From 1e62358d24fb61970660dbf007e79bc74b08155b Mon Sep 17 00:00:00 2001 From: Gion Kunz Date: Sun, 23 Oct 2016 17:08:24 +0200 Subject: [PATCH 01/44] Initial commit --- .doclets.yml | 1 + .editorconfig | 21 + .gitattributes | 1 + .gitignore | 4 + .nvmrc | 2 + .travis.yml | 6 + CONTRIBUTING.md | 29 + LICENSE-MIT | 7 + LICENSE-WTFPL | 13 + README.md | 80 + bs-config.js | 103 + dist/chartist.css | 592 +++ dist/chartist.css.map | 1 + dist/chartist.esm.js | 4248 +++++++++++++++++ dist/chartist.esm.js.map | 1 + dist/chartist.min.css | 2 + dist/chartist.min.css.map | 1 + dist/chartist.umd.js | 9 + dist/chartist.umd.js.map | 1 + index.html | 70 + jspm.config.js | 47 + karma.watch.config.js | 27 + package.json | 88 + src/axes/auto-scale-axis.js | 21 + src/axes/axes.js | 4 + src/axes/axis.js | 109 + src/axes/axis.spec.js | 103 + src/axes/fixed-scale-axis.js | 30 + src/axes/fixed-scale-axis.spec.js | 35 + src/axes/step-axis.js | 15 + src/axes/step-axis.spec.js | 27 + src/charts/bar.js | 431 ++ src/charts/base.js | 174 + src/charts/charts.js | 4 + src/charts/line.js | 402 ++ src/charts/pie.js | 359 ++ src/core/core.js | 8 + src/core/creation.js | 233 + src/core/creation.spec.js | 216 + src/core/data.js | 482 ++ src/core/data.spec.js | 357 ++ src/core/extend.js | 26 + src/core/functional.js | 84 + src/core/globals.js | 34 + src/core/lang.js | 114 + src/core/lang.spec.js | 24 + src/core/math.js | 95 + src/core/options-provider.js | 64 + src/event/event-emitter.js | 63 + src/index.js | 11 + src/interpolation/cardinal.js | 111 + src/interpolation/interpolation.js | 5 + src/interpolation/monotone-cubic.js | 134 + src/interpolation/none.js | 51 + src/interpolation/simple.js | 73 + src/interpolation/step.js | 68 + src/styles/chartist.scss | 241 + src/styles/settings/_chartist-settings.scss | 87 + src/svg/svg-list.js | 41 + src/svg/svg-path.js | 358 ++ src/svg/svg.js | 525 ++ src/testing/fixtures.js | 37 + src/testing/jasmine-dom-matchers.js | 35 + .../spec/fixture-with-multiple-elements.html | 1 + .../spec/fixture-with-single-element.html | 1 + src/testing/spec/fixtures.spec.js | 47 + tooling/node/banner.js | 12 + tooling/node/compile-sass.js | 50 + tooling/node/styles-watch.js | 16 + tooling/node/styles.js | 3 + .../system-loaders/version-loader-plugin.js | 3 + yarn.lock | 4118 ++++++++++++++++ 72 files changed, 14896 insertions(+) create mode 100644 .doclets.yml create mode 100644 .editorconfig create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 .nvmrc create mode 100644 .travis.yml create mode 100644 CONTRIBUTING.md create mode 100644 LICENSE-MIT create mode 100644 LICENSE-WTFPL create mode 100644 README.md create mode 100644 bs-config.js create mode 100644 dist/chartist.css create mode 100644 dist/chartist.css.map create mode 100644 dist/chartist.esm.js create mode 100644 dist/chartist.esm.js.map create mode 100644 dist/chartist.min.css create mode 100644 dist/chartist.min.css.map create mode 100644 dist/chartist.umd.js create mode 100644 dist/chartist.umd.js.map create mode 100644 index.html create mode 100644 jspm.config.js create mode 100644 karma.watch.config.js create mode 100644 package.json create mode 100644 src/axes/auto-scale-axis.js create mode 100644 src/axes/axes.js create mode 100644 src/axes/axis.js create mode 100644 src/axes/axis.spec.js create mode 100644 src/axes/fixed-scale-axis.js create mode 100644 src/axes/fixed-scale-axis.spec.js create mode 100644 src/axes/step-axis.js create mode 100644 src/axes/step-axis.spec.js create mode 100644 src/charts/bar.js create mode 100644 src/charts/base.js create mode 100644 src/charts/charts.js create mode 100644 src/charts/line.js create mode 100644 src/charts/pie.js create mode 100644 src/core/core.js create mode 100644 src/core/creation.js create mode 100644 src/core/creation.spec.js create mode 100644 src/core/data.js create mode 100644 src/core/data.spec.js create mode 100644 src/core/extend.js create mode 100644 src/core/functional.js create mode 100644 src/core/globals.js create mode 100644 src/core/lang.js create mode 100644 src/core/lang.spec.js create mode 100644 src/core/math.js create mode 100644 src/core/options-provider.js create mode 100644 src/event/event-emitter.js create mode 100644 src/index.js create mode 100644 src/interpolation/cardinal.js create mode 100644 src/interpolation/interpolation.js create mode 100644 src/interpolation/monotone-cubic.js create mode 100644 src/interpolation/none.js create mode 100644 src/interpolation/simple.js create mode 100644 src/interpolation/step.js create mode 100644 src/styles/chartist.scss create mode 100644 src/styles/settings/_chartist-settings.scss create mode 100644 src/svg/svg-list.js create mode 100644 src/svg/svg-path.js create mode 100644 src/svg/svg.js create mode 100644 src/testing/fixtures.js create mode 100644 src/testing/jasmine-dom-matchers.js create mode 100644 src/testing/spec/fixture-with-multiple-elements.html create mode 100644 src/testing/spec/fixture-with-single-element.html create mode 100644 src/testing/spec/fixtures.spec.js create mode 100755 tooling/node/banner.js create mode 100644 tooling/node/compile-sass.js create mode 100755 tooling/node/styles-watch.js create mode 100755 tooling/node/styles.js create mode 100644 tooling/system-loaders/version-loader-plugin.js create mode 100644 yarn.lock diff --git a/.doclets.yml b/.doclets.yml new file mode 100644 index 00000000..ea7c2ac6 --- /dev/null +++ b/.doclets.yml @@ -0,0 +1 @@ +dir: src diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..c2cdfb8a --- /dev/null +++ b/.editorconfig @@ -0,0 +1,21 @@ +# EditorConfig helps developers define and maintain consistent +# coding styles between different editors and IDEs +# editorconfig.org + +root = true + + +[*] + +# Change these settings to your own preference +indent_style = space +indent_size = 2 + +# We recommend you to keep these unchanged +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.md] +trim_trailing_whitespace = false diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..21256661 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +* text=auto \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..673420c6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +/node_modules +/jspm_packages +npm-debug.log + diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 00000000..be628fe2 --- /dev/null +++ b/.nvmrc @@ -0,0 +1,2 @@ +v6.9.0 + diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 00000000..405a6c49 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,6 @@ +language: node_js +node_js: + - '5.5.0' +before_script: + - 'npm install -g bower grunt-cli' + - 'bower install' diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..8119c5e7 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,29 @@ +# Contributing to chartist-js + + - [Issues and Bugs](#issue) + - [Submission Guidelines](#submit) + +## Found an Issue? + +If you find a bug in the source code or a mistake in the documentation, you can help us by +submitting an issue to our [GitHub Repository][github]. Even better you can submit a Pull Request +with a fix. + +## Pre-requisites + +You will need the following to run a local development enviroment. + +- Node.js & npm +- Yarn (`npm install yarn -g`) +- Text editor of your choice + + +## How to Run a Local Distribution + +1. `cd` into your local copy of the repository. +2. Run `yarn install` to install dependencies located in `package.json`. +5. Run `yarn start` to start the watch task, and the web server should automatically open. Congrats, you should now be able to see your local copy of the Chartist testbed. + +## Submission Guidelines + +If you are creating a Pull Request, fork the repository and make any changes on the `develop` branch. diff --git a/LICENSE-MIT b/LICENSE-MIT new file mode 100644 index 00000000..976cde6e --- /dev/null +++ b/LICENSE-MIT @@ -0,0 +1,7 @@ +Copyright (c) 2013 Gion Kunz + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/LICENSE-WTFPL b/LICENSE-WTFPL new file mode 100644 index 00000000..5c93f456 --- /dev/null +++ b/LICENSE-WTFPL @@ -0,0 +1,13 @@ + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + Version 2, December 2004 + + Copyright (C) 2004 Sam Hocevar + + Everyone is permitted to copy and distribute verbatim or modified + copies of this license document, and changing it is allowed as long + as the name is changed. + + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. You just DO WHAT THE FUCK YOU WANT TO. diff --git a/README.md b/README.md new file mode 100644 index 00000000..348946be --- /dev/null +++ b/README.md @@ -0,0 +1,80 @@ +# Big welcome by the Chartist Guy + +[![Join the chat at https://gitter.im/gionkunz/chartist-js](https://badges.gitter.im/gionkunz/chartist-js.svg)](https://gitter.im/gionkunz/chartist-js?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) +[![npm version](http://img.shields.io/npm/v/chartist.svg)](https://npmjs.org/package/chartist) [![build status](http://img.shields.io/travis/gionkunz/chartist-js.svg)](https://travis-ci.org/gionkunz/chartist-js) [![Inline docs](http://inch-ci.org/github/gionkunz/chartist-js.svg?branch=develop)](http://inch-ci.org/github/gionkunz/chartist-js) + +![The Chartist Guy](https://raw.github.com/gionkunz/chartist-js/develop/site/images/chartist-guy.gif "The Chartist Guy") + +*Checkout the documentation site at http://gionkunz.github.io/chartist-js/* + +*Checkout this lightning talk that gives you an overview of Chartist in 5 minutes https://www.youtube.com/watch?v=WdYzPhOB_c8* + +*Guest talk of the Chartist.js Guy at the Treehouse Show https://www.youtube.com/watch?v=h9oH0iDaZDQ&t=2m40s* + +Chartist.js is a simple responsive charting library built with SVG. There are hundreds of nice charting libraries already +out there, but they are either: + +* not responsive +* use the wrong technologies for illustration (canvas) +* are not flexible enough while keeping the configuration simple +* are not friendly to your own code +* are not friendly to designers +* have unnecessary dependencies to monolithic libraries +* more annoying things + +That's why we started Chartist.js and our goal is to solve all of the above issues. + +## What is it made for? + +Chartist's goal is to provide a simple, lightweight and unintrusive library to responsively craft charts on your website. +It's important to understand that one of the main intentions of Chartist.js is to rely on standards rather than providing +it's own solution to a problem which is already solved by those standards. We need to leverage the power of browsers +today and say good bye to the idea of solving all problems ourselves. + +Chartist works with inline-SVG and therefore leverages the power of the DOM to provide parts of its functionality. This +also means that Chartist does not provide it's own event handling, labels, behaviors or anything else that can just be +done with plain HTML, JavaScript and CSS. The single and only responsibility of Chartist is to help you drawing "Simple +responsive Charts" using inline-SVG in the DOM, CSS to style and JavaScript to provide an API for configuring your charts. + +## Example site + +You can visit this Site http://gionkunz.github.io/chartist-js/ which is in fact a build of the current project. +We are still developing and constantly add features but you can already use Chartist.js in your projects as we have +reached a stable and reliable state already. + +## Version notes + +We are currently still heavily developing in order to make Chartist.js better. Your help is needed! Please contribute +to the project if you like the idea and the concept and help us to bring nice looking responsive open-source charts +to the masses. + +### Important missing stuff + +1. Jasmine Tests! +2. Documentation: JSDoc, Getting started documentation and landing page +3. Better accessibility using ARIA and other optimizations +4. Better interfaces to the library (i.e. jQuery with data-* attributes for configuration), Angular.js directive etc. +5. Richer Sass / CSS framework +6. Other charts types (spider etc.) + +## Plugins + +Some features aren't right for the core product +but there is a great set of plugins available +which add features like: + +* [Axis labels](http://gionkunz.github.io/chartist-js/plugins.html#axis-title-plugin) +* [Tooltips at data points](https://gionkunz.github.io/chartist-js/plugins.html#tooltip-plugin) +* [Coloring above/below a threshold](https://gionkunz.github.io/chartist-js/plugins.html#threshold-plugin) + +and more. + +See all the plugins [here](https://gionkunz.github.io/chartist-js/plugins.html). + +## Contribution + +We are looking for people who share the idea of having a simple, flexible charting library that is responsive and uses +modern and future-proof technologies. The goal of this project is to create a responsive charting library where developers +have their joy in using it and designers love it because of the designing flexibility they have. + +Contribute if you like the Chartist Guy! diff --git a/bs-config.js b/bs-config.js new file mode 100644 index 00000000..2afd471a --- /dev/null +++ b/bs-config.js @@ -0,0 +1,103 @@ + +/* + |-------------------------------------------------------------------------- + | Browser-sync config file + |-------------------------------------------------------------------------- + | + | For up-to-date information about the options: + | http://www.browsersync.io/docs/options/ + | + | There are more options than you see here, these are just the ones that are + | set internally. See the website for more info. + | + | + */ +module.exports = { + "ui": { + "port": 3001, + "weinre": { + "port": 8080 + } + }, + "files": [ + "dist/**/*.css", "src/**/*.js", "index.html" + ], + "watchOptions": {}, + "server": true, + "proxy": false, + "port": 3000, + "middleware": false, + "serveStatic": [], + "ghostMode": { + "clicks": true, + "scroll": true, + "forms": { + "submit": true, + "inputs": true, + "toggles": true + } + }, + "logLevel": "info", + "logPrefix": "BS", + "logConnections": false, + "logFileChanges": true, + "logSnippet": true, + "rewriteRules": [], + "open": "local", + "browser": "default", + "cors": false, + "xip": false, + "hostnameSuffix": false, + "reloadOnRestart": false, + "notify": true, + "scrollProportionally": true, + "scrollThrottle": 0, + "scrollRestoreTechnique": "window.name", + "scrollElements": [], + "scrollElementMapping": [], + "reloadDelay": 0, + "reloadDebounce": 0, + "reloadThrottle": 0, + "plugins": [], + "injectChanges": true, + "startPath": null, + "minify": true, + "host": null, + "localOnly": false, + "codeSync": true, + "timestamps": true, + "clientEvents": [ + "scroll", + "scroll:element", + "input:text", + "input:toggles", + "form:submit", + "form:reset", + "click" + ], + "socket": { + "socketIoOptions": { + "log": false + }, + "socketIoClientConfig": { + "reconnectionAttempts": 50 + }, + "path": "/browser-sync/socket.io", + "clientPath": "/browser-sync", + "namespace": "/browser-sync", + "clients": { + "heartbeatTimeout": 5000 + } + }, + "tagNames": { + "less": "link", + "scss": "link", + "css": "link", + "jpg": "img", + "jpeg": "img", + "png": "img", + "svg": "img", + "gif": "img", + "js": "script" + } +}; diff --git a/dist/chartist.css b/dist/chartist.css new file mode 100644 index 00000000..f5ff2388 --- /dev/null +++ b/dist/chartist.css @@ -0,0 +1,592 @@ +.ct-label { + fill: rgba(0, 0, 0, 0.4); + color: rgba(0, 0, 0, 0.4); + font-size: 0.75rem; + line-height: 1; } + +.ct-chart-line .ct-label, +.ct-chart-bar .ct-label { + display: block; + display: -webkit-box; + display: -ms-flexbox; + display: flex; } + +.ct-chart-pie .ct-label, +.ct-chart-donut .ct-label { + dominant-baseline: central; } + +.ct-label.ct-horizontal.ct-start { + -webkit-box-align: flex-end; + -ms-flex-align: flex-end; + align-items: flex-end; + -webkit-box-pack: flex-start; + -ms-flex-pack: flex-start; + justify-content: flex-start; + text-align: left; + text-anchor: start; } + +.ct-label.ct-horizontal.ct-end { + -webkit-box-align: flex-start; + -ms-flex-align: flex-start; + align-items: flex-start; + -webkit-box-pack: flex-start; + -ms-flex-pack: flex-start; + justify-content: flex-start; + text-align: left; + text-anchor: start; } + +.ct-label.ct-vertical.ct-start { + -webkit-box-align: flex-end; + -ms-flex-align: flex-end; + align-items: flex-end; + -webkit-box-pack: flex-end; + -ms-flex-pack: flex-end; + justify-content: flex-end; + text-align: right; + text-anchor: end; } + +.ct-label.ct-vertical.ct-end { + -webkit-box-align: flex-end; + -ms-flex-align: flex-end; + align-items: flex-end; + -webkit-box-pack: flex-start; + -ms-flex-pack: flex-start; + justify-content: flex-start; + text-align: left; + text-anchor: start; } + +.ct-chart-bar .ct-label.ct-horizontal.ct-start { + -webkit-box-align: flex-end; + -ms-flex-align: flex-end; + align-items: flex-end; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + text-align: center; + text-anchor: start; } + +.ct-chart-bar .ct-label.ct-horizontal.ct-end { + -webkit-box-align: flex-start; + -ms-flex-align: flex-start; + align-items: flex-start; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + text-align: center; + text-anchor: start; } + +.ct-chart-bar.ct-horizontal-bars .ct-label.ct-horizontal.ct-start { + -webkit-box-align: flex-end; + -ms-flex-align: flex-end; + align-items: flex-end; + -webkit-box-pack: flex-start; + -ms-flex-pack: flex-start; + justify-content: flex-start; + text-align: left; + text-anchor: start; } + +.ct-chart-bar.ct-horizontal-bars .ct-label.ct-horizontal.ct-end { + -webkit-box-align: flex-start; + -ms-flex-align: flex-start; + align-items: flex-start; + -webkit-box-pack: flex-start; + -ms-flex-pack: flex-start; + justify-content: flex-start; + text-align: left; + text-anchor: start; } + +.ct-chart-bar.ct-horizontal-bars .ct-label.ct-vertical.ct-start { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: flex-end; + -ms-flex-pack: flex-end; + justify-content: flex-end; + text-align: right; + text-anchor: end; } + +.ct-chart-bar.ct-horizontal-bars .ct-label.ct-vertical.ct-end { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: flex-start; + -ms-flex-pack: flex-start; + justify-content: flex-start; + text-align: left; + text-anchor: end; } + +.ct-grid { + stroke: rgba(0, 0, 0, 0.2); + stroke-width: 1px; + stroke-dasharray: 2px; } + +.ct-grid-background { + fill: none; } + +.ct-point { + stroke-width: 10px; + stroke-linecap: round; } + +.ct-line { + fill: none; + stroke-width: 4px; } + +.ct-area { + stroke: none; + fill-opacity: 0.1; } + +.ct-bar { + fill: none; + stroke-width: 10px; } + +.ct-slice-donut { + fill: none; + stroke-width: 60px; } + +.ct-series-a .ct-point, .ct-series-a .ct-line, .ct-series-a .ct-bar, .ct-series-a .ct-slice-donut { + stroke: #d70206; } + +.ct-series-a .ct-slice-pie, .ct-series-a .ct-area { + fill: #d70206; } + +.ct-series-b .ct-point, .ct-series-b .ct-line, .ct-series-b .ct-bar, .ct-series-b .ct-slice-donut { + stroke: #f05b4f; } + +.ct-series-b .ct-slice-pie, .ct-series-b .ct-area { + fill: #f05b4f; } + +.ct-series-c .ct-point, .ct-series-c .ct-line, .ct-series-c .ct-bar, .ct-series-c .ct-slice-donut { + stroke: #f4c63d; } + +.ct-series-c .ct-slice-pie, .ct-series-c .ct-area { + fill: #f4c63d; } + +.ct-series-d .ct-point, .ct-series-d .ct-line, .ct-series-d .ct-bar, .ct-series-d .ct-slice-donut { + stroke: #d17905; } + +.ct-series-d .ct-slice-pie, .ct-series-d .ct-area { + fill: #d17905; } + +.ct-series-e .ct-point, .ct-series-e .ct-line, .ct-series-e .ct-bar, .ct-series-e .ct-slice-donut { + stroke: #453d3f; } + +.ct-series-e .ct-slice-pie, .ct-series-e .ct-area { + fill: #453d3f; } + +.ct-series-f .ct-point, .ct-series-f .ct-line, .ct-series-f .ct-bar, .ct-series-f .ct-slice-donut { + stroke: #59922b; } + +.ct-series-f .ct-slice-pie, .ct-series-f .ct-area { + fill: #59922b; } + +.ct-series-g .ct-point, .ct-series-g .ct-line, .ct-series-g .ct-bar, .ct-series-g .ct-slice-donut { + stroke: #0544d3; } + +.ct-series-g .ct-slice-pie, .ct-series-g .ct-area { + fill: #0544d3; } + +.ct-series-h .ct-point, .ct-series-h .ct-line, .ct-series-h .ct-bar, .ct-series-h .ct-slice-donut { + stroke: #6b0392; } + +.ct-series-h .ct-slice-pie, .ct-series-h .ct-area { + fill: #6b0392; } + +.ct-series-i .ct-point, .ct-series-i .ct-line, .ct-series-i .ct-bar, .ct-series-i .ct-slice-donut { + stroke: #f05b4f; } + +.ct-series-i .ct-slice-pie, .ct-series-i .ct-area { + fill: #f05b4f; } + +.ct-series-j .ct-point, .ct-series-j .ct-line, .ct-series-j .ct-bar, .ct-series-j .ct-slice-donut { + stroke: #dda458; } + +.ct-series-j .ct-slice-pie, .ct-series-j .ct-area { + fill: #dda458; } + +.ct-series-k .ct-point, .ct-series-k .ct-line, .ct-series-k .ct-bar, .ct-series-k .ct-slice-donut { + stroke: #eacf7d; } + +.ct-series-k .ct-slice-pie, .ct-series-k .ct-area { + fill: #eacf7d; } + +.ct-series-l .ct-point, .ct-series-l .ct-line, .ct-series-l .ct-bar, .ct-series-l .ct-slice-donut { + stroke: #86797d; } + +.ct-series-l .ct-slice-pie, .ct-series-l .ct-area { + fill: #86797d; } + +.ct-series-m .ct-point, .ct-series-m .ct-line, .ct-series-m .ct-bar, .ct-series-m .ct-slice-donut { + stroke: #b2c326; } + +.ct-series-m .ct-slice-pie, .ct-series-m .ct-area { + fill: #b2c326; } + +.ct-series-n .ct-point, .ct-series-n .ct-line, .ct-series-n .ct-bar, .ct-series-n .ct-slice-donut { + stroke: #6188e2; } + +.ct-series-n .ct-slice-pie, .ct-series-n .ct-area { + fill: #6188e2; } + +.ct-series-o .ct-point, .ct-series-o .ct-line, .ct-series-o .ct-bar, .ct-series-o .ct-slice-donut { + stroke: #a748ca; } + +.ct-series-o .ct-slice-pie, .ct-series-o .ct-area { + fill: #a748ca; } + +.ct-square { + display: block; + position: relative; + width: 100%; } + .ct-square:before { + display: block; + float: left; + content: ""; + width: 0; + height: 0; + padding-bottom: 100%; } + .ct-square:after { + content: ""; + display: table; + clear: both; } + .ct-square > svg { + display: block; + position: absolute; + top: 0; + left: 0; } + +.ct-minor-second { + display: block; + position: relative; + width: 100%; } + .ct-minor-second:before { + display: block; + float: left; + content: ""; + width: 0; + height: 0; + padding-bottom: 93.75%; } + .ct-minor-second:after { + content: ""; + display: table; + clear: both; } + .ct-minor-second > svg { + display: block; + position: absolute; + top: 0; + left: 0; } + +.ct-major-second { + display: block; + position: relative; + width: 100%; } + .ct-major-second:before { + display: block; + float: left; + content: ""; + width: 0; + height: 0; + padding-bottom: 88.88889%; } + .ct-major-second:after { + content: ""; + display: table; + clear: both; } + .ct-major-second > svg { + display: block; + position: absolute; + top: 0; + left: 0; } + +.ct-minor-third { + display: block; + position: relative; + width: 100%; } + .ct-minor-third:before { + display: block; + float: left; + content: ""; + width: 0; + height: 0; + padding-bottom: 83.33333%; } + .ct-minor-third:after { + content: ""; + display: table; + clear: both; } + .ct-minor-third > svg { + display: block; + position: absolute; + top: 0; + left: 0; } + +.ct-major-third { + display: block; + position: relative; + width: 100%; } + .ct-major-third:before { + display: block; + float: left; + content: ""; + width: 0; + height: 0; + padding-bottom: 80%; } + .ct-major-third:after { + content: ""; + display: table; + clear: both; } + .ct-major-third > svg { + display: block; + position: absolute; + top: 0; + left: 0; } + +.ct-perfect-fourth { + display: block; + position: relative; + width: 100%; } + .ct-perfect-fourth:before { + display: block; + float: left; + content: ""; + width: 0; + height: 0; + padding-bottom: 75%; } + .ct-perfect-fourth:after { + content: ""; + display: table; + clear: both; } + .ct-perfect-fourth > svg { + display: block; + position: absolute; + top: 0; + left: 0; } + +.ct-perfect-fifth { + display: block; + position: relative; + width: 100%; } + .ct-perfect-fifth:before { + display: block; + float: left; + content: ""; + width: 0; + height: 0; + padding-bottom: 66.66667%; } + .ct-perfect-fifth:after { + content: ""; + display: table; + clear: both; } + .ct-perfect-fifth > svg { + display: block; + position: absolute; + top: 0; + left: 0; } + +.ct-minor-sixth { + display: block; + position: relative; + width: 100%; } + .ct-minor-sixth:before { + display: block; + float: left; + content: ""; + width: 0; + height: 0; + padding-bottom: 62.5%; } + .ct-minor-sixth:after { + content: ""; + display: table; + clear: both; } + .ct-minor-sixth > svg { + display: block; + position: absolute; + top: 0; + left: 0; } + +.ct-golden-section { + display: block; + position: relative; + width: 100%; } + .ct-golden-section:before { + display: block; + float: left; + content: ""; + width: 0; + height: 0; + padding-bottom: 61.8047%; } + .ct-golden-section:after { + content: ""; + display: table; + clear: both; } + .ct-golden-section > svg { + display: block; + position: absolute; + top: 0; + left: 0; } + +.ct-major-sixth { + display: block; + position: relative; + width: 100%; } + .ct-major-sixth:before { + display: block; + float: left; + content: ""; + width: 0; + height: 0; + padding-bottom: 60%; } + .ct-major-sixth:after { + content: ""; + display: table; + clear: both; } + .ct-major-sixth > svg { + display: block; + position: absolute; + top: 0; + left: 0; } + +.ct-minor-seventh { + display: block; + position: relative; + width: 100%; } + .ct-minor-seventh:before { + display: block; + float: left; + content: ""; + width: 0; + height: 0; + padding-bottom: 56.25%; } + .ct-minor-seventh:after { + content: ""; + display: table; + clear: both; } + .ct-minor-seventh > svg { + display: block; + position: absolute; + top: 0; + left: 0; } + +.ct-major-seventh { + display: block; + position: relative; + width: 100%; } + .ct-major-seventh:before { + display: block; + float: left; + content: ""; + width: 0; + height: 0; + padding-bottom: 53.33333%; } + .ct-major-seventh:after { + content: ""; + display: table; + clear: both; } + .ct-major-seventh > svg { + display: block; + position: absolute; + top: 0; + left: 0; } + +.ct-octave { + display: block; + position: relative; + width: 100%; } + .ct-octave:before { + display: block; + float: left; + content: ""; + width: 0; + height: 0; + padding-bottom: 50%; } + .ct-octave:after { + content: ""; + display: table; + clear: both; } + .ct-octave > svg { + display: block; + position: absolute; + top: 0; + left: 0; } + +.ct-major-tenth { + display: block; + position: relative; + width: 100%; } + .ct-major-tenth:before { + display: block; + float: left; + content: ""; + width: 0; + height: 0; + padding-bottom: 40%; } + .ct-major-tenth:after { + content: ""; + display: table; + clear: both; } + .ct-major-tenth > svg { + display: block; + position: absolute; + top: 0; + left: 0; } + +.ct-major-eleventh { + display: block; + position: relative; + width: 100%; } + .ct-major-eleventh:before { + display: block; + float: left; + content: ""; + width: 0; + height: 0; + padding-bottom: 37.5%; } + .ct-major-eleventh:after { + content: ""; + display: table; + clear: both; } + .ct-major-eleventh > svg { + display: block; + position: absolute; + top: 0; + left: 0; } + +.ct-major-twelfth { + display: block; + position: relative; + width: 100%; } + .ct-major-twelfth:before { + display: block; + float: left; + content: ""; + width: 0; + height: 0; + padding-bottom: 33.33333%; } + .ct-major-twelfth:after { + content: ""; + display: table; + clear: both; } + .ct-major-twelfth > svg { + display: block; + position: absolute; + top: 0; + left: 0; } + +.ct-double-octave { + display: block; + position: relative; + width: 100%; } + .ct-double-octave:before { + display: block; + float: left; + content: ""; + width: 0; + height: 0; + padding-bottom: 25%; } + .ct-double-octave:after { + content: ""; + display: table; + clear: both; } + .ct-double-octave > svg { + display: block; + position: absolute; + top: 0; + left: 0; } +/*# sourceMappingURL=chartist.css.map */ \ No newline at end of file diff --git a/dist/chartist.css.map b/dist/chartist.css.map new file mode 100644 index 00000000..74426712 --- /dev/null +++ b/dist/chartist.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["src/styles/chartist.scss","src/styles/settings/_chartist-settings.scss"],"names":[],"mappings":"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","file":"chartist.css"} \ No newline at end of file diff --git a/dist/chartist.esm.js b/dist/chartist.esm.js new file mode 100644 index 00000000..cadb6b24 --- /dev/null +++ b/dist/chartist.esm.js @@ -0,0 +1,4248 @@ +/* Chartist.js 1.0.0 + * Copyright © 2016 Gion Kunz + * Free to use under either the WTFPL license or the MIT license. + * https://raw.githubusercontent.com/gionkunz/chartist-js/master/LICENSE-WTFPL + * https://raw.githubusercontent.com/gionkunz/chartist-js/master/LICENSE-MIT + */ +var version = '1.0.0'; + +/** + * This object contains all namespaces used within Chartist. + * + * @type {{svg: string, xmlns: string, xhtml: string, xlink: string, ct: string}} + */ +var namespaces = { + svg: 'http://www.w3.org/2000/svg', + xmlns: 'http://www.w3.org/2000/xmlns/', + xhtml: 'http://www.w3.org/1999/xhtml', + xlink: 'http://www.w3.org/1999/xlink', + ct: 'http://gionkunz.github.com/chartist-js/ct' +}; + +/** + * Precision level used internally in Chartist for rounding. If you require more decimal places you can increase this number. + * + * @type {number} + */ +var precision = 8; + +/** + * A map with characters to escape for strings to be safely used as attribute values. + * + * @type {Object} + */ +var escapingMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + '\'': ''' +}; + +/** + * Replaces all occurrences of subStr in str with newSubStr and returns a new string. + * + * @param {String} str + * @param {String} subStr + * @param {String} newSubStr + * @return {String} + */ +function replaceAll(str, subStr, newSubStr) { + return str.replace(new RegExp(subStr, 'g'), newSubStr); +} + +/** + * This is a wrapper around document.querySelector that will return the query if it's already of type Node + * + * @memberof Chartist.Core + * @param {String|Node} query The query to use for selecting a Node or a DOM node that will be returned directly + * @return {Node} + */ +function querySelector$1(query) { + return query instanceof Node ? query : document.querySelector(query); +} + +/** + * This function safely checks if an objects has an owned property. + * + * @param {Object} object The object where to check for a property + * @param {string} property The property name + * @returns {boolean} Returns true if the object owns the specified property + */ +function safeHasProperty(object, property) { + return object !== null && typeof object === 'object' && object.hasOwnProperty(property); +} + +/** + * Checks if a value can be safely coerced to a number. This includes all values except null which result in finite numbers when coerced. This excludes NaN, since it's not finite. + * + * @memberof Chartist.Core + * @param value + * @returns {Boolean} + */ +function isNumeric(value) { + return value === null ? false : isFinite(value); +} + +/** + * Returns true on all falsey values except the numeric value 0. + * + * @memberof Chartist.Core + * @param value + * @returns {boolean} + */ +function isFalseyButZero(value) { + return !value && value !== 0; +} + +/** + * Returns a number if the passed parameter is a valid number or the function will return undefined. On all other values than a valid number, this function will return undefined. + * + * @memberof Chartist.Core + * @param value + * @returns {*} + */ +function getNumberOrUndefined(value) { + return isNumeric(value) ? +value : undefined; +} + +/** + * Converts a number to a string with a unit. If a string is passed then this will be returned unmodified. + * + * @memberof Chartist.Core + * @param {Number} value + * @param {String} unit + * @return {String} Returns the passed number value with unit. + */ +function ensureUnit(value, unit) { + if (typeof value === 'number') { + value = value + unit; + } + + return value; +} + +/** + * Converts a number or string to a quantity object. + * + * @memberof Chartist.Core + * @param {String|Number} input + * @return {Object} Returns an object containing the value as number and the unit as string. + */ +function quantity(input) { + if (typeof input === 'string') { + var match = /^(\d+)\s*(.*)$/g.exec(input); + return { + value: +match[1], + unit: match[2] || undefined + }; + } + return { value: input }; +} + +/** + * Generates a-z from a number 0 to 26 + * + * @memberof Chartist.Core + * @param {Number} n A number from 0 to 26 that will result in a letter a-z + * @return {String} A character from a-z based on the input number n + */ +function alphaNumerate(n) { + // Limit to a-z + return String.fromCharCode(97 + n % 26); +} + +/** + * Helps to simplify functional style code + * + * @memberof Chartist.Core + * @param {*} n This exact value will be returned by the noop function + * @return {*} The same value that was provided to the n parameter + */ +function noop(n) { + return n; +} + +/** + * Functional style helper to produce array with given length initialized with undefined values + * + * @memberof Chartist.Core + * @param length + * @return {Array} + */ +function times(length) { + return Array.apply(null, new Array(length)); +} + +/** + * Sum helper to be used in reduce functions + * + * @memberof Chartist.Core + * @param previous + * @param current + * @return {*} + */ +function sum(previous, current) { + return previous + (current ? current : 0); +} + +/** + * Multiply helper to be used in `Array.map` for multiplying each value of an array with a factor. + * + * @memberof Chartist.Core + * @param {Number} factor + * @returns {Function} Function that can be used in `Array.map` to multiply each value in an array + */ +function mapMultiply(factor) { + return function (num) { + return num * factor; + }; +} + +/** + * Add helper to be used in `Array.map` for adding a addend to each value of an array. + * + * @memberof Chartist.Core + * @param {Number} addend + * @returns {Function} Function that can be used in `Array.map` to add a addend to each value in an array + */ +function mapAdd(addend) { + return function (num) { + return num + addend; + }; +} + +/** + * Map for multi dimensional arrays where their nested arrays will be mapped in serial. The output array will have the length of the largest nested array. The callback function is called with variable arguments where each argument is the nested array value (or undefined if there are no more values). + * + * @memberof Chartist.Core + * @param arr + * @param cb + * @return {Array} + */ +function serialMap(arr, cb) { + var result = [], + length = Math.max.apply(null, arr.map(function (e) { + return e.length; + })); + + times(length).forEach(function (e, index) { + var args = arr.map(function (e) { + return e[index]; + }); + + result[index] = cb.apply(null, args); + }); + + return result; +} + +/** + * Calculate the order of magnitude for the chart scale + * + * @memberof Chartist.Core + * @param {Number} value The value Range of the chart + * @return {Number} The order of magnitude + */ +function orderOfMagnitude(value) { + return Math.floor(Math.log(Math.abs(value)) / Math.LN10); +} + +/** + * Project a data length into screen coordinates (pixels) + * + * @memberof Chartist.Core + * @param {Object} axisLength The svg element for the chart + * @param {Number} length Single data value from a series array + * @param {Object} bounds All the values to set the bounds of the chart + * @return {Number} The projected data length in pixels + */ +function projectLength(axisLength, length, bounds) { + return length / bounds.range * axisLength; +} + +/** + * This helper function can be used to round values with certain precision level after decimal. This is used to prevent rounding errors near float point precision limit. + * + * @memberof Chartist.Core + * @param {Number} value The value that should be rounded with precision + * @param {Number} [digits] The number of digits after decimal used to do the rounding + * @returns {number} Rounded value + */ +function roundWithPrecision(value, digits) { + var precision$$1 = Math.pow(10, digits || precision$$1); + return Math.round(value * precision$$1) / precision$$1; +} + +/** + * Pollard Rho Algorithm to find smallest factor of an integer value. There are more efficient algorithms for factorization, but this one is quite efficient and not so complex. + * + * @memberof Chartist.Core + * @param {Number} num An integer number where the smallest factor should be searched for + * @returns {Number} The smallest integer factor of the parameter num. + */ +function rho(num) { + if (num === 1) { + return num; + } + + function gcd(p, q) { + if (p % q === 0) { + return q; + } else { + return gcd(q, p % q); + } + } + + function f(x) { + return x * x + 1; + } + + var x1 = 2, + x2 = 2, + divisor; + if (num % 2 === 0) { + return 2; + } + + do { + x1 = f(x1) % num; + x2 = f(f(x2)) % num; + divisor = gcd(Math.abs(x1 - x2), num); + } while (divisor === 1); + + return divisor; +} + +/** + * Calculate cartesian coordinates of polar coordinates + * + * @memberof Chartist.Core + * @param {Number} centerX X-axis coordinates of center point of circle segment + * @param {Number} centerY X-axis coordinates of center point of circle segment + * @param {Number} radius Radius of circle segment + * @param {Number} angleInDegrees Angle of circle segment in degrees + * @return {{x:Number, y:Number}} Coordinates of point on circumference + */ +function polarToCartesian(centerX, centerY, radius, angleInDegrees) { + var angleInRadians = (angleInDegrees - 90) * Math.PI / 180.0; + + return { + x: centerX + radius * Math.cos(angleInRadians), + y: centerY + radius * Math.sin(angleInRadians) + }; +} + +/** + * Simple recursive object extend + * + * @memberof Chartist.Core + * @param {Object} target Target object where the source will be merged into + * @param {Object...} sources This object (objects) will be merged into target and then target is returned + * @return {Object} An object that has the same reference as target but is extended and merged with the properties of source + */ +function extend(target) { + var i, source, sourceProp; + target = target || {}; + + for (i = 1; i < arguments.length; i++) { + source = arguments[i]; + for (var prop in source) { + sourceProp = source[prop]; + if (typeof sourceProp === 'object' && sourceProp !== null && !(sourceProp instanceof Array)) { + target[prop] = extend(target[prop], sourceProp); + } else { + target[prop] = sourceProp; + } + } + } + + return target; +} + +/** + * This function serializes arbitrary data to a string. In case of data that can't be easily converted to a string, this function will create a wrapper object and serialize the data using JSON.stringify. The outcoming string will always be escaped using Chartist.escapingMap. + * If called with null or undefined the function will return immediately with null or undefined. + * + * @memberof Chartist.Core + * @param {Number|String|Object} data + * @return {String} + */ +function serialize(data) { + if (data === null || data === undefined) { + return data; + } else if (typeof data === 'number') { + data = '' + data; + } else if (typeof data === 'object') { + data = JSON.stringify({ data: data }); + } + + return Object.keys(escapingMap).reduce(function (result, key) { + return replaceAll(result, key, escapingMap[key]); + }, data); +} + +/** + * This function de-serializes a string previously serialized with Chartist.serialize. The string will always be unescaped using Chartist.escapingMap before it's returned. Based on the input value the return type can be Number, String or Object. JSON.parse is used with try / catch to see if the unescaped string can be parsed into an Object and this Object will be returned on success. + * + * @memberof Chartist.Core + * @param {String} data + * @return {String|Number|Object} + */ +function deserialize(data) { + if (typeof data !== 'string') { + return data; + } + + data = Object.keys(escapingMap).reduce(function (result, key) { + return replaceAll(result, escapingMap[key], key); + }, data); + + try { + data = JSON.parse(data); + data = data.data !== undefined ? data.data : data; + } catch (e) {} + + return data; +} + +/** + * Ensures that the data object passed as second argument to the charts is present and correctly initialized. + * + * @param {Object} data The data object that is passed as second argument to the charts + * @return {Object} The normalized data object + */ +function normalizeData(data, reverse, multi) { + var labelCount; + var output = { + raw: data, + normalized: {} + }; + + // Check if we should generate some labels based on existing series data + output.normalized.series = getDataArray({ + series: data.series || [] + }, reverse, multi); + + // If all elements of the normalized data array are arrays we're dealing with + // multi series data and we need to find the largest series if they are un-even + if (output.normalized.series.every(function (value) { + return value instanceof Array; + })) { + // Getting the series with the the most elements + labelCount = Math.max.apply(null, output.normalized.series.map(function (series) { + return series.length; + })); + } else { + // We're dealing with Pie data so we just take the normalized array length + labelCount = output.normalized.series.length; + } + + output.normalized.labels = (data.labels || []).slice(); + // Padding the labels to labelCount with empty strings + Array.prototype.push.apply(output.normalized.labels, times(Math.max(0, labelCount - output.normalized.labels.length)).map(function () { + return ''; + })); + + if (reverse) { + reverseData(output.normalized); + } + + return output; +} + +/** + * Get meta data of a specific value in a series. + * + * @param series + * @param index + * @returns {*} + */ +function getMetaData(series, index) { + var value = series.data ? series.data[index] : series[index]; + return value ? value.meta : undefined; +} + +/** + * Checks if a value is considered a hole in the data series. + * + * @param {*} value + * @returns {boolean} True if the value is considered a data hole + */ +function isDataHoleValue(value) { + return value === null || value === undefined || typeof value === 'number' && isNaN(value); +} + +/** + * Reverses the series, labels and series data arrays. + * + * @memberof Chartist.Core + * @param data + */ +function reverseData(data) { + data.labels.reverse(); + data.series.reverse(); + for (var i = 0; i < data.series.length; i++) { + if (typeof data.series[i] === 'object' && data.series[i].data !== undefined) { + data.series[i].data.reverse(); + } else if (data.series[i] instanceof Array) { + data.series[i].reverse(); + } + } +} + +/** + * Convert data series into plain array + * + * @memberof Chartist.Core + * @param {Object} data The series object that contains the data to be visualized in the chart + * @param {Boolean} [reverse] If true the whole data is reversed by the getDataArray call. This will modify the data object passed as first parameter. The labels as well as the series order is reversed. The whole series data arrays are reversed too. + * @param {Boolean} [multi] Create a multi dimensional array from a series data array where a value object with `x` and `y` values will be created. + * @return {Array} A plain array that contains the data to be visualized in the chart + */ +function getDataArray(data, reverse, multi) { + // Recursively walks through nested arrays and convert string values to numbers and objects with value properties + // to values. Check the tests in data core -> data normalization for a detailed specification of expected values + function recursiveConvert(value) { + if (safeHasProperty(value, 'value')) { + // We are dealing with value object notation so we need to recurse on value property + return recursiveConvert(value.value); + } else if (safeHasProperty(value, 'data')) { + // We are dealing with series object notation so we need to recurse on data property + return recursiveConvert(value.data); + } else if (value instanceof Array) { + // Data is of type array so we need to recurse on the series + return value.map(recursiveConvert); + } else if (isDataHoleValue(value)) { + // We're dealing with a hole in the data and therefore need to return undefined + // We're also returning undefined for multi value output + return undefined; + } else { + // We need to prepare multi value output (x and y data) + if (multi) { + var multiValue = {}; + + // Single series value arrays are assumed to specify the Y-Axis value + // For example: [1, 2] => [{x: undefined, y: 1}, {x: undefined, y: 2}] + // If multi is a string then it's assumed that it specified which dimension should be filled as default + if (typeof multi === 'string') { + multiValue[multi] = getNumberOrUndefined(value); + } else { + multiValue.y = getNumberOrUndefined(value); + } + + multiValue.x = value.hasOwnProperty('x') ? getNumberOrUndefined(value.x) : multiValue.x; + multiValue.y = value.hasOwnProperty('y') ? getNumberOrUndefined(value.y) : multiValue.y; + + return multiValue; + } else { + // We can return simple data + return getNumberOrUndefined(value); + } + } + } + + return data.series.map(recursiveConvert); +} + +/** + * Checks if provided value object is multi value (contains x or y properties) + * + * @memberof Chartist.Core + * @param value + */ +function isMultiValue(value) { + return typeof value === 'object' && ('x' in value || 'y' in value); +} + +/** + * Gets a value from a dimension `value.x` or `value.y` while returning value directly if it's a valid numeric value. If the value is not numeric and it's falsey this function will return `defaultValue`. + * + * @memberof Chartist.Core + * @param value + * @param dimension + * @param defaultValue + * @returns {*} + */ +function getMultiValue(value, dimension) { + if (isMultiValue(value)) { + return getNumberOrUndefined(value[dimension || 'y']); + } else { + return getNumberOrUndefined(value); + } +} + +/** + * Helper to read series specific options from options object. It automatically falls back to the global option if + * there is no option in the series options. + * + * @param {Object} series Series object + * @param {Object} options Chartist options object + * @param {string} key The options key that should be used to obtain the options + * @returns {*} + */ +function getSeriesOption(series, options, key) { + if (series.name && options.series && options.series[series.name]) { + var seriesOptions = options.series[series.name]; + return seriesOptions.hasOwnProperty(key) ? seriesOptions[key] : options[key]; + } else { + return options[key]; + } +} + +/** + * Splits a list of coordinates and associated values into segments. Each returned segment contains a pathCoordinates + * valueData property describing the segment. + * + * With the default options, segments consist of contiguous sets of points that do not have an undefined value. Any + * points with undefined values are discarded. + * + * **Options** + * The following options are used to determine how segments are formed + * ```javascript + * var options = { + * // If fillHoles is true, undefined values are simply discarded without creating a new segment. Assuming other options are default, this returns single segment. + * fillHoles: false, + * // If increasingX is true, the coordinates in all segments have strictly increasing x-values. + * increasingX: false + * }; + * ``` + * + * @memberof Chartist.Core + * @param {Array} pathCoordinates List of point coordinates to be split in the form [x1, y1, x2, y2 ... xn, yn] + * @param {Array} valueData List of associated point values in the form [v1, v2 .. vn] + * @param {Object} [options] Options set by user + * @return {Array} List of segments, each containing a pathCoordinates and valueData property. + */ +function splitIntoSegments(pathCoordinates, valueData, options) { + var defaultOptions = { + increasingX: false, + fillHoles: false + }; + + options = extend({}, defaultOptions, options); + + var segments = []; + var hole = true; + + for (var i = 0; i < pathCoordinates.length; i += 2) { + // If this value is a "hole" we set the hole flag + if (getMultiValue(valueData[i / 2].value) === undefined) { + // if(valueData[i / 2].value === undefined) { + if (!options.fillHoles) { + hole = true; + } + } else { + if (options.increasingX && i >= 2 && pathCoordinates[i] <= pathCoordinates[i - 2]) { + // X is not increasing, so we need to make sure we start a new segment + hole = true; + } + + // If it's a valid value we need to check if we're coming out of a hole and create a new empty segment + if (hole) { + segments.push({ + pathCoordinates: [], + valueData: [] + }); + // As we have a valid value now, we are not in a "hole" anymore + hole = false; + } + + // Add to the segment pathCoordinates and valueData + segments[segments.length - 1].pathCoordinates.push(pathCoordinates[i], pathCoordinates[i + 1]); + segments[segments.length - 1].valueData.push(valueData[i / 2]); + } + } + + return segments; +} + +/** + * Get highest and lowest value of data array. This Array contains the data that will be visualized in the chart. + * + * @memberof Chartist.Core + * @param {Array} data The array that contains the data to be visualized in the chart + * @param {Object} options The Object that contains the chart options + * @param {String} dimension Axis dimension 'x' or 'y' used to access the correct value and high / low configuration + * @return {Object} An object that contains the highest and lowest value that will be visualized on the chart. + */ +function getHighLow(data, options, dimension) { + // TODO: Remove workaround for deprecated global high / low config. Axis high / low configuration is preferred + options = extend({}, options, dimension ? options['axis' + dimension.toUpperCase()] : {}); + + var highLow = { + high: options.high === undefined ? -Number.MAX_VALUE : +options.high, + low: options.low === undefined ? Number.MAX_VALUE : +options.low + }; + var findHigh = options.high === undefined; + var findLow = options.low === undefined; + + // Function to recursively walk through arrays and find highest and lowest number + function recursiveHighLow(data) { + if (data === undefined) { + return undefined; + } else if (data instanceof Array) { + for (var i = 0; i < data.length; i++) { + recursiveHighLow(data[i]); + } + } else { + var value = dimension ? +data[dimension] : +data; + + if (findHigh && value > highLow.high) { + highLow.high = value; + } + + if (findLow && value < highLow.low) { + highLow.low = value; + } + } + } + + // Start to find highest and lowest number recursively + if (findHigh || findLow) { + recursiveHighLow(data); + } + + // Overrides of high / low based on reference value, it will make sure that the invisible reference value is + // used to generate the chart. This is useful when the chart always needs to contain the position of the + // invisible reference value in the view i.e. for bipolar scales. + if (options.referenceValue || options.referenceValue === 0) { + highLow.high = Math.max(options.referenceValue, highLow.high); + highLow.low = Math.min(options.referenceValue, highLow.low); + } + + // If high and low are the same because of misconfiguration or flat data (only the same value) we need + // to set the high or low to 0 depending on the polarity + if (highLow.high <= highLow.low) { + // If both values are 0 we set high to 1 + if (highLow.low === 0) { + highLow.high = 1; + } else if (highLow.low < 0) { + // If we have the same negative value for the bounds we set bounds.high to 0 + highLow.high = 0; + } else if (highLow.high > 0) { + // If we have the same positive value for the bounds we set bounds.low to 0 + highLow.low = 0; + } else { + // If data array was empty, values are Number.MAX_VALUE and -Number.MAX_VALUE. Set bounds to prevent errors + highLow.high = 1; + highLow.low = 0; + } + } + + return highLow; +} + +/** + * Calculate and retrieve all the bounds for the chart and return them in one array + * + * @memberof Chartist.Core + * @param {Number} axisLength The length of the Axis used for + * @param {Object} highLow An object containing a high and low property indicating the value range of the chart. + * @param {Number} scaleMinSpace The minimum projected length a step should result in + * @param {Boolean} onlyInteger + * @return {Object} All the values to set the bounds of the chart + */ +function getBounds(axisLength, highLow, scaleMinSpace, onlyInteger) { + var i, + optimizationCounter = 0, + newMin, + newMax, + bounds = { + high: highLow.high, + low: highLow.low + }; + + bounds.valueRange = bounds.high - bounds.low; + bounds.oom = orderOfMagnitude(bounds.valueRange); + bounds.step = Math.pow(10, bounds.oom); + bounds.min = Math.floor(bounds.low / bounds.step) * bounds.step; + bounds.max = Math.ceil(bounds.high / bounds.step) * bounds.step; + bounds.range = bounds.max - bounds.min; + bounds.numberOfSteps = Math.round(bounds.range / bounds.step); + + // Optimize scale step by checking if subdivision is possible based on horizontalGridMinSpace + // If we are already below the scaleMinSpace value we will scale up + var length = projectLength(axisLength, bounds.step, bounds); + var scaleUp = length < scaleMinSpace; + var smallestFactor = onlyInteger ? rho(bounds.range) : 0; + + // First check if we should only use integer steps and if step 1 is still larger than scaleMinSpace so we can use 1 + if (onlyInteger && projectLength(axisLength, 1, bounds) >= scaleMinSpace) { + bounds.step = 1; + } else if (onlyInteger && smallestFactor < bounds.step && projectLength(axisLength, smallestFactor, bounds) >= scaleMinSpace) { + // If step 1 was too small, we can try the smallest factor of range + // If the smallest factor is smaller than the current bounds.step and the projected length of smallest factor + // is larger than the scaleMinSpace we should go for it. + bounds.step = smallestFactor; + } else { + // Trying to divide or multiply by 2 and find the best step value + while (true) { + if (scaleUp && projectLength(axisLength, bounds.step, bounds) <= scaleMinSpace) { + bounds.step *= 2; + } else if (!scaleUp && projectLength(axisLength, bounds.step / 2, bounds) >= scaleMinSpace) { + bounds.step /= 2; + if (onlyInteger && bounds.step % 1 !== 0) { + bounds.step *= 2; + break; + } + } else { + break; + } + + if (optimizationCounter++ > 1000) { + throw new Error('Exceeded maximum number of iterations while optimizing scale step!'); + } + } + } + + var EPSILON = 2.221E-16; + bounds.step = Math.max(bounds.step, EPSILON); + function safeIncrement(value, increment) { + // If increment is too small use *= (1+EPSILON) as a simple nextafter + if (value === (value += increment)) { + value *= 1 + (increment > 0 ? EPSILON : -EPSILON); + } + return value; + } + + // Narrow min and max based on new step + newMin = bounds.min; + newMax = bounds.max; + while (newMin + bounds.step <= bounds.low) { + newMin = safeIncrement(newMin, bounds.step); + } + while (newMax - bounds.step >= bounds.high) { + newMax = safeIncrement(newMax, -bounds.step); + } + bounds.min = newMin; + bounds.max = newMax; + bounds.range = bounds.max - bounds.min; + + var values = []; + for (i = bounds.min; i <= bounds.max; i = safeIncrement(i, bounds.step)) { + var value = roundWithPrecision(i); + if (value !== values[values.length - 1]) { + values.push(i); + } + } + bounds.values = values; + return bounds; +} + +var _classCallCheck = (function (instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +}); + +var _createClass = (function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps); + if (staticProps) defineProperties(Constructor, staticProps); + return Constructor; + }; +})(); + +/** + * This helper class is to wrap multiple `Svg` elements into a list where you can call the `Svg` functions on all elements in the list with one call. This is helpful when you'd like to perform calls with `Svg` on multiple elements. + * An instance of this class is also returned by `Svg.querySelectorAll`. + * + * @memberof Svg + * @param {Array|NodeList} nodeList An Array of SVG DOM nodes or a SVG DOM NodeList (as returned by document.querySelectorAll) + * @constructor + */ +var SvgList = function SvgList(nodeList) { + _classCallCheck(this, SvgList); + + var list = this; + + this.svgElements = []; + for (var i = 0; i < nodeList.length; i++) { + this.svgElements.push(new Svg(nodeList[i])); + } + + // Add delegation methods for Svg + Object.keys(Svg.prototype).filter(function (prototypeProperty) { + return ['constructor', 'parent', 'querySelector', 'querySelectorAll', 'replace', 'append', 'classes', 'height', 'width'].indexOf(prototypeProperty) === -1; + }).forEach(function (prototypeProperty) { + list[prototypeProperty] = function () { + var args = Array.prototype.slice.call(arguments, 0); + list.svgElements.forEach(function (element) { + Svg.prototype[prototypeProperty].apply(element, args); + }); + return list; + }; + }); +}; + +/** + * Svg creates a new SVG object wrapper with a starting element. You can use the wrapper to fluently create sub-elements and modify them. + * + * @memberof Svg + * @constructor + * @param {String|Element} name The name of the SVG element to create or an SVG dom element which should be wrapped into Svg + * @param {Object} attributes An object with properties that will be added as attributes to the SVG element that is created. Attributes with undefined values will not be added. + * @param {String} className This class or class list will be added to the SVG element + * @param {Object} parent The parent SVG wrapper object where this newly created wrapper and it's element will be attached to as child + * @param {Boolean} insertFirst If this param is set to true in conjunction with a parent element the newly created element will be added as first child element in the parent element + */ +var Svg = function () { + function Svg(name, attributes, className, parent, insertFirst) { + _classCallCheck(this, Svg); + + // If Svg is getting called with an SVG element we just return the wrapper + if (name instanceof Element) { + this._node = name; + } else { + this._node = document.createElementNS(namespaces.svg, name); + + // If this is an SVG element created then custom namespace + if (name === 'svg') { + this.attr({ + 'xmlns:ct': namespaces.ct + }); + } + } + + if (attributes) { + this.attr(attributes); + } + + if (className) { + this.addClass(className); + } + + if (parent) { + if (insertFirst && parent._node.firstChild) { + parent._node.insertBefore(this._node, parent._node.firstChild); + } else { + parent._node.appendChild(this._node); + } + } + } + + /** + * Set attributes on the current SVG element of the wrapper you're currently working on. + * + * @memberof Svg + * @param {Object|String} attributes An object with properties that will be added as attributes to the SVG element that is created. Attributes with undefined values will not be added. If this parameter is a String then the function is used as a getter and will return the attribute value. + * @param {String} [ns] If specified, the attribute will be obtained using getAttributeNs. In order to write namepsaced attributes you can use the namespace:attribute notation within the attributes object. + * @return {Object|String} The current wrapper object will be returned so it can be used for chaining or the attribute value if used as getter function. + */ + + + _createClass(Svg, [{ + key: 'attr', + value: function attr(attributes, ns) { + if (typeof attributes === 'string') { + if (ns) { + return this._node.getAttributeNS(ns, attributes); + } else { + return this._node.getAttribute(attributes); + } + } + + Object.keys(attributes).forEach(function (key) { + // If the attribute value is undefined we can skip this one + if (attributes[key] === undefined) { + return; + } + + if (key.indexOf(':') !== -1) { + var namespacedAttribute = key.split(':'); + this._node.setAttributeNS(namespaces[namespacedAttribute[0]], key, attributes[key]); + } else { + this._node.setAttribute(key, attributes[key]); + } + }.bind(this)); + + return this; + } + + /** + * Create a new SVG element whose wrapper object will be selected for further operations. This way you can also create nested groups easily. + * + * @memberof Svg + * @param {String} name The name of the SVG element that should be created as child element of the currently selected element wrapper + * @param {Object} [attributes] An object with properties that will be added as attributes to the SVG element that is created. Attributes with undefined values will not be added. + * @param {String} [className] This class or class list will be added to the SVG element + * @param {Boolean} [insertFirst] If this param is set to true in conjunction with a parent element the newly created element will be added as first child element in the parent element + * @return {Svg} Returns a Svg wrapper object that can be used to modify the containing SVG data + */ + + }, { + key: 'elem', + value: function elem(name, attributes, className, insertFirst) { + return new Svg(name, attributes, className, this, insertFirst); + } + + /** + * Returns the parent Chartist.SVG wrapper object + * + * @memberof Svg + * @return {Svg} Returns a Svg wrapper around the parent node of the current node. If the parent node is not existing or it's not an SVG node then this function will return null. + */ + + }, { + key: 'parent', + value: function parent() { + return this._node.parentNode instanceof SVGElement ? new Svg(this._node.parentNode) : null; + } + + /** + * This method returns a Svg wrapper around the root SVG element of the current tree. + * + * @memberof Svg + * @return {Svg} The root SVG element wrapped in a Svg element + */ + + }, { + key: 'root', + value: function root() { + var node = this._node; + while (node.nodeName !== 'svg') { + node = node.parentNode; + } + return new Svg(node); + } + + /** + * Find the first child SVG element of the current element that matches a CSS selector. The returned object is a Svg wrapper. + * + * @memberof Svg + * @param {String} selector A CSS selector that is used to query for child SVG elements + * @return {Svg} The SVG wrapper for the element found or null if no element was found + */ + + }, { + key: 'querySelector', + value: function querySelector(selector) { + var foundNode = this._node.querySelector(selector); + return foundNode ? new Svg(foundNode) : null; + } + + /** + * Find the all child SVG elements of the current element that match a CSS selector. The returned object is a Svg.List wrapper. + * + * @memberof Svg + * @param {String} selector A CSS selector that is used to query for child SVG elements + * @return {SvgList} The SVG wrapper list for the element found or null if no element was found + */ + + }, { + key: 'querySelectorAll', + value: function querySelectorAll(selector) { + var foundNodes = this._node.querySelectorAll(selector); + return foundNodes.length ? new SvgList(foundNodes) : null; + } + + /** + * Returns the underlying SVG node for the current element. + * + * @memberof Svg + * @returns {Node} + */ + + }, { + key: 'getNode', + value: function getNode() { + return this._node; + } + + /** + * This method creates a foreignObject (see https://developer.mozilla.org/en-US/docs/Web/SVG/Element/foreignObject) that allows to embed HTML content into a SVG graphic. With the help of foreignObjects you can enable the usage of regular HTML elements inside of SVG where they are subject for SVG positioning and transformation but the Browser will use the HTML rendering capabilities for the containing DOM. + * + * @memberof Svg + * @param {Node|String} content The DOM Node, or HTML string that will be converted to a DOM Node, that is then placed into and wrapped by the foreignObject + * @param {String} [attributes] An object with properties that will be added as attributes to the foreignObject element that is created. Attributes with undefined values will not be added. + * @param {String} [className] This class or class list will be added to the SVG element + * @param {Boolean} [insertFirst] Specifies if the foreignObject should be inserted as first child + * @return {Svg} New wrapper object that wraps the foreignObject element + */ + + }, { + key: 'foreignObject', + value: function foreignObject(content, attributes, className, insertFirst) { + // If content is string then we convert it to DOM + // TODO: Handle case where content is not a string nor a DOM Node + if (typeof content === 'string') { + var container = document.createElement('div'); + container.innerHTML = content; + content = container.firstChild; + } + + // Adding namespace to content element + content.setAttribute('xmlns', namespaces.xmlns); + + // Creating the foreignObject without required extension attribute (as described here + // http://www.w3.org/TR/SVG/extend.html#ForeignObjectElement) + var fnObj = this.elem('foreignObject', attributes, className, insertFirst); + + // Add content to foreignObjectElement + fnObj._node.appendChild(content); + + return fnObj; + } + + /** + * This method adds a new text element to the current Svg wrapper. + * + * @memberof Svg + * @param {String} t The text that should be added to the text element that is created + * @return {Svg} The same wrapper object that was used to add the newly created element + */ + + }, { + key: 'text', + value: function text(t) { + this._node.appendChild(document.createTextNode(t)); + return this; + } + + /** + * This method will clear all child nodes of the current wrapper object. + * + * @memberof Svg + * @return {Svg} The same wrapper object that got emptied + */ + + }, { + key: 'empty', + value: function empty() { + while (this._node.firstChild) { + this._node.removeChild(this._node.firstChild); + } + + return this; + } + + /** + * This method will cause the current wrapper to remove itself from its parent wrapper. Use this method if you'd like to get rid of an element in a given DOM structure. + * + * @memberof Svg + * @return {Svg} The parent wrapper object of the element that got removed + */ + + }, { + key: 'remove', + value: function remove() { + this._node.parentNode.removeChild(this._node); + return this.parent(); + } + + /** + * This method will replace the element with a new element that can be created outside of the current DOM. + * + * @memberof Svg + * @param {Svg} newElement The new Svg object that will be used to replace the current wrapper object + * @return {Svg} The wrapper of the new element + */ + + }, { + key: 'replace', + value: function replace(newElement) { + this._node.parentNode.replaceChild(newElement._node, this._node); + return newElement; + } + + /** + * This method will append an element to the current element as a child. + * + * @memberof Svg + * @param {Svg} element The Svg element that should be added as a child + * @param {Boolean} [insertFirst] Specifies if the element should be inserted as first child + * @return {Svg} The wrapper of the appended object + */ + + }, { + key: 'append', + value: function append(element, insertFirst) { + if (insertFirst && this._node.firstChild) { + this._node.insertBefore(element._node, this._node.firstChild); + } else { + this._node.appendChild(element._node); + } + + return this; + } + + /** + * Returns an array of class names that are attached to the current wrapper element. This method can not be chained further. + * + * @memberof Svg + * @return {Array} A list of classes or an empty array if there are no classes on the current element + */ + + }, { + key: 'classes', + value: function classes() { + return this._node.getAttribute('class') ? this._node.getAttribute('class').trim().split(/\s+/) : []; + } + + /** + * Adds one or a space separated list of classes to the current element and ensures the classes are only existing once. + * + * @memberof Svg + * @param {String} names A white space separated list of class names + * @return {Svg} The wrapper of the current element + */ + + }, { + key: 'addClass', + value: function addClass(names) { + this._node.setAttribute('class', this.classes().concat(names.trim().split(/\s+/)).filter(function (elem, pos, self) { + return self.indexOf(elem) === pos; + }).join(' ')); + + return this; + } + + /** + * Removes one or a space separated list of classes from the current element. + * + * @memberof Svg + * @param {String} names A white space separated list of class names + * @return {Svg} The wrapper of the current element + */ + + }, { + key: 'removeClass', + value: function removeClass(names) { + var removedClasses = names.trim().split(/\s+/); + + this._node.setAttribute('class', this.classes().filter(function (name) { + return removedClasses.indexOf(name) === -1; + }).join(' ')); + + return this; + } + + /** + * Removes all classes from the current element. + * + * @memberof Svg + * @return {Svg} The wrapper of the current element + */ + + }, { + key: 'removeAllClasses', + value: function removeAllClasses() { + this._node.setAttribute('class', ''); + return this; + } + + /** + * Get element height using `getBoundingClientRect` + * + * @memberof Svg + * @return {Number} The elements height in pixels + */ + + }, { + key: 'height', + value: function height() { + return this._node.getBoundingClientRect().height; + } + + /** + * Get element width using `getBoundingClientRect` + * + * @memberof Chartist.Core + * @return {Number} The elements width in pixels + */ + + }, { + key: 'width', + value: function width() { + return this._node.getBoundingClientRect().width; + } + + /** + * The animate function lets you animate the current element with SMIL animations. You can add animations for multiple attributes at the same time by using an animation definition object. This object should contain SMIL animation attributes. Please refer to http://www.w3.org/TR/SVG/animate.html for a detailed specification about the available animation attributes. Additionally an easing property can be passed in the animation definition object. This can be a string with a name of an easing function in `Svg.Easing` or an array with four numbers specifying a cubic Bézier curve. + * **An animations object could look like this:** + * ```javascript + * element.animate({ + * opacity: { + * dur: 1000, + * from: 0, + * to: 1 + * }, + * x1: { + * dur: '1000ms', + * from: 100, + * to: 200, + * easing: 'easeOutQuart' + * }, + * y1: { + * dur: '2s', + * from: 0, + * to: 100 + * } + * }); + * ``` + * **Automatic unit conversion** + * For the `dur` and the `begin` animate attribute you can also omit a unit by passing a number. The number will automatically be converted to milli seconds. + * **Guided mode** + * The default behavior of SMIL animations with offset using the `begin` attribute is that the attribute will keep it's original value until the animation starts. Mostly this behavior is not desired as you'd like to have your element attributes already initialized with the animation `from` value even before the animation starts. Also if you don't specify `fill="freeze"` on an animate element or if you delete the animation after it's done (which is done in guided mode) the attribute will switch back to the initial value. This behavior is also not desired when performing simple one-time animations. For one-time animations you'd want to trigger animations immediately instead of relative to the document begin time. That's why in guided mode Svg will also use the `begin` property to schedule a timeout and manually start the animation after the timeout. If you're using multiple SMIL definition objects for an attribute (in an array), guided mode will be disabled for this attribute, even if you explicitly enabled it. + * If guided mode is enabled the following behavior is added: + * - Before the animation starts (even when delayed with `begin`) the animated attribute will be set already to the `from` value of the animation + * - `begin` is explicitly set to `indefinite` so it can be started manually without relying on document begin time (creation) + * - The animate element will be forced to use `fill="freeze"` + * - The animation will be triggered with `beginElement()` in a timeout where `begin` of the definition object is interpreted in milli seconds. If no `begin` was specified the timeout is triggered immediately. + * - After the animation the element attribute value will be set to the `to` value of the animation + * - The animate element is deleted from the DOM + * + * @memberof Svg + * @param {Object} animations An animations object where the property keys are the attributes you'd like to animate. The properties should be objects again that contain the SMIL animation attributes (usually begin, dur, from, and to). The property begin and dur is auto converted (see Automatic unit conversion). You can also schedule multiple animations for the same attribute by passing an Array of SMIL definition objects. Attributes that contain an array of SMIL definition objects will not be executed in guided mode. + * @param {Boolean} guided Specify if guided mode should be activated for this animation (see Guided mode). If not otherwise specified, guided mode will be activated. + * @param {Object} eventEmitter If specified, this event emitter will be notified when an animation starts or ends. + * @return {Svg} The current element where the animation was added + */ + + }, { + key: 'animate', + value: function animate(animations, guided, eventEmitter) { + if (guided === undefined) { + guided = true; + } + + Object.keys(animations).forEach(function createAnimateForAttributes(attribute) { + + function createAnimate(animationDefinition, guided) { + var attributeProperties = {}, + animate, + timeout, + animationEasing; + + // Check if an easing is specified in the definition object and delete it from the object as it will not + // be part of the animate element attributes. + if (animationDefinition.easing) { + // If already an easing Bézier curve array we take it or we lookup a easing array in the Easing object + animationEasing = animationDefinition.easing instanceof Array ? animationDefinition.easing : easings[animationDefinition.easing]; + delete animationDefinition.easing; + } + + // If numeric dur or begin was provided we assume milli seconds + animationDefinition.begin = ensureUnit(animationDefinition.begin, 'ms'); + animationDefinition.dur = ensureUnit(animationDefinition.dur, 'ms'); + + if (animationEasing) { + animationDefinition.calcMode = 'spline'; + animationDefinition.keySplines = animationEasing.join(' '); + animationDefinition.keyTimes = '0;1'; + } + + // Adding "fill: freeze" if we are in guided mode and set initial attribute values + if (guided) { + animationDefinition.fill = 'freeze'; + // Animated property on our element should already be set to the animation from value in guided mode + attributeProperties[attribute] = animationDefinition.from; + this.attr(attributeProperties); + + // In guided mode we also set begin to indefinite so we can trigger the start manually and put the begin + // which needs to be in ms aside + timeout = quantity(animationDefinition.begin || 0).value; + animationDefinition.begin = 'indefinite'; + } + + animate = this.elem('animate', extend({ + attributeName: attribute + }, animationDefinition)); + + if (guided) { + // If guided we take the value that was put aside in timeout and trigger the animation manually with a timeout + setTimeout(function () { + // If beginElement fails we set the animated attribute to the end position and remove the animate element + // This happens if the SMIL ElementTimeControl interface is not supported or any other problems occured in + // the browser. (Currently FF 34 does not support animate elements in foreignObjects) + try { + animate._node.beginElement(); + } catch (err) { + // Set animated attribute to current animated value + attributeProperties[attribute] = animationDefinition.to; + this.attr(attributeProperties); + // Remove the animate element as it's no longer required + animate.remove(); + } + }.bind(this), timeout); + } + + if (eventEmitter) { + animate._node.addEventListener('beginEvent', function handleBeginEvent() { + eventEmitter.emit('animationBegin', { + element: this, + animate: animate._node, + params: animationDefinition + }); + }.bind(this)); + } + + animate._node.addEventListener('endEvent', function handleEndEvent() { + if (eventEmitter) { + eventEmitter.emit('animationEnd', { + element: this, + animate: animate._node, + params: animationDefinition + }); + } + + if (guided) { + // Set animated attribute to current animated value + attributeProperties[attribute] = animationDefinition.to; + this.attr(attributeProperties); + // Remove the animate element as it's no longer required + animate.remove(); + } + }.bind(this)); + } + + // If current attribute is an array of definition objects we create an animate for each and disable guided mode + if (animations[attribute] instanceof Array) { + animations[attribute].forEach(function (animationDefinition) { + createAnimate.bind(this)(animationDefinition, false); + }.bind(this)); + } else { + createAnimate.bind(this)(animations[attribute], guided); + } + }.bind(this)); + + return this; + } + }]); + + return Svg; +}(); + +/** + * This method checks for support of a given SVG feature like Extensibility, SVG-animation or the like. Check http://www.w3.org/TR/SVG11/feature for a detailed list. + * + * @memberof Svg + * @param {String} feature The SVG 1.1 feature that should be checked for support. + * @return {Boolean} True of false if the feature is supported or not + */ +function isSupported(feature) { + return document.implementation.hasFeature('http://www.w3.org/TR/SVG11/feature#' + feature, '1.1'); +} + +/** + * This Object contains some standard easing cubic bezier curves. Then can be used with their name in the `Svg.animate`. You can also extend the list and use your own name in the `animate` function. Click the show code button to see the available bezier functions. + * + * @memberof Svg + */ +var easings = { + easeInSine: [0.47, 0, 0.745, 0.715], + easeOutSine: [0.39, 0.575, 0.565, 1], + easeInOutSine: [0.445, 0.05, 0.55, 0.95], + easeInQuad: [0.55, 0.085, 0.68, 0.53], + easeOutQuad: [0.25, 0.46, 0.45, 0.94], + easeInOutQuad: [0.455, 0.03, 0.515, 0.955], + easeInCubic: [0.55, 0.055, 0.675, 0.19], + easeOutCubic: [0.215, 0.61, 0.355, 1], + easeInOutCubic: [0.645, 0.045, 0.355, 1], + easeInQuart: [0.895, 0.03, 0.685, 0.22], + easeOutQuart: [0.165, 0.84, 0.44, 1], + easeInOutQuart: [0.77, 0, 0.175, 1], + easeInQuint: [0.755, 0.05, 0.855, 0.06], + easeOutQuint: [0.23, 1, 0.32, 1], + easeInOutQuint: [0.86, 0, 0.07, 1], + easeInExpo: [0.95, 0.05, 0.795, 0.035], + easeOutExpo: [0.19, 1, 0.22, 1], + easeInOutExpo: [1, 0, 0, 1], + easeInCirc: [0.6, 0.04, 0.98, 0.335], + easeOutCirc: [0.075, 0.82, 0.165, 1], + easeInOutCirc: [0.785, 0.135, 0.15, 0.86], + easeInBack: [0.6, -0.28, 0.735, 0.045], + easeOutBack: [0.175, 0.885, 0.32, 1.275], + easeInOutBack: [0.68, -0.55, 0.265, 1.55] +}; + +/** + * Create or reinitialize the SVG element for the chart + * + * @memberof Chartist.Core + * @param {Node} container The containing DOM Node object that will be used to plant the SVG element + * @param {String} width Set the width of the SVG element. Default is 100% + * @param {String} height Set the height of the SVG element. Default is 100% + * @param {String} className Specify a class to be added to the SVG element + * @return {Object} The created/reinitialized SVG element + */ +function createSvg(container, width, height, className) { + var svg; + + width = width || '100%'; + height = height || '100%'; + + // Check if there is a previous SVG element in the container that contains the Chartist XML namespace and remove it + // Since the DOM API does not support namespaces we need to manually search the returned list http://www.w3.org/TR/selectors-api/ + Array.prototype.slice.call(container.querySelectorAll('svg')).filter(function filterChartistSvgObjects(svg) { + return svg.getAttributeNS(namespaces.xmlns, 'ct'); + }).forEach(function removePreviousElement(svg) { + container.removeChild(svg); + }); + + // Create svg object with width and height or use 100% as default + svg = new Svg('svg').attr({ + width: width, + height: height + }).addClass(className).attr({ + style: 'width: ' + width + '; height: ' + height + ';' + }); + + // Add the DOM node to our container + container.appendChild(svg._node); + + return svg; +} + +/** + * Converts a number into a padding object. + * + * @memberof Chartist.Core + * @param {Object|Number} padding + * @param {Number} [fallback] This value is used to fill missing values if a incomplete padding object was passed + * @returns {Object} Returns a padding object containing top, right, bottom, left properties filled with the padding number passed in as argument. If the argument is something else than a number (presumably already a correct padding object) then this argument is directly returned. + */ +function normalizePadding(padding, fallback) { + fallback = fallback || 0; + + return typeof padding === 'number' ? { + top: padding, + right: padding, + bottom: padding, + left: padding + } : { + top: typeof padding.top === 'number' ? padding.top : fallback, + right: typeof padding.right === 'number' ? padding.right : fallback, + bottom: typeof padding.bottom === 'number' ? padding.bottom : fallback, + left: typeof padding.left === 'number' ? padding.left : fallback + }; +} + +/** + * Initialize chart drawing rectangle (area where chart is drawn) x1,y1 = bottom left / x2,y2 = top right + * + * @memberof Chartist.Core + * @param {Object} svg The svg element for the chart + * @param {Object} options The Object that contains all the optional values for the chart + * @param {Number} [fallbackPadding] The fallback padding if partial padding objects are used + * @return {Object} The chart rectangles coordinates inside the svg element plus the rectangles measurements + */ +function createChartRect(svg, options, fallbackPadding) { + var hasAxis = !!(options.axisX || options.axisY); + var yAxisOffset = hasAxis ? options.axisY.offset : 0; + var xAxisOffset = hasAxis ? options.axisX.offset : 0; + // If width or height results in invalid value (including 0) we fallback to the unitless settings or even 0 + var width = svg.width() || quantity(options.width).value || 0; + var height = svg.height() || quantity(options.height).value || 0; + var normalizedPadding = normalizePadding(options.chartPadding, fallbackPadding); + + // If settings were to small to cope with offset (legacy) and padding, we'll adjust + width = Math.max(width, yAxisOffset + normalizedPadding.left + normalizedPadding.right); + height = Math.max(height, xAxisOffset + normalizedPadding.top + normalizedPadding.bottom); + + var chartRect = { + padding: normalizedPadding, + width: function width() { + return this.x2 - this.x1; + }, + height: function height() { + return this.y1 - this.y2; + } + }; + + if (hasAxis) { + if (options.axisX.position === 'start') { + chartRect.y2 = normalizedPadding.top + xAxisOffset; + chartRect.y1 = Math.max(height - normalizedPadding.bottom, chartRect.y2 + 1); + } else { + chartRect.y2 = normalizedPadding.top; + chartRect.y1 = Math.max(height - normalizedPadding.bottom - xAxisOffset, chartRect.y2 + 1); + } + + if (options.axisY.position === 'start') { + chartRect.x1 = normalizedPadding.left + yAxisOffset; + chartRect.x2 = Math.max(width - normalizedPadding.right, chartRect.x1 + 1); + } else { + chartRect.x1 = normalizedPadding.left; + chartRect.x2 = Math.max(width - normalizedPadding.right - yAxisOffset, chartRect.x1 + 1); + } + } else { + chartRect.x1 = normalizedPadding.left; + chartRect.x2 = Math.max(width - normalizedPadding.right, chartRect.x1 + 1); + chartRect.y2 = normalizedPadding.top; + chartRect.y1 = Math.max(height - normalizedPadding.bottom, chartRect.y2 + 1); + } + + return chartRect; +} + +/** + * Creates a grid line based on a projected value. + * + * @memberof Chartist.Core + * @param position + * @param index + * @param axis + * @param offset + * @param length + * @param group + * @param classes + * @param eventEmitter + */ +function createGrid(position, index, axis, offset, length, group, classes, eventEmitter) { + var positionalData = {}; + positionalData[axis.units.pos + '1'] = position; + positionalData[axis.units.pos + '2'] = position; + positionalData[axis.counterUnits.pos + '1'] = offset; + positionalData[axis.counterUnits.pos + '2'] = offset + length; + + var gridElement = group.elem('line', positionalData, classes.join(' ')); + + // Event for grid draw + eventEmitter.emit('draw', extend({ + type: 'grid', + axis: axis, + index: index, + group: group, + element: gridElement + }, positionalData)); +} + +/** + * Creates a grid background rect and emits the draw event. + * + * @memberof Chartist.Core + * @param gridGroup + * @param chartRect + * @param className + * @param eventEmitter + */ +function createGridBackground(gridGroup, chartRect, className, eventEmitter) { + var gridBackground = gridGroup.elem('rect', { + x: chartRect.x1, + y: chartRect.y2, + width: chartRect.width(), + height: chartRect.height() + }, className, true); + + // Event for grid background draw + eventEmitter.emit('draw', { + type: 'gridBackground', + group: gridGroup, + element: gridBackground + }); +} + +/** + * Creates a label based on a projected value and an axis. + * + * @memberof Chartist.Core + * @param position + * @param length + * @param index + * @param labels + * @param axis + * @param axisOffset + * @param labelOffset + * @param group + * @param classes + * @param useForeignObject + * @param eventEmitter + */ +function createLabel(position, length, index, labels, axis, axisOffset, labelOffset, group, classes, useForeignObject, eventEmitter) { + var labelElement; + var positionalData = {}; + + positionalData[axis.units.pos] = position + labelOffset[axis.units.pos]; + positionalData[axis.counterUnits.pos] = labelOffset[axis.counterUnits.pos]; + positionalData[axis.units.len] = length; + positionalData[axis.counterUnits.len] = Math.max(0, axisOffset - 10); + + if (useForeignObject) { + // We need to set width and height explicitly to px as span will not expand with width and height being + // 100% in all browsers + var content = '' + labels[index] + ''; + + labelElement = group.foreignObject(content, extend({ + style: 'overflow: visible;' + }, positionalData)); + } else { + labelElement = group.elem('text', positionalData, classes.join(' ')).text(labels[index]); + } + + eventEmitter.emit('draw', extend({ + type: 'label', + axis: axis, + index: index, + group: group, + element: labelElement, + text: labels[index] + }, positionalData)); +} + +/** + * Provides options handling functionality with callback for options changes triggered by responsive options and media query matches + * + * @memberof Chartist.Core + * @param {Object} options Options set by user + * @param {Array} responsiveOptions Optional functions to add responsive behavior to chart + * @param {Object} eventEmitter The event emitter that will be used to emit the options changed events + * @return {Object} The consolidated options object from the defaults, base and matching responsive options + */ +function optionsProvider(options, responsiveOptions, eventEmitter) { + var baseOptions = extend({}, options), + currentOptions, + mediaQueryListeners = [], + i; + + function updateCurrentOptions(mediaEvent) { + var previousOptions = currentOptions; + currentOptions = extend({}, baseOptions); + + if (responsiveOptions) { + for (i = 0; i < responsiveOptions.length; i++) { + var mql = window.matchMedia(responsiveOptions[i][0]); + if (mql.matches) { + currentOptions = extend(currentOptions, responsiveOptions[i][1]); + } + } + } + + if (eventEmitter && mediaEvent) { + eventEmitter.emit('optionsChanged', { + previousOptions: previousOptions, + currentOptions: currentOptions + }); + } + } + + function removeMediaQueryListeners() { + mediaQueryListeners.forEach(function (mql) { + mql.removeListener(updateCurrentOptions); + }); + } + + if (!window.matchMedia) { + throw 'window.matchMedia not found! Make sure you\'re using a polyfill.'; + } else if (responsiveOptions) { + + for (i = 0; i < responsiveOptions.length; i++) { + var mql = window.matchMedia(responsiveOptions[i][0]); + mql.addListener(updateCurrentOptions); + mediaQueryListeners.push(mql); + } + } + // Execute initially without an event argument so we get the correct options + updateCurrentOptions(); + + return { + removeMediaQueryListeners: removeMediaQueryListeners, + getCurrentOptions: function getCurrentOptions() { + return extend({}, currentOptions); + } + }; +} + +var EventEmitter = function () { + function EventEmitter() { + _classCallCheck(this, EventEmitter); + + this.handlers = []; + } + + /** + * Add an event handler for a specific event + * + * @memberof Chartist.Event + * @param {String} event The event name + * @param {Function} handler A event handler function + */ + + + _createClass(EventEmitter, [{ + key: 'addEventHandler', + value: function addEventHandler(event, handler) { + this.handlers[event] = this.handlers[event] || []; + this.handlers[event].push(handler); + } + + /** + * Remove an event handler of a specific event name or remove all event handlers for a specific event. + * + * @memberof Chartist.Event + * @param {String} event The event name where a specific or all handlers should be removed + * @param {Function} [handler] An optional event handler function. If specified only this specific handler will be removed and otherwise all handlers are removed. + */ + + }, { + key: 'removeEventHandler', + value: function removeEventHandler(event, handler) { + // Only do something if there are event handlers with this name existing + if (this.handlers[event]) { + // If handler is set we will look for a specific handler and only remove this + if (handler) { + this.handlers[event].splice(this.handlers[event].indexOf(handler), 1); + if (this.handlers[event].length === 0) { + delete this.handlers[event]; + } + } else { + // If no handler is specified we remove all handlers for this event + delete this.handlers[event]; + } + } + } + + /** + * Use this function to emit an event. All handlers that are listening for this event will be triggered with the data parameter. + * + * @memberof Chartist.Event + * @param {String} event The event name that should be triggered + * @param {*} data Arbitrary data that will be passed to the event handler callback functions + */ + + }, { + key: 'emit', + value: function emit(event, data) { + // Only do something if there are event handlers with this name existing + if (this.handlers[event]) { + this.handlers[event].forEach(function (handler) { + handler(data); + }); + } + + // Emit event to star event handlers + if (this.handlers['*']) { + this.handlers['*'].forEach(function (starHandler) { + starHandler(event, data); + }); + } + } + }]); + + return EventEmitter; +}(); + +var BaseChart = function () { + /** + * Constructor of chart base class. + * + * @param query + * @param data + * @param defaultOptions + * @param options + * @param responsiveOptions + * @constructor + */ + function BaseChart(query, data, defaultOptions, options, responsiveOptions) { + _classCallCheck(this, BaseChart); + + this.container = querySelector$1(query); + this.data = data || {}; + this.data.labels = this.data.labels || []; + this.data.series = this.data.series || []; + this.defaultOptions = defaultOptions; + this.options = options; + this.responsiveOptions = responsiveOptions; + this.eventEmitter = new EventEmitter(); + this.supportsForeignObject = isSupported('Extensibility'); + this.supportsAnimations = isSupported('AnimationEventsAttribute'); + this.resizeListener = function resizeListener() { + this.update(); + }.bind(this); + + if (this.container) { + // If chartist was already initialized in this container we are detaching all event listeners first + if (this.container.__chartist__) { + this.container.__chartist__.detach(); + } + + this.container.__chartist__ = this; + } + + // Using event loop for first draw to make it possible to register event listeners in the same call stack where + // the chart was created. + this.initializeTimeoutId = setTimeout(this.initialize.bind(this), 0); + } + + _createClass(BaseChart, [{ + key: 'createChart', + value: function createChart() { + throw new Error('Base chart type can\'t be instantiated!'); + } + + // TODO: Currently we need to re-draw the chart on window resize. This is usually very bad and will affect performance. + // This is done because we can't work with relative coordinates when drawing the chart because SVG Path does not + // work with relative positions yet. We need to check if we can do a viewBox hack to switch to percentage. + // See http://mozilla.6506.n7.nabble.com/Specyfing-paths-with-percentages-unit-td247474.html + // Update: can be done using the above method tested here: http://codepen.io/gionkunz/pen/KDvLj + // The problem is with the label offsets that can't be converted into percentage and affecting the chart container + /** + * Updates the chart which currently does a full reconstruction of the SVG DOM + * + * @param {Object} [data] Optional data you'd like to set for the chart before it will update. If not specified the update method will use the data that is already configured with the chart. + * @param {Object} [options] Optional options you'd like to add to the previous options for the chart before it will update. If not specified the update method will use the options that have been already configured with the chart. + * @param {Boolean} [override] If set to true, the passed options will be used to extend the options that have been configured already. Otherwise the chart default options will be used as the base + * @memberof Chartist.Base + */ + + }, { + key: 'update', + value: function update(data, options, override) { + if (data) { + this.data = data || {}; + this.data.labels = this.data.labels || []; + this.data.series = this.data.series || []; + // Event for data transformation that allows to manipulate the data before it gets rendered in the charts + this.eventEmitter.emit('data', { + type: 'update', + data: this.data + }); + } + + if (options) { + this.options = extend({}, override ? this.options : this.defaultOptions, options); + + // If chartist was not initialized yet, we just set the options and leave the rest to the initialization + // Otherwise we re-create the optionsProvider at this point + if (!this.initializeTimeoutId) { + this.optionsProvider.removeMediaQueryListeners(); + this.optionsProvider = optionsProvider(this.options, this.responsiveOptions, this.eventEmitter); + } + } + + // Only re-created the chart if it has been initialized yet + if (!this.initializeTimeoutId) { + this.createChart(this.optionsProvider.getCurrentOptions()); + } + + // Return a reference to the chart object to chain up calls + return this; + } + + /** + * This method can be called on the API object of each chart and will un-register all event listeners that were added to other components. This currently includes a window.resize listener as well as media query listeners if any responsive options have been provided. Use this function if you need to destroy and recreate Chartist charts dynamically. + * + * @memberof Chartist.Base + */ + + }, { + key: 'detach', + value: function detach() { + // Only detach if initialization already occurred on this chart. If this chart still hasn't initialized (therefore + // the initializationTimeoutId is still a valid timeout reference, we will clear the timeout + if (!this.initializeTimeoutId) { + window.removeEventListener('resize', this.resizeListener); + this.optionsProvider.removeMediaQueryListeners(); + } else { + window.clearTimeout(this.initializeTimeoutId); + } + + return this; + } + + /** + * Use this function to register event handlers. The handler callbacks are synchronous and will run in the main thread rather than the event loop. + * + * @memberof Chartist.Base + * @param {String} event Name of the event. Check the examples for supported events. + * @param {Function} handler The handler function that will be called when an event with the given name was emitted. This function will receive a data argument which contains event data. See the example for more details. + */ + + }, { + key: 'on', + value: function on(event, handler) { + this.eventEmitter.addEventHandler(event, handler); + return this; + } + + /** + * Use this function to un-register event handlers. If the handler function parameter is omitted all handlers for the given event will be un-registered. + * + * @memberof Chartist.Base + * @param {String} event Name of the event for which a handler should be removed + * @param {Function} [handler] The handler function that that was previously used to register a new event handler. This handler will be removed from the event handler list. If this parameter is omitted then all event handlers for the given event are removed from the list. + */ + + }, { + key: 'off', + value: function off(event, handler) { + this.eventEmitter.removeEventHandler(event, handler); + return this; + } + }, { + key: 'initialize', + value: function initialize() { + // Add window resize listener that re-creates the chart + window.addEventListener('resize', this.resizeListener); + + // Obtain current options based on matching media queries (if responsive options are given) + // This will also register a listener that is re-creating the chart based on media changes + this.optionsProvider = optionsProvider(this.options, this.responsiveOptions, this.eventEmitter); + // Register options change listener that will trigger a chart update + this.eventEmitter.addEventHandler('optionsChanged', function () { + this.update(); + }.bind(this)); + + // Before the first chart creation we need to register us with all plugins that are configured + // Initialize all relevant plugins with our chart object and the plugin options specified in the config + if (this.options.plugins) { + this.options.plugins.forEach(function (plugin) { + if (plugin instanceof Array) { + plugin[0](this, plugin[1]); + } else { + plugin(this); + } + }.bind(this)); + } + + // Event for data transformation that allows to manipulate the data before it gets rendered in the charts + this.eventEmitter.emit('data', { + type: 'initial', + data: this.data + }); + + // Create the first chart + this.createChart(this.optionsProvider.getCurrentOptions()); + + // As chart is initialized from the event loop now we can reset our timeout reference + // This is important if the chart gets initialized on the same element twice + this.initializeTimeoutId = undefined; + } + }]); + + return BaseChart; +}(); + +var _possibleConstructorReturn = (function (self, call) { + if (!self) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + + return call && (typeof call === "object" || typeof call === "function") ? call : self; +}); + +var _inherits = (function (subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); + } + + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + enumerable: false, + writable: true, + configurable: true + } + }); + if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; +}); + +var axisUnits = { + x: { + pos: 'x', + len: 'width', + dir: 'horizontal', + rectStart: 'x1', + rectEnd: 'x2', + rectOffset: 'y2' + }, + y: { + pos: 'y', + len: 'height', + dir: 'vertical', + rectStart: 'y2', + rectEnd: 'y1', + rectOffset: 'x1' + } +}; + +var Axis = function () { + function Axis() { + _classCallCheck(this, Axis); + } + + _createClass(Axis, [{ + key: 'initialize', + value: function initialize(units, chartRect, ticks, options) { + this.units = units; + this.counterUnits = units === axisUnits.x ? axisUnits.y : axisUnits.x; + this.options = options; + this.chartRect = chartRect; + this.axisLength = chartRect[this.units.rectEnd] - chartRect[this.units.rectStart]; + this.gridOffset = chartRect[this.units.rectOffset]; + this.ticks = ticks; + } + }, { + key: 'projectValue', + value: function projectValue(value, index, data) { + throw new Error('Base axis can\'t be instantiated!'); + } + }, { + key: 'createGridAndLabels', + value: function createGridAndLabels(gridGroup, labelGroup, useForeignObject, chartOptions, eventEmitter) { + var axisOptions = chartOptions['axis' + this.units.pos.toUpperCase()]; + var projectedValues = this.ticks.map(this.projectValue.bind(this)); + var labelValues = this.ticks.map(axisOptions.labelInterpolationFnc); + + projectedValues.forEach(function (projectedValue, index) { + var labelOffset = { + x: 0, + y: 0 + }; + + // TODO: Find better solution for solving this problem + // Calculate how much space we have available for the label + var labelLength; + if (projectedValues[index + 1]) { + // If we still have one label ahead, we can calculate the distance to the next tick / label + labelLength = projectedValues[index + 1] - projectedValue; + } else { + // If we don't have a label ahead and we have only two labels in total, we just take the remaining distance to + // on the whole axis length. We limit that to a minimum of 30 pixel, so that labels close to the border will + // still be visible inside of the chart padding. + labelLength = Math.max(this.axisLength - projectedValue, 30); + } + + // Skip grid lines and labels where interpolated label values are falsey (execpt for 0) + if (isFalseyButZero(labelValues[index]) && labelValues[index] !== '') { + return; + } + + // Transform to global coordinates using the chartRect + // We also need to set the label offset for the createLabel function + if (this.units.pos === 'x') { + projectedValue = this.chartRect.x1 + projectedValue; + labelOffset.x = chartOptions.axisX.labelOffset.x; + + // If the labels should be positioned in start position (top side for vertical axis) we need to set a + // different offset as for positioned with end (bottom) + if (chartOptions.axisX.position === 'start') { + labelOffset.y = this.chartRect.padding.top + chartOptions.axisX.labelOffset.y + (useForeignObject ? 5 : 20); + } else { + labelOffset.y = this.chartRect.y1 + chartOptions.axisX.labelOffset.y + (useForeignObject ? 5 : 20); + } + } else { + projectedValue = this.chartRect.y1 - projectedValue; + labelOffset.y = chartOptions.axisY.labelOffset.y - (useForeignObject ? labelLength : 0); + + // If the labels should be positioned in start position (left side for horizontal axis) we need to set a + // different offset as for positioned with end (right side) + if (chartOptions.axisY.position === 'start') { + labelOffset.x = useForeignObject ? this.chartRect.padding.left + chartOptions.axisY.labelOffset.x : this.chartRect.x1 - 10; + } else { + labelOffset.x = this.chartRect.x2 + chartOptions.axisY.labelOffset.x + 10; + } + } + + if (axisOptions.showGrid) { + createGrid(projectedValue, index, this, this.gridOffset, this.chartRect[this.counterUnits.len](), gridGroup, [chartOptions.classNames.grid, chartOptions.classNames[this.units.dir]], eventEmitter); + } + + if (axisOptions.showLabel) { + createLabel(projectedValue, labelLength, index, labelValues, this, axisOptions.offset, labelOffset, labelGroup, [chartOptions.classNames.label, chartOptions.classNames[this.units.dir], axisOptions.position === 'start' ? chartOptions.classNames[axisOptions.position] : chartOptions.classNames['end']], useForeignObject, eventEmitter); + } + }.bind(this)); + } + }]); + + return Axis; +}(); + +var _get = (function get(object, property, receiver) { + if (object === null) object = Function.prototype; + var desc = Object.getOwnPropertyDescriptor(object, property); + + if (desc === undefined) { + var parent = Object.getPrototypeOf(object); + + if (parent === null) { + return undefined; + } else { + return get(parent, property, receiver); + } + } else if ("value" in desc) { + return desc.value; + } else { + var getter = desc.get; + + if (getter === undefined) { + return undefined; + } + + return getter.call(receiver); + } +}); + +var AutoScaleAxis = function (_Axis) { + _inherits(AutoScaleAxis, _Axis); + + function AutoScaleAxis(axisUnit, data, chartRect, options) { + _classCallCheck(this, AutoScaleAxis); + + // Usually we calculate highLow based on the data but this can be overriden by a highLow object in the options + var _this = _possibleConstructorReturn(this, (AutoScaleAxis.__proto__ || Object.getPrototypeOf(AutoScaleAxis)).call(this)); + + var highLow = options.highLow || getHighLow(data, options, axisUnit.pos); + _this.bounds = getBounds(chartRect[axisUnit.rectEnd] - chartRect[axisUnit.rectStart], highLow, options.scaleMinSpace || 20, options.onlyInteger); + _this.range = { + min: _this.bounds.min, + max: _this.bounds.max + }; + + _get(AutoScaleAxis.prototype.__proto__ || Object.getPrototypeOf(AutoScaleAxis.prototype), 'initialize', _this).call(_this, axisUnit, chartRect, _this.bounds.values, options); + return _this; + } + + _createClass(AutoScaleAxis, [{ + key: 'projectValue', + value: function projectValue(value) { + return this.axisLength * (+getMultiValue(value, this.units.pos) - this.bounds.min) / this.bounds.range; + } + }]); + + return AutoScaleAxis; +}(Axis); + +var FixedScaleAxis = function (_Axis) { + _inherits(FixedScaleAxis, _Axis); + + function FixedScaleAxis(axisUnit, data, chartRect, options) { + _classCallCheck(this, FixedScaleAxis); + + var _this = _possibleConstructorReturn(this, (FixedScaleAxis.__proto__ || Object.getPrototypeOf(FixedScaleAxis)).call(this)); + + var highLow = options.highLow || getHighLow(data, options, axisUnit.pos); + _this.divisor = options.divisor || 1; + _this.ticks = options.ticks || times(_this.divisor).map(function (value, index) { + return highLow.low + (highLow.high - highLow.low) / this.divisor * index; + }.bind(_this)); + _this.ticks.sort(function (a, b) { + return a - b; + }); + _this.range = { + min: highLow.low, + max: highLow.high + }; + + _get(FixedScaleAxis.prototype.__proto__ || Object.getPrototypeOf(FixedScaleAxis.prototype), 'initialize', _this).call(_this, axisUnit, chartRect, _this.ticks, options); + + _this.stepLength = _this.axisLength / _this.divisor; + return _this; + } + + _createClass(FixedScaleAxis, [{ + key: 'projectValue', + value: function projectValue(value) { + return this.axisLength * (+getMultiValue(value, this.units.pos) - this.range.min) / (this.range.max - this.range.min); + } + }]); + + return FixedScaleAxis; +}(Axis); + +var StepAxis = function (_Axis) { + _inherits(StepAxis, _Axis); + + function StepAxis(axisUnit, data, chartRect, options) { + _classCallCheck(this, StepAxis); + + var _this = _possibleConstructorReturn(this, (StepAxis.__proto__ || Object.getPrototypeOf(StepAxis)).call(this)); + + _get(StepAxis.prototype.__proto__ || Object.getPrototypeOf(StepAxis.prototype), 'initialize', _this).call(_this, axisUnit, chartRect, options.ticks, options); + + var calc = Math.max(1, options.ticks.length - (options.stretch ? 1 : 0)); + _this.stepLength = _this.axisLength / calc; + return _this; + } + + _createClass(StepAxis, [{ + key: 'projectValue', + value: function projectValue(value, index) { + return this.stepLength * index; + } + }]); + + return StepAxis; +}(Axis); + +/** + * Contains the descriptors of supported element types in a SVG path. Currently only move, line and curve are supported. + * + * @memberof SvgPath + * @type {Object} + */ +var elementDescriptions = { + m: ['x', 'y'], + l: ['x', 'y'], + c: ['x1', 'y1', 'x2', 'y2', 'x', 'y'], + a: ['rx', 'ry', 'xAr', 'lAf', 'sf', 'x', 'y'] +}; + +/** + * Default options for newly created SVG path objects. + * + * @memberof SvgPath + * @type {Object} + */ +var defaultOptions$1 = { + // The accuracy in digit count after the decimal point. This will be used to round numbers in the SVG path. If this option is set to false then no rounding will be performed. + accuracy: 3 +}; + +function element(command, params, pathElements, pos, relative, data) { + var pathElement = extend({ + command: relative ? command.toLowerCase() : command.toUpperCase() + }, params, data ? { data: data } : {}); + + pathElements.splice(pos, 0, pathElement); +} + +function forEachParam(pathElements, cb) { + pathElements.forEach(function (pathElement, pathElementIndex) { + elementDescriptions[pathElement.command.toLowerCase()].forEach(function (paramName, paramIndex) { + cb(pathElement, paramName, pathElementIndex, paramIndex, pathElements); + }); + }); +} + +/** + * Used to construct a new path object. + * + * @memberof SvgPath + * @param {Boolean} close If set to true then this path will be closed when stringified (with a Z at the end) + * @param {Object} options Options object that overrides the default objects. See default options for more details. + * @constructor + */ +var SvgPath = function () { + _createClass(SvgPath, null, [{ + key: 'join', + + /** + * This static function on `SvgPath` is joining multiple paths together into one paths. + * + * @memberof SvgPath + * @param {Array} paths A list of paths to be joined together. The order is important. + * @param {boolean} [close] If the newly created path should be a closed path + * @param {Object} [options] Path options for the newly created path. + * @return {SvgPath} + */ + value: function join(paths, close, options) { + var joinedPath = new SvgPath(close, options); + for (var i = 0; i < paths.length; i++) { + var path = paths[i]; + for (var j = 0; j < path.pathElements.length; j++) { + joinedPath.pathElements.push(path.pathElements[j]); + } + } + return joinedPath; + } + }]); + + function SvgPath(close, options) { + _classCallCheck(this, SvgPath); + + this.pathElements = []; + this.pos = 0; + this.close = close; + this.options = extend({}, defaultOptions$1, options); + } + + /** + * Gets or sets the current position (cursor) inside of the path. You can move around the cursor freely but limited to 0 or the count of existing elements. All modifications with element functions will insert new elements at the position of this cursor. + * + * @memberof SvgPath + * @param {Number} [pos] If a number is passed then the cursor is set to this position in the path element array. + * @return {SvgPath|Number} If the position parameter was passed then the return value will be the path object for easy call chaining. If no position parameter was passed then the current position is returned. + */ + + + _createClass(SvgPath, [{ + key: 'position', + value: function position(pos) { + if (pos !== undefined) { + this.pos = Math.max(0, Math.min(this.pathElements.length, pos)); + return this; + } else { + return this.pos; + } + } + + /** + * Removes elements from the path starting at the current position. + * + * @memberof SvgPath + * @param {Number} count Number of path elements that should be removed from the current position. + * @return {SvgPath} The current path object for easy call chaining. + */ + + }, { + key: 'remove', + value: function remove(count) { + this.pathElements.splice(this.pos, count); + return this; + } + + /** + * Use this function to add a new move SVG path element. + * + * @memberof SvgPath + * @param {Number} x The x coordinate for the move element. + * @param {Number} y The y coordinate for the move element. + * @param {Boolean} [relative] If set to true the move element will be created with relative coordinates (lowercase letter) + * @param {*} [data] Any data that should be stored with the element object that will be accessible in pathElement + * @return {SvgPath} The current path object for easy call chaining. + */ + + }, { + key: 'move', + value: function move(x, y, relative, data) { + element('M', { + x: +x, + y: +y + }, this.pathElements, this.pos++, relative, data); + return this; + } + + /** + * Use this function to add a new line SVG path element. + * + * @memberof SvgPath + * @param {Number} x The x coordinate for the line element. + * @param {Number} y The y coordinate for the line element. + * @param {Boolean} [relative] If set to true the line element will be created with relative coordinates (lowercase letter) + * @param {*} [data] Any data that should be stored with the element object that will be accessible in pathElement + * @return {SvgPath} The current path object for easy call chaining. + */ + + }, { + key: 'line', + value: function line(x, y, relative, data) { + element('L', { + x: +x, + y: +y + }, this.pathElements, this.pos++, relative, data); + return this; + } + + /** + * Use this function to add a new curve SVG path element. + * + * @memberof SvgPath + * @param {Number} x1 The x coordinate for the first control point of the bezier curve. + * @param {Number} y1 The y coordinate for the first control point of the bezier curve. + * @param {Number} x2 The x coordinate for the second control point of the bezier curve. + * @param {Number} y2 The y coordinate for the second control point of the bezier curve. + * @param {Number} x The x coordinate for the target point of the curve element. + * @param {Number} y The y coordinate for the target point of the curve element. + * @param {Boolean} [relative] If set to true the curve element will be created with relative coordinates (lowercase letter) + * @param {*} [data] Any data that should be stored with the element object that will be accessible in pathElement + * @return {SvgPath} The current path object for easy call chaining. + */ + + }, { + key: 'curve', + value: function curve(x1, y1, x2, y2, x, y, relative, data) { + element('C', { + x1: +x1, + y1: +y1, + x2: +x2, + y2: +y2, + x: +x, + y: +y + }, this.pathElements, this.pos++, relative, data); + return this; + } + + /** + * Use this function to add a new non-bezier curve SVG path element. + * + * @memberof SvgPath + * @param {Number} rx The radius to be used for the x-axis of the arc. + * @param {Number} ry The radius to be used for the y-axis of the arc. + * @param {Number} xAr Defines the orientation of the arc + * @param {Number} lAf Large arc flag + * @param {Number} sf Sweep flag + * @param {Number} x The x coordinate for the target point of the curve element. + * @param {Number} y The y coordinate for the target point of the curve element. + * @param {Boolean} [relative] If set to true the curve element will be created with relative coordinates (lowercase letter) + * @param {*} [data] Any data that should be stored with the element object that will be accessible in pathElement + * @return {SvgPath} The current path object for easy call chaining. + */ + + }, { + key: 'arc', + value: function arc(rx, ry, xAr, lAf, sf, x, y, relative, data) { + element('A', { + rx: +rx, + ry: +ry, + xAr: +xAr, + lAf: +lAf, + sf: +sf, + x: +x, + y: +y + }, this.pathElements, this.pos++, relative, data); + return this; + } + + /** + * Parses an SVG path seen in the d attribute of path elements, and inserts the parsed elements into the existing path object at the current cursor position. Any closing path indicators (Z at the end of the path) will be ignored by the parser as this is provided by the close option in the options of the path object. + * + * @memberof SvgPath + * @param {String} path Any SVG path that contains move (m), line (l) or curve (c) components. + * @return {SvgPath} The current path object for easy call chaining. + */ + + }, { + key: 'parse', + value: function parse(path) { + // Parsing the SVG path string into an array of arrays [['M', '10', '10'], ['L', '100', '100']] + var chunks = path.replace(/([A-Za-z])([0-9])/g, '$1 $2').replace(/([0-9])([A-Za-z])/g, '$1 $2').split(/[\s,]+/).reduce(function (result, element) { + if (element.match(/[A-Za-z]/)) { + result.push([]); + } + + result[result.length - 1].push(element); + return result; + }, []); + + // If this is a closed path we remove the Z at the end because this is determined by the close option + if (chunks[chunks.length - 1][0].toUpperCase() === 'Z') { + chunks.pop(); + } + + // Using svgPathElementDescriptions to map raw path arrays into objects that contain the command and the parameters + // For example {command: 'M', x: '10', y: '10'} + var elements = chunks.map(function (chunk) { + var command = chunk.shift(), + description = elementDescriptions[command.toLowerCase()]; + + return extend({ + command: command + }, description.reduce(function (result, paramName, index) { + result[paramName] = +chunk[index]; + return result; + }, {})); + }); + + // Preparing a splice call with the elements array as var arg params and insert the parsed elements at the current position + var spliceArgs = [this.pos, 0]; + Array.prototype.push.apply(spliceArgs, elements); + Array.prototype.splice.apply(this.pathElements, spliceArgs); + // Increase the internal position by the element count + this.pos += elements.length; + + return this; + } + + /** + * This function renders to current SVG path object into a final SVG string that can be used in the d attribute of SVG path elements. It uses the accuracy option to round big decimals. If the close parameter was set in the constructor of this path object then a path closing Z will be appended to the output string. + * + * @memberof SvgPath + * @return {String} + */ + + }, { + key: 'stringify', + value: function stringify() { + var accuracyMultiplier = Math.pow(10, this.options.accuracy); + + return this.pathElements.reduce(function (path, pathElement) { + var params = elementDescriptions[pathElement.command.toLowerCase()].map(function (paramName) { + return this.options.accuracy ? Math.round(pathElement[paramName] * accuracyMultiplier) / accuracyMultiplier : pathElement[paramName]; + }.bind(this)); + + return path + pathElement.command + params.join(','); + }.bind(this), '') + (this.close ? 'Z' : ''); + } + + /** + * Scales all elements in the current SVG path object. There is an individual parameter for each coordinate. Scaling will also be done for control points of curves, affecting the given coordinate. + * + * @memberof SvgPath + * @param {Number} x The number which will be used to scale the x, x1 and x2 of all path elements. + * @param {Number} y The number which will be used to scale the y, y1 and y2 of all path elements. + * @return {SvgPath} The current path object for easy call chaining. + */ + + }, { + key: 'scale', + value: function scale(x, y) { + forEachParam(this.pathElements, function (pathElement, paramName) { + pathElement[paramName] *= paramName[0] === 'x' ? x : y; + }); + return this; + } + + /** + * Translates all elements in the current SVG path object. The translation is relative and there is an individual parameter for each coordinate. Translation will also be done for control points of curves, affecting the given coordinate. + * + * @memberof SvgPath + * @param {Number} x The number which will be used to translate the x, x1 and x2 of all path elements. + * @param {Number} y The number which will be used to translate the y, y1 and y2 of all path elements. + * @return {SvgPath} The current path object for easy call chaining. + */ + + }, { + key: 'translate', + value: function translate(x, y) { + forEachParam(this.pathElements, function (pathElement, paramName) { + pathElement[paramName] += paramName[0] === 'x' ? x : y; + }); + return this; + } + + /** + * This function will run over all existing path elements and then loop over their attributes. The callback function will be called for every path element attribute that exists in the current path. + * The method signature of the callback function looks like this: + * ```javascript + * function(pathElement, paramName, pathElementIndex, paramIndex, pathElements) + * ``` + * If something else than undefined is returned by the callback function, this value will be used to replace the old value. This allows you to build custom transformations of path objects that can't be achieved using the basic transformation functions scale and translate. + * + * @memberof SvgPath + * @param {Function} transformFnc The callback function for the transformation. Check the signature in the function description. + * @return {SvgPath} The current path object for easy call chaining. + */ + + }, { + key: 'transform', + value: function transform(transformFnc) { + forEachParam(this.pathElements, function (pathElement, paramName, pathElementIndex, paramIndex, pathElements) { + var transformed = transformFnc(pathElement, paramName, pathElementIndex, paramIndex, pathElements); + if (transformed || transformed === 0) { + pathElement[paramName] = transformed; + } + }); + return this; + } + + /** + * This function clones a whole path object with all its properties. This is a deep clone and path element objects will also be cloned. + * + * @memberof SvgPath + * @param {Boolean} [close] Optional option to set the new cloned path to closed. If not specified or false, the original path close option will be used. + * @return {SvgPath} + */ + + }, { + key: 'clone', + value: function clone(close) { + var c = new SvgPath(close || this.close); + c.pos = this.pos; + c.pathElements = this.pathElements.slice().map(function cloneElements(pathElement) { + return extend({}, pathElement); + }); + c.options = extend({}, this.options); + return c; + } + + /** + * Split a Svg.Path object by a specific command in the path chain. The path chain will be split and an array of newly created paths objects will be returned. This is useful if you'd like to split an SVG path by it's move commands, for example, in order to isolate chunks of drawings. + * + * @memberof SvgPath + * @param {String} command The command you'd like to use to split the path + * @return {Array} + */ + + }, { + key: 'splitByCommand', + value: function splitByCommand(command) { + var split = [new SvgPath()]; + + this.pathElements.forEach(function (pathElement) { + if (pathElement.command === command.toUpperCase() && split[split.length - 1].pathElements.length !== 0) { + split.push(new SvgPath()); + } + + split[split.length - 1].pathElements.push(pathElement); + }); + + return split; + } + }]); + + return SvgPath; +}(); + +/** + * This interpolation function does not smooth the path and the result is only containing lines and no curves. + * + * @example + * var chart = new Chartist.Line('.ct-chart', { + * labels: [1, 2, 3, 4, 5], + * series: [[1, 2, 8, 1, 7]] + * }, { + * lineSmooth: Chartist.Interpolation.none({ + * fillHoles: false + * }) + * }); + * + * + * @memberof Chartist.Interpolation + * @return {Function} + */ +function none(options) { + var defaultOptions = { + fillHoles: false + }; + options = extend({}, defaultOptions, options); + return function none(pathCoordinates, valueData) { + var path = new SvgPath(); + var hole = true; + + for (var i = 0; i < pathCoordinates.length; i += 2) { + var currX = pathCoordinates[i]; + var currY = pathCoordinates[i + 1]; + var currData = valueData[i / 2]; + + if (getMultiValue(currData.value) !== undefined) { + + if (hole) { + path.move(currX, currY, false, currData); + } else { + path.line(currX, currY, false, currData); + } + + hole = false; + } else if (!options.fillHoles) { + hole = true; + } + } + + return path; + }; +} + +/** + * Simple smoothing creates horizontal handles that are positioned with a fraction of the length between two data points. You can use the divisor option to specify the amount of smoothing. + * + * Simple smoothing can be used instead of `Chartist.Smoothing.cardinal` if you'd like to get rid of the artifacts it produces sometimes. Simple smoothing produces less flowing lines but is accurate by hitting the points and it also doesn't swing below or above the given data point. + * + * All smoothing functions within Chartist are factory functions that accept an options parameter. The simple interpolation function accepts one configuration parameter `divisor`, between 1 and ∞, which controls the smoothing characteristics. + * + * @example + * var chart = new Chartist.Line('.ct-chart', { + * labels: [1, 2, 3, 4, 5], + * series: [[1, 2, 8, 1, 7]] + * }, { + * lineSmooth: Chartist.Interpolation.simple({ + * divisor: 2, + * fillHoles: false + * }) + * }); + * + * + * @memberof Chartist.Interpolation + * @param {Object} options The options of the simple interpolation factory function. + * @return {Function} + */ +function simple(options) { + var defaultOptions = { + divisor: 2, + fillHoles: false + }; + options = extend({}, defaultOptions, options); + + var d = 1 / Math.max(1, options.divisor); + + return function simple(pathCoordinates, valueData) { + var path = new SvgPath(); + var prevX, prevY, prevData; + + for (var i = 0; i < pathCoordinates.length; i += 2) { + var currX = pathCoordinates[i]; + var currY = pathCoordinates[i + 1]; + var length = (currX - prevX) * d; + var currData = valueData[i / 2]; + + if (currData.value !== undefined) { + + if (prevData === undefined) { + path.move(currX, currY, false, currData); + } else { + path.curve(prevX + length, prevY, currX - length, currY, currX, currY, false, currData); + } + + prevX = currX; + prevY = currY; + prevData = currData; + } else if (!options.fillHoles) { + prevX = currX = prevData = undefined; + } + } + + return path; + }; +} + +/** + * Step interpolation will cause the line chart to move in steps rather than diagonal or smoothed lines. This interpolation will create additional points that will also be drawn when the `showPoint` option is enabled. + * + * All smoothing functions within Chartist are factory functions that accept an options parameter. The step interpolation function accepts one configuration parameter `postpone`, that can be `true` or `false`. The default value is `true` and will cause the step to occur where the value actually changes. If a different behaviour is needed where the step is shifted to the left and happens before the actual value, this option can be set to `false`. + * + * @example + * var chart = new Chartist.Line('.ct-chart', { + * labels: [1, 2, 3, 4, 5], + * series: [[1, 2, 8, 1, 7]] + * }, { + * lineSmooth: Chartist.Interpolation.step({ + * postpone: true, + * fillHoles: false + * }) + * }); + * + * @memberof Chartist.Interpolation + * @param options + * @returns {Function} + */ +function step(options) { + var defaultOptions = { + postpone: true, + fillHoles: false + }; + + options = extend({}, defaultOptions, options); + + return function step(pathCoordinates, valueData) { + var path = new SvgPath(); + + var prevX, prevY, prevData; + + for (var i = 0; i < pathCoordinates.length; i += 2) { + var currX = pathCoordinates[i]; + var currY = pathCoordinates[i + 1]; + var currData = valueData[i / 2]; + + // If the current point is also not a hole we can draw the step lines + if (currData.value !== undefined) { + if (prevData === undefined) { + path.move(currX, currY, false, currData); + } else { + if (options.postpone) { + // If postponed we should draw the step line with the value of the previous value + path.line(currX, prevY, false, prevData); + } else { + // If not postponed we should draw the step line with the value of the current value + path.line(prevX, currY, false, currData); + } + // Line to the actual point (this should only be a Y-Axis movement + path.line(currX, currY, false, currData); + } + + prevX = currX; + prevY = currY; + prevData = currData; + } else if (!options.fillHoles) { + prevX = prevY = prevData = undefined; + } + } + + return path; + }; +} + +/** + * Cardinal / Catmull-Rome spline interpolation is the default smoothing function in Chartist. It produces nice results where the splines will always meet the points. It produces some artifacts though when data values are increased or decreased rapidly. The line may not follow a very accurate path and if the line should be accurate this smoothing function does not produce the best results. + * + * Cardinal splines can only be created if there are more than two data points. If this is not the case this smoothing will fallback to `Chartist.Smoothing.none`. + * + * All smoothing functions within Chartist are factory functions that accept an options parameter. The cardinal interpolation function accepts one configuration parameter `tension`, between 0 and 1, which controls the smoothing intensity. + * + * @example + * var chart = new Chartist.Line('.ct-chart', { + * labels: [1, 2, 3, 4, 5], + * series: [[1, 2, 8, 1, 7]] + * }, { + * lineSmooth: Chartist.Interpolation.cardinal({ + * tension: 1, + * fillHoles: false + * }) + * }); + * + * @memberof Chartist.Interpolation + * @param {Object} options The options of the cardinal factory function. + * @return {Function} + */ +function cardinal(options) { + var defaultOptions = { + tension: 1, + fillHoles: false + }; + + options = extend({}, defaultOptions, options); + + var t = Math.min(1, Math.max(0, options.tension)), + c = 1 - t; + + return function cardinal(pathCoordinates, valueData) { + // First we try to split the coordinates into segments + // This is necessary to treat "holes" in line charts + var segments = splitIntoSegments(pathCoordinates, valueData, { + fillHoles: options.fillHoles + }); + + if (!segments.length) { + // If there were no segments return 'none' interpolation + return none()([]); + } else if (segments.length > 1) { + // If the split resulted in more that one segment we need to interpolate each segment individually and join them + // afterwards together into a single path. + var paths = []; + // For each segment we will recurse the cardinal function + segments.forEach(function (segment) { + paths.push(cardinal(segment.pathCoordinates, segment.valueData)); + }); + // Join the segment path data into a single path and return + return SvgPath.join(paths); + } else { + // If there was only one segment we can proceed regularly by using pathCoordinates and valueData from the first + // segment + pathCoordinates = segments[0].pathCoordinates; + valueData = segments[0].valueData; + + // If less than two points we need to fallback to no smoothing + if (pathCoordinates.length <= 4) { + return none()(pathCoordinates, valueData); + } + + var path = new SvgPath().move(pathCoordinates[0], pathCoordinates[1], false, valueData[0]), + z; + + for (var i = 0, iLen = pathCoordinates.length; iLen - 2 * !z > i; i += 2) { + var p = [{ x: +pathCoordinates[i - 2], y: +pathCoordinates[i - 1] }, { x: +pathCoordinates[i], y: +pathCoordinates[i + 1] }, { x: +pathCoordinates[i + 2], y: +pathCoordinates[i + 3] }, { x: +pathCoordinates[i + 4], y: +pathCoordinates[i + 5] }]; + if (z) { + if (!i) { + p[0] = { x: +pathCoordinates[iLen - 2], y: +pathCoordinates[iLen - 1] }; + } else if (iLen - 4 === i) { + p[3] = { x: +pathCoordinates[0], y: +pathCoordinates[1] }; + } else if (iLen - 2 === i) { + p[2] = { x: +pathCoordinates[0], y: +pathCoordinates[1] }; + p[3] = { x: +pathCoordinates[2], y: +pathCoordinates[3] }; + } + } else { + if (iLen - 4 === i) { + p[3] = p[2]; + } else if (!i) { + p[0] = { x: +pathCoordinates[i], y: +pathCoordinates[i + 1] }; + } + } + + path.curve(t * (-p[0].x + 6 * p[1].x + p[2].x) / 6 + c * p[2].x, t * (-p[0].y + 6 * p[1].y + p[2].y) / 6 + c * p[2].y, t * (p[1].x + 6 * p[2].x - p[3].x) / 6 + c * p[2].x, t * (p[1].y + 6 * p[2].y - p[3].y) / 6 + c * p[2].y, p[2].x, p[2].y, false, valueData[(i + 2) / 2]); + } + + return path; + } + }; +} + +/** + * Monotone Cubic spline interpolation produces a smooth curve which preserves monotonicity. Unlike cardinal splines, the curve will not extend beyond the range of y-values of the original data points. + * + * Monotone Cubic splines can only be created if there are more than two data points. If this is not the case this smoothing will fallback to `Chartist.Smoothing.none`. + * + * The x-values of subsequent points must be increasing to fit a Monotone Cubic spline. If this condition is not met for a pair of adjacent points, then there will be a break in the curve between those data points. + * + * All smoothing functions within Chartist are factory functions that accept an options parameter. + * + * @example + * var chart = new Chartist.Line('.ct-chart', { + * labels: [1, 2, 3, 4, 5], + * series: [[1, 2, 8, 1, 7]] + * }, { + * lineSmooth: Chartist.Interpolation.monotoneCubic({ + * fillHoles: false + * }) + * }); + * + * @memberof Chartist.Interpolation + * @param {Object} [options] The options of the monotoneCubic factory function. + * @return {Function} + */ +function monotoneCubic(options) { + var defaultOptions = { + fillHoles: false + }; + + options = extend({}, defaultOptions, options); + + return function monotoneCubic(pathCoordinates, valueData) { + // First we try to split the coordinates into segments + // This is necessary to treat "holes" in line charts + var segments = splitIntoSegments(pathCoordinates, valueData, { + fillHoles: options.fillHoles, + increasingX: true + }); + + if (!segments.length) { + // If there were no segments return 'Chartist.Interpolation.none' + return none()([]); + } else if (segments.length > 1) { + // If the split resulted in more that one segment we need to interpolate each segment individually and join them + // afterwards together into a single path. + var paths = []; + // For each segment we will recurse the monotoneCubic fn function + segments.forEach(function (segment) { + paths.push(monotoneCubic(segment.pathCoordinates, segment.valueData)); + }); + // Join the segment path data into a single path and return + return SvgPath.join(paths); + } else { + // If there was only one segment we can proceed regularly by using pathCoordinates and valueData from the first + // segment + pathCoordinates = segments[0].pathCoordinates; + valueData = segments[0].valueData; + + // If less than three points we need to fallback to no smoothing + if (pathCoordinates.length <= 4) { + return none()(pathCoordinates, valueData); + } + + var xs = [], + ys = [], + i, + n = pathCoordinates.length / 2, + ms = [], + ds = [], + dys = [], + dxs = [], + path; + + // Populate x and y coordinates into separate arrays, for readability + + for (i = 0; i < n; i++) { + xs[i] = pathCoordinates[i * 2]; + ys[i] = pathCoordinates[i * 2 + 1]; + } + + // Calculate deltas and derivative + + for (i = 0; i < n - 1; i++) { + dys[i] = ys[i + 1] - ys[i]; + dxs[i] = xs[i + 1] - xs[i]; + ds[i] = dys[i] / dxs[i]; + } + + // Determine desired slope (m) at each point using Fritsch-Carlson method + // See: http://math.stackexchange.com/questions/45218/implementation-of-monotone-cubic-interpolation + + ms[0] = ds[0]; + ms[n - 1] = ds[n - 2]; + + for (i = 1; i < n - 1; i++) { + if (ds[i] === 0 || ds[i - 1] === 0 || ds[i - 1] > 0 !== ds[i] > 0) { + ms[i] = 0; + } else { + ms[i] = 3 * (dxs[i - 1] + dxs[i]) / ((2 * dxs[i] + dxs[i - 1]) / ds[i - 1] + (dxs[i] + 2 * dxs[i - 1]) / ds[i]); + + if (!isFinite(ms[i])) { + ms[i] = 0; + } + } + } + + // Now build a path from the slopes + + path = new SvgPath().move(xs[0], ys[0], false, valueData[0]); + + for (i = 0; i < n - 1; i++) { + path.curve( + // First control point + xs[i] + dxs[i] / 3, ys[i] + ms[i] * dxs[i] / 3, + // Second control point + xs[i + 1] - dxs[i] / 3, ys[i + 1] - ms[i + 1] * dxs[i] / 3, + // End point + xs[i + 1], ys[i + 1], false, valueData[i + 1]); + } + + return path; + } + }; +} + + + +var interpolation = Object.freeze({ + none: none, + simple: simple, + step: step, + cardinal: cardinal, + monotoneCubic: monotoneCubic +}); + +/** + * Default options in line charts. Expand the code view to see a detailed list of options with comments. + * + * @memberof Chartist.Line + */ +var defaultOptions = { + // Options for X-Axis + axisX: { + // The offset of the labels to the chart area + offset: 30, + // Position where labels are placed. Can be set to `start` or `end` where `start` is equivalent to left or top on vertical axis and `end` is equivalent to right or bottom on horizontal axis. + position: 'end', + // Allows you to correct label positioning on this axis by positive or negative x and y offset. + labelOffset: { + x: 0, + y: 0 + }, + // If labels should be shown or not + showLabel: true, + // If the axis grid should be drawn or not + showGrid: true, + // Interpolation function that allows you to intercept the value from the axis label + labelInterpolationFnc: noop, + // Set the axis type to be used to project values on this axis. If not defined, Chartist.StepAxis will be used for the X-Axis, where the ticks option will be set to the labels in the data and the stretch option will be set to the global fullWidth option. This type can be changed to any axis constructor available (e.g. Chartist.FixedScaleAxis), where all axis options should be present here. + type: undefined + }, + // Options for Y-Axis + axisY: { + // The offset of the labels to the chart area + offset: 40, + // Position where labels are placed. Can be set to `start` or `end` where `start` is equivalent to left or top on vertical axis and `end` is equivalent to right or bottom on horizontal axis. + position: 'start', + // Allows you to correct label positioning on this axis by positive or negative x and y offset. + labelOffset: { + x: 0, + y: 0 + }, + // If labels should be shown or not + showLabel: true, + // If the axis grid should be drawn or not + showGrid: true, + // Interpolation function that allows you to intercept the value from the axis label + labelInterpolationFnc: noop, + // Set the axis type to be used to project values on this axis. If not defined, Chartist.AutoScaleAxis will be used for the Y-Axis, where the high and low options will be set to the global high and low options. This type can be changed to any axis constructor available (e.g. Chartist.FixedScaleAxis), where all axis options should be present here. + type: undefined, + // This value specifies the minimum height in pixel of the scale steps + scaleMinSpace: 20, + // Use only integer values (whole numbers) for the scale steps + onlyInteger: false + }, + // Specify a fixed width for the chart as a string (i.e. '100px' or '50%') + width: undefined, + // Specify a fixed height for the chart as a string (i.e. '100px' or '50%') + height: undefined, + // If the line should be drawn or not + showLine: true, + // If dots should be drawn or not + showPoint: true, + // If the line chart should draw an area + showArea: false, + // The base for the area chart that will be used to close the area shape (is normally 0) + areaBase: 0, + // Specify if the lines should be smoothed. This value can be true or false where true will result in smoothing using the default smoothing interpolation function Chartist.Interpolation.cardinal and false results in Chartist.Interpolation.none. You can also choose other smoothing / interpolation functions available in the Chartist.Interpolation module, or write your own interpolation function. Check the examples for a brief description. + lineSmooth: true, + // If the line chart should add a background fill to the .ct-grids group. + showGridBackground: false, + // Overriding the natural low of the chart allows you to zoom in or limit the charts lowest displayed value + low: undefined, + // Overriding the natural high of the chart allows you to zoom in or limit the charts highest displayed value + high: undefined, + // Padding of the chart drawing area to the container element and labels as a number or padding object {top: 5, right: 5, bottom: 5, left: 5} + chartPadding: { + top: 15, + right: 15, + bottom: 5, + left: 10 + }, + // When set to true, the last grid line on the x-axis is not drawn and the chart elements will expand to the full available width of the chart. For the last label to be drawn correctly you might need to add chart padding or offset the last label with a draw event handler. + fullWidth: false, + // If true the whole data is reversed including labels, the series order as well as the whole series data arrays. + reverseData: false, + // Override the class names that get used to generate the SVG structure of the chart + classNames: { + chart: 'ct-chart-line', + label: 'ct-label', + labelGroup: 'ct-labels', + series: 'ct-series', + line: 'ct-line', + point: 'ct-point', + area: 'ct-area', + grid: 'ct-grid', + gridGroup: 'ct-grids', + gridBackground: 'ct-grid-background', + vertical: 'ct-vertical', + horizontal: 'ct-horizontal', + start: 'ct-start', + end: 'ct-end' + } +}; + +var LineChart = function (_BaseChart) { + _inherits(LineChart, _BaseChart); + + /** + * This method creates a new line chart. + * + * @memberof Chartist.Line + * @param {String|Node} query A selector query string or directly a DOM element + * @param {Object} data The data object that needs to consist of a labels and a series array + * @param {Object} [options] The options object with options that override the default options. Check the examples for a detailed list. + * @param {Array} [responsiveOptions] Specify an array of responsive option arrays which are a media query and options object pair => [[mediaQueryString, optionsObject],[more...]] + * @return {Object} An object which exposes the API for the created chart + * + * @example + * // Create a simple line chart + * var data = { + * // A labels array that can contain any sort of values + * labels: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri'], + * // Our series array that contains series objects or in this case series data arrays + * series: [ + * [5, 2, 4, 2, 0] + * ] + * }; + * + * // As options we currently only set a static size of 300x200 px + * var options = { + * width: '300px', + * height: '200px' + * }; + * + * // In the global name space Chartist we call the Line function to initialize a line chart. As a first parameter we pass in a selector where we would like to get our chart created. Second parameter is the actual data object and as a third parameter we pass in our options + * new Chartist.Line('.ct-chart', data, options); + * + * @example + * // Use specific interpolation function with configuration from the Chartist.Interpolation module + * + * var chart = new Chartist.Line('.ct-chart', { + * labels: [1, 2, 3, 4, 5], + * series: [ + * [1, 1, 8, 1, 7] + * ] + * }, { + * lineSmooth: Chartist.Interpolation.cardinal({ + * tension: 0.2 + * }) + * }); + * + * @example + * // Create a line chart with responsive options + * + * var data = { + * // A labels array that can contain any sort of values + * labels: ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'], + * // Our series array that contains series objects or in this case series data arrays + * series: [ + * [5, 2, 4, 2, 0] + * ] + * }; + * + * // In addition to the regular options we specify responsive option overrides that will override the default configutation based on the matching media queries. + * var responsiveOptions = [ + * ['screen and (min-width: 641px) and (max-width: 1024px)', { + * showPoint: false, + * axisX: { + * labelInterpolationFnc: function(value) { + * // Will return Mon, Tue, Wed etc. on medium screens + * return value.slice(0, 3); + * } + * } + * }], + * ['screen and (max-width: 640px)', { + * showLine: false, + * axisX: { + * labelInterpolationFnc: function(value) { + * // Will return M, T, W etc. on small screens + * return value[0]; + * } + * } + * }] + * ]; + * + * new Chartist.Line('.ct-chart', data, null, responsiveOptions); + * + */ + function LineChart(query, data, options, responsiveOptions) { + _classCallCheck(this, LineChart); + + return _possibleConstructorReturn(this, (LineChart.__proto__ || Object.getPrototypeOf(LineChart)).call(this, query, data, defaultOptions, extend({}, defaultOptions, options), responsiveOptions)); + } + + /** + * Creates a new chart + * + */ + + + _createClass(LineChart, [{ + key: 'createChart', + value: function createChart(options) { + var data = normalizeData(this.data, options.reverseData, true); + + // Create new svg object + this.svg = createSvg(this.container, options.width, options.height, options.classNames.chart); + // Create groups for labels, grid and series + var gridGroup = this.svg.elem('g').addClass(options.classNames.gridGroup); + var seriesGroup = this.svg.elem('g'); + var labelGroup = this.svg.elem('g').addClass(options.classNames.labelGroup); + + var chartRect = createChartRect(this.svg, options, defaultOptions.padding); + var axisX, axisY; + + if (options.axisX.type === undefined) { + axisX = new StepAxis(axisUnits.x, data.normalized.series, chartRect, extend({}, options.axisX, { + ticks: data.normalized.labels, + stretch: options.fullWidth + })); + } else { + axisX = new options.axisX.type(axisUnits.x, data.normalized.series, chartRect, options.axisX); + } + + if (options.axisY.type === undefined) { + axisY = new AutoScaleAxis(axisUnits.y, data.normalized.series, chartRect, extend({}, options.axisY, { + high: isNumeric(options.high) ? options.high : options.axisY.high, + low: isNumeric(options.low) ? options.low : options.axisY.low + })); + } else { + axisY = new options.axisY.type(axisUnits.y, data.normalized.series, chartRect, options.axisY); + } + + axisX.createGridAndLabels(gridGroup, labelGroup, this.supportsForeignObject, options, this.eventEmitter); + axisY.createGridAndLabels(gridGroup, labelGroup, this.supportsForeignObject, options, this.eventEmitter); + + if (options.showGridBackground) { + createGridBackground(gridGroup, chartRect, options.classNames.gridBackground, this.eventEmitter); + } + + // Draw the series + data.raw.series.forEach(function (series, seriesIndex) { + var seriesElement = seriesGroup.elem('g'); + + // Write attributes to series group element. If series name or meta is undefined the attributes will not be written + seriesElement.attr({ + 'ct:series-name': series.name, + 'ct:meta': serialize(series.meta) + }); + + // Use series class from series data or if not set generate one + seriesElement.addClass([options.classNames.series, series.className || options.classNames.series + '-' + alphaNumerate(seriesIndex)].join(' ')); + + var pathCoordinates = [], + pathData = []; + + data.normalized.series[seriesIndex].forEach(function (value, valueIndex) { + var p = { + x: chartRect.x1 + axisX.projectValue(value, valueIndex, data.normalized.series[seriesIndex]), + y: chartRect.y1 - axisY.projectValue(value, valueIndex, data.normalized.series[seriesIndex]) + }; + pathCoordinates.push(p.x, p.y); + pathData.push({ + value: value, + valueIndex: valueIndex, + meta: getMetaData(series, valueIndex) + }); + }.bind(this)); + + var seriesOptions = { + lineSmooth: getSeriesOption(series, options, 'lineSmooth'), + showPoint: getSeriesOption(series, options, 'showPoint'), + showLine: getSeriesOption(series, options, 'showLine'), + showArea: getSeriesOption(series, options, 'showArea'), + areaBase: getSeriesOption(series, options, 'areaBase') + }; + + var smoothing = typeof seriesOptions.lineSmooth === 'function' ? seriesOptions.lineSmooth : seriesOptions.lineSmooth ? monotoneCubic() : none(); + // Interpolating path where pathData will be used to annotate each path element so we can trace back the original + // index, value and meta data + var path = smoothing(pathCoordinates, pathData); + + // If we should show points we need to create them now to avoid secondary loop + // Points are drawn from the pathElements returned by the interpolation function + // Small offset for Firefox to render squares correctly + if (seriesOptions.showPoint) { + + path.pathElements.forEach(function (pathElement) { + var point = seriesElement.elem('line', { + x1: pathElement.x, + y1: pathElement.y, + x2: pathElement.x + 0.01, + y2: pathElement.y + }, options.classNames.point).attr({ + 'ct:value': [pathElement.data.value.x, pathElement.data.value.y].filter(isNumeric).join(','), + 'ct:meta': serialize(pathElement.data.meta) + }); + + this.eventEmitter.emit('draw', { + type: 'point', + value: pathElement.data.value, + index: pathElement.data.valueIndex, + meta: pathElement.data.meta, + series: series, + seriesIndex: seriesIndex, + axisX: axisX, + axisY: axisY, + group: seriesElement, + element: point, + x: pathElement.x, + y: pathElement.y + }); + }.bind(this)); + } + + if (seriesOptions.showLine) { + var line = seriesElement.elem('path', { + d: path.stringify() + }, options.classNames.line, true); + + this.eventEmitter.emit('draw', { + type: 'line', + values: data.normalized.series[seriesIndex], + path: path.clone(), + chartRect: chartRect, + index: seriesIndex, + series: series, + seriesIndex: seriesIndex, + seriesMeta: series.meta, + axisX: axisX, + axisY: axisY, + group: seriesElement, + element: line + }); + } + + // Area currently only works with axes that support a range! + if (seriesOptions.showArea && axisY.range) { + // If areaBase is outside the chart area (< min or > max) we need to set it respectively so that + // the area is not drawn outside the chart area. + var areaBase = Math.max(Math.min(seriesOptions.areaBase, axisY.range.max), axisY.range.min); + + // We project the areaBase value into screen coordinates + var areaBaseProjected = chartRect.y1 - axisY.projectValue(areaBase); + + // In order to form the area we'll first split the path by move commands so we can chunk it up into segments + path.splitByCommand('M').filter(function onlySolidSegments(pathSegment) { + // We filter only "solid" segments that contain more than one point. Otherwise there's no need for an area + return pathSegment.pathElements.length > 1; + }).map(function convertToArea(solidPathSegments) { + // Receiving the filtered solid path segments we can now convert those segments into fill areas + var firstElement = solidPathSegments.pathElements[0]; + var lastElement = solidPathSegments.pathElements[solidPathSegments.pathElements.length - 1]; + + // Cloning the solid path segment with closing option and removing the first move command from the clone + // We then insert a new move that should start at the area base and draw a straight line up or down + // at the end of the path we add an additional straight line to the projected area base value + // As the closing option is set our path will be automatically closed + return solidPathSegments.clone(true).position(0).remove(1).move(firstElement.x, areaBaseProjected).line(firstElement.x, firstElement.y).position(solidPathSegments.pathElements.length + 1).line(lastElement.x, areaBaseProjected); + }).forEach(function createArea(areaPath) { + // For each of our newly created area paths, we'll now create path elements by stringifying our path objects + // and adding the created DOM elements to the correct series group + var area = seriesElement.elem('path', { + d: areaPath.stringify() + }, options.classNames.area, true); + + // Emit an event for each area that was drawn + this.eventEmitter.emit('draw', { + type: 'area', + values: data.normalized.series[seriesIndex], + path: areaPath.clone(), + series: series, + seriesIndex: seriesIndex, + axisX: axisX, + axisY: axisY, + chartRect: chartRect, + index: seriesIndex, + group: seriesElement, + element: area + }); + }.bind(this)); + } + }.bind(this)); + + this.eventEmitter.emit('created', { + bounds: axisY.bounds, + chartRect: chartRect, + axisX: axisX, + axisY: axisY, + svg: this.svg, + options: options + }); + } + }]); + + return LineChart; +}(BaseChart); + +/** + * Default options in bar charts. Expand the code view to see a detailed list of options with comments. + * + * @memberof Chartist.Bar + */ +var defaultOptions$2 = { + // Options for X-Axis + axisX: { + // The offset of the chart drawing area to the border of the container + offset: 30, + // Position where labels are placed. Can be set to `start` or `end` where `start` is equivalent to left or top on vertical axis and `end` is equivalent to right or bottom on horizontal axis. + position: 'end', + // Allows you to correct label positioning on this axis by positive or negative x and y offset. + labelOffset: { + x: 0, + y: 0 + }, + // If labels should be shown or not + showLabel: true, + // If the axis grid should be drawn or not + showGrid: true, + // Interpolation function that allows you to intercept the value from the axis label + labelInterpolationFnc: noop, + // This value specifies the minimum width in pixel of the scale steps + scaleMinSpace: 30, + // Use only integer values (whole numbers) for the scale steps + onlyInteger: false + }, + // Options for Y-Axis + axisY: { + // The offset of the chart drawing area to the border of the container + offset: 40, + // Position where labels are placed. Can be set to `start` or `end` where `start` is equivalent to left or top on vertical axis and `end` is equivalent to right or bottom on horizontal axis. + position: 'start', + // Allows you to correct label positioning on this axis by positive or negative x and y offset. + labelOffset: { + x: 0, + y: 0 + }, + // If labels should be shown or not + showLabel: true, + // If the axis grid should be drawn or not + showGrid: true, + // Interpolation function that allows you to intercept the value from the axis label + labelInterpolationFnc: noop, + // This value specifies the minimum height in pixel of the scale steps + scaleMinSpace: 20, + // Use only integer values (whole numbers) for the scale steps + onlyInteger: false + }, + // Specify a fixed width for the chart as a string (i.e. '100px' or '50%') + width: undefined, + // Specify a fixed height for the chart as a string (i.e. '100px' or '50%') + height: undefined, + // Overriding the natural high of the chart allows you to zoom in or limit the charts highest displayed value + high: undefined, + // Overriding the natural low of the chart allows you to zoom in or limit the charts lowest displayed value + low: undefined, + // Unless low/high are explicitly set, bar chart will be centered at zero by default. Set referenceValue to null to auto scale. + referenceValue: 0, + // Padding of the chart drawing area to the container element and labels as a number or padding object {top: 5, right: 5, bottom: 5, left: 5} + chartPadding: { + top: 15, + right: 15, + bottom: 5, + left: 10 + }, + // Specify the distance in pixel of bars in a group + seriesBarDistance: 15, + // If set to true this property will cause the series bars to be stacked. Check the `stackMode` option for further stacking options. + stackBars: false, + // If set to 'overlap' this property will force the stacked bars to draw from the zero line. + // If set to 'accumulate' this property will form a total for each series point. This will also influence the y-axis and the overall bounds of the chart. In stacked mode the seriesBarDistance property will have no effect. + stackMode: 'accumulate', + // Inverts the axes of the bar chart in order to draw a horizontal bar chart. Be aware that you also need to invert your axis settings as the Y Axis will now display the labels and the X Axis the values. + horizontalBars: false, + // If set to true then each bar will represent a series and the data array is expected to be a one dimensional array of data values rather than a series array of series. This is useful if the bar chart should represent a profile rather than some data over time. + distributeSeries: false, + // If true the whole data is reversed including labels, the series order as well as the whole series data arrays. + reverseData: false, + // If the bar chart should add a background fill to the .ct-grids group. + showGridBackground: false, + // Override the class names that get used to generate the SVG structure of the chart + classNames: { + chart: 'ct-chart-bar', + horizontalBars: 'ct-horizontal-bars', + label: 'ct-label', + labelGroup: 'ct-labels', + series: 'ct-series', + bar: 'ct-bar', + grid: 'ct-grid', + gridGroup: 'ct-grids', + gridBackground: 'ct-grid-background', + vertical: 'ct-vertical', + horizontal: 'ct-horizontal', + start: 'ct-start', + end: 'ct-end' + } +}; + +var BarChart = function (_BaseChart) { + _inherits(BarChart, _BaseChart); + + /** + * This method creates a new bar chart and returns API object that you can use for later changes. + * + * @memberof Chartist.Bar + * @param {String|Node} query A selector query string or directly a DOM element + * @param {Object} data The data object that needs to consist of a labels and a series array + * @param {Object} [options] The options object with options that override the default options. Check the examples for a detailed list. + * @param {Array} [responsiveOptions] Specify an array of responsive option arrays which are a media query and options object pair => [[mediaQueryString, optionsObject],[more...]] + * @return {Object} An object which exposes the API for the created chart + * + * @example + * // Create a simple bar chart + * var data = { + * labels: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri'], + * series: [ + * [5, 2, 4, 2, 0] + * ] + * }; + * + * // In the global name space Chartist we call the Bar function to initialize a bar chart. As a first parameter we pass in a selector where we would like to get our chart created and as a second parameter we pass our data object. + * new Chartist.Bar('.ct-chart', data); + * + * @example + * // This example creates a bipolar grouped bar chart where the boundaries are limitted to -10 and 10 + * new Chartist.Bar('.ct-chart', { + * labels: [1, 2, 3, 4, 5, 6, 7], + * series: [ + * [1, 3, 2, -5, -3, 1, -6], + * [-5, -2, -4, -1, 2, -3, 1] + * ] + * }, { + * seriesBarDistance: 12, + * low: -10, + * high: 10 + * }); + * + */ + function BarChart(query, data, options, responsiveOptions) { + _classCallCheck(this, BarChart); + + return _possibleConstructorReturn(this, (BarChart.__proto__ || Object.getPrototypeOf(BarChart)).call(this, query, data, defaultOptions$2, extend({}, defaultOptions$2, options), responsiveOptions)); + } + + /** + * Creates a new chart + * + */ + + + _createClass(BarChart, [{ + key: 'createChart', + value: function createChart(options) { + var data; + var highLow; + + if (options.distributeSeries) { + data = normalizeData(this.data, options.reverseData, options.horizontalBars ? 'x' : 'y'); + data.normalized.series = data.normalized.series.map(function (value) { + return [value]; + }); + } else { + data = normalizeData(this.data, options.reverseData, options.horizontalBars ? 'x' : 'y'); + } + + // Create new svg element + this.svg = createSvg(this.container, options.width, options.height, options.classNames.chart + (options.horizontalBars ? ' ' + options.classNames.horizontalBars : '')); + + // Drawing groups in correct order + var gridGroup = this.svg.elem('g').addClass(options.classNames.gridGroup); + var seriesGroup = this.svg.elem('g'); + var labelGroup = this.svg.elem('g').addClass(options.classNames.labelGroup); + + if (options.stackBars && data.normalized.series.length !== 0) { + + // If stacked bars we need to calculate the high low from stacked values from each series + var serialSums = serialMap(data.normalized.series, function serialSums() { + return Array.prototype.slice.call(arguments).map(function (value) { + return value; + }).reduce(function (prev, curr) { + return { + x: prev.x + (curr && curr.x) || 0, + y: prev.y + (curr && curr.y) || 0 + }; + }, { x: 0, y: 0 }); + }); + + highLow = getHighLow([serialSums], options, options.horizontalBars ? 'x' : 'y'); + } else { + + highLow = getHighLow(data.normalized.series, options, options.horizontalBars ? 'x' : 'y'); + } + + // Overrides of high / low from settings + highLow.high = +options.high || (options.high === 0 ? 0 : highLow.high); + highLow.low = +options.low || (options.low === 0 ? 0 : highLow.low); + + var chartRect = createChartRect(this.svg, options, defaultOptions$2.padding); + + var valueAxis, labelAxisTicks, labelAxis, axisX, axisY; + + // We need to set step count based on some options combinations + if (options.distributeSeries && options.stackBars) { + // If distributed series are enabled and bars need to be stacked, we'll only have one bar and therefore should + // use only the first label for the step axis + labelAxisTicks = data.normalized.labels.slice(0, 1); + } else { + // If distributed series are enabled but stacked bars aren't, we should use the series labels + // If we are drawing a regular bar chart with two dimensional series data, we just use the labels array + // as the bars are normalized + labelAxisTicks = data.normalized.labels; + } + + // Set labelAxis and valueAxis based on the horizontalBars setting. This setting will flip the axes if necessary. + if (options.horizontalBars) { + if (options.axisX.type === undefined) { + valueAxis = axisX = new AutoScaleAxis(axisUnits.x, data.normalized.series, chartRect, extend({}, options.axisX, { + highLow: highLow, + referenceValue: 0 + })); + } else { + valueAxis = axisX = new options.axisX.type(axisUnits.x, data.normalized.series, chartRect, extend({}, options.axisX, { + highLow: highLow, + referenceValue: 0 + })); + } + + if (options.axisY.type === undefined) { + labelAxis = axisY = new StepAxis(axisUnits.y, data.normalized.series, chartRect, { + ticks: labelAxisTicks + }); + } else { + labelAxis = axisY = new options.axisY.type(axisUnits.y, data.normalized.series, chartRect, options.axisY); + } + } else { + if (options.axisX.type === undefined) { + labelAxis = axisX = new StepAxis(axisUnits.x, data.normalized.series, chartRect, { + ticks: labelAxisTicks + }); + } else { + labelAxis = axisX = new options.axisX.type(axisUnits.x, data.normalized.series, chartRect, options.axisX); + } + + if (options.axisY.type === undefined) { + valueAxis = axisY = new AutoScaleAxis(axisUnits.y, data.normalized.series, chartRect, extend({}, options.axisY, { + highLow: highLow, + referenceValue: 0 + })); + } else { + valueAxis = axisY = new options.axisY.type(axisUnits.units.y, data.normalized.series, chartRect, extend({}, options.axisY, { + highLow: highLow, + referenceValue: 0 + })); + } + } + + // Projected 0 point + var zeroPoint = options.horizontalBars ? chartRect.x1 + valueAxis.projectValue(0) : chartRect.y1 - valueAxis.projectValue(0); + // Used to track the screen coordinates of stacked bars + var stackedBarValues = []; + + labelAxis.createGridAndLabels(gridGroup, labelGroup, this.supportsForeignObject, options, this.eventEmitter); + valueAxis.createGridAndLabels(gridGroup, labelGroup, this.supportsForeignObject, options, this.eventEmitter); + + if (options.showGridBackground) { + createGridBackground(gridGroup, chartRect, options.classNames.gridBackground, this.eventEmitter); + } + + // Draw the series + data.raw.series.forEach(function (series, seriesIndex) { + // Calculating bi-polar value of index for seriesOffset. For i = 0..4 biPol will be -1.5, -0.5, 0.5, 1.5 etc. + var biPol = seriesIndex - (data.raw.series.length - 1) / 2; + // Half of the period width between vertical grid lines used to position bars + var periodHalfLength; + // Current series SVG element + var seriesElement; + + // We need to set periodHalfLength based on some options combinations + if (options.distributeSeries && !options.stackBars) { + // If distributed series are enabled but stacked bars aren't, we need to use the length of the normaizedData array + // which is the series count and divide by 2 + periodHalfLength = labelAxis.axisLength / data.normalized.series.length / 2; + } else if (options.distributeSeries && options.stackBars) { + // If distributed series and stacked bars are enabled we'll only get one bar so we should just divide the axis + // length by 2 + periodHalfLength = labelAxis.axisLength / 2; + } else { + // On regular bar charts we should just use the series length + periodHalfLength = labelAxis.axisLength / data.normalized.series[seriesIndex].length / 2; + } + + // Adding the series group to the series element + seriesElement = seriesGroup.elem('g'); + + // Write attributes to series group element. If series name or meta is undefined the attributes will not be written + seriesElement.attr({ + 'ct:series-name': series.name, + 'ct:meta': serialize(series.meta) + }); + + // Use series class from series data or if not set generate one + seriesElement.addClass([options.classNames.series, series.className || options.classNames.series + '-' + alphaNumerate(seriesIndex)].join(' ')); + + data.normalized.series[seriesIndex].forEach(function (value, valueIndex) { + var projected, bar, previousStack, labelAxisValueIndex; + + // We need to set labelAxisValueIndex based on some options combinations + if (options.distributeSeries && !options.stackBars) { + // If distributed series are enabled but stacked bars aren't, we can use the seriesIndex for later projection + // on the step axis for label positioning + labelAxisValueIndex = seriesIndex; + } else if (options.distributeSeries && options.stackBars) { + // If distributed series and stacked bars are enabled, we will only get one bar and therefore always use + // 0 for projection on the label step axis + labelAxisValueIndex = 0; + } else { + // On regular bar charts we just use the value index to project on the label step axis + labelAxisValueIndex = valueIndex; + } + + // We need to transform coordinates differently based on the chart layout + if (options.horizontalBars) { + projected = { + x: chartRect.x1 + valueAxis.projectValue(value && value.x ? value.x : 0, valueIndex, data.normalized.series[seriesIndex]), + y: chartRect.y1 - labelAxis.projectValue(value && value.y ? value.y : 0, labelAxisValueIndex, data.normalized.series[seriesIndex]) + }; + } else { + projected = { + x: chartRect.x1 + labelAxis.projectValue(value && value.x ? value.x : 0, labelAxisValueIndex, data.normalized.series[seriesIndex]), + y: chartRect.y1 - valueAxis.projectValue(value && value.y ? value.y : 0, valueIndex, data.normalized.series[seriesIndex]) + }; + } + + // If the label axis is a step based axis we will offset the bar into the middle of between two steps using + // the periodHalfLength value. Also we do arrange the different series so that they align up to each other using + // the seriesBarDistance. If we don't have a step axis, the bar positions can be chosen freely so we should not + // add any automated positioning. + if (labelAxis instanceof StepAxis) { + // Offset to center bar between grid lines, but only if the step axis is not stretched + if (!labelAxis.options.stretch) { + projected[labelAxis.units.pos] += periodHalfLength * (options.horizontalBars ? -1 : 1); + } + // Using bi-polar offset for multiple series if no stacked bars or series distribution is used + projected[labelAxis.units.pos] += options.stackBars || options.distributeSeries ? 0 : biPol * options.seriesBarDistance * (options.horizontalBars ? -1 : 1); + } + + // Enter value in stacked bar values used to remember previous screen value for stacking up bars + previousStack = stackedBarValues[valueIndex] || zeroPoint; + stackedBarValues[valueIndex] = previousStack - (zeroPoint - projected[labelAxis.counterUnits.pos]); + + // Skip if value is undefined + if (value === undefined) { + return; + } + + var positions = {}; + positions[labelAxis.units.pos + '1'] = projected[labelAxis.units.pos]; + positions[labelAxis.units.pos + '2'] = projected[labelAxis.units.pos]; + + if (options.stackBars && (options.stackMode === 'accumulate' || !options.stackMode)) { + // Stack mode: accumulate (default) + // If bars are stacked we use the stackedBarValues reference and otherwise base all bars off the zero line + // We want backwards compatibility, so the expected fallback without the 'stackMode' option + // to be the original behaviour (accumulate) + positions[labelAxis.counterUnits.pos + '1'] = previousStack; + positions[labelAxis.counterUnits.pos + '2'] = stackedBarValues[valueIndex]; + } else { + // Draw from the zero line normally + // This is also the same code for Stack mode: overlap + positions[labelAxis.counterUnits.pos + '1'] = zeroPoint; + positions[labelAxis.counterUnits.pos + '2'] = projected[labelAxis.counterUnits.pos]; + } + + // Limit x and y so that they are within the chart rect + positions.x1 = Math.min(Math.max(positions.x1, chartRect.x1), chartRect.x2); + positions.x2 = Math.min(Math.max(positions.x2, chartRect.x1), chartRect.x2); + positions.y1 = Math.min(Math.max(positions.y1, chartRect.y2), chartRect.y1); + positions.y2 = Math.min(Math.max(positions.y2, chartRect.y2), chartRect.y1); + + var metaData = getMetaData(series, valueIndex); + + // Create bar element + bar = seriesElement.elem('line', positions, options.classNames.bar).attr({ + 'ct:value': [value.x, value.y].filter(isNumeric).join(','), + 'ct:meta': serialize(metaData) + }); + + this.eventEmitter.emit('draw', extend({ + type: 'bar', + value: value, + index: valueIndex, + meta: metaData, + series: series, + seriesIndex: seriesIndex, + axisX: axisX, + axisY: axisY, + chartRect: chartRect, + group: seriesElement, + element: bar + }, positions)); + }.bind(this)); + }.bind(this)); + + this.eventEmitter.emit('created', { + bounds: valueAxis.bounds, + chartRect: chartRect, + axisX: axisX, + axisY: axisY, + svg: this.svg, + options: options + }); + } + }]); + + return BarChart; +}(BaseChart); + +/** + * Default options in line charts. Expand the code view to see a detailed list of options with comments. + * + * @memberof Chartist.Pie + */ +var defaultOptions$3 = { + // Specify a fixed width for the chart as a string (i.e. '100px' or '50%') + width: undefined, + // Specify a fixed height for the chart as a string (i.e. '100px' or '50%') + height: undefined, + // Padding of the chart drawing area to the container element and labels as a number or padding object {top: 5, right: 5, bottom: 5, left: 5} + chartPadding: 5, + // Override the class names that are used to generate the SVG structure of the chart + classNames: { + chartPie: 'ct-chart-pie', + chartDonut: 'ct-chart-donut', + series: 'ct-series', + slicePie: 'ct-slice-pie', + sliceDonut: 'ct-slice-donut', + label: 'ct-label' + }, + // The start angle of the pie chart in degrees where 0 points north. A higher value offsets the start angle clockwise. + startAngle: 0, + // An optional total you can specify. By specifying a total value, the sum of the values in the series must be this total in order to draw a full pie. You can use this parameter to draw only parts of a pie or gauge charts. + total: undefined, + // If specified the donut CSS classes will be used and strokes will be drawn instead of pie slices. + donut: false, + // Specify the donut stroke width, currently done in javascript for convenience. May move to CSS styles in the future. + // This option can be set as number or string to specify a relative width (i.e. 100 or '30%'). + donutWidth: 60, + // If a label should be shown or not + showLabel: true, + // Label position offset from the standard position which is half distance of the radius. This value can be either positive or negative. Positive values will position the label away from the center. + labelOffset: 0, + // This option can be set to 'inside', 'outside' or 'center'. Positioned with 'inside' the labels will be placed on half the distance of the radius to the border of the Pie by respecting the 'labelOffset'. The 'outside' option will place the labels at the border of the pie and 'center' will place the labels in the absolute center point of the chart. The 'center' option only makes sense in conjunction with the 'labelOffset' option. + labelPosition: 'inside', + // An interpolation function for the label value + labelInterpolationFnc: noop, + // Label direction can be 'neutral', 'explode' or 'implode'. The labels anchor will be positioned based on those settings as well as the fact if the labels are on the right or left side of the center of the chart. Usually explode is useful when labels are positioned far away from the center. + labelDirection: 'neutral', + // If true the whole data is reversed including labels, the series order as well as the whole series data arrays. + reverseData: false, + // If true empty values will be ignored to avoid drawing unncessary slices and labels + ignoreEmptyValues: false +}; + +/** + * Determines SVG anchor position based on direction and center parameter + * + * @param center + * @param label + * @param direction + * @return {string} + */ +function determineAnchorPosition(center, label, direction) { + var toTheRight = label.x > center.x; + + if (toTheRight && direction === 'explode' || !toTheRight && direction === 'implode') { + return 'start'; + } else if (toTheRight && direction === 'implode' || !toTheRight && direction === 'explode') { + return 'end'; + } else { + return 'middle'; + } +} + +var PieChart = function (_BaseChart) { + _inherits(PieChart, _BaseChart); + + /** + * This method creates a new pie chart and returns an object that can be used to redraw the chart. + * + * @memberof Chartist.Pie + * @param {String|Node} query A selector query string or directly a DOM element + * @param {Object} data The data object in the pie chart needs to have a series property with a one dimensional data array. The values will be normalized against each other and don't necessarily need to be in percentage. The series property can also be an array of value objects that contain a value property and a className property to override the CSS class name for the series group. + * @param {Object} [options] The options object with options that override the default options. Check the examples for a detailed list. + * @param {Array} [responsiveOptions] Specify an array of responsive option arrays which are a media query and options object pair => [[mediaQueryString, optionsObject],[more...]] + * @return {Object} An object with a version and an update method to manually redraw the chart + * + * @example + * // Simple pie chart example with four series + * new Chartist.Pie('.ct-chart', { + * series: [10, 2, 4, 3] + * }); + * + * @example + * // Drawing a donut chart + * new Chartist.Pie('.ct-chart', { + * series: [10, 2, 4, 3] + * }, { + * donut: true + * }); + * + * @example + * // Using donut, startAngle and total to draw a gauge chart + * new Chartist.Pie('.ct-chart', { + * series: [20, 10, 30, 40] + * }, { + * donut: true, + * donutWidth: 20, + * startAngle: 270, + * total: 200 + * }); + * + * @example + * // Drawing a pie chart with padding and labels that are outside the pie + * new Chartist.Pie('.ct-chart', { + * series: [20, 10, 30, 40] + * }, { + * chartPadding: 30, + * labelOffset: 50, + * labelDirection: 'explode' + * }); + * + * @example + * // Overriding the class names for individual series as well as a name and meta data. + * // The name will be written as ct:series-name attribute and the meta data will be serialized and written + * // to a ct:meta attribute. + * new Chartist.Pie('.ct-chart', { + * series: [{ + * value: 20, + * name: 'Series 1', + * className: 'my-custom-class-one', + * meta: 'Meta One' + * }, { + * value: 10, + * name: 'Series 2', + * className: 'my-custom-class-two', + * meta: 'Meta Two' + * }, { + * value: 70, + * name: 'Series 3', + * className: 'my-custom-class-three', + * meta: 'Meta Three' + * }] + * }); + */ + function PieChart(query, data, options, responsiveOptions) { + _classCallCheck(this, PieChart); + + return _possibleConstructorReturn(this, (PieChart.__proto__ || Object.getPrototypeOf(PieChart)).call(this, query, data, defaultOptions$3, extend({}, defaultOptions$3, options), responsiveOptions)); + } + + /** + * Creates the pie chart + * + * @param options + */ + + + _createClass(PieChart, [{ + key: 'createChart', + value: function createChart(options) { + var data = normalizeData(this.data); + var seriesGroups = [], + labelsGroup, + chartRect, + radius, + labelRadius, + totalDataSum, + startAngle = options.startAngle; + + // Create SVG.js draw + this.svg = createSvg(this.container, options.width, options.height, options.donut ? options.classNames.chartDonut : options.classNames.chartPie); + // Calculate charting rect + chartRect = createChartRect(this.svg, options, defaultOptions$3.padding); + // Get biggest circle radius possible within chartRect + radius = Math.min(chartRect.width() / 2, chartRect.height() / 2); + // Calculate total of all series to get reference value or use total reference from optional options + totalDataSum = options.total || data.normalized.series.reduce(function (previousValue, currentValue) { + return previousValue + currentValue; + }, 0); + + var donutWidth = quantity(options.donutWidth); + if (donutWidth.unit === '%') { + donutWidth.value *= radius / 100; + } + + // If this is a donut chart we need to adjust our radius to enable strokes to be drawn inside + // Unfortunately this is not possible with the current SVG Spec + // See this proposal for more details: http://lists.w3.org/Archives/Public/www-svg/2003Oct/0000.html + radius -= options.donut ? donutWidth.value / 2 : 0; + + // If labelPosition is set to `outside` or a donut chart is drawn then the label position is at the radius, + // if regular pie chart it's half of the radius + if (options.labelPosition === 'outside' || options.donut) { + labelRadius = radius; + } else if (options.labelPosition === 'center') { + // If labelPosition is center we start with 0 and will later wait for the labelOffset + labelRadius = 0; + } else { + // Default option is 'inside' where we use half the radius so the label will be placed in the center of the pie + // slice + labelRadius = radius / 2; + } + // Add the offset to the labelRadius where a negative offset means closed to the center of the chart + labelRadius += options.labelOffset; + + // Calculate end angle based on total sum and current data value and offset with padding + var center = { + x: chartRect.x1 + chartRect.width() / 2, + y: chartRect.y2 + chartRect.height() / 2 + }; + + // Check if there is only one non-zero value in the series array. + var hasSingleValInSeries = data.raw.series.filter(function (val) { + return val.hasOwnProperty('value') ? val.value !== 0 : val !== 0; + }).length === 1; + + // Creating the series groups + data.raw.series.forEach(function (series, index) { + seriesGroups[index] = this.svg.elem('g', null, null); + }.bind(this)); + //if we need to show labels we create the label group now + if (options.showLabel) { + labelsGroup = this.svg.elem('g', null, null); + } + + // Draw the series + // initialize series groups + data.raw.series.forEach(function (series, index) { + // If current value is zero and we are ignoring empty values then skip to next value + if (data.normalized.series[index] === 0 && options.ignoreEmptyValues) return; + + // If the series is an object and contains a name or meta data we add a custom attribute + seriesGroups[index].attr({ + 'ct:series-name': series.name + }); + + // Use series class from series data or if not set generate one + seriesGroups[index].addClass([options.classNames.series, series.className || options.classNames.series + '-' + alphaNumerate(index)].join(' ')); + + // If the whole dataset is 0 endAngle should be zero. Can't divide by 0. + var endAngle = totalDataSum > 0 ? startAngle + data.normalized.series[index] / totalDataSum * 360 : 0; + + // Use slight offset so there are no transparent hairline issues + var overlappigStartAngle = Math.max(0, startAngle - (index === 0 || hasSingleValInSeries ? 0 : 0.2)); + + // If we need to draw the arc for all 360 degrees we need to add a hack where we close the circle + // with Z and use 359.99 degrees + if (endAngle - overlappigStartAngle >= 359.99) { + endAngle = overlappigStartAngle + 359.99; + } + + var start = polarToCartesian(center.x, center.y, radius, overlappigStartAngle), + end = polarToCartesian(center.x, center.y, radius, endAngle); + + // Create a new path element for the pie chart. If this isn't a donut chart we should close the path for a correct stroke + var path = new SvgPath(!options.donut).move(end.x, end.y).arc(radius, radius, 0, endAngle - startAngle > 180, 0, start.x, start.y); + + // If regular pie chart (no donut) we add a line to the center of the circle for completing the pie + if (!options.donut) { + path.line(center.x, center.y); + } + + // Create the SVG path + // If this is a donut chart we add the donut class, otherwise just a regular slice + var pathElement = seriesGroups[index].elem('path', { + d: path.stringify() + }, options.donut ? options.classNames.sliceDonut : options.classNames.slicePie); + + // Adding the pie series value to the path + pathElement.attr({ + 'ct:value': data.normalized.series[index], + 'ct:meta': serialize(series.meta) + }); + + // If this is a donut, we add the stroke-width as style attribute + if (options.donut) { + pathElement.attr({ + 'style': 'stroke-width: ' + donutWidth.value + 'px' + }); + } + + // Fire off draw event + this.eventEmitter.emit('draw', { + type: 'slice', + value: data.normalized.series[index], + totalDataSum: totalDataSum, + index: index, + meta: series.meta, + series: series, + group: seriesGroups[index], + element: pathElement, + path: path.clone(), + center: center, + radius: radius, + startAngle: startAngle, + endAngle: endAngle + }); + + // If we need to show labels we need to add the label for this slice now + if (options.showLabel) { + var labelPosition; + if (data.raw.series.length === 1) { + // If we have only 1 series, we can position the label in the center of the pie + labelPosition = { + x: center.x, + y: center.y + }; + } else { + // Position at the labelRadius distance from center and between start and end angle + labelPosition = polarToCartesian(center.x, center.y, labelRadius, startAngle + (endAngle - startAngle) / 2); + } + + var rawValue; + if (data.normalized.labels && !isFalseyButZero(data.normalized.labels[index])) { + rawValue = data.normalized.labels[index]; + } else { + rawValue = data.normalized.series[index]; + } + + var interpolatedValue = options.labelInterpolationFnc(rawValue, index); + + if (interpolatedValue || interpolatedValue === 0) { + var labelElement = labelsGroup.elem('text', { + dx: labelPosition.x, + dy: labelPosition.y, + 'text-anchor': determineAnchorPosition(center, labelPosition, options.labelDirection) + }, options.classNames.label).text('' + interpolatedValue); + + // Fire off draw event + this.eventEmitter.emit('draw', { + type: 'label', + index: index, + group: labelsGroup, + element: labelElement, + text: '' + interpolatedValue, + x: labelPosition.x, + y: labelPosition.y + }); + } + } + + // Set next startAngle to current endAngle. + // (except for last slice) + startAngle = endAngle; + }.bind(this)); + + this.eventEmitter.emit('created', { + chartRect: chartRect, + svg: this.svg, + options: options + }); + } + }]); + + return PieChart; +}(BaseChart); + +export { interpolation as Interpolation, EventEmitter, extend, optionsProvider, namespaces, precision, escapingMap, version, replaceAll, querySelector$1 as querySelector, safeHasProperty, isNumeric, isFalseyButZero, getNumberOrUndefined, ensureUnit, quantity, alphaNumerate, noop, times, sum, mapMultiply, mapAdd, serialMap, orderOfMagnitude, projectLength, roundWithPrecision, rho, polarToCartesian, serialize, deserialize, normalizeData, getMetaData, isDataHoleValue, reverseData, getDataArray, isMultiValue, getMultiValue, getSeriesOption, splitIntoSegments, getHighLow, getBounds, createSvg, normalizePadding, createChartRect, createGrid, createGridBackground, createLabel, BaseChart, LineChart, BarChart, PieChart, Axis, axisUnits, AutoScaleAxis, FixedScaleAxis, StepAxis, Svg, isSupported, easings, SvgList, SvgPath }; + +//# sourceMappingURL=chartist.esm.js.map \ No newline at end of file diff --git a/dist/chartist.esm.js.map b/dist/chartist.esm.js.map new file mode 100644 index 00000000..b231d866 --- /dev/null +++ b/dist/chartist.esm.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../package.json!file:/home/gion/Code/chartist/tooling/system-loaders/package.json","../src/core/globals.js","../src/core/lang.js","../src/core/functional.js","../src/core/math.js","../src/core/extend.js","../src/core/data.js","../jspm_packages/npm/systemjs-plugin-babel@0.0.16/babel-helpers/classCallCheck.js","../jspm_packages/npm/systemjs-plugin-babel@0.0.16/babel-helpers/createClass.js","../src/svg/svg-list.js","../src/svg/svg.js","../src/core/creation.js","../src/core/options-provider.js","../src/event/event-emitter.js","../src/charts/base.js","../jspm_packages/npm/systemjs-plugin-babel@0.0.16/babel-helpers/possibleConstructorReturn.js","../jspm_packages/npm/systemjs-plugin-babel@0.0.16/babel-helpers/inherits.js","../src/axes/axis.js","../jspm_packages/npm/systemjs-plugin-babel@0.0.16/babel-helpers/get.js","../src/axes/auto-scale-axis.js","../src/axes/fixed-scale-axis.js","../src/axes/step-axis.js","../src/svg/svg-path.js","../src/interpolation/none.js","../src/interpolation/simple.js","../src/interpolation/step.js","../src/interpolation/cardinal.js","../src/interpolation/monotone-cubic.js","../src/charts/line.js","../src/charts/bar.js","../src/charts/pie.js"],"names":["version","namespaces","precision","escapingMap","replaceAll","str","subStr","newSubStr","replace","RegExp","querySelector","query","Node","document","safeHasProperty","object","property","hasOwnProperty","isNumeric","value","isFinite","isFalseyButZero","getNumberOrUndefined","undefined","ensureUnit","unit","quantity","input","match","exec","alphaNumerate","n","String","fromCharCode","noop","times","length","Array","apply","sum","previous","current","mapMultiply","factor","num","mapAdd","addend","serialMap","arr","cb","result","Math","max","map","e","forEach","index","args","orderOfMagnitude","floor","log","abs","LN10","projectLength","axisLength","bounds","range","roundWithPrecision","digits","pow","round","rho","gcd","p","q","f","x","x1","x2","divisor","polarToCartesian","centerX","centerY","radius","angleInDegrees","angleInRadians","PI","cos","sin","extend","target","i","source","sourceProp","arguments","prop","serialize","data","JSON","stringify","Object","keys","reduce","key","deserialize","parse","normalizeData","reverse","multi","labelCount","output","normalized","series","getDataArray","every","labels","slice","prototype","push","getMetaData","meta","isDataHoleValue","isNaN","reverseData","recursiveConvert","multiValue","y","isMultiValue","getMultiValue","dimension","getSeriesOption","options","name","seriesOptions","splitIntoSegments","pathCoordinates","valueData","defaultOptions","segments","hole","fillHoles","increasingX","getHighLow","toUpperCase","highLow","high","Number","MAX_VALUE","low","findHigh","findLow","recursiveHighLow","referenceValue","min","getBounds","scaleMinSpace","onlyInteger","optimizationCounter","newMin","newMax","valueRange","oom","step","ceil","numberOfSteps","scaleUp","smallestFactor","Error","EPSILON","safeIncrement","increment","values","instance","Constructor","TypeError","defineProperties","props","descriptor","enumerable","configurable","writable","defineProperty","protoProps","staticProps","SvgList","nodeList","list","svgElements","Svg","filter","prototypeProperty","indexOf","call","element","attributes","className","parent","insertFirst","Element","_node","createElementNS","svg","attr","ct","addClass","firstChild","insertBefore","appendChild","ns","getAttributeNS","getAttribute","namespacedAttribute","split","setAttributeNS","setAttribute","bind","parentNode","SVGElement","node","nodeName","selector","foundNode","foundNodes","querySelectorAll","content","container","createElement","innerHTML","xmlns","fnObj","elem","t","createTextNode","removeChild","newElement","replaceChild","trim","names","classes","concat","pos","self","join","removedClasses","getBoundingClientRect","height","width","animations","guided","eventEmitter","createAnimateForAttributes","attribute","createAnimate","animationDefinition","attributeProperties","animate","timeout","animationEasing","easing","easings","begin","dur","calcMode","keySplines","keyTimes","fill","from","beginElement","err","to","remove","addEventListener","handleBeginEvent","emit","handleEndEvent","isSupported","feature","implementation","hasFeature","createSvg","filterChartistSvgObjects","removePreviousElement","normalizePadding","padding","fallback","top","right","bottom","left","createChartRect","fallbackPadding","hasAxis","axisX","axisY","yAxisOffset","offset","xAxisOffset","normalizedPadding","chartPadding","chartRect","y1","y2","position","createGrid","axis","group","positionalData","units","counterUnits","gridElement","createGridBackground","gridGroup","gridBackground","createLabel","axisOffset","labelOffset","useForeignObject","labelElement","len","foreignObject","text","optionsProvider","responsiveOptions","baseOptions","currentOptions","mediaQueryListeners","updateCurrentOptions","mediaEvent","previousOptions","mql","window","matchMedia","matches","removeMediaQueryListeners","removeListener","addListener","getCurrentOptions","EventEmitter","handlers","event","handler","splice","starHandler","BaseChart","supportsForeignObject","supportsAnimations","resizeListener","update","__chartist__","detach","initializeTimeoutId","setTimeout","initialize","override","createChart","removeEventListener","clearTimeout","addEventHandler","removeEventHandler","plugins","plugin","ReferenceError","subClass","superClass","create","setPrototypeOf","__proto__","axisUnits","Axis","ticks","rectEnd","rectStart","gridOffset","rectOffset","labelGroup","chartOptions","axisOptions","projectedValues","projectValue","labelValues","labelInterpolationFnc","projectedValue","labelLength","showGrid","classNames","grid","dir","showLabel","label","get","receiver","Function","desc","getOwnPropertyDescriptor","getPrototypeOf","getter","AutoScaleAxis","axisUnit","FixedScaleAxis","sort","a","b","stepLength","StepAxis","calc","stretch","elementDescriptions","command","params","pathElements","relative","pathElement","toLowerCase","forEachParam","pathElementIndex","paramName","paramIndex","SvgPath","paths","close","joinedPath","path","j","count","rx","ry","xAr","lAf","sf","chunks","pop","elements","chunk","shift","description","spliceArgs","accuracyMultiplier","accuracy","transformFnc","transformed","c","cloneElements","none","currX","currY","currData","move","line","simple","d","prevX","prevY","prevData","curve","postpone","cardinal","tension","segment","z","iLen","monotoneCubic","xs","ys","ms","ds","dys","dxs","LineChart","chart","seriesGroup","type","fullWidth","createGridAndLabels","showGridBackground","raw","seriesIndex","seriesElement","pathData","valueIndex","smoothing","lineSmooth","showPoint","point","showLine","clone","showArea","areaBase","areaBaseProjected","splitByCommand","onlySolidSegments","pathSegment","convertToArea","solidPathSegments","firstElement","lastElement","createArea","areaPath","area","BarChart","distributeSeries","horizontalBars","stackBars","serialSums","prev","curr","valueAxis","labelAxisTicks","labelAxis","zeroPoint","stackedBarValues","biPol","periodHalfLength","projected","bar","previousStack","labelAxisValueIndex","seriesBarDistance","positions","stackMode","metaData","determineAnchorPosition","center","direction","toTheRight","PieChart","seriesGroups","labelsGroup","labelRadius","totalDataSum","startAngle","donut","chartDonut","chartPie","total","previousValue","currentValue","donutWidth","labelPosition","hasSingleValInSeries","val","ignoreEmptyValues","endAngle","overlappigStartAngle","start","end","arc","sliceDonut","slicePie","rawValue","interpolatedValue","labelDirection"],"mappings":"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","file":"chartist.esm.js"} \ No newline at end of file diff --git a/dist/chartist.min.css b/dist/chartist.min.css new file mode 100644 index 00000000..18dde681 --- /dev/null +++ b/dist/chartist.min.css @@ -0,0 +1,2 @@ +.ct-label{fill:rgba(0,0,0,.4);color:rgba(0,0,0,.4);font-size:.75rem;line-height:1}.ct-chart-bar .ct-label,.ct-chart-line .ct-label{display:block;display:-webkit-box;display:-ms-flexbox;display:flex}.ct-chart-donut .ct-label,.ct-chart-pie .ct-label{dominant-baseline:central}.ct-label.ct-horizontal.ct-start{-webkit-box-align:flex-end;-ms-flex-align:flex-end;align-items:flex-end}.ct-label.ct-horizontal.ct-end,.ct-label.ct-horizontal.ct-start{-webkit-box-pack:flex-start;-ms-flex-pack:flex-start;justify-content:flex-start;text-align:left;text-anchor:start}.ct-label.ct-horizontal.ct-end{-webkit-box-align:flex-start;-ms-flex-align:flex-start;align-items:flex-start}.ct-label.ct-vertical.ct-start{-webkit-box-align:flex-end;-ms-flex-align:flex-end;align-items:flex-end;-webkit-box-pack:flex-end;-ms-flex-pack:flex-end;justify-content:flex-end;text-align:right;text-anchor:end}.ct-label.ct-vertical.ct-end{-webkit-box-pack:flex-start;-ms-flex-pack:flex-start;justify-content:flex-start;text-align:left}.ct-chart-bar .ct-label.ct-horizontal.ct-start,.ct-label.ct-vertical.ct-end{-webkit-box-align:flex-end;-ms-flex-align:flex-end;align-items:flex-end;text-anchor:start}.ct-chart-bar .ct-label.ct-horizontal.ct-end,.ct-chart-bar .ct-label.ct-horizontal.ct-start{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;text-align:center}.ct-chart-bar .ct-label.ct-horizontal.ct-end{-webkit-box-align:flex-start;-ms-flex-align:flex-start;align-items:flex-start;text-anchor:start}.ct-chart-bar.ct-horizontal-bars .ct-label.ct-horizontal.ct-start{-webkit-box-align:flex-end;-ms-flex-align:flex-end;align-items:flex-end;-webkit-box-pack:flex-start;-ms-flex-pack:flex-start;justify-content:flex-start;text-align:left;text-anchor:start}.ct-chart-bar.ct-horizontal-bars .ct-label.ct-horizontal.ct-end{-webkit-box-align:flex-start;-ms-flex-align:flex-start;align-items:flex-start;-webkit-box-pack:flex-start;-ms-flex-pack:flex-start;justify-content:flex-start;text-align:left;text-anchor:start}.ct-chart-bar.ct-horizontal-bars .ct-label.ct-vertical.ct-start{-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:flex-end;-ms-flex-pack:flex-end;justify-content:flex-end;text-align:right;text-anchor:end}.ct-chart-bar.ct-horizontal-bars .ct-label.ct-vertical.ct-end{-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:flex-start;-ms-flex-pack:flex-start;justify-content:flex-start;text-align:left;text-anchor:end}.ct-grid{stroke:rgba(0,0,0,.2);stroke-width:1px;stroke-dasharray:2px}.ct-grid-background{fill:none}.ct-point{stroke-width:10px;stroke-linecap:round}.ct-line{fill:none;stroke-width:4px}.ct-area{stroke:none;fill-opacity:.1}.ct-bar{fill:none;stroke-width:10px}.ct-slice-donut{fill:none;stroke-width:60px}.ct-series-a .ct-bar,.ct-series-a .ct-line,.ct-series-a .ct-point,.ct-series-a .ct-slice-donut{stroke:#d70206}.ct-series-a .ct-area,.ct-series-a .ct-slice-pie{fill:#d70206}.ct-series-b .ct-bar,.ct-series-b .ct-line,.ct-series-b .ct-point,.ct-series-b .ct-slice-donut{stroke:#f05b4f}.ct-series-b .ct-area,.ct-series-b .ct-slice-pie{fill:#f05b4f}.ct-series-c .ct-bar,.ct-series-c .ct-line,.ct-series-c .ct-point,.ct-series-c .ct-slice-donut{stroke:#f4c63d}.ct-series-c .ct-area,.ct-series-c .ct-slice-pie{fill:#f4c63d}.ct-series-d .ct-bar,.ct-series-d .ct-line,.ct-series-d .ct-point,.ct-series-d .ct-slice-donut{stroke:#d17905}.ct-series-d .ct-area,.ct-series-d .ct-slice-pie{fill:#d17905}.ct-series-e .ct-bar,.ct-series-e .ct-line,.ct-series-e .ct-point,.ct-series-e .ct-slice-donut{stroke:#453d3f}.ct-series-e .ct-area,.ct-series-e .ct-slice-pie{fill:#453d3f}.ct-series-f .ct-bar,.ct-series-f .ct-line,.ct-series-f .ct-point,.ct-series-f .ct-slice-donut{stroke:#59922b}.ct-series-f .ct-area,.ct-series-f .ct-slice-pie{fill:#59922b}.ct-series-g .ct-bar,.ct-series-g .ct-line,.ct-series-g .ct-point,.ct-series-g .ct-slice-donut{stroke:#0544d3}.ct-series-g .ct-area,.ct-series-g .ct-slice-pie{fill:#0544d3}.ct-series-h .ct-bar,.ct-series-h .ct-line,.ct-series-h .ct-point,.ct-series-h .ct-slice-donut{stroke:#6b0392}.ct-series-h .ct-area,.ct-series-h .ct-slice-pie{fill:#6b0392}.ct-series-i .ct-bar,.ct-series-i .ct-line,.ct-series-i .ct-point,.ct-series-i .ct-slice-donut{stroke:#f05b4f}.ct-series-i .ct-area,.ct-series-i .ct-slice-pie{fill:#f05b4f}.ct-series-j .ct-bar,.ct-series-j .ct-line,.ct-series-j .ct-point,.ct-series-j .ct-slice-donut{stroke:#dda458}.ct-series-j .ct-area,.ct-series-j .ct-slice-pie{fill:#dda458}.ct-series-k .ct-bar,.ct-series-k .ct-line,.ct-series-k .ct-point,.ct-series-k .ct-slice-donut{stroke:#eacf7d}.ct-series-k .ct-area,.ct-series-k .ct-slice-pie{fill:#eacf7d}.ct-series-l .ct-bar,.ct-series-l .ct-line,.ct-series-l .ct-point,.ct-series-l .ct-slice-donut{stroke:#86797d}.ct-series-l .ct-area,.ct-series-l .ct-slice-pie{fill:#86797d}.ct-series-m .ct-bar,.ct-series-m .ct-line,.ct-series-m .ct-point,.ct-series-m .ct-slice-donut{stroke:#b2c326}.ct-series-m .ct-area,.ct-series-m .ct-slice-pie{fill:#b2c326}.ct-series-n .ct-bar,.ct-series-n .ct-line,.ct-series-n .ct-point,.ct-series-n .ct-slice-donut{stroke:#6188e2}.ct-series-n .ct-area,.ct-series-n .ct-slice-pie{fill:#6188e2}.ct-series-o .ct-bar,.ct-series-o .ct-line,.ct-series-o .ct-point,.ct-series-o .ct-slice-donut{stroke:#a748ca}.ct-series-o .ct-area,.ct-series-o .ct-slice-pie{fill:#a748ca}.ct-square{display:block;position:relative;width:100%}.ct-square:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:100%}.ct-square:after{content:"";display:table;clear:both}.ct-square>svg{display:block;position:absolute;top:0;left:0}.ct-minor-second{display:block;position:relative;width:100%}.ct-minor-second:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:93.75%}.ct-minor-second:after{content:"";display:table;clear:both}.ct-minor-second>svg{display:block;position:absolute;top:0;left:0}.ct-major-second{display:block;position:relative;width:100%}.ct-major-second:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:88.88889%}.ct-major-second:after{content:"";display:table;clear:both}.ct-major-second>svg{display:block;position:absolute;top:0;left:0}.ct-minor-third{display:block;position:relative;width:100%}.ct-minor-third:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:83.33333%}.ct-minor-third:after{content:"";display:table;clear:both}.ct-minor-third>svg{display:block;position:absolute;top:0;left:0}.ct-major-third{display:block;position:relative;width:100%}.ct-major-third:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:80%}.ct-major-third:after{content:"";display:table;clear:both}.ct-major-third>svg{display:block;position:absolute;top:0;left:0}.ct-perfect-fourth{display:block;position:relative;width:100%}.ct-perfect-fourth:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:75%}.ct-perfect-fourth:after{content:"";display:table;clear:both}.ct-perfect-fourth>svg{display:block;position:absolute;top:0;left:0}.ct-perfect-fifth{display:block;position:relative;width:100%}.ct-perfect-fifth:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:66.66667%}.ct-perfect-fifth:after{content:"";display:table;clear:both}.ct-perfect-fifth>svg{display:block;position:absolute;top:0;left:0}.ct-minor-sixth{display:block;position:relative;width:100%}.ct-minor-sixth:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:62.5%}.ct-minor-sixth:after{content:"";display:table;clear:both}.ct-minor-sixth>svg{display:block;position:absolute;top:0;left:0}.ct-golden-section{display:block;position:relative;width:100%}.ct-golden-section:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:61.8047%}.ct-golden-section:after{content:"";display:table;clear:both}.ct-golden-section>svg{display:block;position:absolute;top:0;left:0}.ct-major-sixth{display:block;position:relative;width:100%}.ct-major-sixth:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:60%}.ct-major-sixth:after{content:"";display:table;clear:both}.ct-major-sixth>svg{display:block;position:absolute;top:0;left:0}.ct-minor-seventh{display:block;position:relative;width:100%}.ct-minor-seventh:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:56.25%}.ct-minor-seventh:after{content:"";display:table;clear:both}.ct-minor-seventh>svg{display:block;position:absolute;top:0;left:0}.ct-major-seventh{display:block;position:relative;width:100%}.ct-major-seventh:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:53.33333%}.ct-major-seventh:after{content:"";display:table;clear:both}.ct-major-seventh>svg{display:block;position:absolute;top:0;left:0}.ct-octave{display:block;position:relative;width:100%}.ct-octave:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:50%}.ct-octave:after{content:"";display:table;clear:both}.ct-octave>svg{display:block;position:absolute;top:0;left:0}.ct-major-tenth{display:block;position:relative;width:100%}.ct-major-tenth:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:40%}.ct-major-tenth:after{content:"";display:table;clear:both}.ct-major-tenth>svg{display:block;position:absolute;top:0;left:0}.ct-major-eleventh{display:block;position:relative;width:100%}.ct-major-eleventh:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:37.5%}.ct-major-eleventh:after{content:"";display:table;clear:both}.ct-major-eleventh>svg{display:block;position:absolute;top:0;left:0}.ct-major-twelfth{display:block;position:relative;width:100%}.ct-major-twelfth:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:33.33333%}.ct-major-twelfth:after{content:"";display:table;clear:both}.ct-major-twelfth>svg{display:block;position:absolute;top:0;left:0}.ct-double-octave{display:block;position:relative;width:100%}.ct-double-octave:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:25%}.ct-double-octave:after{content:"";display:table;clear:both}.ct-double-octave>svg{display:block;position:absolute;top:0;left:0} +/*# sourceMappingURL=chartist.min.css.map */ \ No newline at end of file diff --git a/dist/chartist.min.css.map b/dist/chartist.min.css.map new file mode 100644 index 00000000..f51ef128 --- /dev/null +++ b/dist/chartist.min.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["src/styles/chartist.scss","src/styles/settings/_chartist-settings.scss"],"names":[],"mappings":"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","file":"chartist.min.css"} \ No newline at end of file diff --git a/dist/chartist.umd.js b/dist/chartist.umd.js new file mode 100644 index 00000000..ea9f9ab1 --- /dev/null +++ b/dist/chartist.umd.js @@ -0,0 +1,9 @@ +/* Chartist.js 1.0.0 + * Copyright © 2016 Gion Kunz + * Free to use under either the WTFPL license or the MIT license. + * https://raw.githubusercontent.com/gionkunz/chartist-js/master/LICENSE-WTFPL + * https://raw.githubusercontent.com/gionkunz/chartist-js/master/LICENSE-MIT + */ +!function(a,b){"object"==typeof exports&&"undefined"!=typeof module?b(exports):"function"==typeof define&&define.amd?define(["exports"],b):b(a.Chartist=a.Chartist||{})}(this,function(a){"use strict";function b(a,b,c){return a.replace(new RegExp(b,"g"),c)}function c(a){return a instanceof Node?a:document.querySelector(a)}function d(a,b){return null!==a&&"object"==typeof a&&a.hasOwnProperty(b)}function e(a){return null!==a&&isFinite(a)}function f(a){return!a&&0!==a}function g(a){return e(a)?+a:void 0}function h(a,b){return"number"==typeof a&&(a+=b),a}function i(a){if("string"==typeof a){var b=/^(\d+)\s*(.*)$/g.exec(a);return{value:+b[1],unit:b[2]||void 0}}return{value:a}}function j(a){return String.fromCharCode(97+a%26)}function k(a){return a}function l(a){return Array.apply(null,new Array(a))}function m(a,b){return a+(b?b:0)}function n(a){return function(b){return b*a}}function o(a){return function(b){return b+a}}function p(a,b){var c=[],d=Math.max.apply(null,a.map(function(a){return a.length}));return l(d).forEach(function(d,e){var f=a.map(function(a){return a[e]});c[e]=b.apply(null,f)}),c}function q(a){return Math.floor(Math.log(Math.abs(a))/Math.LN10)}function r(a,b,c){return b/c.range*a}function s(a,b){var c=Math.pow(10,b||c);return Math.round(a*c)/c}function t(a){function b(a,c){return a%c===0?c:b(c,a%c)}function c(a){return a*a+1}if(1===a)return a;var d,e=2,f=2;if(a%2===0)return 2;do e=c(e)%a,f=c(c(f))%a,d=b(Math.abs(e-f),a);while(1===d);return d}function u(a,b,c,d){var e=(d-90)*Math.PI/180;return{x:a+c*Math.cos(e),y:b+c*Math.sin(e)}}function v(a){var b,c,d;for(a=a||{},b=1;b=2&&a[g]<=a[g-2]&&(f=!0),f&&(e.push({pathCoordinates:[],valueData:[]}),f=!1),e[e.length-1].pathCoordinates.push(a[g],a[g+1]),e[e.length-1].valueData.push(b[g/2]));return e}function H(a,b,c){function d(a){if(void 0!==a)if(a instanceof Array)for(var b=0;be.high&&(e.high=h),g&&h0?e.low=0:(e.high=1,e.low=0)),e}function I(a,b,c,d){function e(a,b){return a===(a+=b)&&(a*=1+(b>0?n:-n)),a}var f,g,h,i=0,j={high:b.high,low:b.low};j.valueRange=j.high-j.low,j.oom=q(j.valueRange),j.step=Math.pow(10,j.oom),j.min=Math.floor(j.low/j.step)*j.step,j.max=Math.ceil(j.high/j.step)*j.step,j.range=j.max-j.min,j.numberOfSteps=Math.round(j.range/j.step);var k=r(a,j.step,j),l=k=c)j.step=1;else if(d&&m=c)j.step=m;else for(;;){if(l&&r(a,j.step,j)<=c)j.step*=2;else{if(l||!(r(a,j.step/2,j)>=c))break;if(j.step/=2,d&&j.step%1!==0){j.step*=2;break}}if(i++>1e3)throw new Error("Exceeded maximum number of iterations while optimizing scale step!")}var n=2.221e-16;for(j.step=Math.max(j.step,n),g=j.min,h=j.max;g+j.step<=j.low;)g=e(g,j.step);for(;h-j.step>=j.high;)h=e(h,-j.step);j.min=g,j.max=h,j.range=j.max-j.min;var o=[];for(f=j.min;f<=j.max;f=e(f,j.step)){var p=s(f);p!==o[o.length-1]&&o.push(f)}return j.values=o,j}function J(a){return document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#"+a,"1.1")}function K(a,b,c,d){var e;return b=b||"100%",c=c||"100%",Array.prototype.slice.call(a.querySelectorAll("svg")).filter(function(a){return a.getAttributeNS($.xmlns,"ct")}).forEach(function(b){a.removeChild(b)}),e=new ea("svg").attr({width:b,height:c}).addClass(d).attr({style:"width: "+b+"; height: "+c+";"}),a.appendChild(e._node),e}function L(a,b){return b=b||0,"number"==typeof a?{top:a,right:a,bottom:a,left:a}:{top:"number"==typeof a.top?a.top:b,right:"number"==typeof a.right?a.right:b,bottom:"number"==typeof a.bottom?a.bottom:b,left:"number"==typeof a.left?a.left:b}}function M(a,b,c){var d=!(!b.axisX&&!b.axisY),e=d?b.axisY.offset:0,f=d?b.axisX.offset:0,g=a.width()||i(b.width).value||0,h=a.height()||i(b.height).value||0,j=L(b.chartPadding,c);g=Math.max(g,e+j.left+j.right),h=Math.max(h,f+j.top+j.bottom);var k={padding:j,width:function(){return this.x2-this.x1},height:function(){return this.y1-this.y2}};return d?("start"===b.axisX.position?(k.y2=j.top+f,k.y1=Math.max(h-j.bottom,k.y2+1)):(k.y2=j.top,k.y1=Math.max(h-j.bottom-f,k.y2+1)),"start"===b.axisY.position?(k.x1=j.left+e,k.x2=Math.max(g-j.right,k.x1+1)):(k.x1=j.left,k.x2=Math.max(g-j.right-e,k.x1+1))):(k.x1=j.left,k.x2=Math.max(g-j.right,k.x1+1),k.y2=j.top,k.y1=Math.max(h-j.bottom,k.y2+1)),k}function N(a,b,c,d,e,f,g,h){var i={};i[c.units.pos+"1"]=a,i[c.units.pos+"2"]=a,i[c.counterUnits.pos+"1"]=d,i[c.counterUnits.pos+"2"]=d+e;var j=f.elem("line",i,g.join(" "));h.emit("draw",v({type:"grid",axis:c,index:b,group:f,element:j},i))}function O(a,b,c,d){var e=a.elem("rect",{x:b.x1,y:b.y2,width:b.width(),height:b.height()},c,!0);d.emit("draw",{type:"gridBackground",group:a,element:e})}function P(a,b,c,d,e,f,g,h,i,j,k){var l,m={};if(m[e.units.pos]=a+g[e.units.pos],m[e.counterUnits.pos]=g[e.counterUnits.pos],m[e.units.len]=b,m[e.counterUnits.len]=Math.max(0,f-10),j){var n=''+d[c]+"";l=h.foreignObject(n,v({style:"overflow: visible;"},m))}else l=h.elem("text",m,i.join(" ")).text(d[c]);k.emit("draw",v({type:"label",axis:e,index:c,group:h,element:l,text:d[c]},m))}function Q(a,b,c){function d(a){var d=f;if(f=v({},h),b)for(g=0;g1){var h=[];return g.forEach(function(a){h.push(b(a.pathCoordinates,a.valueData))}),sa.join(h)}if(e=g[0].pathCoordinates,f=g[0].valueData,e.length<=4)return T()(e,f);for(var i,j=(new sa).move(e[0],e[1],!1,f[0]),k=0,l=e.length;l-2*!i>k;k+=2){var m=[{x:+e[k-2],y:+e[k-1]},{x:+e[k],y:+e[k+1]},{x:+e[k+2],y:+e[k+3]},{x:+e[k+4],y:+e[k+5]}];i?k?l-4===k?m[3]={x:+e[0],y:+e[1]}:l-2===k&&(m[2]={x:+e[0],y:+e[1]},m[3]={x:+e[2],y:+e[3]}):m[0]={x:+e[l-2],y:+e[l-1]}:l-4===k?m[3]=m[2]:k||(m[0]={x:+e[k],y:+e[k+1]}),j.curve(c*(-m[0].x+6*m[1].x+m[2].x)/6+d*m[2].x,c*(-m[0].y+6*m[1].y+m[2].y)/6+d*m[2].y,c*(m[1].x+6*m[2].x-m[3].x)/6+d*m[2].x,c*(m[1].y+6*m[2].y-m[3].y)/6+d*m[2].y,m[2].x,m[2].y,!1,f[(k+2)/2])}return j}return T()([])}}function X(a){var b={fillHoles:!1};return a=v({},b,a),function b(c,d){var e=G(c,d,{fillHoles:a.fillHoles,increasingX:!0});if(e.length){if(e.length>1){var f=[];return e.forEach(function(a){f.push(b(a.pathCoordinates,a.valueData))}),sa.join(f)}if(c=e[0].pathCoordinates,d=e[0].valueData,c.length<=4)return T()(c,d);var g,h,i=[],j=[],k=c.length/2,l=[],m=[],n=[],o=[];for(g=0;g0!=m[g]>0?l[g]=0:(l[g]=3*(o[g-1]+o[g])/((2*o[g]+o[g-1])/m[g-1]+(o[g]+2*o[g-1])/m[g]),isFinite(l[g])||(l[g]=0));for(h=(new sa).move(i[0],j[0],!1,d[0]),g=0;ga.x;return d&&"explode"===c||!d&&"implode"===c?"start":d&&"implode"===c||!d&&"explode"===c?"end":"middle"}var Z="1.0.0",$={svg:"http://www.w3.org/2000/svg",xmlns:"http://www.w3.org/2000/xmlns/",xhtml:"http://www.w3.org/1999/xhtml",xlink:"http://www.w3.org/1999/xlink",ct:"http://gionkunz.github.com/chartist-js/ct"},_=8,aa={"&":"&","<":"<",">":">",'"':""","'":"'"},ba=function(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")},ca=function(){function a(a,b){for(var c=0;c1}).map(function(a){var b=a.pathElements[0],c=a.pathElements[a.pathElements.length-1];return a.clone(!0).position(0).remove(1).move(b.x,s).line(b.x,b.y).position(a.pathElements.length+1).line(c.x,s)}).forEach(function(e){var g=k.elem("path",{d:e.stringify()},a.classNames.area,!0);this.eventEmitter.emit("draw",{type:"area",values:b.normalized.series[h],path:e.clone(),series:f,seriesIndex:h,axisX:c,axisY:d,chartRect:i,index:h,group:k,element:g})}.bind(this))}}.bind(this)),this.eventEmitter.emit("created",{bounds:d.bounds,chartRect:i,axisX:c,axisY:d,svg:this.svg,options:a})}}]),b}(ha),wa={axisX:{offset:30,position:"end",labelOffset:{x:0,y:0},showLabel:!0,showGrid:!0,labelInterpolationFnc:k,scaleMinSpace:30,onlyInteger:!1},axisY:{offset:40,position:"start",labelOffset:{x:0,y:0},showLabel:!0,showGrid:!0,labelInterpolationFnc:k,scaleMinSpace:20,onlyInteger:!1},width:void 0,height:void 0,high:void 0,low:void 0,referenceValue:0,chartPadding:{top:15,right:15,bottom:5,left:10},seriesBarDistance:15,stackBars:!1,stackMode:"accumulate",horizontalBars:!1,distributeSeries:!1,reverseData:!1,showGridBackground:!1,classNames:{chart:"ct-chart-bar",horizontalBars:"ct-horizontal-bars",label:"ct-label",labelGroup:"ct-labels",series:"ct-series",bar:"ct-bar",grid:"ct-grid",gridGroup:"ct-grids",gridBackground:"ct-grid-background",vertical:"ct-vertical",horizontal:"ct-horizontal",start:"ct-start",end:"ct-end"}},xa=function(a){function b(a,c,d,e){return ba(this,b),ia(this,(b.__proto__||Object.getPrototypeOf(b)).call(this,a,c,wa,v({},wa,d),e))}return ja(b,a),ca(b,[{key:"createChart",value:function(a){var b,c;a.distributeSeries?(b=y(this.data,a.reverseData,a.horizontalBars?"x":"y"),b.normalized.series=b.normalized.series.map(function(a){return[a]})):b=y(this.data,a.reverseData,a.horizontalBars?"x":"y"),this.svg=K(this.container,a.width,a.height,a.classNames.chart+(a.horizontalBars?" "+a.classNames.horizontalBars:""));var d=this.svg.elem("g").addClass(a.classNames.gridGroup),f=this.svg.elem("g"),g=this.svg.elem("g").addClass(a.classNames.labelGroup);if(a.stackBars&&0!==b.normalized.series.length){var h=p(b.normalized.series,function(){return Array.prototype.slice.call(arguments).map(function(a){return a}).reduce(function(a,b){return{x:a.x+(b&&b.x)||0,y:a.y+(b&&b.y)||0}},{x:0,y:0})});c=H([h],a,a.horizontalBars?"x":"y")}else c=H(b.normalized.series,a,a.horizontalBars?"x":"y");c.high=+a.high||(0===a.high?0:c.high),c.low=+a.low||(0===a.low?0:c.low);var i,k,l,m,n,o=M(this.svg,a,wa.padding);k=a.distributeSeries&&a.stackBars?b.normalized.labels.slice(0,1):b.normalized.labels,a.horizontalBars?(i=m=void 0===a.axisX.type?new na(ka.x,b.normalized.series,o,v({},a.axisX,{ +highLow:c,referenceValue:0})):new a.axisX.type(ka.x,b.normalized.series,o,v({},a.axisX,{highLow:c,referenceValue:0})),l=n=void 0===a.axisY.type?new pa(ka.y,b.normalized.series,o,{ticks:k}):new a.axisY.type(ka.y,b.normalized.series,o,a.axisY)):(l=m=void 0===a.axisX.type?new pa(ka.x,b.normalized.series,o,{ticks:k}):new a.axisX.type(ka.x,b.normalized.series,o,a.axisX),i=n=void 0===a.axisY.type?new na(ka.y,b.normalized.series,o,v({},a.axisY,{highLow:c,referenceValue:0})):new a.axisY.type(ka.units.y,b.normalized.series,o,v({},a.axisY,{highLow:c,referenceValue:0})));var q=a.horizontalBars?o.x1+i.projectValue(0):o.y1-i.projectValue(0),r=[];l.createGridAndLabels(d,g,this.supportsForeignObject,a,this.eventEmitter),i.createGridAndLabels(d,g,this.supportsForeignObject,a,this.eventEmitter),a.showGridBackground&&O(d,o,a.classNames.gridBackground,this.eventEmitter),b.raw.series.forEach(function(c,d){var g,h,k=d-(b.raw.series.length-1)/2;g=a.distributeSeries&&!a.stackBars?l.axisLength/b.normalized.series.length/2:a.distributeSeries&&a.stackBars?l.axisLength/2:l.axisLength/b.normalized.series[d].length/2,h=f.elem("g"),h.attr({"ct:series-name":c.name,"ct:meta":w(c.meta)}),h.addClass([a.classNames.series,c.className||a.classNames.series+"-"+j(d)].join(" ")),b.normalized.series[d].forEach(function(f,j){var p,s,t,u;if(u=a.distributeSeries&&!a.stackBars?d:a.distributeSeries&&a.stackBars?0:j,p=a.horizontalBars?{x:o.x1+i.projectValue(f&&f.x?f.x:0,j,b.normalized.series[d]),y:o.y1-l.projectValue(f&&f.y?f.y:0,u,b.normalized.series[d])}:{x:o.x1+l.projectValue(f&&f.x?f.x:0,u,b.normalized.series[d]),y:o.y1-i.projectValue(f&&f.y?f.y:0,j,b.normalized.series[d])},l instanceof pa&&(l.options.stretch||(p[l.units.pos]+=g*(a.horizontalBars?-1:1)),p[l.units.pos]+=a.stackBars||a.distributeSeries?0:k*a.seriesBarDistance*(a.horizontalBars?-1:1)),t=r[j]||q,r[j]=t-(q-p[l.counterUnits.pos]),void 0!==f){var x={};x[l.units.pos+"1"]=p[l.units.pos],x[l.units.pos+"2"]=p[l.units.pos],!a.stackBars||"accumulate"!==a.stackMode&&a.stackMode?(x[l.counterUnits.pos+"1"]=q,x[l.counterUnits.pos+"2"]=p[l.counterUnits.pos]):(x[l.counterUnits.pos+"1"]=t,x[l.counterUnits.pos+"2"]=r[j]),x.x1=Math.min(Math.max(x.x1,o.x1),o.x2),x.x2=Math.min(Math.max(x.x2,o.x1),o.x2),x.y1=Math.min(Math.max(x.y1,o.y2),o.y1),x.y2=Math.min(Math.max(x.y2,o.y2),o.y1);var y=z(c,j);s=h.elem("line",x,a.classNames.bar).attr({"ct:value":[f.x,f.y].filter(e).join(","),"ct:meta":w(y)}),this.eventEmitter.emit("draw",v({type:"bar",value:f,index:j,meta:y,series:c,seriesIndex:d,axisX:m,axisY:n,chartRect:o,group:h,element:s},x))}}.bind(this))}.bind(this)),this.eventEmitter.emit("created",{bounds:i.bounds,chartRect:o,axisX:m,axisY:n,svg:this.svg,options:a})}}]),b}(ha),ya={width:void 0,height:void 0,chartPadding:5,classNames:{chartPie:"ct-chart-pie",chartDonut:"ct-chart-donut",series:"ct-series",slicePie:"ct-slice-pie",sliceDonut:"ct-slice-donut",label:"ct-label"},startAngle:0,total:void 0,donut:!1,donutWidth:60,showLabel:!0,labelOffset:0,labelPosition:"inside",labelInterpolationFnc:k,labelDirection:"neutral",reverseData:!1,ignoreEmptyValues:!1},za=function(a){function b(a,c,d,e){return ba(this,b),ia(this,(b.__proto__||Object.getPrototypeOf(b)).call(this,a,c,ya,v({},ya,d),e))}return ja(b,a),ca(b,[{key:"createChart",value:function(a){var b,c,d,e,g,h=y(this.data),k=[],l=a.startAngle;this.svg=K(this.container,a.width,a.height,a.donut?a.classNames.chartDonut:a.classNames.chartPie),c=M(this.svg,a,ya.padding),d=Math.min(c.width()/2,c.height()/2),g=a.total||h.normalized.series.reduce(function(a,b){return a+b},0);var m=i(a.donutWidth);"%"===m.unit&&(m.value*=d/100),d-=a.donut?m.value/2:0,e="outside"===a.labelPosition||a.donut?d:"center"===a.labelPosition?0:d/2,e+=a.labelOffset;var n={x:c.x1+c.width()/2,y:c.y2+c.height()/2},o=1===h.raw.series.filter(function(a){return a.hasOwnProperty("value")?0!==a.value:0!==a}).length;h.raw.series.forEach(function(a,b){k[b]=this.svg.elem("g",null,null)}.bind(this)),a.showLabel&&(b=this.svg.elem("g",null,null)),h.raw.series.forEach(function(c,i){if(0!==h.normalized.series[i]||!a.ignoreEmptyValues){k[i].attr({"ct:series-name":c.name}),k[i].addClass([a.classNames.series,c.className||a.classNames.series+"-"+j(i)].join(" "));var p=g>0?l+h.normalized.series[i]/g*360:0,q=Math.max(0,l-(0===i||o?0:.2));p-q>=359.99&&(p=q+359.99);var r=u(n.x,n.y,d,q),s=u(n.x,n.y,d,p),t=new sa(!a.donut).move(s.x,s.y).arc(d,d,0,p-l>180,0,r.x,r.y);a.donut||t.line(n.x,n.y);var v=k[i].elem("path",{d:t.stringify()},a.donut?a.classNames.sliceDonut:a.classNames.slicePie);if(v.attr({"ct:value":h.normalized.series[i],"ct:meta":w(c.meta)}),a.donut&&v.attr({style:"stroke-width: "+m.value+"px"}),this.eventEmitter.emit("draw",{type:"slice",value:h.normalized.series[i],totalDataSum:g,index:i,meta:c.meta,series:c,group:k[i],element:v,path:t.clone(),center:n,radius:d,startAngle:l,endAngle:p}),a.showLabel){var x;x=1===h.raw.series.length?{x:n.x,y:n.y}:u(n.x,n.y,e,l+(p-l)/2);var y;y=h.normalized.labels&&!f(h.normalized.labels[i])?h.normalized.labels[i]:h.normalized.series[i];var z=a.labelInterpolationFnc(y,i);if(z||0===z){var A=b.elem("text",{dx:x.x,dy:x.y,"text-anchor":Y(n,x,a.labelDirection)},a.classNames.label).text(""+z);this.eventEmitter.emit("draw",{type:"label",index:i,group:b,element:A,text:""+z,x:x.x,y:x.y})}}l=p}}.bind(this)),this.eventEmitter.emit("created",{chartRect:c,svg:this.svg,options:a})}}]),b}(ha);a.Interpolation=ta,a.EventEmitter=ga,a.extend=v,a.optionsProvider=Q,a.namespaces=$,a.precision=_,a.escapingMap=aa,a.version=Z,a.replaceAll=b,a.querySelector=c,a.safeHasProperty=d,a.isNumeric=e,a.isFalseyButZero=f,a.getNumberOrUndefined=g,a.ensureUnit=h,a.quantity=i,a.alphaNumerate=j,a.noop=k,a.times=l,a.sum=m,a.mapMultiply=n,a.mapAdd=o,a.serialMap=p,a.orderOfMagnitude=q,a.projectLength=r,a.roundWithPrecision=s,a.rho=t,a.polarToCartesian=u,a.serialize=w,a.deserialize=x,a.normalizeData=y,a.getMetaData=z,a.isDataHoleValue=A,a.reverseData=B,a.getDataArray=C,a.isMultiValue=D,a.getMultiValue=E,a.getSeriesOption=F,a.splitIntoSegments=G,a.getHighLow=H,a.getBounds=I,a.createSvg=K,a.normalizePadding=L,a.createChartRect=M,a.createGrid=N,a.createGridBackground=O,a.createLabel=P,a.BaseChart=ha,a.LineChart=va,a.BarChart=xa,a.PieChart=za,a.Axis=la,a.axisUnits=ka,a.AutoScaleAxis=na,a.FixedScaleAxis=oa,a.StepAxis=pa,a.Svg=ea,a.isSupported=J,a.easings=fa,a.SvgList=da,a.SvgPath=sa,Object.defineProperty(a,"__esModule",{value:!0})}); +//# sourceMappingURL=chartist.umd.js.map \ No newline at end of file diff --git a/dist/chartist.umd.js.map b/dist/chartist.umd.js.map new file mode 100644 index 00000000..a26d78b8 --- /dev/null +++ b/dist/chartist.umd.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/core/lang.js","../src/core/functional.js","../src/core/math.js","../src/core/extend.js","../src/core/data.js","../src/svg/svg.js","../src/core/creation.js","../src/core/options-provider.js","../src/svg/svg-path.js","../src/interpolation/none.js","../src/interpolation/simple.js","../src/interpolation/step.js","../src/interpolation/cardinal.js","../src/interpolation/monotone-cubic.js","../src/charts/pie.js","../package.json!file:/home/gion/Code/chartist/tooling/system-loaders/package.json","../src/core/globals.js","../jspm_packages/npm/systemjs-plugin-babel@0.0.16/babel-helpers/classCallCheck.js","../jspm_packages/npm/systemjs-plugin-babel@0.0.16/babel-helpers/createClass.js","../src/svg/svg-list.js","../src/event/event-emitter.js","../src/charts/base.js","../jspm_packages/npm/systemjs-plugin-babel@0.0.16/babel-helpers/possibleConstructorReturn.js","../jspm_packages/npm/systemjs-plugin-babel@0.0.16/babel-helpers/inherits.js","../src/axes/axis.js","../jspm_packages/npm/systemjs-plugin-babel@0.0.16/babel-helpers/get.js","../src/axes/auto-scale-axis.js","../src/axes/fixed-scale-axis.js","../src/axes/step-axis.js","../src/charts/line.js","../src/charts/bar.js"],"names":["replaceAll","str","subStr","newSubStr","replace","RegExp","querySelector","query","Node","document","safeHasProperty","object","property","hasOwnProperty","isNumeric","value","isFinite","isFalseyButZero","getNumberOrUndefined","undefined","ensureUnit","unit","quantity","input","match","exec","alphaNumerate","n","String","fromCharCode","noop","times","length","Array","apply","sum","previous","current","mapMultiply","factor","num","mapAdd","addend","serialMap","arr","cb","result","Math","max","map","e","forEach","index","args","orderOfMagnitude","floor","log","abs","LN10","projectLength","axisLength","bounds","range","roundWithPrecision","digits","precision","pow","round","rho","gcd","p","q","f","x","divisor","x1","x2","polarToCartesian","centerX","centerY","radius","angleInDegrees","angleInRadians","PI","cos","sin","extend","target","i","source","sourceProp","arguments","prop","serialize","data","JSON","stringify","Object","keys","escapingMap","reduce","key","deserialize","parse","normalizeData","reverse","multi","labelCount","output","normalized","series","getDataArray","every","labels","slice","prototype","push","getMetaData","meta","isDataHoleValue","isNaN","reverseData","recursiveConvert","multiValue","y","isMultiValue","getMultiValue","dimension","getSeriesOption","options","name","seriesOptions","splitIntoSegments","pathCoordinates","valueData","defaultOptions","segments","hole","fillHoles","increasingX","getHighLow","recursiveHighLow","findHigh","highLow","high","findLow","low","toUpperCase","Number","MAX_VALUE","referenceValue","min","getBounds","scaleMinSpace","onlyInteger","safeIncrement","increment","EPSILON","newMin","newMax","optimizationCounter","valueRange","oom","step","ceil","numberOfSteps","scaleUp","smallestFactor","Error","values","isSupported","feature","implementation","hasFeature","createSvg","container","width","height","className","svg","call","querySelectorAll","filter","getAttributeNS","namespaces","xmlns","removeChild","Svg","attr","addClass","appendChild","_node","normalizePadding","padding","fallback","top","right","bottom","left","createChartRect","fallbackPadding","hasAxis","axisX","axisY","yAxisOffset","offset","xAxisOffset","normalizedPadding","chartPadding","chartRect","this","y1","y2","position","createGrid","axis","group","classes","eventEmitter","positionalData","units","pos","counterUnits","gridElement","elem","join","emit","createGridBackground","gridGroup","gridBackground","createLabel","axisOffset","labelOffset","useForeignObject","labelElement","len","content","foreignObject","text","optionsProvider","responsiveOptions","updateCurrentOptions","mediaEvent","previousOptions","currentOptions","baseOptions","mql","window","matchMedia","matches","removeMediaQueryListeners","removeListener","mediaQueryListeners","addListener","element","command","params","pathElements","relative","pathElement","toLowerCase","splice","forEachParam","pathElementIndex","paramName","paramIndex","none","path","SvgPath","currX","currY","currData","move","line","simple","d","prevX","prevY","prevData","curve","postpone","cardinal","t","tension","c","paths","segment","z","iLen","monotoneCubic","xs","ys","ms","ds","dys","dxs","determineAnchorPosition","center","label","direction","toTheRight","version","_classCallCheck","instance","Constructor","TypeError","_createClass","defineProperties","props","descriptor","enumerable","configurable","writable","defineProperty","protoProps","staticProps","SvgList","nodeList","list","svgElements","prototypeProperty","indexOf","attributes","parent","insertFirst","Element","createElementNS","ct","firstChild","insertBefore","ns","getAttribute","namespacedAttribute","split","setAttributeNS","setAttribute","bind","parentNode","SVGElement","node","nodeName","selector","foundNode","foundNodes","createElement","innerHTML","fnObj","createTextNode","newElement","replaceChild","trim","names","concat","self","removedClasses","getBoundingClientRect","animations","guided","attribute","createAnimate","animationDefinition","animate","timeout","animationEasing","attributeProperties","easing","easings","begin","dur","calcMode","keySplines","keyTimes","fill","from","beginElement","err","to","remove","addEventListener","EventEmitter","handlers","event","handler","starHandler","BaseChart","supportsForeignObject","supportsAnimations","resizeListener","update","__chartist__","detach","initializeTimeoutId","setTimeout","initialize","override","createChart","getCurrentOptions","clearTimeout","removeEventListener","addEventHandler","removeEventHandler","plugins","plugin","_possibleConstructorReturn","ReferenceError","_inherits","subClass","superClass","create","setPrototypeOf","__proto__","axisUnits","Axis","ticks","rectEnd","rectStart","gridOffset","rectOffset","labelGroup","chartOptions","axisOptions","projectedValues","projectValue","labelValues","labelInterpolationFnc","projectedValue","labelLength","showGrid","classNames","grid","dir","showLabel","_get","get","receiver","Function","desc","getOwnPropertyDescriptor","getPrototypeOf","getter","AutoScaleAxis","_Axis","axisUnit","_this","FixedScaleAxis","sort","a","b","stepLength","StepAxis","calc","stretch","elementDescriptions","close","joinedPath","j","count","rx","ry","xAr","lAf","sf","chunks","pop","elements","chunk","shift","description","spliceArgs","accuracyMultiplier","accuracy","transformFnc","transformed","LineChart","_BaseChart","chart","seriesGroup","type","fullWidth","createGridAndLabels","showGridBackground","raw","seriesIndex","seriesElement","pathData","valueIndex","smoothing","lineSmooth","showPoint","point","showLine","clone","showArea","areaBase","areaBaseProjected","splitByCommand","pathSegment","solidPathSegments","firstElement","lastElement","areaPath","area","BarChart","distributeSeries","horizontalBars","stackBars","serialSums","prev","curr","valueAxis","labelAxisTicks","labelAxis","zeroPoint","stackedBarValues","periodHalfLength","biPol","projected","bar","previousStack","labelAxisValueIndex","seriesBarDistance","positions","stackMode","metaData","PieChart","labelsGroup","labelRadius","totalDataSum","seriesGroups","startAngle","donut","chartDonut","chartPie","total","previousValue","currentValue","donutWidth","labelPosition","hasSingleValInSeries","val","ignoreEmptyValues","endAngle","overlappigStartAngle","start","end","arc","sliceDonut","slicePie","rawValue","interpolatedValue","labelDirection"],"mappings":"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","file":"chartist.umd.js","sourcesContent":["/**\n * Replaces all occurrences of subStr in str with newSubStr and returns a new string.\n *\n * @param {String} str\n * @param {String} subStr\n * @param {String} newSubStr\n * @return {String}\n */\nexport function replaceAll(str, subStr, newSubStr) {\n return str.replace(new RegExp(subStr, 'g'), newSubStr);\n}\n\n/**\n * This is a wrapper around document.querySelector that will return the query if it's already of type Node\n *\n * @memberof Chartist.Core\n * @param {String|Node} query The query to use for selecting a Node or a DOM node that will be returned directly\n * @return {Node}\n */\nexport function querySelector(query) {\n return query instanceof Node ? query : document.querySelector(query);\n}\n\n/**\n * This function safely checks if an objects has an owned property.\n *\n * @param {Object} object The object where to check for a property\n * @param {string} property The property name\n * @returns {boolean} Returns true if the object owns the specified property\n */\nexport function safeHasProperty(object, property) {\n return object !== null &&\n typeof object === 'object' &&\n object.hasOwnProperty(property);\n}\n\n/**\n * Checks if a value can be safely coerced to a number. This includes all values except null which result in finite numbers when coerced. This excludes NaN, since it's not finite.\n *\n * @memberof Chartist.Core\n * @param value\n * @returns {Boolean}\n */\nexport function isNumeric(value) {\n return value === null ? false : isFinite(value);\n}\n\n/**\n * Returns true on all falsey values except the numeric value 0.\n *\n * @memberof Chartist.Core\n * @param value\n * @returns {boolean}\n */\nexport function isFalseyButZero(value) {\n return !value && value !== 0;\n}\n\n/**\n * Returns a number if the passed parameter is a valid number or the function will return undefined. On all other values than a valid number, this function will return undefined.\n *\n * @memberof Chartist.Core\n * @param value\n * @returns {*}\n */\nexport function getNumberOrUndefined(value) {\n return isNumeric(value) ? +value : undefined;\n}\n\n/**\n * Converts a number to a string with a unit. If a string is passed then this will be returned unmodified.\n *\n * @memberof Chartist.Core\n * @param {Number} value\n * @param {String} unit\n * @return {String} Returns the passed number value with unit.\n */\nexport function ensureUnit(value, unit) {\n if(typeof value === 'number') {\n value = value + unit;\n }\n\n return value;\n}\n\n/**\n * Converts a number or string to a quantity object.\n *\n * @memberof Chartist.Core\n * @param {String|Number} input\n * @return {Object} Returns an object containing the value as number and the unit as string.\n */\nexport function quantity(input) {\n if (typeof input === 'string') {\n var match = (/^(\\d+)\\s*(.*)$/g).exec(input);\n return {\n value : +match[1],\n unit: match[2] || undefined\n };\n }\n return { value: input };\n}\n\n/**\n * Generates a-z from a number 0 to 26\n *\n * @memberof Chartist.Core\n * @param {Number} n A number from 0 to 26 that will result in a letter a-z\n * @return {String} A character from a-z based on the input number n\n */\nexport function alphaNumerate(n) {\n // Limit to a-z\n return String.fromCharCode(97 + n % 26);\n}\n","/**\n * Helps to simplify functional style code\n *\n * @memberof Chartist.Core\n * @param {*} n This exact value will be returned by the noop function\n * @return {*} The same value that was provided to the n parameter\n */\nexport function noop(n) {\n return n;\n}\n\n/**\n * Functional style helper to produce array with given length initialized with undefined values\n *\n * @memberof Chartist.Core\n * @param length\n * @return {Array}\n */\nexport function times(length) {\n return Array.apply(null, new Array(length));\n}\n\n/**\n * Sum helper to be used in reduce functions\n *\n * @memberof Chartist.Core\n * @param previous\n * @param current\n * @return {*}\n */\nexport function sum(previous, current) {\n return previous + (current ? current : 0);\n}\n\n/**\n * Multiply helper to be used in `Array.map` for multiplying each value of an array with a factor.\n *\n * @memberof Chartist.Core\n * @param {Number} factor\n * @returns {Function} Function that can be used in `Array.map` to multiply each value in an array\n */\nexport function mapMultiply(factor) {\n return function(num) {\n return num * factor;\n };\n}\n\n/**\n * Add helper to be used in `Array.map` for adding a addend to each value of an array.\n *\n * @memberof Chartist.Core\n * @param {Number} addend\n * @returns {Function} Function that can be used in `Array.map` to add a addend to each value in an array\n */\nexport function mapAdd(addend) {\n return function(num) {\n return num + addend;\n };\n}\n\n/**\n * Map for multi dimensional arrays where their nested arrays will be mapped in serial. The output array will have the length of the largest nested array. The callback function is called with variable arguments where each argument is the nested array value (or undefined if there are no more values).\n *\n * @memberof Chartist.Core\n * @param arr\n * @param cb\n * @return {Array}\n */\nexport function serialMap(arr, cb) {\n var result = [],\n length = Math.max.apply(null, arr.map(function(e) {\n return e.length;\n }));\n\n times(length).forEach(function(e, index) {\n var args = arr.map(function(e) {\n return e[index];\n });\n\n result[index] = cb.apply(null, args);\n });\n\n return result;\n}\n","import {precision} from './globals';\n\n/**\n * Calculate the order of magnitude for the chart scale\n *\n * @memberof Chartist.Core\n * @param {Number} value The value Range of the chart\n * @return {Number} The order of magnitude\n */\nexport function orderOfMagnitude(value) {\n return Math.floor(Math.log(Math.abs(value)) / Math.LN10);\n}\n\n/**\n * Project a data length into screen coordinates (pixels)\n *\n * @memberof Chartist.Core\n * @param {Object} axisLength The svg element for the chart\n * @param {Number} length Single data value from a series array\n * @param {Object} bounds All the values to set the bounds of the chart\n * @return {Number} The projected data length in pixels\n */\nexport function projectLength(axisLength, length, bounds) {\n return length / bounds.range * axisLength;\n}\n\n/**\n * This helper function can be used to round values with certain precision level after decimal. This is used to prevent rounding errors near float point precision limit.\n *\n * @memberof Chartist.Core\n * @param {Number} value The value that should be rounded with precision\n * @param {Number} [digits] The number of digits after decimal used to do the rounding\n * @returns {number} Rounded value\n */\nexport function roundWithPrecision(value, digits) {\n var precision = Math.pow(10, digits || precision);\n return Math.round(value * precision) / precision;\n}\n\n/**\n * Pollard Rho Algorithm to find smallest factor of an integer value. There are more efficient algorithms for factorization, but this one is quite efficient and not so complex.\n *\n * @memberof Chartist.Core\n * @param {Number} num An integer number where the smallest factor should be searched for\n * @returns {Number} The smallest integer factor of the parameter num.\n */\nexport function rho(num) {\n if(num === 1) {\n return num;\n }\n\n function gcd(p, q) {\n if (p % q === 0) {\n return q;\n } else {\n return gcd(q, p % q);\n }\n }\n\n function f(x) {\n return x * x + 1;\n }\n\n var x1 = 2, x2 = 2, divisor;\n if (num % 2 === 0) {\n return 2;\n }\n\n do {\n x1 = f(x1) % num;\n x2 = f(f(x2)) % num;\n divisor = gcd(Math.abs(x1 - x2), num);\n } while (divisor === 1);\n\n return divisor;\n}\n\n/**\n * Calculate cartesian coordinates of polar coordinates\n *\n * @memberof Chartist.Core\n * @param {Number} centerX X-axis coordinates of center point of circle segment\n * @param {Number} centerY X-axis coordinates of center point of circle segment\n * @param {Number} radius Radius of circle segment\n * @param {Number} angleInDegrees Angle of circle segment in degrees\n * @return {{x:Number, y:Number}} Coordinates of point on circumference\n */\nexport function polarToCartesian(centerX, centerY, radius, angleInDegrees) {\n var angleInRadians = (angleInDegrees - 90) * Math.PI / 180.0;\n\n return {\n x: centerX + (radius * Math.cos(angleInRadians)),\n y: centerY + (radius * Math.sin(angleInRadians))\n };\n}\n","/**\n * Simple recursive object extend\n *\n * @memberof Chartist.Core\n * @param {Object} target Target object where the source will be merged into\n * @param {Object...} sources This object (objects) will be merged into target and then target is returned\n * @return {Object} An object that has the same reference as target but is extended and merged with the properties of source\n */\nexport function extend(target) {\n var i, source, sourceProp;\n target = target || {};\n\n for (i = 1; i < arguments.length; i++) {\n source = arguments[i];\n for (var prop in source) {\n sourceProp = source[prop];\n if (typeof sourceProp === 'object' && sourceProp !== null && !(sourceProp instanceof Array)) {\n target[prop] = extend(target[prop], sourceProp);\n } else {\n target[prop] = sourceProp;\n }\n }\n }\n\n return target;\n}\n","import {escapingMap} from './globals';\nimport {replaceAll, safeHasProperty, getNumberOrUndefined} from './lang';\nimport {times} from './functional';\nimport {extend} from './extend';\nimport {orderOfMagnitude, projectLength, roundWithPrecision, rho} from './math';\n\n/**\n * This function serializes arbitrary data to a string. In case of data that can't be easily converted to a string, this function will create a wrapper object and serialize the data using JSON.stringify. The outcoming string will always be escaped using Chartist.escapingMap.\n * If called with null or undefined the function will return immediately with null or undefined.\n *\n * @memberof Chartist.Core\n * @param {Number|String|Object} data\n * @return {String}\n */\nexport function serialize(data) {\n if(data === null || data === undefined) {\n return data;\n } else if(typeof data === 'number') {\n data = ''+data;\n } else if(typeof data === 'object') {\n data = JSON.stringify({data: data});\n }\n\n return Object.keys(escapingMap).reduce(function(result, key) {\n return replaceAll(result, key, escapingMap[key]);\n }, data);\n}\n\n/**\n * This function de-serializes a string previously serialized with Chartist.serialize. The string will always be unescaped using Chartist.escapingMap before it's returned. Based on the input value the return type can be Number, String or Object. JSON.parse is used with try / catch to see if the unescaped string can be parsed into an Object and this Object will be returned on success.\n *\n * @memberof Chartist.Core\n * @param {String} data\n * @return {String|Number|Object}\n */\nexport function deserialize(data) {\n if(typeof data !== 'string') {\n return data;\n }\n\n data = Object.keys(escapingMap).reduce(function(result, key) {\n return replaceAll(result, escapingMap[key], key);\n }, data);\n\n try {\n data = JSON.parse(data);\n data = data.data !== undefined ? data.data : data;\n } catch(e) {}\n\n return data;\n}\n\n/**\n * Ensures that the data object passed as second argument to the charts is present and correctly initialized.\n *\n * @param {Object} data The data object that is passed as second argument to the charts\n * @return {Object} The normalized data object\n */\nexport function normalizeData(data, reverse, multi) {\n var labelCount;\n var output = {\n raw: data,\n normalized: {}\n };\n\n // Check if we should generate some labels based on existing series data\n output.normalized.series = getDataArray({\n series: data.series || []\n }, reverse, multi);\n\n // If all elements of the normalized data array are arrays we're dealing with\n // multi series data and we need to find the largest series if they are un-even\n if (output.normalized.series.every(function(value) {\n return value instanceof Array;\n })) {\n // Getting the series with the the most elements\n labelCount = Math.max.apply(null, output.normalized.series.map(function(series) {\n return series.length;\n }));\n } else {\n // We're dealing with Pie data so we just take the normalized array length\n labelCount = output.normalized.series.length;\n }\n\n output.normalized.labels = (data.labels || []).slice();\n // Padding the labels to labelCount with empty strings\n Array.prototype.push.apply(\n output.normalized.labels,\n times(Math.max(0, labelCount - output.normalized.labels.length)).map(function() {\n return '';\n })\n );\n\n if(reverse) {\n reverseData(output.normalized);\n }\n\n return output;\n}\n\n/**\n * Get meta data of a specific value in a series.\n *\n * @param series\n * @param index\n * @returns {*}\n */\nexport function getMetaData(series, index) {\n var value = series.data ? series.data[index] : series[index];\n return value ? value.meta : undefined;\n}\n\n/**\n * Checks if a value is considered a hole in the data series.\n *\n * @param {*} value\n * @returns {boolean} True if the value is considered a data hole\n */\nexport function isDataHoleValue(value) {\n return value === null ||\n value === undefined ||\n (typeof value === 'number' && isNaN(value));\n}\n\n/**\n * Reverses the series, labels and series data arrays.\n *\n * @memberof Chartist.Core\n * @param data\n */\nexport function reverseData(data) {\n data.labels.reverse();\n data.series.reverse();\n for (var i = 0; i < data.series.length; i++) {\n if(typeof(data.series[i]) === 'object' && data.series[i].data !== undefined) {\n data.series[i].data.reverse();\n } else if(data.series[i] instanceof Array) {\n data.series[i].reverse();\n }\n }\n}\n\n/**\n * Convert data series into plain array\n *\n * @memberof Chartist.Core\n * @param {Object} data The series object that contains the data to be visualized in the chart\n * @param {Boolean} [reverse] If true the whole data is reversed by the getDataArray call. This will modify the data object passed as first parameter. The labels as well as the series order is reversed. The whole series data arrays are reversed too.\n * @param {Boolean} [multi] Create a multi dimensional array from a series data array where a value object with `x` and `y` values will be created.\n * @return {Array} A plain array that contains the data to be visualized in the chart\n */\nexport function getDataArray(data, reverse, multi) {\n // Recursively walks through nested arrays and convert string values to numbers and objects with value properties\n // to values. Check the tests in data core -> data normalization for a detailed specification of expected values\n function recursiveConvert(value) {\n if(safeHasProperty(value, 'value')) {\n // We are dealing with value object notation so we need to recurse on value property\n return recursiveConvert(value.value);\n } else if(safeHasProperty(value, 'data')) {\n // We are dealing with series object notation so we need to recurse on data property\n return recursiveConvert(value.data);\n } else if(value instanceof Array) {\n // Data is of type array so we need to recurse on the series\n return value.map(recursiveConvert);\n } else if(isDataHoleValue(value)) {\n // We're dealing with a hole in the data and therefore need to return undefined\n // We're also returning undefined for multi value output\n return undefined;\n } else {\n // We need to prepare multi value output (x and y data)\n if(multi) {\n var multiValue = {};\n\n // Single series value arrays are assumed to specify the Y-Axis value\n // For example: [1, 2] => [{x: undefined, y: 1}, {x: undefined, y: 2}]\n // If multi is a string then it's assumed that it specified which dimension should be filled as default\n if(typeof multi === 'string') {\n multiValue[multi] = getNumberOrUndefined(value);\n } else {\n multiValue.y = getNumberOrUndefined(value);\n }\n\n multiValue.x = value.hasOwnProperty('x') ? getNumberOrUndefined(value.x) : multiValue.x;\n multiValue.y = value.hasOwnProperty('y') ? getNumberOrUndefined(value.y) : multiValue.y;\n\n return multiValue;\n\n } else {\n // We can return simple data\n return getNumberOrUndefined(value);\n }\n }\n }\n\n return data.series.map(recursiveConvert);\n}\n\n/**\n * Checks if provided value object is multi value (contains x or y properties)\n *\n * @memberof Chartist.Core\n * @param value\n */\nexport function isMultiValue(value) {\n return typeof value === 'object' && ('x' in value || 'y' in value);\n}\n\n/**\n * Gets a value from a dimension `value.x` or `value.y` while returning value directly if it's a valid numeric value. If the value is not numeric and it's falsey this function will return `defaultValue`.\n *\n * @memberof Chartist.Core\n * @param value\n * @param dimension\n * @param defaultValue\n * @returns {*}\n */\nexport function getMultiValue(value, dimension) {\n if(isMultiValue(value)) {\n return getNumberOrUndefined(value[dimension || 'y']);\n } else {\n return getNumberOrUndefined(value);\n }\n}\n\n/**\n * Helper to read series specific options from options object. It automatically falls back to the global option if\n * there is no option in the series options.\n *\n * @param {Object} series Series object\n * @param {Object} options Chartist options object\n * @param {string} key The options key that should be used to obtain the options\n * @returns {*}\n */\nexport function getSeriesOption(series, options, key) {\n if(series.name && options.series && options.series[series.name]) {\n var seriesOptions = options.series[series.name];\n return seriesOptions.hasOwnProperty(key) ? seriesOptions[key] : options[key];\n } else {\n return options[key];\n }\n}\n\n/**\n * Splits a list of coordinates and associated values into segments. Each returned segment contains a pathCoordinates\n * valueData property describing the segment.\n *\n * With the default options, segments consist of contiguous sets of points that do not have an undefined value. Any\n * points with undefined values are discarded.\n *\n * **Options**\n * The following options are used to determine how segments are formed\n * ```javascript\n * var options = {\n * // If fillHoles is true, undefined values are simply discarded without creating a new segment. Assuming other options are default, this returns single segment.\n * fillHoles: false,\n * // If increasingX is true, the coordinates in all segments have strictly increasing x-values.\n * increasingX: false\n * };\n * ```\n *\n * @memberof Chartist.Core\n * @param {Array} pathCoordinates List of point coordinates to be split in the form [x1, y1, x2, y2 ... xn, yn]\n * @param {Array} valueData List of associated point values in the form [v1, v2 .. vn]\n * @param {Object} [options] Options set by user\n * @return {Array} List of segments, each containing a pathCoordinates and valueData property.\n */\nexport function splitIntoSegments(pathCoordinates, valueData, options) {\n var defaultOptions = {\n increasingX: false,\n fillHoles: false\n };\n\n options = extend({}, defaultOptions, options);\n\n var segments = [];\n var hole = true;\n\n for(var i = 0; i < pathCoordinates.length; i += 2) {\n // If this value is a \"hole\" we set the hole flag\n if(getMultiValue(valueData[i / 2].value) === undefined) {\n // if(valueData[i / 2].value === undefined) {\n if(!options.fillHoles) {\n hole = true;\n }\n } else {\n if(options.increasingX && i >= 2 && pathCoordinates[i] <= pathCoordinates[i-2]) {\n // X is not increasing, so we need to make sure we start a new segment\n hole = true;\n }\n\n\n // If it's a valid value we need to check if we're coming out of a hole and create a new empty segment\n if(hole) {\n segments.push({\n pathCoordinates: [],\n valueData: []\n });\n // As we have a valid value now, we are not in a \"hole\" anymore\n hole = false;\n }\n\n // Add to the segment pathCoordinates and valueData\n segments[segments.length - 1].pathCoordinates.push(pathCoordinates[i], pathCoordinates[i + 1]);\n segments[segments.length - 1].valueData.push(valueData[i / 2]);\n }\n }\n\n return segments;\n}\n\n/**\n * Get highest and lowest value of data array. This Array contains the data that will be visualized in the chart.\n *\n * @memberof Chartist.Core\n * @param {Array} data The array that contains the data to be visualized in the chart\n * @param {Object} options The Object that contains the chart options\n * @param {String} dimension Axis dimension 'x' or 'y' used to access the correct value and high / low configuration\n * @return {Object} An object that contains the highest and lowest value that will be visualized on the chart.\n */\nexport function getHighLow(data, options, dimension) {\n // TODO: Remove workaround for deprecated global high / low config. Axis high / low configuration is preferred\n options = extend({}, options, dimension ? options['axis' + dimension.toUpperCase()] : {});\n\n var highLow = {\n high: options.high === undefined ? -Number.MAX_VALUE : +options.high,\n low: options.low === undefined ? Number.MAX_VALUE : +options.low\n };\n var findHigh = options.high === undefined;\n var findLow = options.low === undefined;\n\n // Function to recursively walk through arrays and find highest and lowest number\n function recursiveHighLow(data) {\n if(data === undefined) {\n return undefined;\n } else if(data instanceof Array) {\n for (var i = 0; i < data.length; i++) {\n recursiveHighLow(data[i]);\n }\n } else {\n var value = dimension ? +data[dimension] : +data;\n\n if (findHigh && value > highLow.high) {\n highLow.high = value;\n }\n\n if (findLow && value < highLow.low) {\n highLow.low = value;\n }\n }\n }\n\n // Start to find highest and lowest number recursively\n if(findHigh || findLow) {\n recursiveHighLow(data);\n }\n\n // Overrides of high / low based on reference value, it will make sure that the invisible reference value is\n // used to generate the chart. This is useful when the chart always needs to contain the position of the\n // invisible reference value in the view i.e. for bipolar scales.\n if (options.referenceValue || options.referenceValue === 0) {\n highLow.high = Math.max(options.referenceValue, highLow.high);\n highLow.low = Math.min(options.referenceValue, highLow.low);\n }\n\n // If high and low are the same because of misconfiguration or flat data (only the same value) we need\n // to set the high or low to 0 depending on the polarity\n if (highLow.high <= highLow.low) {\n // If both values are 0 we set high to 1\n if (highLow.low === 0) {\n highLow.high = 1;\n } else if (highLow.low < 0) {\n // If we have the same negative value for the bounds we set bounds.high to 0\n highLow.high = 0;\n } else if (highLow.high > 0) {\n // If we have the same positive value for the bounds we set bounds.low to 0\n highLow.low = 0;\n } else {\n // If data array was empty, values are Number.MAX_VALUE and -Number.MAX_VALUE. Set bounds to prevent errors\n highLow.high = 1;\n highLow.low = 0;\n }\n }\n\n return highLow;\n}\n\n/**\n * Calculate and retrieve all the bounds for the chart and return them in one array\n *\n * @memberof Chartist.Core\n * @param {Number} axisLength The length of the Axis used for\n * @param {Object} highLow An object containing a high and low property indicating the value range of the chart.\n * @param {Number} scaleMinSpace The minimum projected length a step should result in\n * @param {Boolean} onlyInteger\n * @return {Object} All the values to set the bounds of the chart\n */\nexport function getBounds(axisLength, highLow, scaleMinSpace, onlyInteger) {\n var i,\n optimizationCounter = 0,\n newMin,\n newMax,\n bounds = {\n high: highLow.high,\n low: highLow.low\n };\n\n bounds.valueRange = bounds.high - bounds.low;\n bounds.oom = orderOfMagnitude(bounds.valueRange);\n bounds.step = Math.pow(10, bounds.oom);\n bounds.min = Math.floor(bounds.low / bounds.step) * bounds.step;\n bounds.max = Math.ceil(bounds.high / bounds.step) * bounds.step;\n bounds.range = bounds.max - bounds.min;\n bounds.numberOfSteps = Math.round(bounds.range / bounds.step);\n\n // Optimize scale step by checking if subdivision is possible based on horizontalGridMinSpace\n // If we are already below the scaleMinSpace value we will scale up\n var length = projectLength(axisLength, bounds.step, bounds);\n var scaleUp = length < scaleMinSpace;\n var smallestFactor = onlyInteger ? rho(bounds.range) : 0;\n\n // First check if we should only use integer steps and if step 1 is still larger than scaleMinSpace so we can use 1\n if(onlyInteger && projectLength(axisLength, 1, bounds) >= scaleMinSpace) {\n bounds.step = 1;\n } else if(onlyInteger && smallestFactor < bounds.step && projectLength(axisLength, smallestFactor, bounds) >= scaleMinSpace) {\n // If step 1 was too small, we can try the smallest factor of range\n // If the smallest factor is smaller than the current bounds.step and the projected length of smallest factor\n // is larger than the scaleMinSpace we should go for it.\n bounds.step = smallestFactor;\n } else {\n // Trying to divide or multiply by 2 and find the best step value\n while (true) {\n if (scaleUp && projectLength(axisLength, bounds.step, bounds) <= scaleMinSpace) {\n bounds.step *= 2;\n } else if (!scaleUp && projectLength(axisLength, bounds.step / 2, bounds) >= scaleMinSpace) {\n bounds.step /= 2;\n if(onlyInteger && bounds.step % 1 !== 0) {\n bounds.step *= 2;\n break;\n }\n } else {\n break;\n }\n\n if(optimizationCounter++ > 1000) {\n throw new Error('Exceeded maximum number of iterations while optimizing scale step!');\n }\n }\n }\n\n var EPSILON = 2.221E-16;\n bounds.step = Math.max(bounds.step, EPSILON);\n function safeIncrement(value, increment) {\n // If increment is too small use *= (1+EPSILON) as a simple nextafter\n if (value === (value += increment)) {\n value *= (1 + (increment > 0 ? EPSILON : -EPSILON));\n }\n return value;\n }\n\n // Narrow min and max based on new step\n newMin = bounds.min;\n newMax = bounds.max;\n while (newMin + bounds.step <= bounds.low) {\n newMin = safeIncrement(newMin, bounds.step);\n }\n while (newMax - bounds.step >= bounds.high) {\n newMax = safeIncrement(newMax, -bounds.step);\n }\n bounds.min = newMin;\n bounds.max = newMax;\n bounds.range = bounds.max - bounds.min;\n\n var values = [];\n for (i = bounds.min; i <= bounds.max; i = safeIncrement(i, bounds.step)) {\n var value = roundWithPrecision(i);\n if (value !== values[values.length - 1]) {\n values.push(i);\n }\n }\n bounds.values = values;\n return bounds;\n}\n","import {namespaces, ensureUnit, quantity, extend} from '../core/core';\nimport {SvgList} from './svg-list';\n\n/**\n * Svg creates a new SVG object wrapper with a starting element. You can use the wrapper to fluently create sub-elements and modify them.\n *\n * @memberof Svg\n * @constructor\n * @param {String|Element} name The name of the SVG element to create or an SVG dom element which should be wrapped into Svg\n * @param {Object} attributes An object with properties that will be added as attributes to the SVG element that is created. Attributes with undefined values will not be added.\n * @param {String} className This class or class list will be added to the SVG element\n * @param {Object} parent The parent SVG wrapper object where this newly created wrapper and it's element will be attached to as child\n * @param {Boolean} insertFirst If this param is set to true in conjunction with a parent element the newly created element will be added as first child element in the parent element\n */\nexport class Svg {\n\n constructor(name, attributes, className, parent, insertFirst) {\n // If Svg is getting called with an SVG element we just return the wrapper\n if(name instanceof Element) {\n this._node = name;\n } else {\n this._node = document.createElementNS(namespaces.svg, name);\n\n // If this is an SVG element created then custom namespace\n if(name === 'svg') {\n this.attr({\n 'xmlns:ct': namespaces.ct\n });\n }\n }\n\n if(attributes) {\n this.attr(attributes);\n }\n\n if(className) {\n this.addClass(className);\n }\n\n if(parent) {\n if (insertFirst && parent._node.firstChild) {\n parent._node.insertBefore(this._node, parent._node.firstChild);\n } else {\n parent._node.appendChild(this._node);\n }\n }\n }\n\n /**\n * Set attributes on the current SVG element of the wrapper you're currently working on.\n *\n * @memberof Svg\n * @param {Object|String} attributes An object with properties that will be added as attributes to the SVG element that is created. Attributes with undefined values will not be added. If this parameter is a String then the function is used as a getter and will return the attribute value.\n * @param {String} [ns] If specified, the attribute will be obtained using getAttributeNs. In order to write namepsaced attributes you can use the namespace:attribute notation within the attributes object.\n * @return {Object|String} The current wrapper object will be returned so it can be used for chaining or the attribute value if used as getter function.\n */\n attr(attributes, ns) {\n if(typeof attributes === 'string') {\n if(ns) {\n return this._node.getAttributeNS(ns, attributes);\n } else {\n return this._node.getAttribute(attributes);\n }\n }\n\n Object.keys(attributes).forEach(function(key) {\n // If the attribute value is undefined we can skip this one\n if(attributes[key] === undefined) {\n return;\n }\n\n if (key.indexOf(':') !== -1) {\n var namespacedAttribute = key.split(':');\n this._node.setAttributeNS(namespaces[namespacedAttribute[0]], key, attributes[key]);\n } else {\n this._node.setAttribute(key, attributes[key]);\n }\n }.bind(this));\n\n return this;\n }\n\n /**\n * Create a new SVG element whose wrapper object will be selected for further operations. This way you can also create nested groups easily.\n *\n * @memberof Svg\n * @param {String} name The name of the SVG element that should be created as child element of the currently selected element wrapper\n * @param {Object} [attributes] An object with properties that will be added as attributes to the SVG element that is created. Attributes with undefined values will not be added.\n * @param {String} [className] This class or class list will be added to the SVG element\n * @param {Boolean} [insertFirst] If this param is set to true in conjunction with a parent element the newly created element will be added as first child element in the parent element\n * @return {Svg} Returns a Svg wrapper object that can be used to modify the containing SVG data\n */\n elem(name, attributes, className, insertFirst) {\n return new Svg(name, attributes, className, this, insertFirst);\n }\n\n /**\n * Returns the parent Chartist.SVG wrapper object\n *\n * @memberof Svg\n * @return {Svg} Returns a Svg wrapper around the parent node of the current node. If the parent node is not existing or it's not an SVG node then this function will return null.\n */\n parent() {\n return this._node.parentNode instanceof SVGElement ? new Svg(this._node.parentNode) : null;\n }\n\n /**\n * This method returns a Svg wrapper around the root SVG element of the current tree.\n *\n * @memberof Svg\n * @return {Svg} The root SVG element wrapped in a Svg element\n */\n root() {\n var node = this._node;\n while(node.nodeName !== 'svg') {\n node = node.parentNode;\n }\n return new Svg(node);\n }\n\n /**\n * Find the first child SVG element of the current element that matches a CSS selector. The returned object is a Svg wrapper.\n *\n * @memberof Svg\n * @param {String} selector A CSS selector that is used to query for child SVG elements\n * @return {Svg} The SVG wrapper for the element found or null if no element was found\n */\n querySelector(selector) {\n var foundNode = this._node.querySelector(selector);\n return foundNode ? new Svg(foundNode) : null;\n }\n\n /**\n * Find the all child SVG elements of the current element that match a CSS selector. The returned object is a Svg.List wrapper.\n *\n * @memberof Svg\n * @param {String} selector A CSS selector that is used to query for child SVG elements\n * @return {SvgList} The SVG wrapper list for the element found or null if no element was found\n */\n querySelectorAll(selector) {\n var foundNodes = this._node.querySelectorAll(selector);\n return foundNodes.length ? new SvgList(foundNodes) : null;\n }\n\n /**\n * Returns the underlying SVG node for the current element.\n *\n * @memberof Svg\n * @returns {Node}\n */\n getNode() {\n return this._node;\n }\n\n /**\n * This method creates a foreignObject (see https://developer.mozilla.org/en-US/docs/Web/SVG/Element/foreignObject) that allows to embed HTML content into a SVG graphic. With the help of foreignObjects you can enable the usage of regular HTML elements inside of SVG where they are subject for SVG positioning and transformation but the Browser will use the HTML rendering capabilities for the containing DOM.\n *\n * @memberof Svg\n * @param {Node|String} content The DOM Node, or HTML string that will be converted to a DOM Node, that is then placed into and wrapped by the foreignObject\n * @param {String} [attributes] An object with properties that will be added as attributes to the foreignObject element that is created. Attributes with undefined values will not be added.\n * @param {String} [className] This class or class list will be added to the SVG element\n * @param {Boolean} [insertFirst] Specifies if the foreignObject should be inserted as first child\n * @return {Svg} New wrapper object that wraps the foreignObject element\n */\n foreignObject(content, attributes, className, insertFirst) {\n // If content is string then we convert it to DOM\n // TODO: Handle case where content is not a string nor a DOM Node\n if(typeof content === 'string') {\n var container = document.createElement('div');\n container.innerHTML = content;\n content = container.firstChild;\n }\n\n // Adding namespace to content element\n content.setAttribute('xmlns', namespaces.xmlns);\n\n // Creating the foreignObject without required extension attribute (as described here\n // http://www.w3.org/TR/SVG/extend.html#ForeignObjectElement)\n var fnObj = this.elem('foreignObject', attributes, className, insertFirst);\n\n // Add content to foreignObjectElement\n fnObj._node.appendChild(content);\n\n return fnObj;\n }\n\n /**\n * This method adds a new text element to the current Svg wrapper.\n *\n * @memberof Svg\n * @param {String} t The text that should be added to the text element that is created\n * @return {Svg} The same wrapper object that was used to add the newly created element\n */\n text(t) {\n this._node.appendChild(document.createTextNode(t));\n return this;\n }\n\n /**\n * This method will clear all child nodes of the current wrapper object.\n *\n * @memberof Svg\n * @return {Svg} The same wrapper object that got emptied\n */\n empty() {\n while (this._node.firstChild) {\n this._node.removeChild(this._node.firstChild);\n }\n\n return this;\n }\n\n /**\n * This method will cause the current wrapper to remove itself from its parent wrapper. Use this method if you'd like to get rid of an element in a given DOM structure.\n *\n * @memberof Svg\n * @return {Svg} The parent wrapper object of the element that got removed\n */\n remove() {\n this._node.parentNode.removeChild(this._node);\n return this.parent();\n }\n\n /**\n * This method will replace the element with a new element that can be created outside of the current DOM.\n *\n * @memberof Svg\n * @param {Svg} newElement The new Svg object that will be used to replace the current wrapper object\n * @return {Svg} The wrapper of the new element\n */\n replace(newElement) {\n this._node.parentNode.replaceChild(newElement._node, this._node);\n return newElement;\n }\n\n /**\n * This method will append an element to the current element as a child.\n *\n * @memberof Svg\n * @param {Svg} element The Svg element that should be added as a child\n * @param {Boolean} [insertFirst] Specifies if the element should be inserted as first child\n * @return {Svg} The wrapper of the appended object\n */\n append(element, insertFirst) {\n if(insertFirst && this._node.firstChild) {\n this._node.insertBefore(element._node, this._node.firstChild);\n } else {\n this._node.appendChild(element._node);\n }\n\n return this;\n }\n\n /**\n * Returns an array of class names that are attached to the current wrapper element. This method can not be chained further.\n *\n * @memberof Svg\n * @return {Array} A list of classes or an empty array if there are no classes on the current element\n */\n classes() {\n return this._node.getAttribute('class') ? this._node.getAttribute('class').trim().split(/\\s+/) : [];\n }\n\n /**\n * Adds one or a space separated list of classes to the current element and ensures the classes are only existing once.\n *\n * @memberof Svg\n * @param {String} names A white space separated list of class names\n * @return {Svg} The wrapper of the current element\n */\n addClass(names) {\n this._node.setAttribute('class',\n this.classes()\n .concat(names.trim().split(/\\s+/))\n .filter(function(elem, pos, self) {\n return self.indexOf(elem) === pos;\n }).join(' ')\n );\n\n return this;\n }\n\n /**\n * Removes one or a space separated list of classes from the current element.\n *\n * @memberof Svg\n * @param {String} names A white space separated list of class names\n * @return {Svg} The wrapper of the current element\n */\n removeClass(names) {\n var removedClasses = names.trim().split(/\\s+/);\n\n this._node.setAttribute('class', this.classes().filter(function(name) {\n return removedClasses.indexOf(name) === -1;\n }).join(' '));\n\n return this;\n }\n\n /**\n * Removes all classes from the current element.\n *\n * @memberof Svg\n * @return {Svg} The wrapper of the current element\n */\n removeAllClasses() {\n this._node.setAttribute('class', '');\n return this;\n }\n\n /**\n * Get element height using `getBoundingClientRect`\n *\n * @memberof Svg\n * @return {Number} The elements height in pixels\n */\n height() {\n return this._node.getBoundingClientRect().height;\n }\n\n /**\n * Get element width using `getBoundingClientRect`\n *\n * @memberof Chartist.Core\n * @return {Number} The elements width in pixels\n */\n width() {\n return this._node.getBoundingClientRect().width;\n }\n\n /**\n * The animate function lets you animate the current element with SMIL animations. You can add animations for multiple attributes at the same time by using an animation definition object. This object should contain SMIL animation attributes. Please refer to http://www.w3.org/TR/SVG/animate.html for a detailed specification about the available animation attributes. Additionally an easing property can be passed in the animation definition object. This can be a string with a name of an easing function in `Svg.Easing` or an array with four numbers specifying a cubic Bézier curve.\n * **An animations object could look like this:**\n * ```javascript\n * element.animate({\n * opacity: {\n * dur: 1000,\n * from: 0,\n * to: 1\n * },\n * x1: {\n * dur: '1000ms',\n * from: 100,\n * to: 200,\n * easing: 'easeOutQuart'\n * },\n * y1: {\n * dur: '2s',\n * from: 0,\n * to: 100\n * }\n * });\n * ```\n * **Automatic unit conversion**\n * For the `dur` and the `begin` animate attribute you can also omit a unit by passing a number. The number will automatically be converted to milli seconds.\n * **Guided mode**\n * The default behavior of SMIL animations with offset using the `begin` attribute is that the attribute will keep it's original value until the animation starts. Mostly this behavior is not desired as you'd like to have your element attributes already initialized with the animation `from` value even before the animation starts. Also if you don't specify `fill=\"freeze\"` on an animate element or if you delete the animation after it's done (which is done in guided mode) the attribute will switch back to the initial value. This behavior is also not desired when performing simple one-time animations. For one-time animations you'd want to trigger animations immediately instead of relative to the document begin time. That's why in guided mode Svg will also use the `begin` property to schedule a timeout and manually start the animation after the timeout. If you're using multiple SMIL definition objects for an attribute (in an array), guided mode will be disabled for this attribute, even if you explicitly enabled it.\n * If guided mode is enabled the following behavior is added:\n * - Before the animation starts (even when delayed with `begin`) the animated attribute will be set already to the `from` value of the animation\n * - `begin` is explicitly set to `indefinite` so it can be started manually without relying on document begin time (creation)\n * - The animate element will be forced to use `fill=\"freeze\"`\n * - The animation will be triggered with `beginElement()` in a timeout where `begin` of the definition object is interpreted in milli seconds. If no `begin` was specified the timeout is triggered immediately.\n * - After the animation the element attribute value will be set to the `to` value of the animation\n * - The animate element is deleted from the DOM\n *\n * @memberof Svg\n * @param {Object} animations An animations object where the property keys are the attributes you'd like to animate. The properties should be objects again that contain the SMIL animation attributes (usually begin, dur, from, and to). The property begin and dur is auto converted (see Automatic unit conversion). You can also schedule multiple animations for the same attribute by passing an Array of SMIL definition objects. Attributes that contain an array of SMIL definition objects will not be executed in guided mode.\n * @param {Boolean} guided Specify if guided mode should be activated for this animation (see Guided mode). If not otherwise specified, guided mode will be activated.\n * @param {Object} eventEmitter If specified, this event emitter will be notified when an animation starts or ends.\n * @return {Svg} The current element where the animation was added\n */\n animate(animations, guided, eventEmitter) {\n if(guided === undefined) {\n guided = true;\n }\n\n Object.keys(animations).forEach(function createAnimateForAttributes(attribute) {\n\n function createAnimate(animationDefinition, guided) {\n var attributeProperties = {},\n animate,\n timeout,\n animationEasing;\n\n // Check if an easing is specified in the definition object and delete it from the object as it will not\n // be part of the animate element attributes.\n if(animationDefinition.easing) {\n // If already an easing Bézier curve array we take it or we lookup a easing array in the Easing object\n animationEasing = animationDefinition.easing instanceof Array ?\n animationDefinition.easing :\n easings[animationDefinition.easing];\n delete animationDefinition.easing;\n }\n\n // If numeric dur or begin was provided we assume milli seconds\n animationDefinition.begin = ensureUnit(animationDefinition.begin, 'ms');\n animationDefinition.dur = ensureUnit(animationDefinition.dur, 'ms');\n\n if(animationEasing) {\n animationDefinition.calcMode = 'spline';\n animationDefinition.keySplines = animationEasing.join(' ');\n animationDefinition.keyTimes = '0;1';\n }\n\n // Adding \"fill: freeze\" if we are in guided mode and set initial attribute values\n if(guided) {\n animationDefinition.fill = 'freeze';\n // Animated property on our element should already be set to the animation from value in guided mode\n attributeProperties[attribute] = animationDefinition.from;\n this.attr(attributeProperties);\n\n // In guided mode we also set begin to indefinite so we can trigger the start manually and put the begin\n // which needs to be in ms aside\n timeout = quantity(animationDefinition.begin || 0).value;\n animationDefinition.begin = 'indefinite';\n }\n\n animate = this.elem('animate', extend({\n attributeName: attribute\n }, animationDefinition));\n\n if(guided) {\n // If guided we take the value that was put aside in timeout and trigger the animation manually with a timeout\n setTimeout(function() {\n // If beginElement fails we set the animated attribute to the end position and remove the animate element\n // This happens if the SMIL ElementTimeControl interface is not supported or any other problems occured in\n // the browser. (Currently FF 34 does not support animate elements in foreignObjects)\n try {\n animate._node.beginElement();\n } catch(err) {\n // Set animated attribute to current animated value\n attributeProperties[attribute] = animationDefinition.to;\n this.attr(attributeProperties);\n // Remove the animate element as it's no longer required\n animate.remove();\n }\n }.bind(this), timeout);\n }\n\n if(eventEmitter) {\n animate._node.addEventListener('beginEvent', function handleBeginEvent() {\n eventEmitter.emit('animationBegin', {\n element: this,\n animate: animate._node,\n params: animationDefinition\n });\n }.bind(this));\n }\n\n animate._node.addEventListener('endEvent', function handleEndEvent() {\n if(eventEmitter) {\n eventEmitter.emit('animationEnd', {\n element: this,\n animate: animate._node,\n params: animationDefinition\n });\n }\n\n if(guided) {\n // Set animated attribute to current animated value\n attributeProperties[attribute] = animationDefinition.to;\n this.attr(attributeProperties);\n // Remove the animate element as it's no longer required\n animate.remove();\n }\n }.bind(this));\n }\n\n // If current attribute is an array of definition objects we create an animate for each and disable guided mode\n if(animations[attribute] instanceof Array) {\n animations[attribute].forEach(function(animationDefinition) {\n createAnimate.bind(this)(animationDefinition, false);\n }.bind(this));\n } else {\n createAnimate.bind(this)(animations[attribute], guided);\n }\n\n }.bind(this));\n\n return this;\n }\n}\n\n/**\n * This method checks for support of a given SVG feature like Extensibility, SVG-animation or the like. Check http://www.w3.org/TR/SVG11/feature for a detailed list.\n *\n * @memberof Svg\n * @param {String} feature The SVG 1.1 feature that should be checked for support.\n * @return {Boolean} True of false if the feature is supported or not\n */\nexport function isSupported(feature) {\n return document.implementation.hasFeature('http://www.w3.org/TR/SVG11/feature#' + feature, '1.1');\n}\n\n/**\n * This Object contains some standard easing cubic bezier curves. Then can be used with their name in the `Svg.animate`. You can also extend the list and use your own name in the `animate` function. Click the show code button to see the available bezier functions.\n *\n * @memberof Svg\n */\nexport const easings = {\n easeInSine: [0.47, 0, 0.745, 0.715],\n easeOutSine: [0.39, 0.575, 0.565, 1],\n easeInOutSine: [0.445, 0.05, 0.55, 0.95],\n easeInQuad: [0.55, 0.085, 0.68, 0.53],\n easeOutQuad: [0.25, 0.46, 0.45, 0.94],\n easeInOutQuad: [0.455, 0.03, 0.515, 0.955],\n easeInCubic: [0.55, 0.055, 0.675, 0.19],\n easeOutCubic: [0.215, 0.61, 0.355, 1],\n easeInOutCubic: [0.645, 0.045, 0.355, 1],\n easeInQuart: [0.895, 0.03, 0.685, 0.22],\n easeOutQuart: [0.165, 0.84, 0.44, 1],\n easeInOutQuart: [0.77, 0, 0.175, 1],\n easeInQuint: [0.755, 0.05, 0.855, 0.06],\n easeOutQuint: [0.23, 1, 0.32, 1],\n easeInOutQuint: [0.86, 0, 0.07, 1],\n easeInExpo: [0.95, 0.05, 0.795, 0.035],\n easeOutExpo: [0.19, 1, 0.22, 1],\n easeInOutExpo: [1, 0, 0, 1],\n easeInCirc: [0.6, 0.04, 0.98, 0.335],\n easeOutCirc: [0.075, 0.82, 0.165, 1],\n easeInOutCirc: [0.785, 0.135, 0.15, 0.86],\n easeInBack: [0.6, -0.28, 0.735, 0.045],\n easeOutBack: [0.175, 0.885, 0.32, 1.275],\n easeInOutBack: [0.68, -0.55, 0.265, 1.55]\n};\n","import {namespaces} from './globals';\nimport {Svg} from '../svg/svg';\nimport {quantity} from './lang';\nimport {extend} from './extend';\n\n/**\n * Create or reinitialize the SVG element for the chart\n *\n * @memberof Chartist.Core\n * @param {Node} container The containing DOM Node object that will be used to plant the SVG element\n * @param {String} width Set the width of the SVG element. Default is 100%\n * @param {String} height Set the height of the SVG element. Default is 100%\n * @param {String} className Specify a class to be added to the SVG element\n * @return {Object} The created/reinitialized SVG element\n */\nexport function createSvg(container, width, height, className) {\n var svg;\n\n width = width || '100%';\n height = height || '100%';\n\n // Check if there is a previous SVG element in the container that contains the Chartist XML namespace and remove it\n // Since the DOM API does not support namespaces we need to manually search the returned list http://www.w3.org/TR/selectors-api/\n Array.prototype.slice.call(container.querySelectorAll('svg')).filter(function filterChartistSvgObjects(svg) {\n return svg.getAttributeNS(namespaces.xmlns, 'ct');\n }).forEach(function removePreviousElement(svg) {\n container.removeChild(svg);\n });\n\n // Create svg object with width and height or use 100% as default\n svg = new Svg('svg').attr({\n width: width,\n height: height\n }).addClass(className).attr({\n style: 'width: ' + width + '; height: ' + height + ';'\n });\n\n // Add the DOM node to our container\n container.appendChild(svg._node);\n\n return svg;\n}\n\n/**\n * Converts a number into a padding object.\n *\n * @memberof Chartist.Core\n * @param {Object|Number} padding\n * @param {Number} [fallback] This value is used to fill missing values if a incomplete padding object was passed\n * @returns {Object} Returns a padding object containing top, right, bottom, left properties filled with the padding number passed in as argument. If the argument is something else than a number (presumably already a correct padding object) then this argument is directly returned.\n */\nexport function normalizePadding(padding, fallback) {\n fallback = fallback || 0;\n\n return typeof padding === 'number' ? {\n top: padding,\n right: padding,\n bottom: padding,\n left: padding\n } : {\n top: typeof padding.top === 'number' ? padding.top : fallback,\n right: typeof padding.right === 'number' ? padding.right : fallback,\n bottom: typeof padding.bottom === 'number' ? padding.bottom : fallback,\n left: typeof padding.left === 'number' ? padding.left : fallback\n };\n}\n\n/**\n * Initialize chart drawing rectangle (area where chart is drawn) x1,y1 = bottom left / x2,y2 = top right\n *\n * @memberof Chartist.Core\n * @param {Object} svg The svg element for the chart\n * @param {Object} options The Object that contains all the optional values for the chart\n * @param {Number} [fallbackPadding] The fallback padding if partial padding objects are used\n * @return {Object} The chart rectangles coordinates inside the svg element plus the rectangles measurements\n */\nexport function createChartRect(svg, options, fallbackPadding) {\n var hasAxis = !!(options.axisX || options.axisY);\n var yAxisOffset = hasAxis ? options.axisY.offset : 0;\n var xAxisOffset = hasAxis ? options.axisX.offset : 0;\n // If width or height results in invalid value (including 0) we fallback to the unitless settings or even 0\n var width = svg.width() || quantity(options.width).value || 0;\n var height = svg.height() || quantity(options.height).value || 0;\n var normalizedPadding = normalizePadding(options.chartPadding, fallbackPadding);\n\n // If settings were to small to cope with offset (legacy) and padding, we'll adjust\n width = Math.max(width, yAxisOffset + normalizedPadding.left + normalizedPadding.right);\n height = Math.max(height, xAxisOffset + normalizedPadding.top + normalizedPadding.bottom);\n\n var chartRect = {\n padding: normalizedPadding,\n width: function () {\n return this.x2 - this.x1;\n },\n height: function () {\n return this.y1 - this.y2;\n }\n };\n\n if(hasAxis) {\n if (options.axisX.position === 'start') {\n chartRect.y2 = normalizedPadding.top + xAxisOffset;\n chartRect.y1 = Math.max(height - normalizedPadding.bottom, chartRect.y2 + 1);\n } else {\n chartRect.y2 = normalizedPadding.top;\n chartRect.y1 = Math.max(height - normalizedPadding.bottom - xAxisOffset, chartRect.y2 + 1);\n }\n\n if (options.axisY.position === 'start') {\n chartRect.x1 = normalizedPadding.left + yAxisOffset;\n chartRect.x2 = Math.max(width - normalizedPadding.right, chartRect.x1 + 1);\n } else {\n chartRect.x1 = normalizedPadding.left;\n chartRect.x2 = Math.max(width - normalizedPadding.right - yAxisOffset, chartRect.x1 + 1);\n }\n } else {\n chartRect.x1 = normalizedPadding.left;\n chartRect.x2 = Math.max(width - normalizedPadding.right, chartRect.x1 + 1);\n chartRect.y2 = normalizedPadding.top;\n chartRect.y1 = Math.max(height - normalizedPadding.bottom, chartRect.y2 + 1);\n }\n\n return chartRect;\n}\n\n/**\n * Creates a grid line based on a projected value.\n *\n * @memberof Chartist.Core\n * @param position\n * @param index\n * @param axis\n * @param offset\n * @param length\n * @param group\n * @param classes\n * @param eventEmitter\n */\nexport function createGrid(position, index, axis, offset, length, group, classes, eventEmitter) {\n var positionalData = {};\n positionalData[axis.units.pos + '1'] = position;\n positionalData[axis.units.pos + '2'] = position;\n positionalData[axis.counterUnits.pos + '1'] = offset;\n positionalData[axis.counterUnits.pos + '2'] = offset + length;\n\n var gridElement = group.elem('line', positionalData, classes.join(' '));\n\n // Event for grid draw\n eventEmitter.emit('draw',\n extend({\n type: 'grid',\n axis: axis,\n index: index,\n group: group,\n element: gridElement\n }, positionalData)\n );\n}\n\n/**\n * Creates a grid background rect and emits the draw event.\n *\n * @memberof Chartist.Core\n * @param gridGroup\n * @param chartRect\n * @param className\n * @param eventEmitter\n */\nexport function createGridBackground(gridGroup, chartRect, className, eventEmitter) {\n var gridBackground = gridGroup.elem('rect', {\n x: chartRect.x1,\n y: chartRect.y2,\n width: chartRect.width(),\n height: chartRect.height()\n }, className, true);\n\n // Event for grid background draw\n eventEmitter.emit('draw', {\n type: 'gridBackground',\n group: gridGroup,\n element: gridBackground\n });\n}\n\n/**\n * Creates a label based on a projected value and an axis.\n *\n * @memberof Chartist.Core\n * @param position\n * @param length\n * @param index\n * @param labels\n * @param axis\n * @param axisOffset\n * @param labelOffset\n * @param group\n * @param classes\n * @param useForeignObject\n * @param eventEmitter\n */\nexport function createLabel(position, length, index, labels, axis, axisOffset, labelOffset, group, classes, useForeignObject, eventEmitter) {\n var labelElement;\n var positionalData = {};\n\n positionalData[axis.units.pos] = position + labelOffset[axis.units.pos];\n positionalData[axis.counterUnits.pos] = labelOffset[axis.counterUnits.pos];\n positionalData[axis.units.len] = length;\n positionalData[axis.counterUnits.len] = Math.max(0, axisOffset - 10);\n\n if(useForeignObject) {\n // We need to set width and height explicitly to px as span will not expand with width and height being\n // 100% in all browsers\n var content = '' +\n labels[index] + '';\n\n labelElement = group.foreignObject(content, extend({\n style: 'overflow: visible;'\n }, positionalData));\n } else {\n labelElement = group.elem('text', positionalData, classes.join(' ')).text(labels[index]);\n }\n\n eventEmitter.emit('draw', extend({\n type: 'label',\n axis: axis,\n index: index,\n group: group,\n element: labelElement,\n text: labels[index]\n }, positionalData));\n}\n","import {extend} from './extend';\n\n/**\n * Provides options handling functionality with callback for options changes triggered by responsive options and media query matches\n *\n * @memberof Chartist.Core\n * @param {Object} options Options set by user\n * @param {Array} responsiveOptions Optional functions to add responsive behavior to chart\n * @param {Object} eventEmitter The event emitter that will be used to emit the options changed events\n * @return {Object} The consolidated options object from the defaults, base and matching responsive options\n */\nexport function optionsProvider(options, responsiveOptions, eventEmitter) {\n var baseOptions = extend({}, options),\n currentOptions,\n mediaQueryListeners = [],\n i;\n\n function updateCurrentOptions(mediaEvent) {\n var previousOptions = currentOptions;\n currentOptions = extend({}, baseOptions);\n\n if (responsiveOptions) {\n for (i = 0; i < responsiveOptions.length; i++) {\n var mql = window.matchMedia(responsiveOptions[i][0]);\n if (mql.matches) {\n currentOptions = extend(currentOptions, responsiveOptions[i][1]);\n }\n }\n }\n\n if(eventEmitter && mediaEvent) {\n eventEmitter.emit('optionsChanged', {\n previousOptions: previousOptions,\n currentOptions: currentOptions\n });\n }\n }\n\n function removeMediaQueryListeners() {\n mediaQueryListeners.forEach(function(mql) {\n mql.removeListener(updateCurrentOptions);\n });\n }\n\n if (!window.matchMedia) {\n throw 'window.matchMedia not found! Make sure you\\'re using a polyfill.';\n } else if (responsiveOptions) {\n\n for (i = 0; i < responsiveOptions.length; i++) {\n var mql = window.matchMedia(responsiveOptions[i][0]);\n mql.addListener(updateCurrentOptions);\n mediaQueryListeners.push(mql);\n }\n }\n // Execute initially without an event argument so we get the correct options\n updateCurrentOptions();\n\n return {\n removeMediaQueryListeners: removeMediaQueryListeners,\n getCurrentOptions: function getCurrentOptions() {\n return extend({}, currentOptions);\n }\n };\n}\n","import {extend} from '../core/core';\n\n/**\n * Contains the descriptors of supported element types in a SVG path. Currently only move, line and curve are supported.\n *\n * @memberof SvgPath\n * @type {Object}\n */\nconst elementDescriptions = {\n m: ['x', 'y'],\n l: ['x', 'y'],\n c: ['x1', 'y1', 'x2', 'y2', 'x', 'y'],\n a: ['rx', 'ry', 'xAr', 'lAf', 'sf', 'x', 'y']\n};\n\n/**\n * Default options for newly created SVG path objects.\n *\n * @memberof SvgPath\n * @type {Object}\n */\nconst defaultOptions = {\n // The accuracy in digit count after the decimal point. This will be used to round numbers in the SVG path. If this option is set to false then no rounding will be performed.\n accuracy: 3\n};\n\nfunction element(command, params, pathElements, pos, relative, data) {\n var pathElement = extend({\n command: relative ? command.toLowerCase() : command.toUpperCase()\n }, params, data ? { data: data } : {} );\n\n pathElements.splice(pos, 0, pathElement);\n}\n\nfunction forEachParam(pathElements, cb) {\n pathElements.forEach(function(pathElement, pathElementIndex) {\n elementDescriptions[pathElement.command.toLowerCase()].forEach(function(paramName, paramIndex) {\n cb(pathElement, paramName, pathElementIndex, paramIndex, pathElements);\n });\n });\n}\n\n/**\n * Used to construct a new path object.\n *\n * @memberof SvgPath\n * @param {Boolean} close If set to true then this path will be closed when stringified (with a Z at the end)\n * @param {Object} options Options object that overrides the default objects. See default options for more details.\n * @constructor\n */\nexport class SvgPath {\n /**\n * This static function on `SvgPath` is joining multiple paths together into one paths.\n *\n * @memberof SvgPath\n * @param {Array} paths A list of paths to be joined together. The order is important.\n * @param {boolean} [close] If the newly created path should be a closed path\n * @param {Object} [options] Path options for the newly created path.\n * @return {SvgPath}\n */\n static join(paths, close, options) {\n var joinedPath = new SvgPath(close, options);\n for(var i = 0; i < paths.length; i++) {\n var path = paths[i];\n for(var j = 0; j < path.pathElements.length; j++) {\n joinedPath.pathElements.push(path.pathElements[j]);\n }\n }\n return joinedPath;\n }\n\n constructor(close, options) {\n this.pathElements = [];\n this.pos = 0;\n this.close = close;\n this.options = extend({}, defaultOptions, options);\n }\n\n /**\n * Gets or sets the current position (cursor) inside of the path. You can move around the cursor freely but limited to 0 or the count of existing elements. All modifications with element functions will insert new elements at the position of this cursor.\n *\n * @memberof SvgPath\n * @param {Number} [pos] If a number is passed then the cursor is set to this position in the path element array.\n * @return {SvgPath|Number} If the position parameter was passed then the return value will be the path object for easy call chaining. If no position parameter was passed then the current position is returned.\n */\n position(pos) {\n if(pos !== undefined) {\n this.pos = Math.max(0, Math.min(this.pathElements.length, pos));\n return this;\n } else {\n return this.pos;\n }\n }\n\n /**\n * Removes elements from the path starting at the current position.\n *\n * @memberof SvgPath\n * @param {Number} count Number of path elements that should be removed from the current position.\n * @return {SvgPath} The current path object for easy call chaining.\n */\n remove(count) {\n this.pathElements.splice(this.pos, count);\n return this;\n }\n\n /**\n * Use this function to add a new move SVG path element.\n *\n * @memberof SvgPath\n * @param {Number} x The x coordinate for the move element.\n * @param {Number} y The y coordinate for the move element.\n * @param {Boolean} [relative] If set to true the move element will be created with relative coordinates (lowercase letter)\n * @param {*} [data] Any data that should be stored with the element object that will be accessible in pathElement\n * @return {SvgPath} The current path object for easy call chaining.\n */\n move(x, y, relative, data) {\n element('M', {\n x: +x,\n y: +y\n }, this.pathElements, this.pos++, relative, data);\n return this;\n }\n\n /**\n * Use this function to add a new line SVG path element.\n *\n * @memberof SvgPath\n * @param {Number} x The x coordinate for the line element.\n * @param {Number} y The y coordinate for the line element.\n * @param {Boolean} [relative] If set to true the line element will be created with relative coordinates (lowercase letter)\n * @param {*} [data] Any data that should be stored with the element object that will be accessible in pathElement\n * @return {SvgPath} The current path object for easy call chaining.\n */\n line(x, y, relative, data) {\n element('L', {\n x: +x,\n y: +y\n }, this.pathElements, this.pos++, relative, data);\n return this;\n }\n\n /**\n * Use this function to add a new curve SVG path element.\n *\n * @memberof SvgPath\n * @param {Number} x1 The x coordinate for the first control point of the bezier curve.\n * @param {Number} y1 The y coordinate for the first control point of the bezier curve.\n * @param {Number} x2 The x coordinate for the second control point of the bezier curve.\n * @param {Number} y2 The y coordinate for the second control point of the bezier curve.\n * @param {Number} x The x coordinate for the target point of the curve element.\n * @param {Number} y The y coordinate for the target point of the curve element.\n * @param {Boolean} [relative] If set to true the curve element will be created with relative coordinates (lowercase letter)\n * @param {*} [data] Any data that should be stored with the element object that will be accessible in pathElement\n * @return {SvgPath} The current path object for easy call chaining.\n */\n curve(x1, y1, x2, y2, x, y, relative, data) {\n element('C', {\n x1: +x1,\n y1: +y1,\n x2: +x2,\n y2: +y2,\n x: +x,\n y: +y\n }, this.pathElements, this.pos++, relative, data);\n return this;\n }\n\n /**\n * Use this function to add a new non-bezier curve SVG path element.\n *\n * @memberof SvgPath\n * @param {Number} rx The radius to be used for the x-axis of the arc.\n * @param {Number} ry The radius to be used for the y-axis of the arc.\n * @param {Number} xAr Defines the orientation of the arc\n * @param {Number} lAf Large arc flag\n * @param {Number} sf Sweep flag\n * @param {Number} x The x coordinate for the target point of the curve element.\n * @param {Number} y The y coordinate for the target point of the curve element.\n * @param {Boolean} [relative] If set to true the curve element will be created with relative coordinates (lowercase letter)\n * @param {*} [data] Any data that should be stored with the element object that will be accessible in pathElement\n * @return {SvgPath} The current path object for easy call chaining.\n */\n arc(rx, ry, xAr, lAf, sf, x, y, relative, data) {\n element('A', {\n rx: +rx,\n ry: +ry,\n xAr: +xAr,\n lAf: +lAf,\n sf: +sf,\n x: +x,\n y: +y\n }, this.pathElements, this.pos++, relative, data);\n return this;\n }\n\n /**\n * Parses an SVG path seen in the d attribute of path elements, and inserts the parsed elements into the existing path object at the current cursor position. Any closing path indicators (Z at the end of the path) will be ignored by the parser as this is provided by the close option in the options of the path object.\n *\n * @memberof SvgPath\n * @param {String} path Any SVG path that contains move (m), line (l) or curve (c) components.\n * @return {SvgPath} The current path object for easy call chaining.\n */\n parse(path) {\n // Parsing the SVG path string into an array of arrays [['M', '10', '10'], ['L', '100', '100']]\n var chunks = path.replace(/([A-Za-z])([0-9])/g, '$1 $2')\n .replace(/([0-9])([A-Za-z])/g, '$1 $2')\n .split(/[\\s,]+/)\n .reduce(function(result, element) {\n if(element.match(/[A-Za-z]/)) {\n result.push([]);\n }\n\n result[result.length - 1].push(element);\n return result;\n }, []);\n\n // If this is a closed path we remove the Z at the end because this is determined by the close option\n if(chunks[chunks.length - 1][0].toUpperCase() === 'Z') {\n chunks.pop();\n }\n\n // Using svgPathElementDescriptions to map raw path arrays into objects that contain the command and the parameters\n // For example {command: 'M', x: '10', y: '10'}\n var elements = chunks.map(function(chunk) {\n var command = chunk.shift(),\n description = elementDescriptions[command.toLowerCase()];\n\n return extend({\n command: command\n }, description.reduce(function(result, paramName, index) {\n result[paramName] = +chunk[index];\n return result;\n }, {}));\n });\n\n // Preparing a splice call with the elements array as var arg params and insert the parsed elements at the current position\n var spliceArgs = [this.pos, 0];\n Array.prototype.push.apply(spliceArgs, elements);\n Array.prototype.splice.apply(this.pathElements, spliceArgs);\n // Increase the internal position by the element count\n this.pos += elements.length;\n\n return this;\n }\n\n /**\n * This function renders to current SVG path object into a final SVG string that can be used in the d attribute of SVG path elements. It uses the accuracy option to round big decimals. If the close parameter was set in the constructor of this path object then a path closing Z will be appended to the output string.\n *\n * @memberof SvgPath\n * @return {String}\n */\n stringify() {\n var accuracyMultiplier = Math.pow(10, this.options.accuracy);\n\n return this.pathElements.reduce(function(path, pathElement) {\n var params = elementDescriptions[pathElement.command.toLowerCase()].map(function(paramName) {\n return this.options.accuracy ?\n (Math.round(pathElement[paramName] * accuracyMultiplier) / accuracyMultiplier) :\n pathElement[paramName];\n }.bind(this));\n\n return path + pathElement.command + params.join(',');\n }.bind(this), '') + (this.close ? 'Z' : '');\n }\n\n /**\n * Scales all elements in the current SVG path object. There is an individual parameter for each coordinate. Scaling will also be done for control points of curves, affecting the given coordinate.\n *\n * @memberof SvgPath\n * @param {Number} x The number which will be used to scale the x, x1 and x2 of all path elements.\n * @param {Number} y The number which will be used to scale the y, y1 and y2 of all path elements.\n * @return {SvgPath} The current path object for easy call chaining.\n */\n scale(x, y) {\n forEachParam(this.pathElements, function(pathElement, paramName) {\n pathElement[paramName] *= paramName[0] === 'x' ? x : y;\n });\n return this;\n }\n\n /**\n * Translates all elements in the current SVG path object. The translation is relative and there is an individual parameter for each coordinate. Translation will also be done for control points of curves, affecting the given coordinate.\n *\n * @memberof SvgPath\n * @param {Number} x The number which will be used to translate the x, x1 and x2 of all path elements.\n * @param {Number} y The number which will be used to translate the y, y1 and y2 of all path elements.\n * @return {SvgPath} The current path object for easy call chaining.\n */\n translate(x, y) {\n forEachParam(this.pathElements, function(pathElement, paramName) {\n pathElement[paramName] += paramName[0] === 'x' ? x : y;\n });\n return this;\n }\n\n /**\n * This function will run over all existing path elements and then loop over their attributes. The callback function will be called for every path element attribute that exists in the current path.\n * The method signature of the callback function looks like this:\n * ```javascript\n * function(pathElement, paramName, pathElementIndex, paramIndex, pathElements)\n * ```\n * If something else than undefined is returned by the callback function, this value will be used to replace the old value. This allows you to build custom transformations of path objects that can't be achieved using the basic transformation functions scale and translate.\n *\n * @memberof SvgPath\n * @param {Function} transformFnc The callback function for the transformation. Check the signature in the function description.\n * @return {SvgPath} The current path object for easy call chaining.\n */\n transform(transformFnc) {\n forEachParam(this.pathElements, function(pathElement, paramName, pathElementIndex, paramIndex, pathElements) {\n var transformed = transformFnc(pathElement, paramName, pathElementIndex, paramIndex, pathElements);\n if(transformed || transformed === 0) {\n pathElement[paramName] = transformed;\n }\n });\n return this;\n }\n\n /**\n * This function clones a whole path object with all its properties. This is a deep clone and path element objects will also be cloned.\n *\n * @memberof SvgPath\n * @param {Boolean} [close] Optional option to set the new cloned path to closed. If not specified or false, the original path close option will be used.\n * @return {SvgPath}\n */\n clone(close) {\n var c = new SvgPath(close || this.close);\n c.pos = this.pos;\n c.pathElements = this.pathElements.slice().map(function cloneElements(pathElement) {\n return extend({}, pathElement);\n });\n c.options = extend({}, this.options);\n return c;\n }\n\n /**\n * Split a Svg.Path object by a specific command in the path chain. The path chain will be split and an array of newly created paths objects will be returned. This is useful if you'd like to split an SVG path by it's move commands, for example, in order to isolate chunks of drawings.\n *\n * @memberof SvgPath\n * @param {String} command The command you'd like to use to split the path\n * @return {Array}\n */\n splitByCommand(command) {\n var split = [\n new SvgPath()\n ];\n\n this.pathElements.forEach(function(pathElement) {\n if(pathElement.command === command.toUpperCase() && split[split.length - 1].pathElements.length !== 0) {\n split.push(new SvgPath());\n }\n\n split[split.length - 1].pathElements.push(pathElement);\n });\n\n return split;\n }\n}\n","import {extend, getMultiValue} from '../core/core';\nimport {SvgPath} from '../svg/svg-path';\n\n/**\n * This interpolation function does not smooth the path and the result is only containing lines and no curves.\n *\n * @example\n * var chart = new Chartist.Line('.ct-chart', {\n * labels: [1, 2, 3, 4, 5],\n * series: [[1, 2, 8, 1, 7]]\n * }, {\n * lineSmooth: Chartist.Interpolation.none({\n * fillHoles: false\n * })\n * });\n *\n *\n * @memberof Chartist.Interpolation\n * @return {Function}\n */\nexport function none(options) {\n var defaultOptions = {\n fillHoles: false\n };\n options = extend({}, defaultOptions, options);\n return function none(pathCoordinates, valueData) {\n var path = new SvgPath();\n var hole = true;\n\n for(var i = 0; i < pathCoordinates.length; i += 2) {\n var currX = pathCoordinates[i];\n var currY = pathCoordinates[i + 1];\n var currData = valueData[i / 2];\n\n if(getMultiValue(currData.value) !== undefined) {\n\n if(hole) {\n path.move(currX, currY, false, currData);\n } else {\n path.line(currX, currY, false, currData);\n }\n\n hole = false;\n } else if(!options.fillHoles) {\n hole = true;\n }\n }\n\n return path;\n };\n}\n","import {extend} from '../core/core';\nimport {SvgPath} from '../svg/svg-path';\n\n/**\n * Simple smoothing creates horizontal handles that are positioned with a fraction of the length between two data points. You can use the divisor option to specify the amount of smoothing.\n *\n * Simple smoothing can be used instead of `Chartist.Smoothing.cardinal` if you'd like to get rid of the artifacts it produces sometimes. Simple smoothing produces less flowing lines but is accurate by hitting the points and it also doesn't swing below or above the given data point.\n *\n * All smoothing functions within Chartist are factory functions that accept an options parameter. The simple interpolation function accepts one configuration parameter `divisor`, between 1 and ∞, which controls the smoothing characteristics.\n *\n * @example\n * var chart = new Chartist.Line('.ct-chart', {\n * labels: [1, 2, 3, 4, 5],\n * series: [[1, 2, 8, 1, 7]]\n * }, {\n * lineSmooth: Chartist.Interpolation.simple({\n * divisor: 2,\n * fillHoles: false\n * })\n * });\n *\n *\n * @memberof Chartist.Interpolation\n * @param {Object} options The options of the simple interpolation factory function.\n * @return {Function}\n */\nexport function simple(options) {\n var defaultOptions = {\n divisor: 2,\n fillHoles: false\n };\n options = extend({}, defaultOptions, options);\n\n var d = 1 / Math.max(1, options.divisor);\n\n return function simple(pathCoordinates, valueData) {\n var path = new SvgPath();\n var prevX, prevY, prevData;\n\n for(var i = 0; i < pathCoordinates.length; i += 2) {\n var currX = pathCoordinates[i];\n var currY = pathCoordinates[i + 1];\n var length = (currX - prevX) * d;\n var currData = valueData[i / 2];\n\n if(currData.value !== undefined) {\n\n if(prevData === undefined) {\n path.move(currX, currY, false, currData);\n } else {\n path.curve(\n prevX + length,\n prevY,\n currX - length,\n currY,\n currX,\n currY,\n false,\n currData\n );\n }\n\n prevX = currX;\n prevY = currY;\n prevData = currData;\n } else if(!options.fillHoles) {\n prevX = currX = prevData = undefined;\n }\n }\n\n return path;\n };\n}\n","import {extend} from '../core/core';\nimport {SvgPath} from '../svg/svg-path';\n\n/**\n * Step interpolation will cause the line chart to move in steps rather than diagonal or smoothed lines. This interpolation will create additional points that will also be drawn when the `showPoint` option is enabled.\n *\n * All smoothing functions within Chartist are factory functions that accept an options parameter. The step interpolation function accepts one configuration parameter `postpone`, that can be `true` or `false`. The default value is `true` and will cause the step to occur where the value actually changes. If a different behaviour is needed where the step is shifted to the left and happens before the actual value, this option can be set to `false`.\n *\n * @example\n * var chart = new Chartist.Line('.ct-chart', {\n * labels: [1, 2, 3, 4, 5],\n * series: [[1, 2, 8, 1, 7]]\n * }, {\n * lineSmooth: Chartist.Interpolation.step({\n * postpone: true,\n * fillHoles: false\n * })\n * });\n *\n * @memberof Chartist.Interpolation\n * @param options\n * @returns {Function}\n */\nexport function step(options) {\n var defaultOptions = {\n postpone: true,\n fillHoles: false\n };\n\n options = extend({}, defaultOptions, options);\n\n return function step(pathCoordinates, valueData) {\n var path = new SvgPath();\n\n var prevX, prevY, prevData;\n\n for (var i = 0; i < pathCoordinates.length; i += 2) {\n var currX = pathCoordinates[i];\n var currY = pathCoordinates[i + 1];\n var currData = valueData[i / 2];\n\n // If the current point is also not a hole we can draw the step lines\n if(currData.value !== undefined) {\n if(prevData === undefined) {\n path.move(currX, currY, false, currData);\n } else {\n if(options.postpone) {\n // If postponed we should draw the step line with the value of the previous value\n path.line(currX, prevY, false, prevData);\n } else {\n // If not postponed we should draw the step line with the value of the current value\n path.line(prevX, currY, false, currData);\n }\n // Line to the actual point (this should only be a Y-Axis movement\n path.line(currX, currY, false, currData);\n }\n\n prevX = currX;\n prevY = currY;\n prevData = currData;\n } else if(!options.fillHoles) {\n prevX = prevY = prevData = undefined;\n }\n }\n\n return path;\n };\n}\n","import {extend, splitIntoSegments} from '../core/core';\nimport {SvgPath} from '../svg/svg-path';\nimport {none} from './none';\n\n/**\n * Cardinal / Catmull-Rome spline interpolation is the default smoothing function in Chartist. It produces nice results where the splines will always meet the points. It produces some artifacts though when data values are increased or decreased rapidly. The line may not follow a very accurate path and if the line should be accurate this smoothing function does not produce the best results.\n *\n * Cardinal splines can only be created if there are more than two data points. If this is not the case this smoothing will fallback to `Chartist.Smoothing.none`.\n *\n * All smoothing functions within Chartist are factory functions that accept an options parameter. The cardinal interpolation function accepts one configuration parameter `tension`, between 0 and 1, which controls the smoothing intensity.\n *\n * @example\n * var chart = new Chartist.Line('.ct-chart', {\n * labels: [1, 2, 3, 4, 5],\n * series: [[1, 2, 8, 1, 7]]\n * }, {\n * lineSmooth: Chartist.Interpolation.cardinal({\n * tension: 1,\n * fillHoles: false\n * })\n * });\n *\n * @memberof Chartist.Interpolation\n * @param {Object} options The options of the cardinal factory function.\n * @return {Function}\n */\nexport function cardinal(options) {\n var defaultOptions = {\n tension: 1,\n fillHoles: false\n };\n\n options = extend({}, defaultOptions, options);\n\n var t = Math.min(1, Math.max(0, options.tension)),\n c = 1 - t;\n\n return function cardinal(pathCoordinates, valueData) {\n // First we try to split the coordinates into segments\n // This is necessary to treat \"holes\" in line charts\n var segments = splitIntoSegments(pathCoordinates, valueData, {\n fillHoles: options.fillHoles\n });\n\n if(!segments.length) {\n // If there were no segments return 'none' interpolation\n return none()([]);\n } else if(segments.length > 1) {\n // If the split resulted in more that one segment we need to interpolate each segment individually and join them\n // afterwards together into a single path.\n var paths = [];\n // For each segment we will recurse the cardinal function\n segments.forEach(function(segment) {\n paths.push(cardinal(segment.pathCoordinates, segment.valueData));\n });\n // Join the segment path data into a single path and return\n return SvgPath.join(paths);\n } else {\n // If there was only one segment we can proceed regularly by using pathCoordinates and valueData from the first\n // segment\n pathCoordinates = segments[0].pathCoordinates;\n valueData = segments[0].valueData;\n\n // If less than two points we need to fallback to no smoothing\n if(pathCoordinates.length <= 4) {\n return none()(pathCoordinates, valueData);\n }\n\n var path = new SvgPath().move(pathCoordinates[0], pathCoordinates[1], false, valueData[0]),\n z;\n\n for (var i = 0, iLen = pathCoordinates.length; iLen - 2 * !z > i; i += 2) {\n var p = [\n {x: +pathCoordinates[i - 2], y: +pathCoordinates[i - 1]},\n {x: +pathCoordinates[i], y: +pathCoordinates[i + 1]},\n {x: +pathCoordinates[i + 2], y: +pathCoordinates[i + 3]},\n {x: +pathCoordinates[i + 4], y: +pathCoordinates[i + 5]}\n ];\n if (z) {\n if (!i) {\n p[0] = {x: +pathCoordinates[iLen - 2], y: +pathCoordinates[iLen - 1]};\n } else if (iLen - 4 === i) {\n p[3] = {x: +pathCoordinates[0], y: +pathCoordinates[1]};\n } else if (iLen - 2 === i) {\n p[2] = {x: +pathCoordinates[0], y: +pathCoordinates[1]};\n p[3] = {x: +pathCoordinates[2], y: +pathCoordinates[3]};\n }\n } else {\n if (iLen - 4 === i) {\n p[3] = p[2];\n } else if (!i) {\n p[0] = {x: +pathCoordinates[i], y: +pathCoordinates[i + 1]};\n }\n }\n\n path.curve(\n (t * (-p[0].x + 6 * p[1].x + p[2].x) / 6) + (c * p[2].x),\n (t * (-p[0].y + 6 * p[1].y + p[2].y) / 6) + (c * p[2].y),\n (t * (p[1].x + 6 * p[2].x - p[3].x) / 6) + (c * p[2].x),\n (t * (p[1].y + 6 * p[2].y - p[3].y) / 6) + (c * p[2].y),\n p[2].x,\n p[2].y,\n false,\n valueData[(i + 2) / 2]\n );\n }\n\n return path;\n }\n };\n}\n","import {extend, splitIntoSegments} from '../core/core';\nimport {SvgPath} from '../svg/svg-path';\nimport {none} from './none';\n\n/**\n * Monotone Cubic spline interpolation produces a smooth curve which preserves monotonicity. Unlike cardinal splines, the curve will not extend beyond the range of y-values of the original data points.\n *\n * Monotone Cubic splines can only be created if there are more than two data points. If this is not the case this smoothing will fallback to `Chartist.Smoothing.none`.\n *\n * The x-values of subsequent points must be increasing to fit a Monotone Cubic spline. If this condition is not met for a pair of adjacent points, then there will be a break in the curve between those data points.\n *\n * All smoothing functions within Chartist are factory functions that accept an options parameter.\n *\n * @example\n * var chart = new Chartist.Line('.ct-chart', {\n * labels: [1, 2, 3, 4, 5],\n * series: [[1, 2, 8, 1, 7]]\n * }, {\n * lineSmooth: Chartist.Interpolation.monotoneCubic({\n * fillHoles: false\n * })\n * });\n *\n * @memberof Chartist.Interpolation\n * @param {Object} [options] The options of the monotoneCubic factory function.\n * @return {Function}\n */\nexport function monotoneCubic(options) {\n var defaultOptions = {\n fillHoles: false\n };\n\n options = extend({}, defaultOptions, options);\n\n return function monotoneCubic(pathCoordinates, valueData) {\n // First we try to split the coordinates into segments\n // This is necessary to treat \"holes\" in line charts\n var segments = splitIntoSegments(pathCoordinates, valueData, {\n fillHoles: options.fillHoles,\n increasingX: true\n });\n\n if(!segments.length) {\n // If there were no segments return 'Chartist.Interpolation.none'\n return none()([]);\n } else if(segments.length > 1) {\n // If the split resulted in more that one segment we need to interpolate each segment individually and join them\n // afterwards together into a single path.\n var paths = [];\n // For each segment we will recurse the monotoneCubic fn function\n segments.forEach(function(segment) {\n paths.push(monotoneCubic(segment.pathCoordinates, segment.valueData));\n });\n // Join the segment path data into a single path and return\n return SvgPath.join(paths);\n } else {\n // If there was only one segment we can proceed regularly by using pathCoordinates and valueData from the first\n // segment\n pathCoordinates = segments[0].pathCoordinates;\n valueData = segments[0].valueData;\n\n // If less than three points we need to fallback to no smoothing\n if(pathCoordinates.length <= 4) {\n return none()(pathCoordinates, valueData);\n }\n\n var xs = [],\n ys = [],\n i,\n n = pathCoordinates.length / 2,\n ms = [],\n ds = [], dys = [], dxs = [],\n path;\n\n // Populate x and y coordinates into separate arrays, for readability\n\n for(i = 0; i < n; i++) {\n xs[i] = pathCoordinates[i * 2];\n ys[i] = pathCoordinates[i * 2 + 1];\n }\n\n // Calculate deltas and derivative\n\n for(i = 0; i < n - 1; i++) {\n dys[i] = ys[i + 1] - ys[i];\n dxs[i] = xs[i + 1] - xs[i];\n ds[i] = dys[i] / dxs[i];\n }\n\n // Determine desired slope (m) at each point using Fritsch-Carlson method\n // See: http://math.stackexchange.com/questions/45218/implementation-of-monotone-cubic-interpolation\n\n ms[0] = ds[0];\n ms[n - 1] = ds[n - 2];\n\n for(i = 1; i < n - 1; i++) {\n if(ds[i] === 0 || ds[i - 1] === 0 || (ds[i - 1] > 0) !== (ds[i] > 0)) {\n ms[i] = 0;\n } else {\n ms[i] = 3 * (dxs[i - 1] + dxs[i]) / (\n (2 * dxs[i] + dxs[i - 1]) / ds[i - 1] +\n (dxs[i] + 2 * dxs[i - 1]) / ds[i]);\n\n if(!isFinite(ms[i])) {\n ms[i] = 0;\n }\n }\n }\n\n // Now build a path from the slopes\n\n path = new SvgPath().move(xs[0], ys[0], false, valueData[0]);\n\n for(i = 0; i < n - 1; i++) {\n path.curve(\n // First control point\n xs[i] + dxs[i] / 3,\n ys[i] + ms[i] * dxs[i] / 3,\n // Second control point\n xs[i + 1] - dxs[i] / 3,\n ys[i + 1] - ms[i + 1] * dxs[i] / 3,\n // End point\n xs[i + 1],\n ys[i + 1],\n\n false,\n valueData[i + 1]\n );\n }\n\n return path;\n }\n };\n}\n","import {alphaNumerate, quantity, isFalseyButZero} from '../core/lang';\nimport {noop} from '../core/functional';\nimport {polarToCartesian} from '../core/math';\nimport {extend} from '../core/extend';\nimport {normalizeData, serialize} from '../core/data';\nimport {createSvg, createChartRect} from '../core/creation';\nimport {SvgPath} from '../svg/svg-path';\nimport {BaseChart} from './base';\n\n/**\n * Default options in line charts. Expand the code view to see a detailed list of options with comments.\n *\n * @memberof Chartist.Pie\n */\nconst defaultOptions = {\n // Specify a fixed width for the chart as a string (i.e. '100px' or '50%')\n width: undefined,\n // Specify a fixed height for the chart as a string (i.e. '100px' or '50%')\n height: undefined,\n // Padding of the chart drawing area to the container element and labels as a number or padding object {top: 5, right: 5, bottom: 5, left: 5}\n chartPadding: 5,\n // Override the class names that are used to generate the SVG structure of the chart\n classNames: {\n chartPie: 'ct-chart-pie',\n chartDonut: 'ct-chart-donut',\n series: 'ct-series',\n slicePie: 'ct-slice-pie',\n sliceDonut: 'ct-slice-donut',\n label: 'ct-label'\n },\n // The start angle of the pie chart in degrees where 0 points north. A higher value offsets the start angle clockwise.\n startAngle: 0,\n // An optional total you can specify. By specifying a total value, the sum of the values in the series must be this total in order to draw a full pie. You can use this parameter to draw only parts of a pie or gauge charts.\n total: undefined,\n // If specified the donut CSS classes will be used and strokes will be drawn instead of pie slices.\n donut: false,\n // Specify the donut stroke width, currently done in javascript for convenience. May move to CSS styles in the future.\n // This option can be set as number or string to specify a relative width (i.e. 100 or '30%').\n donutWidth: 60,\n // If a label should be shown or not\n showLabel: true,\n // Label position offset from the standard position which is half distance of the radius. This value can be either positive or negative. Positive values will position the label away from the center.\n labelOffset: 0,\n // This option can be set to 'inside', 'outside' or 'center'. Positioned with 'inside' the labels will be placed on half the distance of the radius to the border of the Pie by respecting the 'labelOffset'. The 'outside' option will place the labels at the border of the pie and 'center' will place the labels in the absolute center point of the chart. The 'center' option only makes sense in conjunction with the 'labelOffset' option.\n labelPosition: 'inside',\n // An interpolation function for the label value\n labelInterpolationFnc: noop,\n // Label direction can be 'neutral', 'explode' or 'implode'. The labels anchor will be positioned based on those settings as well as the fact if the labels are on the right or left side of the center of the chart. Usually explode is useful when labels are positioned far away from the center.\n labelDirection: 'neutral',\n // If true the whole data is reversed including labels, the series order as well as the whole series data arrays.\n reverseData: false,\n // If true empty values will be ignored to avoid drawing unncessary slices and labels\n ignoreEmptyValues: false\n};\n\n/**\n * Determines SVG anchor position based on direction and center parameter\n *\n * @param center\n * @param label\n * @param direction\n * @return {string}\n */\nexport function determineAnchorPosition(center, label, direction) {\n var toTheRight = label.x > center.x;\n\n if (toTheRight && direction === 'explode' ||\n !toTheRight && direction === 'implode') {\n return 'start';\n } else if (toTheRight && direction === 'implode' ||\n !toTheRight && direction === 'explode') {\n return 'end';\n } else {\n return 'middle';\n }\n}\n\nexport class PieChart extends BaseChart {\n /**\n * This method creates a new pie chart and returns an object that can be used to redraw the chart.\n *\n * @memberof Chartist.Pie\n * @param {String|Node} query A selector query string or directly a DOM element\n * @param {Object} data The data object in the pie chart needs to have a series property with a one dimensional data array. The values will be normalized against each other and don't necessarily need to be in percentage. The series property can also be an array of value objects that contain a value property and a className property to override the CSS class name for the series group.\n * @param {Object} [options] The options object with options that override the default options. Check the examples for a detailed list.\n * @param {Array} [responsiveOptions] Specify an array of responsive option arrays which are a media query and options object pair => [[mediaQueryString, optionsObject],[more...]]\n * @return {Object} An object with a version and an update method to manually redraw the chart\n *\n * @example\n * // Simple pie chart example with four series\n * new Chartist.Pie('.ct-chart', {\n * series: [10, 2, 4, 3]\n * });\n *\n * @example\n * // Drawing a donut chart\n * new Chartist.Pie('.ct-chart', {\n * series: [10, 2, 4, 3]\n * }, {\n * donut: true\n * });\n *\n * @example\n * // Using donut, startAngle and total to draw a gauge chart\n * new Chartist.Pie('.ct-chart', {\n * series: [20, 10, 30, 40]\n * }, {\n * donut: true,\n * donutWidth: 20,\n * startAngle: 270,\n * total: 200\n * });\n *\n * @example\n * // Drawing a pie chart with padding and labels that are outside the pie\n * new Chartist.Pie('.ct-chart', {\n * series: [20, 10, 30, 40]\n * }, {\n * chartPadding: 30,\n * labelOffset: 50,\n * labelDirection: 'explode'\n * });\n *\n * @example\n * // Overriding the class names for individual series as well as a name and meta data.\n * // The name will be written as ct:series-name attribute and the meta data will be serialized and written\n * // to a ct:meta attribute.\n * new Chartist.Pie('.ct-chart', {\n * series: [{\n * value: 20,\n * name: 'Series 1',\n * className: 'my-custom-class-one',\n * meta: 'Meta One'\n * }, {\n * value: 10,\n * name: 'Series 2',\n * className: 'my-custom-class-two',\n * meta: 'Meta Two'\n * }, {\n * value: 70,\n * name: 'Series 3',\n * className: 'my-custom-class-three',\n * meta: 'Meta Three'\n * }]\n * });\n */\n constructor(query, data, options, responsiveOptions) {\n super(query, data, defaultOptions, extend({}, defaultOptions, options), responsiveOptions);\n }\n\n /**\n * Creates the pie chart\n *\n * @param options\n */\n createChart(options) {\n var data = normalizeData(this.data);\n var seriesGroups = [],\n labelsGroup,\n chartRect,\n radius,\n labelRadius,\n totalDataSum,\n startAngle = options.startAngle;\n\n // Create SVG.js draw\n this.svg = createSvg(this.container, options.width, options.height, options.donut ? options.classNames.chartDonut : options.classNames.chartPie);\n // Calculate charting rect\n chartRect = createChartRect(this.svg, options, defaultOptions.padding);\n // Get biggest circle radius possible within chartRect\n radius = Math.min(chartRect.width() / 2, chartRect.height() / 2);\n // Calculate total of all series to get reference value or use total reference from optional options\n totalDataSum = options.total || data.normalized.series.reduce(function (previousValue, currentValue) {\n return previousValue + currentValue;\n }, 0);\n\n var donutWidth = quantity(options.donutWidth);\n if (donutWidth.unit === '%') {\n donutWidth.value *= radius / 100;\n }\n\n // If this is a donut chart we need to adjust our radius to enable strokes to be drawn inside\n // Unfortunately this is not possible with the current SVG Spec\n // See this proposal for more details: http://lists.w3.org/Archives/Public/www-svg/2003Oct/0000.html\n radius -= options.donut ? donutWidth.value / 2 : 0;\n\n // If labelPosition is set to `outside` or a donut chart is drawn then the label position is at the radius,\n // if regular pie chart it's half of the radius\n if (options.labelPosition === 'outside' || options.donut) {\n labelRadius = radius;\n } else if (options.labelPosition === 'center') {\n // If labelPosition is center we start with 0 and will later wait for the labelOffset\n labelRadius = 0;\n } else {\n // Default option is 'inside' where we use half the radius so the label will be placed in the center of the pie\n // slice\n labelRadius = radius / 2;\n }\n // Add the offset to the labelRadius where a negative offset means closed to the center of the chart\n labelRadius += options.labelOffset;\n\n // Calculate end angle based on total sum and current data value and offset with padding\n var center = {\n x: chartRect.x1 + chartRect.width() / 2,\n y: chartRect.y2 + chartRect.height() / 2\n };\n\n // Check if there is only one non-zero value in the series array.\n var hasSingleValInSeries = data.raw.series.filter(function (val) {\n return val.hasOwnProperty('value') ? val.value !== 0 : val !== 0;\n }).length === 1;\n\n // Creating the series groups\n data.raw.series.forEach(function (series, index) {\n seriesGroups[index] = this.svg.elem('g', null, null);\n }.bind(this));\n //if we need to show labels we create the label group now\n if (options.showLabel) {\n labelsGroup = this.svg.elem('g', null, null);\n }\n\n // Draw the series\n // initialize series groups\n data.raw.series.forEach(function (series, index) {\n // If current value is zero and we are ignoring empty values then skip to next value\n if (data.normalized.series[index] === 0 && options.ignoreEmptyValues) return;\n\n // If the series is an object and contains a name or meta data we add a custom attribute\n seriesGroups[index].attr({\n 'ct:series-name': series.name\n });\n\n // Use series class from series data or if not set generate one\n seriesGroups[index].addClass([\n options.classNames.series,\n (series.className || options.classNames.series + '-' + alphaNumerate(index))\n ].join(' '));\n\n // If the whole dataset is 0 endAngle should be zero. Can't divide by 0.\n var endAngle = (totalDataSum > 0 ? startAngle + data.normalized.series[index] / totalDataSum * 360 : 0);\n\n // Use slight offset so there are no transparent hairline issues\n var overlappigStartAngle = Math.max(0, startAngle - (index === 0 || hasSingleValInSeries ? 0 : 0.2));\n\n // If we need to draw the arc for all 360 degrees we need to add a hack where we close the circle\n // with Z and use 359.99 degrees\n if (endAngle - overlappigStartAngle >= 359.99) {\n endAngle = overlappigStartAngle + 359.99;\n }\n\n var start = polarToCartesian(center.x, center.y, radius, overlappigStartAngle),\n end = polarToCartesian(center.x, center.y, radius, endAngle);\n\n // Create a new path element for the pie chart. If this isn't a donut chart we should close the path for a correct stroke\n var path = new SvgPath(!options.donut)\n .move(end.x, end.y)\n .arc(radius, radius, 0, endAngle - startAngle > 180, 0, start.x, start.y);\n\n // If regular pie chart (no donut) we add a line to the center of the circle for completing the pie\n if (!options.donut) {\n path.line(center.x, center.y);\n }\n\n // Create the SVG path\n // If this is a donut chart we add the donut class, otherwise just a regular slice\n var pathElement = seriesGroups[index].elem('path', {\n d: path.stringify()\n }, options.donut ? options.classNames.sliceDonut : options.classNames.slicePie);\n\n // Adding the pie series value to the path\n pathElement.attr({\n 'ct:value': data.normalized.series[index],\n 'ct:meta': serialize(series.meta)\n });\n\n // If this is a donut, we add the stroke-width as style attribute\n if (options.donut) {\n pathElement.attr({\n 'style': 'stroke-width: ' + donutWidth.value + 'px'\n });\n }\n\n // Fire off draw event\n this.eventEmitter.emit('draw', {\n type: 'slice',\n value: data.normalized.series[index],\n totalDataSum: totalDataSum,\n index: index,\n meta: series.meta,\n series: series,\n group: seriesGroups[index],\n element: pathElement,\n path: path.clone(),\n center: center,\n radius: radius,\n startAngle: startAngle,\n endAngle: endAngle\n });\n\n // If we need to show labels we need to add the label for this slice now\n if (options.showLabel) {\n var labelPosition;\n if (data.raw.series.length === 1) {\n // If we have only 1 series, we can position the label in the center of the pie\n labelPosition = {\n x: center.x,\n y: center.y\n };\n } else {\n // Position at the labelRadius distance from center and between start and end angle\n labelPosition = polarToCartesian(\n center.x,\n center.y,\n labelRadius,\n startAngle + (endAngle - startAngle) / 2\n );\n }\n\n var rawValue;\n if (data.normalized.labels && !isFalseyButZero(data.normalized.labels[index])) {\n rawValue = data.normalized.labels[index];\n } else {\n rawValue = data.normalized.series[index];\n }\n\n var interpolatedValue = options.labelInterpolationFnc(rawValue, index);\n\n if (interpolatedValue || interpolatedValue === 0) {\n var labelElement = labelsGroup.elem('text', {\n dx: labelPosition.x,\n dy: labelPosition.y,\n 'text-anchor': determineAnchorPosition(center, labelPosition, options.labelDirection)\n }, options.classNames.label).text('' + interpolatedValue);\n\n // Fire off draw event\n this.eventEmitter.emit('draw', {\n type: 'label',\n index: index,\n group: labelsGroup,\n element: labelElement,\n text: '' + interpolatedValue,\n x: labelPosition.x,\n y: labelPosition.y\n });\n }\n }\n\n // Set next startAngle to current endAngle.\n // (except for last slice)\n startAngle = endAngle;\n }.bind(this));\n\n this.eventEmitter.emit('created', {\n chartRect: chartRect,\n svg: this.svg,\n options: options\n });\n }\n}\n","","export {version} from 'package.json!version';\n\n/**\n * This object contains all namespaces used within Chartist.\n *\n * @type {{svg: string, xmlns: string, xhtml: string, xlink: string, ct: string}}\n */\nexport let namespaces = {\n svg: 'http://www.w3.org/2000/svg',\n xmlns: 'http://www.w3.org/2000/xmlns/',\n xhtml: 'http://www.w3.org/1999/xhtml',\n xlink: 'http://www.w3.org/1999/xlink',\n ct: 'http://gionkunz.github.com/chartist-js/ct'\n};\n\n/**\n * Precision level used internally in Chartist for rounding. If you require more decimal places you can increase this number.\n *\n * @type {number}\n */\nexport let precision = 8;\n\n/**\n * A map with characters to escape for strings to be safely used as attribute values.\n *\n * @type {Object}\n */\nexport let escapingMap = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n '\\'': '''\n};\n","export default (function (instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n});","export default (function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);\n if (staticProps) defineProperties(Constructor, staticProps);\n return Constructor;\n };\n})();","import {Svg} from './svg';\n\n/**\n * This helper class is to wrap multiple `Svg` elements into a list where you can call the `Svg` functions on all elements in the list with one call. This is helpful when you'd like to perform calls with `Svg` on multiple elements.\n * An instance of this class is also returned by `Svg.querySelectorAll`.\n *\n * @memberof Svg\n * @param {Array|NodeList} nodeList An Array of SVG DOM nodes or a SVG DOM NodeList (as returned by document.querySelectorAll)\n * @constructor\n */\nexport class SvgList {\n constructor(nodeList) {\n var list = this;\n\n this.svgElements = [];\n for(var i = 0; i < nodeList.length; i++) {\n this.svgElements.push(new Svg(nodeList[i]));\n }\n\n // Add delegation methods for Svg\n Object.keys(Svg.prototype).filter(function(prototypeProperty) {\n return ['constructor',\n 'parent',\n 'querySelector',\n 'querySelectorAll',\n 'replace',\n 'append',\n 'classes',\n 'height',\n 'width'].indexOf(prototypeProperty) === -1;\n }).forEach(function(prototypeProperty) {\n list[prototypeProperty] = function() {\n var args = Array.prototype.slice.call(arguments, 0);\n list.svgElements.forEach(function(element) {\n Svg.prototype[prototypeProperty].apply(element, args);\n });\n return list;\n };\n });\n }\n}\n","export class EventEmitter {\n constructor() {\n this.handlers = [];\n }\n\n /**\n * Add an event handler for a specific event\n *\n * @memberof Chartist.Event\n * @param {String} event The event name\n * @param {Function} handler A event handler function\n */\n addEventHandler(event, handler) {\n this.handlers[event] = this.handlers[event] || [];\n this.handlers[event].push(handler);\n }\n\n /**\n * Remove an event handler of a specific event name or remove all event handlers for a specific event.\n *\n * @memberof Chartist.Event\n * @param {String} event The event name where a specific or all handlers should be removed\n * @param {Function} [handler] An optional event handler function. If specified only this specific handler will be removed and otherwise all handlers are removed.\n */\n removeEventHandler(event, handler) {\n // Only do something if there are event handlers with this name existing\n if(this.handlers[event]) {\n // If handler is set we will look for a specific handler and only remove this\n if(handler) {\n this.handlers[event].splice(this.handlers[event].indexOf(handler), 1);\n if(this.handlers[event].length === 0) {\n delete this.handlers[event];\n }\n } else {\n // If no handler is specified we remove all handlers for this event\n delete this.handlers[event];\n }\n }\n }\n\n /**\n * Use this function to emit an event. All handlers that are listening for this event will be triggered with the data parameter.\n *\n * @memberof Chartist.Event\n * @param {String} event The event name that should be triggered\n * @param {*} data Arbitrary data that will be passed to the event handler callback functions\n */\n emit(event, data) {\n // Only do something if there are event handlers with this name existing\n if(this.handlers[event]) {\n this.handlers[event].forEach(function(handler) {\n handler(data);\n });\n }\n\n // Emit event to star event handlers\n if(this.handlers['*']) {\n this.handlers['*'].forEach(function(starHandler) {\n starHandler(event, data);\n });\n }\n }\n}\n","import {querySelector, extend, optionsProvider} from '../core/core';\nimport {EventEmitter} from '../event/event-emitter';\nimport {isSupported} from '../svg/svg';\n\nexport class BaseChart {\n /**\n * Constructor of chart base class.\n *\n * @param query\n * @param data\n * @param defaultOptions\n * @param options\n * @param responsiveOptions\n * @constructor\n */\n constructor(query, data, defaultOptions, options, responsiveOptions) {\n this.container = querySelector(query);\n this.data = data || {};\n this.data.labels = this.data.labels || [];\n this.data.series = this.data.series || [];\n this.defaultOptions = defaultOptions;\n this.options = options;\n this.responsiveOptions = responsiveOptions;\n this.eventEmitter = new EventEmitter();\n this.supportsForeignObject = isSupported('Extensibility');\n this.supportsAnimations = isSupported('AnimationEventsAttribute');\n this.resizeListener = function resizeListener(){\n this.update();\n }.bind(this);\n \n if(this.container) {\n // If chartist was already initialized in this container we are detaching all event listeners first\n if(this.container.__chartist__) {\n this.container.__chartist__.detach();\n }\n \n this.container.__chartist__ = this;\n }\n \n // Using event loop for first draw to make it possible to register event listeners in the same call stack where\n // the chart was created.\n this.initializeTimeoutId = setTimeout(this.initialize.bind(this), 0);\n }\n\n createChart() {\n throw new Error('Base chart type can\\'t be instantiated!');\n }\n\n // TODO: Currently we need to re-draw the chart on window resize. This is usually very bad and will affect performance.\n // This is done because we can't work with relative coordinates when drawing the chart because SVG Path does not\n // work with relative positions yet. We need to check if we can do a viewBox hack to switch to percentage.\n // See http://mozilla.6506.n7.nabble.com/Specyfing-paths-with-percentages-unit-td247474.html\n // Update: can be done using the above method tested here: http://codepen.io/gionkunz/pen/KDvLj\n // The problem is with the label offsets that can't be converted into percentage and affecting the chart container\n /**\n * Updates the chart which currently does a full reconstruction of the SVG DOM\n *\n * @param {Object} [data] Optional data you'd like to set for the chart before it will update. If not specified the update method will use the data that is already configured with the chart.\n * @param {Object} [options] Optional options you'd like to add to the previous options for the chart before it will update. If not specified the update method will use the options that have been already configured with the chart.\n * @param {Boolean} [override] If set to true, the passed options will be used to extend the options that have been configured already. Otherwise the chart default options will be used as the base\n * @memberof Chartist.Base\n */\n update(data, options, override) {\n if(data) {\n this.data = data || {};\n this.data.labels = this.data.labels || [];\n this.data.series = this.data.series || [];\n // Event for data transformation that allows to manipulate the data before it gets rendered in the charts\n this.eventEmitter.emit('data', {\n type: 'update',\n data: this.data\n });\n }\n\n if(options) {\n this.options = extend({}, override ? this.options : this.defaultOptions, options);\n\n // If chartist was not initialized yet, we just set the options and leave the rest to the initialization\n // Otherwise we re-create the optionsProvider at this point\n if(!this.initializeTimeoutId) {\n this.optionsProvider.removeMediaQueryListeners();\n this.optionsProvider = optionsProvider(this.options, this.responsiveOptions, this.eventEmitter);\n }\n }\n\n // Only re-created the chart if it has been initialized yet\n if(!this.initializeTimeoutId) {\n this.createChart(this.optionsProvider.getCurrentOptions());\n }\n\n // Return a reference to the chart object to chain up calls\n return this;\n }\n\n /**\n * This method can be called on the API object of each chart and will un-register all event listeners that were added to other components. This currently includes a window.resize listener as well as media query listeners if any responsive options have been provided. Use this function if you need to destroy and recreate Chartist charts dynamically.\n *\n * @memberof Chartist.Base\n */\n detach() {\n // Only detach if initialization already occurred on this chart. If this chart still hasn't initialized (therefore\n // the initializationTimeoutId is still a valid timeout reference, we will clear the timeout\n if(!this.initializeTimeoutId) {\n window.removeEventListener('resize', this.resizeListener);\n this.optionsProvider.removeMediaQueryListeners();\n } else {\n window.clearTimeout(this.initializeTimeoutId);\n }\n\n return this;\n }\n\n /**\n * Use this function to register event handlers. The handler callbacks are synchronous and will run in the main thread rather than the event loop.\n *\n * @memberof Chartist.Base\n * @param {String} event Name of the event. Check the examples for supported events.\n * @param {Function} handler The handler function that will be called when an event with the given name was emitted. This function will receive a data argument which contains event data. See the example for more details.\n */\n on(event, handler) {\n this.eventEmitter.addEventHandler(event, handler);\n return this;\n }\n\n /**\n * Use this function to un-register event handlers. If the handler function parameter is omitted all handlers for the given event will be un-registered.\n *\n * @memberof Chartist.Base\n * @param {String} event Name of the event for which a handler should be removed\n * @param {Function} [handler] The handler function that that was previously used to register a new event handler. This handler will be removed from the event handler list. If this parameter is omitted then all event handlers for the given event are removed from the list.\n */\n off(event, handler) {\n this.eventEmitter.removeEventHandler(event, handler);\n return this;\n }\n\n initialize() {\n // Add window resize listener that re-creates the chart\n window.addEventListener('resize', this.resizeListener);\n\n // Obtain current options based on matching media queries (if responsive options are given)\n // This will also register a listener that is re-creating the chart based on media changes\n this.optionsProvider = optionsProvider(this.options, this.responsiveOptions, this.eventEmitter);\n // Register options change listener that will trigger a chart update\n this.eventEmitter.addEventHandler('optionsChanged', function() {\n this.update();\n }.bind(this));\n\n // Before the first chart creation we need to register us with all plugins that are configured\n // Initialize all relevant plugins with our chart object and the plugin options specified in the config\n if(this.options.plugins) {\n this.options.plugins.forEach(function(plugin) {\n if(plugin instanceof Array) {\n plugin[0](this, plugin[1]);\n } else {\n plugin(this);\n }\n }.bind(this));\n }\n\n // Event for data transformation that allows to manipulate the data before it gets rendered in the charts\n this.eventEmitter.emit('data', {\n type: 'initial',\n data: this.data\n });\n\n // Create the first chart\n this.createChart(this.optionsProvider.getCurrentOptions());\n\n // As chart is initialized from the event loop now we can reset our timeout reference\n // This is important if the chart gets initialized on the same element twice\n this.initializeTimeoutId = undefined;\n }\n}\n","export default (function (self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self;\n});","export default (function (subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n});","import {isFalseyButZero} from '../core/lang';\nimport {createGrid, createLabel} from '../core/creation';\n\nexport const axisUnits = {\n x: {\n pos: 'x',\n len: 'width',\n dir: 'horizontal',\n rectStart: 'x1',\n rectEnd: 'x2',\n rectOffset: 'y2'\n },\n y: {\n pos: 'y',\n len: 'height',\n dir: 'vertical',\n rectStart: 'y2',\n rectEnd: 'y1',\n rectOffset: 'x1'\n }\n};\n\nexport class Axis {\n initialize(units, chartRect, ticks, options) {\n this.units = units;\n this.counterUnits = units === axisUnits.x ? axisUnits.y : axisUnits.x;\n this.options = options;\n this.chartRect = chartRect;\n this.axisLength = chartRect[this.units.rectEnd] - chartRect[this.units.rectStart];\n this.gridOffset = chartRect[this.units.rectOffset];\n this.ticks = ticks;\n }\n\n projectValue(value, index, data) {\n throw new Error('Base axis can\\'t be instantiated!');\n }\n\n createGridAndLabels(gridGroup, labelGroup, useForeignObject, chartOptions, eventEmitter) {\n var axisOptions = chartOptions['axis' + this.units.pos.toUpperCase()];\n var projectedValues = this.ticks.map(this.projectValue.bind(this));\n var labelValues = this.ticks.map(axisOptions.labelInterpolationFnc);\n\n projectedValues.forEach(function(projectedValue, index) {\n var labelOffset = {\n x: 0,\n y: 0\n };\n\n // TODO: Find better solution for solving this problem\n // Calculate how much space we have available for the label\n var labelLength;\n if(projectedValues[index + 1]) {\n // If we still have one label ahead, we can calculate the distance to the next tick / label\n labelLength = projectedValues[index + 1] - projectedValue;\n } else {\n // If we don't have a label ahead and we have only two labels in total, we just take the remaining distance to\n // on the whole axis length. We limit that to a minimum of 30 pixel, so that labels close to the border will\n // still be visible inside of the chart padding.\n labelLength = Math.max(this.axisLength - projectedValue, 30);\n }\n\n // Skip grid lines and labels where interpolated label values are falsey (execpt for 0)\n if(isFalseyButZero(labelValues[index]) && labelValues[index] !== '') {\n return;\n }\n\n // Transform to global coordinates using the chartRect\n // We also need to set the label offset for the createLabel function\n if(this.units.pos === 'x') {\n projectedValue = this.chartRect.x1 + projectedValue;\n labelOffset.x = chartOptions.axisX.labelOffset.x;\n\n // If the labels should be positioned in start position (top side for vertical axis) we need to set a\n // different offset as for positioned with end (bottom)\n if(chartOptions.axisX.position === 'start') {\n labelOffset.y = this.chartRect.padding.top + chartOptions.axisX.labelOffset.y + (useForeignObject ? 5 : 20);\n } else {\n labelOffset.y = this.chartRect.y1 + chartOptions.axisX.labelOffset.y + (useForeignObject ? 5 : 20);\n }\n } else {\n projectedValue = this.chartRect.y1 - projectedValue;\n labelOffset.y = chartOptions.axisY.labelOffset.y - (useForeignObject ? labelLength : 0);\n\n // If the labels should be positioned in start position (left side for horizontal axis) we need to set a\n // different offset as for positioned with end (right side)\n if(chartOptions.axisY.position === 'start') {\n labelOffset.x = useForeignObject ? this.chartRect.padding.left + chartOptions.axisY.labelOffset.x : this.chartRect.x1 - 10;\n } else {\n labelOffset.x = this.chartRect.x2 + chartOptions.axisY.labelOffset.x + 10;\n }\n }\n\n if(axisOptions.showGrid) {\n createGrid(projectedValue, index, this, this.gridOffset, this.chartRect[this.counterUnits.len](), gridGroup, [\n chartOptions.classNames.grid,\n chartOptions.classNames[this.units.dir]\n ], eventEmitter);\n }\n\n if(axisOptions.showLabel) {\n createLabel(projectedValue, labelLength, index, labelValues, this, axisOptions.offset, labelOffset, labelGroup, [\n chartOptions.classNames.label,\n chartOptions.classNames[this.units.dir],\n (axisOptions.position === 'start' ? chartOptions.classNames[axisOptions.position] : chartOptions.classNames['end'])\n ], useForeignObject, eventEmitter);\n }\n }.bind(this));\n }\n}\n","export default (function get(object, property, receiver) {\n if (object === null) object = Function.prototype;\n var desc = Object.getOwnPropertyDescriptor(object, property);\n\n if (desc === undefined) {\n var parent = Object.getPrototypeOf(object);\n\n if (parent === null) {\n return undefined;\n } else {\n return get(parent, property, receiver);\n }\n } else if (\"value\" in desc) {\n return desc.value;\n } else {\n var getter = desc.get;\n\n if (getter === undefined) {\n return undefined;\n }\n\n return getter.call(receiver);\n }\n});","import {getBounds, getHighLow, getMultiValue} from '../core/data';\nimport {Axis} from './axis';\n\nexport class AutoScaleAxis extends Axis {\n constructor(axisUnit, data, chartRect, options) {\n super();\n // Usually we calculate highLow based on the data but this can be overriden by a highLow object in the options\n var highLow = options.highLow || getHighLow(data, options, axisUnit.pos);\n this.bounds = getBounds(chartRect[axisUnit.rectEnd] - chartRect[axisUnit.rectStart], highLow, options.scaleMinSpace || 20, options.onlyInteger);\n this.range = {\n min: this.bounds.min,\n max: this.bounds.max\n };\n\n super.initialize(axisUnit, chartRect, this.bounds.values, options);\n }\n\n projectValue(value) {\n return this.axisLength * (+getMultiValue(value, this.units.pos) - this.bounds.min) / this.bounds.range;\n }\n}\n","import {getMultiValue, getHighLow} from '../core/data';\nimport {times} from '../core/functional';\nimport {Axis} from './axis';\n\nexport class FixedScaleAxis extends Axis {\n constructor(axisUnit, data, chartRect, options) {\n super();\n\n var highLow = options.highLow || getHighLow(data, options, axisUnit.pos);\n this.divisor = options.divisor || 1;\n this.ticks = options.ticks || times(this.divisor).map(function(value, index) {\n return highLow.low + (highLow.high - highLow.low) / this.divisor * index;\n }.bind(this));\n this.ticks.sort(function(a, b) {\n return a - b;\n });\n this.range = {\n min: highLow.low,\n max: highLow.high\n };\n\n super.initialize(axisUnit, chartRect, this.ticks, options);\n\n this.stepLength = this.axisLength / this.divisor;\n }\n\n projectValue(value) {\n return this.axisLength * (+getMultiValue(value, this.units.pos) - this.range.min) / (this.range.max - this.range.min);\n }\n}\n","import {Axis} from './axis';\n\nexport class StepAxis extends Axis {\n constructor(axisUnit, data, chartRect, options) {\n super();\n super.initialize(axisUnit, chartRect, options.ticks, options);\n\n var calc = Math.max(1, options.ticks.length - (options.stretch ? 1 : 0));\n this.stepLength = this.axisLength / calc;\n }\n\n projectValue(value, index) {\n return this.stepLength * index;\n }\n}\n","import {isNumeric, alphaNumerate} from '../core/lang';\nimport {noop} from '../core/functional';\nimport {extend} from '../core/extend';\nimport {normalizeData, serialize, getMetaData, getSeriesOption} from '../core/data';\nimport {createSvg, createChartRect, createGridBackground} from '../core/creation';\nimport {StepAxis, AutoScaleAxis, axisUnits} from '../axes/axes';\nimport {BaseChart} from './base';\nimport {monotoneCubic, none} from '../interpolation/interpolation';\n\n/**\n * Default options in line charts. Expand the code view to see a detailed list of options with comments.\n *\n * @memberof Chartist.Line\n */\nconst defaultOptions = {\n // Options for X-Axis\n axisX: {\n // The offset of the labels to the chart area\n offset: 30,\n // Position where labels are placed. Can be set to `start` or `end` where `start` is equivalent to left or top on vertical axis and `end` is equivalent to right or bottom on horizontal axis.\n position: 'end',\n // Allows you to correct label positioning on this axis by positive or negative x and y offset.\n labelOffset: {\n x: 0,\n y: 0\n },\n // If labels should be shown or not\n showLabel: true,\n // If the axis grid should be drawn or not\n showGrid: true,\n // Interpolation function that allows you to intercept the value from the axis label\n labelInterpolationFnc: noop,\n // Set the axis type to be used to project values on this axis. If not defined, Chartist.StepAxis will be used for the X-Axis, where the ticks option will be set to the labels in the data and the stretch option will be set to the global fullWidth option. This type can be changed to any axis constructor available (e.g. Chartist.FixedScaleAxis), where all axis options should be present here.\n type: undefined\n },\n // Options for Y-Axis\n axisY: {\n // The offset of the labels to the chart area\n offset: 40,\n // Position where labels are placed. Can be set to `start` or `end` where `start` is equivalent to left or top on vertical axis and `end` is equivalent to right or bottom on horizontal axis.\n position: 'start',\n // Allows you to correct label positioning on this axis by positive or negative x and y offset.\n labelOffset: {\n x: 0,\n y: 0\n },\n // If labels should be shown or not\n showLabel: true,\n // If the axis grid should be drawn or not\n showGrid: true,\n // Interpolation function that allows you to intercept the value from the axis label\n labelInterpolationFnc: noop,\n // Set the axis type to be used to project values on this axis. If not defined, Chartist.AutoScaleAxis will be used for the Y-Axis, where the high and low options will be set to the global high and low options. This type can be changed to any axis constructor available (e.g. Chartist.FixedScaleAxis), where all axis options should be present here.\n type: undefined,\n // This value specifies the minimum height in pixel of the scale steps\n scaleMinSpace: 20,\n // Use only integer values (whole numbers) for the scale steps\n onlyInteger: false\n },\n // Specify a fixed width for the chart as a string (i.e. '100px' or '50%')\n width: undefined,\n // Specify a fixed height for the chart as a string (i.e. '100px' or '50%')\n height: undefined,\n // If the line should be drawn or not\n showLine: true,\n // If dots should be drawn or not\n showPoint: true,\n // If the line chart should draw an area\n showArea: false,\n // The base for the area chart that will be used to close the area shape (is normally 0)\n areaBase: 0,\n // Specify if the lines should be smoothed. This value can be true or false where true will result in smoothing using the default smoothing interpolation function Chartist.Interpolation.cardinal and false results in Chartist.Interpolation.none. You can also choose other smoothing / interpolation functions available in the Chartist.Interpolation module, or write your own interpolation function. Check the examples for a brief description.\n lineSmooth: true,\n // If the line chart should add a background fill to the .ct-grids group.\n showGridBackground: false,\n // Overriding the natural low of the chart allows you to zoom in or limit the charts lowest displayed value\n low: undefined,\n // Overriding the natural high of the chart allows you to zoom in or limit the charts highest displayed value\n high: undefined,\n // Padding of the chart drawing area to the container element and labels as a number or padding object {top: 5, right: 5, bottom: 5, left: 5}\n chartPadding: {\n top: 15,\n right: 15,\n bottom: 5,\n left: 10\n },\n // When set to true, the last grid line on the x-axis is not drawn and the chart elements will expand to the full available width of the chart. For the last label to be drawn correctly you might need to add chart padding or offset the last label with a draw event handler.\n fullWidth: false,\n // If true the whole data is reversed including labels, the series order as well as the whole series data arrays.\n reverseData: false,\n // Override the class names that get used to generate the SVG structure of the chart\n classNames: {\n chart: 'ct-chart-line',\n label: 'ct-label',\n labelGroup: 'ct-labels',\n series: 'ct-series',\n line: 'ct-line',\n point: 'ct-point',\n area: 'ct-area',\n grid: 'ct-grid',\n gridGroup: 'ct-grids',\n gridBackground: 'ct-grid-background',\n vertical: 'ct-vertical',\n horizontal: 'ct-horizontal',\n start: 'ct-start',\n end: 'ct-end'\n }\n};\n\nexport class LineChart extends BaseChart {\n /**\n * This method creates a new line chart.\n *\n * @memberof Chartist.Line\n * @param {String|Node} query A selector query string or directly a DOM element\n * @param {Object} data The data object that needs to consist of a labels and a series array\n * @param {Object} [options] The options object with options that override the default options. Check the examples for a detailed list.\n * @param {Array} [responsiveOptions] Specify an array of responsive option arrays which are a media query and options object pair => [[mediaQueryString, optionsObject],[more...]]\n * @return {Object} An object which exposes the API for the created chart\n *\n * @example\n * // Create a simple line chart\n * var data = {\n * // A labels array that can contain any sort of values\n * labels: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri'],\n * // Our series array that contains series objects or in this case series data arrays\n * series: [\n * [5, 2, 4, 2, 0]\n * ]\n * };\n *\n * // As options we currently only set a static size of 300x200 px\n * var options = {\n * width: '300px',\n * height: '200px'\n * };\n *\n * // In the global name space Chartist we call the Line function to initialize a line chart. As a first parameter we pass in a selector where we would like to get our chart created. Second parameter is the actual data object and as a third parameter we pass in our options\n * new Chartist.Line('.ct-chart', data, options);\n *\n * @example\n * // Use specific interpolation function with configuration from the Chartist.Interpolation module\n *\n * var chart = new Chartist.Line('.ct-chart', {\n * labels: [1, 2, 3, 4, 5],\n * series: [\n * [1, 1, 8, 1, 7]\n * ]\n * }, {\n * lineSmooth: Chartist.Interpolation.cardinal({\n * tension: 0.2\n * })\n * });\n *\n * @example\n * // Create a line chart with responsive options\n *\n * var data = {\n * // A labels array that can contain any sort of values\n * labels: ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'],\n * // Our series array that contains series objects or in this case series data arrays\n * series: [\n * [5, 2, 4, 2, 0]\n * ]\n * };\n *\n * // In addition to the regular options we specify responsive option overrides that will override the default configutation based on the matching media queries.\n * var responsiveOptions = [\n * ['screen and (min-width: 641px) and (max-width: 1024px)', {\n * showPoint: false,\n * axisX: {\n * labelInterpolationFnc: function(value) {\n * // Will return Mon, Tue, Wed etc. on medium screens\n * return value.slice(0, 3);\n * }\n * }\n * }],\n * ['screen and (max-width: 640px)', {\n * showLine: false,\n * axisX: {\n * labelInterpolationFnc: function(value) {\n * // Will return M, T, W etc. on small screens\n * return value[0];\n * }\n * }\n * }]\n * ];\n *\n * new Chartist.Line('.ct-chart', data, null, responsiveOptions);\n *\n */\n constructor(query, data, options, responsiveOptions) {\n super(query, data, defaultOptions, extend({}, defaultOptions, options), responsiveOptions);\n }\n\n /**\n * Creates a new chart\n *\n */\n createChart(options) {\n var data = normalizeData(this.data, options.reverseData, true);\n\n // Create new svg object\n this.svg = createSvg(this.container, options.width, options.height, options.classNames.chart);\n // Create groups for labels, grid and series\n var gridGroup = this.svg.elem('g').addClass(options.classNames.gridGroup);\n var seriesGroup = this.svg.elem('g');\n var labelGroup = this.svg.elem('g').addClass(options.classNames.labelGroup);\n\n var chartRect = createChartRect(this.svg, options, defaultOptions.padding);\n var axisX, axisY;\n\n if(options.axisX.type === undefined) {\n axisX = new StepAxis(axisUnits.x, data.normalized.series, chartRect, extend({}, options.axisX, {\n ticks: data.normalized.labels,\n stretch: options.fullWidth\n }));\n } else {\n axisX = new options.axisX.type(axisUnits.x, data.normalized.series, chartRect, options.axisX);\n }\n\n if(options.axisY.type === undefined) {\n axisY = new AutoScaleAxis(axisUnits.y, data.normalized.series, chartRect, extend({}, options.axisY, {\n high: isNumeric(options.high) ? options.high : options.axisY.high,\n low: isNumeric(options.low) ? options.low : options.axisY.low\n }));\n } else {\n axisY = new options.axisY.type(axisUnits.y, data.normalized.series, chartRect, options.axisY);\n }\n\n axisX.createGridAndLabels(gridGroup, labelGroup, this.supportsForeignObject, options, this.eventEmitter);\n axisY.createGridAndLabels(gridGroup, labelGroup, this.supportsForeignObject, options, this.eventEmitter);\n\n if (options.showGridBackground) {\n createGridBackground(gridGroup, chartRect, options.classNames.gridBackground, this.eventEmitter);\n }\n\n // Draw the series\n data.raw.series.forEach(function(series, seriesIndex) {\n var seriesElement = seriesGroup.elem('g');\n\n // Write attributes to series group element. If series name or meta is undefined the attributes will not be written\n seriesElement.attr({\n 'ct:series-name': series.name,\n 'ct:meta': serialize(series.meta)\n });\n\n // Use series class from series data or if not set generate one\n seriesElement.addClass([\n options.classNames.series,\n (series.className || options.classNames.series + '-' + alphaNumerate(seriesIndex))\n ].join(' '));\n\n var pathCoordinates = [],\n pathData = [];\n\n data.normalized.series[seriesIndex].forEach(function(value, valueIndex) {\n var p = {\n x: chartRect.x1 + axisX.projectValue(value, valueIndex, data.normalized.series[seriesIndex]),\n y: chartRect.y1 - axisY.projectValue(value, valueIndex, data.normalized.series[seriesIndex])\n };\n pathCoordinates.push(p.x, p.y);\n pathData.push({\n value: value,\n valueIndex: valueIndex,\n meta: getMetaData(series, valueIndex)\n });\n }.bind(this));\n\n var seriesOptions = {\n lineSmooth: getSeriesOption(series, options, 'lineSmooth'),\n showPoint: getSeriesOption(series, options, 'showPoint'),\n showLine: getSeriesOption(series, options, 'showLine'),\n showArea: getSeriesOption(series, options, 'showArea'),\n areaBase: getSeriesOption(series, options, 'areaBase')\n };\n\n var smoothing = typeof seriesOptions.lineSmooth === 'function' ?\n seriesOptions.lineSmooth : (seriesOptions.lineSmooth ? monotoneCubic() : none());\n // Interpolating path where pathData will be used to annotate each path element so we can trace back the original\n // index, value and meta data\n var path = smoothing(pathCoordinates, pathData);\n\n // If we should show points we need to create them now to avoid secondary loop\n // Points are drawn from the pathElements returned by the interpolation function\n // Small offset for Firefox to render squares correctly\n if (seriesOptions.showPoint) {\n\n path.pathElements.forEach(function(pathElement) {\n var point = seriesElement.elem('line', {\n x1: pathElement.x,\n y1: pathElement.y,\n x2: pathElement.x + 0.01,\n y2: pathElement.y\n }, options.classNames.point).attr({\n 'ct:value': [pathElement.data.value.x, pathElement.data.value.y].filter(isNumeric).join(','),\n 'ct:meta': serialize(pathElement.data.meta)\n });\n\n this.eventEmitter.emit('draw', {\n type: 'point',\n value: pathElement.data.value,\n index: pathElement.data.valueIndex,\n meta: pathElement.data.meta,\n series: series,\n seriesIndex: seriesIndex,\n axisX: axisX,\n axisY: axisY,\n group: seriesElement,\n element: point,\n x: pathElement.x,\n y: pathElement.y\n });\n }.bind(this));\n }\n\n if(seriesOptions.showLine) {\n var line = seriesElement.elem('path', {\n d: path.stringify()\n }, options.classNames.line, true);\n\n this.eventEmitter.emit('draw', {\n type: 'line',\n values: data.normalized.series[seriesIndex],\n path: path.clone(),\n chartRect: chartRect,\n index: seriesIndex,\n series: series,\n seriesIndex: seriesIndex,\n seriesMeta: series.meta,\n axisX: axisX,\n axisY: axisY,\n group: seriesElement,\n element: line\n });\n }\n\n // Area currently only works with axes that support a range!\n if(seriesOptions.showArea && axisY.range) {\n // If areaBase is outside the chart area (< min or > max) we need to set it respectively so that\n // the area is not drawn outside the chart area.\n var areaBase = Math.max(Math.min(seriesOptions.areaBase, axisY.range.max), axisY.range.min);\n\n // We project the areaBase value into screen coordinates\n var areaBaseProjected = chartRect.y1 - axisY.projectValue(areaBase);\n\n // In order to form the area we'll first split the path by move commands so we can chunk it up into segments\n path.splitByCommand('M').filter(function onlySolidSegments(pathSegment) {\n // We filter only \"solid\" segments that contain more than one point. Otherwise there's no need for an area\n return pathSegment.pathElements.length > 1;\n }).map(function convertToArea(solidPathSegments) {\n // Receiving the filtered solid path segments we can now convert those segments into fill areas\n var firstElement = solidPathSegments.pathElements[0];\n var lastElement = solidPathSegments.pathElements[solidPathSegments.pathElements.length - 1];\n\n // Cloning the solid path segment with closing option and removing the first move command from the clone\n // We then insert a new move that should start at the area base and draw a straight line up or down\n // at the end of the path we add an additional straight line to the projected area base value\n // As the closing option is set our path will be automatically closed\n return solidPathSegments.clone(true)\n .position(0)\n .remove(1)\n .move(firstElement.x, areaBaseProjected)\n .line(firstElement.x, firstElement.y)\n .position(solidPathSegments.pathElements.length + 1)\n .line(lastElement.x, areaBaseProjected);\n\n }).forEach(function createArea(areaPath) {\n // For each of our newly created area paths, we'll now create path elements by stringifying our path objects\n // and adding the created DOM elements to the correct series group\n var area = seriesElement.elem('path', {\n d: areaPath.stringify()\n }, options.classNames.area, true);\n\n // Emit an event for each area that was drawn\n this.eventEmitter.emit('draw', {\n type: 'area',\n values: data.normalized.series[seriesIndex],\n path: areaPath.clone(),\n series: series,\n seriesIndex: seriesIndex,\n axisX: axisX,\n axisY: axisY,\n chartRect: chartRect,\n index: seriesIndex,\n group: seriesElement,\n element: area\n });\n }.bind(this));\n }\n }.bind(this));\n\n this.eventEmitter.emit('created', {\n bounds: axisY.bounds,\n chartRect: chartRect,\n axisX: axisX,\n axisY: axisY,\n svg: this.svg,\n options: options\n });\n }\n}\n","import {isNumeric, alphaNumerate} from '../core/lang';\nimport {noop, serialMap} from '../core/functional';\nimport {extend} from '../core/extend';\nimport {normalizeData, serialize, getMetaData, getHighLow} from '../core/data';\nimport {createSvg, createChartRect, createGridBackground} from '../core/creation';\nimport {AutoScaleAxis, StepAxis, axisUnits} from '../axes/axes';\nimport {BaseChart} from './base';\n\n/**\n * Default options in bar charts. Expand the code view to see a detailed list of options with comments.\n *\n * @memberof Chartist.Bar\n */\nconst defaultOptions = {\n // Options for X-Axis\n axisX: {\n // The offset of the chart drawing area to the border of the container\n offset: 30,\n // Position where labels are placed. Can be set to `start` or `end` where `start` is equivalent to left or top on vertical axis and `end` is equivalent to right or bottom on horizontal axis.\n position: 'end',\n // Allows you to correct label positioning on this axis by positive or negative x and y offset.\n labelOffset: {\n x: 0,\n y: 0\n },\n // If labels should be shown or not\n showLabel: true,\n // If the axis grid should be drawn or not\n showGrid: true,\n // Interpolation function that allows you to intercept the value from the axis label\n labelInterpolationFnc: noop,\n // This value specifies the minimum width in pixel of the scale steps\n scaleMinSpace: 30,\n // Use only integer values (whole numbers) for the scale steps\n onlyInteger: false\n },\n // Options for Y-Axis\n axisY: {\n // The offset of the chart drawing area to the border of the container\n offset: 40,\n // Position where labels are placed. Can be set to `start` or `end` where `start` is equivalent to left or top on vertical axis and `end` is equivalent to right or bottom on horizontal axis.\n position: 'start',\n // Allows you to correct label positioning on this axis by positive or negative x and y offset.\n labelOffset: {\n x: 0,\n y: 0\n },\n // If labels should be shown or not\n showLabel: true,\n // If the axis grid should be drawn or not\n showGrid: true,\n // Interpolation function that allows you to intercept the value from the axis label\n labelInterpolationFnc: noop,\n // This value specifies the minimum height in pixel of the scale steps\n scaleMinSpace: 20,\n // Use only integer values (whole numbers) for the scale steps\n onlyInteger: false\n },\n // Specify a fixed width for the chart as a string (i.e. '100px' or '50%')\n width: undefined,\n // Specify a fixed height for the chart as a string (i.e. '100px' or '50%')\n height: undefined,\n // Overriding the natural high of the chart allows you to zoom in or limit the charts highest displayed value\n high: undefined,\n // Overriding the natural low of the chart allows you to zoom in or limit the charts lowest displayed value\n low: undefined,\n // Unless low/high are explicitly set, bar chart will be centered at zero by default. Set referenceValue to null to auto scale.\n referenceValue: 0,\n // Padding of the chart drawing area to the container element and labels as a number or padding object {top: 5, right: 5, bottom: 5, left: 5}\n chartPadding: {\n top: 15,\n right: 15,\n bottom: 5,\n left: 10\n },\n // Specify the distance in pixel of bars in a group\n seriesBarDistance: 15,\n // If set to true this property will cause the series bars to be stacked. Check the `stackMode` option for further stacking options.\n stackBars: false,\n // If set to 'overlap' this property will force the stacked bars to draw from the zero line.\n // If set to 'accumulate' this property will form a total for each series point. This will also influence the y-axis and the overall bounds of the chart. In stacked mode the seriesBarDistance property will have no effect.\n stackMode: 'accumulate',\n // Inverts the axes of the bar chart in order to draw a horizontal bar chart. Be aware that you also need to invert your axis settings as the Y Axis will now display the labels and the X Axis the values.\n horizontalBars: false,\n // If set to true then each bar will represent a series and the data array is expected to be a one dimensional array of data values rather than a series array of series. This is useful if the bar chart should represent a profile rather than some data over time.\n distributeSeries: false,\n // If true the whole data is reversed including labels, the series order as well as the whole series data arrays.\n reverseData: false,\n // If the bar chart should add a background fill to the .ct-grids group.\n showGridBackground: false,\n // Override the class names that get used to generate the SVG structure of the chart\n classNames: {\n chart: 'ct-chart-bar',\n horizontalBars: 'ct-horizontal-bars',\n label: 'ct-label',\n labelGroup: 'ct-labels',\n series: 'ct-series',\n bar: 'ct-bar',\n grid: 'ct-grid',\n gridGroup: 'ct-grids',\n gridBackground: 'ct-grid-background',\n vertical: 'ct-vertical',\n horizontal: 'ct-horizontal',\n start: 'ct-start',\n end: 'ct-end'\n }\n};\n\nexport class BarChart extends BaseChart {\n /**\n * This method creates a new bar chart and returns API object that you can use for later changes.\n *\n * @memberof Chartist.Bar\n * @param {String|Node} query A selector query string or directly a DOM element\n * @param {Object} data The data object that needs to consist of a labels and a series array\n * @param {Object} [options] The options object with options that override the default options. Check the examples for a detailed list.\n * @param {Array} [responsiveOptions] Specify an array of responsive option arrays which are a media query and options object pair => [[mediaQueryString, optionsObject],[more...]]\n * @return {Object} An object which exposes the API for the created chart\n *\n * @example\n * // Create a simple bar chart\n * var data = {\n * labels: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri'],\n * series: [\n * [5, 2, 4, 2, 0]\n * ]\n * };\n *\n * // In the global name space Chartist we call the Bar function to initialize a bar chart. As a first parameter we pass in a selector where we would like to get our chart created and as a second parameter we pass our data object.\n * new Chartist.Bar('.ct-chart', data);\n *\n * @example\n * // This example creates a bipolar grouped bar chart where the boundaries are limitted to -10 and 10\n * new Chartist.Bar('.ct-chart', {\n * labels: [1, 2, 3, 4, 5, 6, 7],\n * series: [\n * [1, 3, 2, -5, -3, 1, -6],\n * [-5, -2, -4, -1, 2, -3, 1]\n * ]\n * }, {\n * seriesBarDistance: 12,\n * low: -10,\n * high: 10\n * });\n *\n */\n constructor(query, data, options, responsiveOptions) {\n super(query, data, defaultOptions, extend({}, defaultOptions, options), responsiveOptions);\n }\n\n /**\n * Creates a new chart\n *\n */\n createChart(options) {\n var data;\n var highLow;\n\n if(options.distributeSeries) {\n data = normalizeData(this.data, options.reverseData, options.horizontalBars ? 'x' : 'y');\n data.normalized.series = data.normalized.series.map(function(value) {\n return [value];\n });\n } else {\n data = normalizeData(this.data, options.reverseData, options.horizontalBars ? 'x' : 'y');\n }\n\n // Create new svg element\n this.svg = createSvg(\n this.container,\n options.width,\n options.height,\n options.classNames.chart + (options.horizontalBars ? ' ' + options.classNames.horizontalBars : '')\n );\n\n // Drawing groups in correct order\n var gridGroup = this.svg.elem('g').addClass(options.classNames.gridGroup);\n var seriesGroup = this.svg.elem('g');\n var labelGroup = this.svg.elem('g').addClass(options.classNames.labelGroup);\n\n if(options.stackBars && data.normalized.series.length !== 0) {\n\n // If stacked bars we need to calculate the high low from stacked values from each series\n var serialSums = serialMap(data.normalized.series, function serialSums() {\n return Array.prototype.slice.call(arguments).map(function(value) {\n return value;\n }).reduce(function(prev, curr) {\n return {\n x: prev.x + (curr && curr.x) || 0,\n y: prev.y + (curr && curr.y) || 0\n };\n }, {x: 0, y: 0});\n });\n\n highLow = getHighLow([serialSums], options, options.horizontalBars ? 'x' : 'y');\n\n } else {\n\n highLow = getHighLow(data.normalized.series, options, options.horizontalBars ? 'x' : 'y');\n }\n\n // Overrides of high / low from settings\n highLow.high = +options.high || (options.high === 0 ? 0 : highLow.high);\n highLow.low = +options.low || (options.low === 0 ? 0 : highLow.low);\n\n var chartRect = createChartRect(this.svg, options, defaultOptions.padding);\n\n var valueAxis,\n labelAxisTicks,\n labelAxis,\n axisX,\n axisY;\n\n // We need to set step count based on some options combinations\n if(options.distributeSeries && options.stackBars) {\n // If distributed series are enabled and bars need to be stacked, we'll only have one bar and therefore should\n // use only the first label for the step axis\n labelAxisTicks = data.normalized.labels.slice(0, 1);\n } else {\n // If distributed series are enabled but stacked bars aren't, we should use the series labels\n // If we are drawing a regular bar chart with two dimensional series data, we just use the labels array\n // as the bars are normalized\n labelAxisTicks = data.normalized.labels;\n }\n\n // Set labelAxis and valueAxis based on the horizontalBars setting. This setting will flip the axes if necessary.\n if(options.horizontalBars) {\n if(options.axisX.type === undefined) {\n valueAxis = axisX = new AutoScaleAxis(axisUnits.x, data.normalized.series, chartRect, extend({}, options.axisX, {\n highLow: highLow,\n referenceValue: 0\n }));\n } else {\n valueAxis = axisX = new options.axisX.type(axisUnits.x, data.normalized.series, chartRect, extend({}, options.axisX, {\n highLow: highLow,\n referenceValue: 0\n }));\n }\n\n if(options.axisY.type === undefined) {\n labelAxis = axisY = new StepAxis(axisUnits.y, data.normalized.series, chartRect, {\n ticks: labelAxisTicks\n });\n } else {\n labelAxis = axisY = new options.axisY.type(axisUnits.y, data.normalized.series, chartRect, options.axisY);\n }\n } else {\n if(options.axisX.type === undefined) {\n labelAxis = axisX = new StepAxis(axisUnits.x, data.normalized.series, chartRect, {\n ticks: labelAxisTicks\n });\n } else {\n labelAxis = axisX = new options.axisX.type(axisUnits.x, data.normalized.series, chartRect, options.axisX);\n }\n\n if(options.axisY.type === undefined) {\n valueAxis = axisY = new AutoScaleAxis(axisUnits.y, data.normalized.series, chartRect, extend({}, options.axisY, {\n highLow: highLow,\n referenceValue: 0\n }));\n } else {\n valueAxis = axisY = new options.axisY.type(axisUnits.units.y, data.normalized.series, chartRect, extend({}, options.axisY, {\n highLow: highLow,\n referenceValue: 0\n }));\n }\n }\n\n // Projected 0 point\n var zeroPoint = options.horizontalBars ? (chartRect.x1 + valueAxis.projectValue(0)) : (chartRect.y1 - valueAxis.projectValue(0));\n // Used to track the screen coordinates of stacked bars\n var stackedBarValues = [];\n\n labelAxis.createGridAndLabels(gridGroup, labelGroup, this.supportsForeignObject, options, this.eventEmitter);\n valueAxis.createGridAndLabels(gridGroup, labelGroup, this.supportsForeignObject, options, this.eventEmitter);\n\n if (options.showGridBackground) {\n createGridBackground(gridGroup, chartRect, options.classNames.gridBackground, this.eventEmitter);\n }\n\n // Draw the series\n data.raw.series.forEach(function(series, seriesIndex) {\n // Calculating bi-polar value of index for seriesOffset. For i = 0..4 biPol will be -1.5, -0.5, 0.5, 1.5 etc.\n var biPol = seriesIndex - (data.raw.series.length - 1) / 2;\n // Half of the period width between vertical grid lines used to position bars\n var periodHalfLength;\n // Current series SVG element\n var seriesElement;\n\n // We need to set periodHalfLength based on some options combinations\n if(options.distributeSeries && !options.stackBars) {\n // If distributed series are enabled but stacked bars aren't, we need to use the length of the normaizedData array\n // which is the series count and divide by 2\n periodHalfLength = labelAxis.axisLength / data.normalized.series.length / 2;\n } else if(options.distributeSeries && options.stackBars) {\n // If distributed series and stacked bars are enabled we'll only get one bar so we should just divide the axis\n // length by 2\n periodHalfLength = labelAxis.axisLength / 2;\n } else {\n // On regular bar charts we should just use the series length\n periodHalfLength = labelAxis.axisLength / data.normalized.series[seriesIndex].length / 2;\n }\n\n // Adding the series group to the series element\n seriesElement = seriesGroup.elem('g');\n\n // Write attributes to series group element. If series name or meta is undefined the attributes will not be written\n seriesElement.attr({\n 'ct:series-name': series.name,\n 'ct:meta': serialize(series.meta)\n });\n\n // Use series class from series data or if not set generate one\n seriesElement.addClass([\n options.classNames.series,\n (series.className || options.classNames.series + '-' + alphaNumerate(seriesIndex))\n ].join(' '));\n\n data.normalized.series[seriesIndex].forEach(function(value, valueIndex) {\n var projected,\n bar,\n previousStack,\n labelAxisValueIndex;\n\n // We need to set labelAxisValueIndex based on some options combinations\n if(options.distributeSeries && !options.stackBars) {\n // If distributed series are enabled but stacked bars aren't, we can use the seriesIndex for later projection\n // on the step axis for label positioning\n labelAxisValueIndex = seriesIndex;\n } else if(options.distributeSeries && options.stackBars) {\n // If distributed series and stacked bars are enabled, we will only get one bar and therefore always use\n // 0 for projection on the label step axis\n labelAxisValueIndex = 0;\n } else {\n // On regular bar charts we just use the value index to project on the label step axis\n labelAxisValueIndex = valueIndex;\n }\n\n // We need to transform coordinates differently based on the chart layout\n if(options.horizontalBars) {\n projected = {\n x: chartRect.x1 + valueAxis.projectValue(value && value.x ? value.x : 0, valueIndex, data.normalized.series[seriesIndex]),\n y: chartRect.y1 - labelAxis.projectValue(value && value.y ? value.y : 0, labelAxisValueIndex, data.normalized.series[seriesIndex])\n };\n } else {\n projected = {\n x: chartRect.x1 + labelAxis.projectValue(value && value.x ? value.x : 0, labelAxisValueIndex, data.normalized.series[seriesIndex]),\n y: chartRect.y1 - valueAxis.projectValue(value && value.y ? value.y : 0, valueIndex, data.normalized.series[seriesIndex])\n }\n }\n\n // If the label axis is a step based axis we will offset the bar into the middle of between two steps using\n // the periodHalfLength value. Also we do arrange the different series so that they align up to each other using\n // the seriesBarDistance. If we don't have a step axis, the bar positions can be chosen freely so we should not\n // add any automated positioning.\n if(labelAxis instanceof StepAxis) {\n // Offset to center bar between grid lines, but only if the step axis is not stretched\n if(!labelAxis.options.stretch) {\n projected[labelAxis.units.pos] += periodHalfLength * (options.horizontalBars ? -1 : 1);\n }\n // Using bi-polar offset for multiple series if no stacked bars or series distribution is used\n projected[labelAxis.units.pos] += (options.stackBars || options.distributeSeries) ? 0 : biPol * options.seriesBarDistance * (options.horizontalBars ? -1 : 1);\n }\n\n // Enter value in stacked bar values used to remember previous screen value for stacking up bars\n previousStack = stackedBarValues[valueIndex] || zeroPoint;\n stackedBarValues[valueIndex] = previousStack - (zeroPoint - projected[labelAxis.counterUnits.pos]);\n\n // Skip if value is undefined\n if(value === undefined) {\n return;\n }\n\n var positions = {};\n positions[labelAxis.units.pos + '1'] = projected[labelAxis.units.pos];\n positions[labelAxis.units.pos + '2'] = projected[labelAxis.units.pos];\n\n if(options.stackBars && (options.stackMode === 'accumulate' || !options.stackMode)) {\n // Stack mode: accumulate (default)\n // If bars are stacked we use the stackedBarValues reference and otherwise base all bars off the zero line\n // We want backwards compatibility, so the expected fallback without the 'stackMode' option\n // to be the original behaviour (accumulate)\n positions[labelAxis.counterUnits.pos + '1'] = previousStack;\n positions[labelAxis.counterUnits.pos + '2'] = stackedBarValues[valueIndex];\n } else {\n // Draw from the zero line normally\n // This is also the same code for Stack mode: overlap\n positions[labelAxis.counterUnits.pos + '1'] = zeroPoint;\n positions[labelAxis.counterUnits.pos + '2'] = projected[labelAxis.counterUnits.pos];\n }\n\n // Limit x and y so that they are within the chart rect\n positions.x1 = Math.min(Math.max(positions.x1, chartRect.x1), chartRect.x2);\n positions.x2 = Math.min(Math.max(positions.x2, chartRect.x1), chartRect.x2);\n positions.y1 = Math.min(Math.max(positions.y1, chartRect.y2), chartRect.y1);\n positions.y2 = Math.min(Math.max(positions.y2, chartRect.y2), chartRect.y1);\n\n var metaData = getMetaData(series, valueIndex);\n\n // Create bar element\n bar = seriesElement.elem('line', positions, options.classNames.bar).attr({\n 'ct:value': [value.x, value.y].filter(isNumeric).join(','),\n 'ct:meta': serialize(metaData)\n });\n\n this.eventEmitter.emit('draw', extend({\n type: 'bar',\n value: value,\n index: valueIndex,\n meta: metaData,\n series: series,\n seriesIndex: seriesIndex,\n axisX: axisX,\n axisY: axisY,\n chartRect: chartRect,\n group: seriesElement,\n element: bar\n }, positions));\n }.bind(this));\n }.bind(this));\n\n this.eventEmitter.emit('created', {\n bounds: valueAxis.bounds,\n chartRect: chartRect,\n axisX: axisX,\n axisY: axisY,\n svg: this.svg,\n options: options\n });\n }\n}\n"]} \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 00000000..086a631f --- /dev/null +++ b/index.html @@ -0,0 +1,70 @@ + + + + + Chartist.js - Testbed + + + + + + + +
+ + + diff --git a/jspm.config.js b/jspm.config.js new file mode 100644 index 00000000..545d667c --- /dev/null +++ b/jspm.config.js @@ -0,0 +1,47 @@ +SystemJS.config({ + paths: { + "npm:": "jspm_packages/npm/", + "github:": "jspm_packages/github/", + "chartist/": "src/" + }, + browserConfig: { + "baseURL": "/" + }, + devConfig: { + "map": { + "plugin-babel": "npm:systemjs-plugin-babel@0.0.16" + } + }, + transpiler: "plugin-babel", + packages: { + "chartist": { + "main": "index.js", + "defaultExtension": "js", + "format": "esm", + "meta": { + "*.js": { + "loader": "plugin-babel" + } + } + } + } +}); + +SystemJS.config({ + packageConfigPaths: [ + "npm:@*/*.json", + "npm:*.json", + "github:*/*.json" + ], + map: { + "text": "github:systemjs/plugin-text@0.0.9" + }, + packages: {} +}); + +// Manually added +SystemJS.config({ + map: { + "version": "tooling/system-loaders/version-loader-plugin.js" + } +}); diff --git a/karma.watch.config.js b/karma.watch.config.js new file mode 100644 index 00000000..95bb102d --- /dev/null +++ b/karma.watch.config.js @@ -0,0 +1,27 @@ +module.exports = function(config) { + config.set({ + basePath: './', + frameworks: ['jasmine', 'jspm'], + autoWatch: true, + browsers: ['PhantomJS'], + reporters: ['nyan'], + files: [ + { pattern: 'src/**/*.+(js|html)', included: false }, + { pattern: 'tooling/**/*.js', included: false }, + { pattern: 'package.json', included: false }, + { pattern: 'jspm_packages/system-polyfills.js', included: false }, + 'dist/chartist.min.css' + ], + jspm: { + loadFiles: ['src/**/*.js'], + stripExtension: false, + config: 'jspm.config.js' + }, + proxies: { + '/jspm_packages/': '/base/jspm_packages/', + '/src/': '/base/src/', + '/tooling/': '/base/tooling/', + '/package.json': '/base/package.json' + } + }); +}; diff --git a/package.json b/package.json new file mode 100644 index 00000000..c2184528 --- /dev/null +++ b/package.json @@ -0,0 +1,88 @@ +{ + "name": "chartist", + "title": "Chartist.js", + "description": "Simple, responsive charts", + "version": "1.0.0", + "author": "Gion Kunz", + "homepage": "https://chartist-js.github.io", + "repository": { + "type": "git", + "url": "https://github.com/chartist-js/chartist.git" + }, + "bugs": { + "url": "https://github.com/chartist-js/chartist/issues" + }, + "keywords": [ + "chartist", + "responsive charts", + "charts", + "charting" + ], + "files": [ + "dist", + "LICENSE-WTFPL", + "LICENSE-MIT", + "package.json", + "README.md" + ], + "style": "dist/chartist.min.css", + "main": "dist/chartist.umd.js", + "browser": "dist/chartist.umd.js", + "license": "MIT OR WTFPL", + "licenses": [ + { + "type": "WTFPL", + "url": "https://github.com/chartist-js/chartist/blob/master/LICENSE-WTFPL" + }, + { + "type": "MIT", + "url": "https://github.com/chartist-js/chartist/blob/master/LICENSE-MIT" + } + ], + "dependencies": { + "autoprefixer": "^6.5.1", + "chokidar": "^1.6.1", + "cssnano": "^3.7.7", + "debounce": "^1.0.0", + "fs-promise": "^0.5.0", + "interpolate": "^0.1.0", + "node-sass": "^3.10.1", + "postcss": "^5.2.5" + }, + "devDependencies": { + "browser-sync": "^2.17.5", + "jasmine-core": "^2.5.2", + "jspm": "beta", + "karma": "^1.3.0", + "karma-jasmine": "^1.0.2", + "karma-jspm": "^2.2.0", + "karma-nyan-reporter": "^0.2.4", + "karma-phantomjs-launcher": "^1.0.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "jspm": { + "name": "chartist", + "main": "chartist", + "dependencies": { + "text": "github:systemjs/plugin-text@^0.0.9" + }, + "devDependencies": { + "plugin-babel": "npm:systemjs-plugin-babel@^0.0.16" + } + }, + "scripts": { + "start": "yarn run test-watch & yarn run server & yarn run styles-watch", + "test-watch": "./node_modules/.bin/karma start karma.watch.config.js", + "styles-watch": "./tooling/node/styles-watch.js", + "server": "./node_modules/.bin/browser-sync start --config 'bs-config.js'", + "build": "yarn run build-styles && yarn run build-umd && yarn run build-esm", + "build-umd": "./node_modules/.bin/jspm build chartist dist/chartist.umd.js --format umd --global-name Chartist --minify --source-map-contents && ./tooling/node/banner.js dist/chartist.umd.js dist/chartist.umd.js", + "build-esm": "./node_modules/.bin/jspm build chartist dist/chartist.esm.js --format esm && ./tooling/node/banner.js dist/chartist.esm.js dist/chartist.esm.js", + "build-styles": "./tooling/node/styles.js src/styles/chartist.scss dist" + }, + "config": { + "banner": "/* Chartist.js {pkg.version}\n * Copyright © {year} Gion Kunz\n * Free to use under either the WTFPL license or the MIT license.\n * https://raw.githubusercontent.com/gionkunz/chartist-js/master/LICENSE-WTFPL\n * https://raw.githubusercontent.com/gionkunz/chartist-js/master/LICENSE-MIT\n */\n" + } +} diff --git a/src/axes/auto-scale-axis.js b/src/axes/auto-scale-axis.js new file mode 100644 index 00000000..f195c723 --- /dev/null +++ b/src/axes/auto-scale-axis.js @@ -0,0 +1,21 @@ +import {getBounds, getHighLow, getMultiValue} from '../core/data'; +import {Axis} from './axis'; + +export class AutoScaleAxis extends Axis { + constructor(axisUnit, data, chartRect, options) { + super(); + // Usually we calculate highLow based on the data but this can be overriden by a highLow object in the options + var highLow = options.highLow || getHighLow(data, options, axisUnit.pos); + this.bounds = getBounds(chartRect[axisUnit.rectEnd] - chartRect[axisUnit.rectStart], highLow, options.scaleMinSpace || 20, options.onlyInteger); + this.range = { + min: this.bounds.min, + max: this.bounds.max + }; + + super.initialize(axisUnit, chartRect, this.bounds.values, options); + } + + projectValue(value) { + return this.axisLength * (+getMultiValue(value, this.units.pos) - this.bounds.min) / this.bounds.range; + } +} diff --git a/src/axes/axes.js b/src/axes/axes.js new file mode 100644 index 00000000..75d73cc3 --- /dev/null +++ b/src/axes/axes.js @@ -0,0 +1,4 @@ +export {Axis, axisUnits} from './axis'; +export {AutoScaleAxis} from './auto-scale-axis'; +export {FixedScaleAxis} from './fixed-scale-axis'; +export {StepAxis} from './step-axis'; diff --git a/src/axes/axis.js b/src/axes/axis.js new file mode 100644 index 00000000..09caa859 --- /dev/null +++ b/src/axes/axis.js @@ -0,0 +1,109 @@ +import {isFalseyButZero} from '../core/lang'; +import {createGrid, createLabel} from '../core/creation'; + +export const axisUnits = { + x: { + pos: 'x', + len: 'width', + dir: 'horizontal', + rectStart: 'x1', + rectEnd: 'x2', + rectOffset: 'y2' + }, + y: { + pos: 'y', + len: 'height', + dir: 'vertical', + rectStart: 'y2', + rectEnd: 'y1', + rectOffset: 'x1' + } +}; + +export class Axis { + initialize(units, chartRect, ticks, options) { + this.units = units; + this.counterUnits = units === axisUnits.x ? axisUnits.y : axisUnits.x; + this.options = options; + this.chartRect = chartRect; + this.axisLength = chartRect[this.units.rectEnd] - chartRect[this.units.rectStart]; + this.gridOffset = chartRect[this.units.rectOffset]; + this.ticks = ticks; + } + + projectValue(value, index, data) { + throw new Error('Base axis can\'t be instantiated!'); + } + + createGridAndLabels(gridGroup, labelGroup, useForeignObject, chartOptions, eventEmitter) { + var axisOptions = chartOptions['axis' + this.units.pos.toUpperCase()]; + var projectedValues = this.ticks.map(this.projectValue.bind(this)); + var labelValues = this.ticks.map(axisOptions.labelInterpolationFnc); + + projectedValues.forEach(function(projectedValue, index) { + var labelOffset = { + x: 0, + y: 0 + }; + + // TODO: Find better solution for solving this problem + // Calculate how much space we have available for the label + var labelLength; + if(projectedValues[index + 1]) { + // If we still have one label ahead, we can calculate the distance to the next tick / label + labelLength = projectedValues[index + 1] - projectedValue; + } else { + // If we don't have a label ahead and we have only two labels in total, we just take the remaining distance to + // on the whole axis length. We limit that to a minimum of 30 pixel, so that labels close to the border will + // still be visible inside of the chart padding. + labelLength = Math.max(this.axisLength - projectedValue, 30); + } + + // Skip grid lines and labels where interpolated label values are falsey (execpt for 0) + if(isFalseyButZero(labelValues[index]) && labelValues[index] !== '') { + return; + } + + // Transform to global coordinates using the chartRect + // We also need to set the label offset for the createLabel function + if(this.units.pos === 'x') { + projectedValue = this.chartRect.x1 + projectedValue; + labelOffset.x = chartOptions.axisX.labelOffset.x; + + // If the labels should be positioned in start position (top side for vertical axis) we need to set a + // different offset as for positioned with end (bottom) + if(chartOptions.axisX.position === 'start') { + labelOffset.y = this.chartRect.padding.top + chartOptions.axisX.labelOffset.y + (useForeignObject ? 5 : 20); + } else { + labelOffset.y = this.chartRect.y1 + chartOptions.axisX.labelOffset.y + (useForeignObject ? 5 : 20); + } + } else { + projectedValue = this.chartRect.y1 - projectedValue; + labelOffset.y = chartOptions.axisY.labelOffset.y - (useForeignObject ? labelLength : 0); + + // If the labels should be positioned in start position (left side for horizontal axis) we need to set a + // different offset as for positioned with end (right side) + if(chartOptions.axisY.position === 'start') { + labelOffset.x = useForeignObject ? this.chartRect.padding.left + chartOptions.axisY.labelOffset.x : this.chartRect.x1 - 10; + } else { + labelOffset.x = this.chartRect.x2 + chartOptions.axisY.labelOffset.x + 10; + } + } + + if(axisOptions.showGrid) { + createGrid(projectedValue, index, this, this.gridOffset, this.chartRect[this.counterUnits.len](), gridGroup, [ + chartOptions.classNames.grid, + chartOptions.classNames[this.units.dir] + ], eventEmitter); + } + + if(axisOptions.showLabel) { + createLabel(projectedValue, labelLength, index, labelValues, this, axisOptions.offset, labelOffset, labelGroup, [ + chartOptions.classNames.label, + chartOptions.classNames[this.units.dir], + (axisOptions.position === 'start' ? chartOptions.classNames[axisOptions.position] : chartOptions.classNames['end']) + ], useForeignObject, eventEmitter); + } + }.bind(this)); + } +} diff --git a/src/axes/axis.spec.js b/src/axes/axis.spec.js new file mode 100644 index 00000000..be55efcc --- /dev/null +++ b/src/axes/axis.spec.js @@ -0,0 +1,103 @@ +import {Svg} from '../svg/svg'; +import {EventEmitter} from '../event/event-emitter'; +import {Axis, axisUnits} from './axis'; + +describe('Axis', function() { + var ticks, chartRect, chartOptions, eventEmitter, gridGroup, labelGroup; + + beforeEach(function() { + eventEmitter = new EventEmitter(); + gridGroup = new Svg('g'); + labelGroup = new Svg('g'); + ticks = [1, 2]; + chartRect = { + padding: { + bottom: 5, + left: 10, + right: 15, + top: 15 + }, + y2: 15, + y1: 250, + x1: 50, + x2: 450, + width: function() { + return this.x2 - this.x1; + }, + height: function() { + return this.y1 - this.y2; + } + }; + + chartOptions = { + axisX: { + offset: 30, + position: 'end', + labelOffset: { + x: 0, + y: 0 + }, + showLabel: true, + showGrid: true + }, + classNames: { + label: 'ct-label', + labelGroup: 'ct-labels', + grid: 'ct-grid', + gridGroup: 'ct-grids', + vertical: 'ct-vertical', + horizontal: 'ct-horizontal', + start: 'ct-start', + end: 'ct-end' + } + }; + }); + + it('should skip all grid lines and labels for interpolated value of null', function() { + chartOptions.axisX.labelInterpolationFnc = function(value, index) { + return index === 0 ? null : value; + }; + + var axis = new Axis(); + axis.initialize(axisUnits.x, chartRect, ticks, null); + axis.projectValue = function(value) { + return value; + }; + + axis.createGridAndLabels(gridGroup, labelGroup, true, chartOptions, eventEmitter); + expect(gridGroup.querySelectorAll('.ct-grid').svgElements.length).toBe(1); + expect(labelGroup.querySelectorAll('.ct-label').svgElements.length).toBe(1); + }); + + it('should skip all grid lines and labels for interpolated value of undefined', function() { + chartOptions.axisX.labelInterpolationFnc = function(value, index) { + return index === 0 ? undefined : value; + }; + + var axis = new Axis(); + axis.initialize(axisUnits.x, chartRect, ticks, null); + axis.projectValue = function(value) { + return value; + }; + + axis.createGridAndLabels(gridGroup, labelGroup, true, chartOptions, eventEmitter); + expect(gridGroup.querySelectorAll('.ct-grid').svgElements.length).toBe(1); + expect(labelGroup.querySelectorAll('.ct-label').svgElements.length).toBe(1); + }); + + it('should include all grid lines and labels for interpolated value of empty strings', function() { + chartOptions.axisX.labelInterpolationFnc = function(value, index) { + return index === 0 ? '' : value; + }; + + var axis = new Axis(); + axis.initialize(axisUnits.x, chartRect, ticks, null); + axis.projectValue = function(value) { + return value; + }; + + axis.createGridAndLabels(gridGroup, labelGroup, true, chartOptions, eventEmitter); + expect(gridGroup.querySelectorAll('.ct-grid').svgElements.length).toBe(2); + expect(labelGroup.querySelectorAll('.ct-label').svgElements.length).toBe(2); + }); +}); diff --git a/src/axes/fixed-scale-axis.js b/src/axes/fixed-scale-axis.js new file mode 100644 index 00000000..117c94fb --- /dev/null +++ b/src/axes/fixed-scale-axis.js @@ -0,0 +1,30 @@ +import {getMultiValue, getHighLow} from '../core/data'; +import {times} from '../core/functional'; +import {Axis} from './axis'; + +export class FixedScaleAxis extends Axis { + constructor(axisUnit, data, chartRect, options) { + super(); + + var highLow = options.highLow || getHighLow(data, options, axisUnit.pos); + this.divisor = options.divisor || 1; + this.ticks = options.ticks || times(this.divisor).map(function(value, index) { + return highLow.low + (highLow.high - highLow.low) / this.divisor * index; + }.bind(this)); + this.ticks.sort(function(a, b) { + return a - b; + }); + this.range = { + min: highLow.low, + max: highLow.high + }; + + super.initialize(axisUnit, chartRect, this.ticks, options); + + this.stepLength = this.axisLength / this.divisor; + } + + projectValue(value) { + return this.axisLength * (+getMultiValue(value, this.units.pos) - this.range.min) / (this.range.max - this.range.min); + } +} diff --git a/src/axes/fixed-scale-axis.spec.js b/src/axes/fixed-scale-axis.spec.js new file mode 100644 index 00000000..027cf42d --- /dev/null +++ b/src/axes/fixed-scale-axis.spec.js @@ -0,0 +1,35 @@ +import {FixedScaleAxis} from './fixed-scale-axis'; + +describe('FixedScaleAxis', function () { + it('should order the tick array', function () { + var ticks = [10, 5, 0, -5, -10]; + var axisUnit = { + pos: 'y', + len: 'height', + dir: 'vertical', + rectStart: 'y2', + rectEnd: 'y1', + rectOffset: 'x1' + }; + var data = [[{x: 1, y: 10}, {x: 2, y: 5}, {x: 3, y: -5}]]; + var chartRect = { + 'padding': {'top': 15, 'right': 15, 'bottom': 5, 'left': 10}, + 'y2': 15, + 'y1': 141, + 'x1': 50, + 'x2': 269 + }; + var options = { + 'offset': 40, + 'position': 'start', + 'labelOffset': {'x': 0, 'y': 0}, + 'showLabel': true, + 'showGrid': true, + 'scaleMinSpace': 20, + 'onlyInteger': false, + 'ticks': ticks + }; + var fsaxis = new FixedScaleAxis(axisUnit, data, chartRect, options); + expect(fsaxis.ticks).toEqual([-10, -5, 0, 5, 10]); + }); +}); diff --git a/src/axes/step-axis.js b/src/axes/step-axis.js new file mode 100644 index 00000000..dbbd984a --- /dev/null +++ b/src/axes/step-axis.js @@ -0,0 +1,15 @@ +import {Axis} from './axis'; + +export class StepAxis extends Axis { + constructor(axisUnit, data, chartRect, options) { + super(); + super.initialize(axisUnit, chartRect, options.ticks, options); + + var calc = Math.max(1, options.ticks.length - (options.stretch ? 1 : 0)); + this.stepLength = this.axisLength / calc; + } + + projectValue(value, index) { + return this.stepLength * index; + } +} diff --git a/src/axes/step-axis.spec.js b/src/axes/step-axis.spec.js new file mode 100644 index 00000000..bf09501b --- /dev/null +++ b/src/axes/step-axis.spec.js @@ -0,0 +1,27 @@ +import {StepAxis} from './step-axis'; + +describe('StepAxis', function() { + it('should return 0 if options.ticks.length == 1', function() { + var ticks = [1], + axisUnit = { + 'pos':'y', + 'len':'height', + 'dir':'vertical', + 'rectStart':'y2', + 'rectEnd':'y1', + 'rectOffset':'x1' + }, + data = [[1]], + chartRect = { + 'y2':0, + 'y1':15, + 'x1':50, + 'x2':100 + }, + options = { + 'ticks': ticks + }, + stepAxis = new StepAxis(axisUnit, data, chartRect, options); + expect(stepAxis.stepLength).toEqual(15); + }); +}); diff --git a/src/charts/bar.js b/src/charts/bar.js new file mode 100644 index 00000000..1a88605c --- /dev/null +++ b/src/charts/bar.js @@ -0,0 +1,431 @@ +import {isNumeric, alphaNumerate} from '../core/lang'; +import {noop, serialMap} from '../core/functional'; +import {extend} from '../core/extend'; +import {normalizeData, serialize, getMetaData, getHighLow} from '../core/data'; +import {createSvg, createChartRect, createGridBackground} from '../core/creation'; +import {AutoScaleAxis, StepAxis, axisUnits} from '../axes/axes'; +import {BaseChart} from './base'; + +/** + * Default options in bar charts. Expand the code view to see a detailed list of options with comments. + * + * @memberof Chartist.Bar + */ +const defaultOptions = { + // Options for X-Axis + axisX: { + // The offset of the chart drawing area to the border of the container + offset: 30, + // Position where labels are placed. Can be set to `start` or `end` where `start` is equivalent to left or top on vertical axis and `end` is equivalent to right or bottom on horizontal axis. + position: 'end', + // Allows you to correct label positioning on this axis by positive or negative x and y offset. + labelOffset: { + x: 0, + y: 0 + }, + // If labels should be shown or not + showLabel: true, + // If the axis grid should be drawn or not + showGrid: true, + // Interpolation function that allows you to intercept the value from the axis label + labelInterpolationFnc: noop, + // This value specifies the minimum width in pixel of the scale steps + scaleMinSpace: 30, + // Use only integer values (whole numbers) for the scale steps + onlyInteger: false + }, + // Options for Y-Axis + axisY: { + // The offset of the chart drawing area to the border of the container + offset: 40, + // Position where labels are placed. Can be set to `start` or `end` where `start` is equivalent to left or top on vertical axis and `end` is equivalent to right or bottom on horizontal axis. + position: 'start', + // Allows you to correct label positioning on this axis by positive or negative x and y offset. + labelOffset: { + x: 0, + y: 0 + }, + // If labels should be shown or not + showLabel: true, + // If the axis grid should be drawn or not + showGrid: true, + // Interpolation function that allows you to intercept the value from the axis label + labelInterpolationFnc: noop, + // This value specifies the minimum height in pixel of the scale steps + scaleMinSpace: 20, + // Use only integer values (whole numbers) for the scale steps + onlyInteger: false + }, + // Specify a fixed width for the chart as a string (i.e. '100px' or '50%') + width: undefined, + // Specify a fixed height for the chart as a string (i.e. '100px' or '50%') + height: undefined, + // Overriding the natural high of the chart allows you to zoom in or limit the charts highest displayed value + high: undefined, + // Overriding the natural low of the chart allows you to zoom in or limit the charts lowest displayed value + low: undefined, + // Unless low/high are explicitly set, bar chart will be centered at zero by default. Set referenceValue to null to auto scale. + referenceValue: 0, + // Padding of the chart drawing area to the container element and labels as a number or padding object {top: 5, right: 5, bottom: 5, left: 5} + chartPadding: { + top: 15, + right: 15, + bottom: 5, + left: 10 + }, + // Specify the distance in pixel of bars in a group + seriesBarDistance: 15, + // If set to true this property will cause the series bars to be stacked. Check the `stackMode` option for further stacking options. + stackBars: false, + // If set to 'overlap' this property will force the stacked bars to draw from the zero line. + // If set to 'accumulate' this property will form a total for each series point. This will also influence the y-axis and the overall bounds of the chart. In stacked mode the seriesBarDistance property will have no effect. + stackMode: 'accumulate', + // Inverts the axes of the bar chart in order to draw a horizontal bar chart. Be aware that you also need to invert your axis settings as the Y Axis will now display the labels and the X Axis the values. + horizontalBars: false, + // If set to true then each bar will represent a series and the data array is expected to be a one dimensional array of data values rather than a series array of series. This is useful if the bar chart should represent a profile rather than some data over time. + distributeSeries: false, + // If true the whole data is reversed including labels, the series order as well as the whole series data arrays. + reverseData: false, + // If the bar chart should add a background fill to the .ct-grids group. + showGridBackground: false, + // Override the class names that get used to generate the SVG structure of the chart + classNames: { + chart: 'ct-chart-bar', + horizontalBars: 'ct-horizontal-bars', + label: 'ct-label', + labelGroup: 'ct-labels', + series: 'ct-series', + bar: 'ct-bar', + grid: 'ct-grid', + gridGroup: 'ct-grids', + gridBackground: 'ct-grid-background', + vertical: 'ct-vertical', + horizontal: 'ct-horizontal', + start: 'ct-start', + end: 'ct-end' + } +}; + +export class BarChart extends BaseChart { + /** + * This method creates a new bar chart and returns API object that you can use for later changes. + * + * @memberof Chartist.Bar + * @param {String|Node} query A selector query string or directly a DOM element + * @param {Object} data The data object that needs to consist of a labels and a series array + * @param {Object} [options] The options object with options that override the default options. Check the examples for a detailed list. + * @param {Array} [responsiveOptions] Specify an array of responsive option arrays which are a media query and options object pair => [[mediaQueryString, optionsObject],[more...]] + * @return {Object} An object which exposes the API for the created chart + * + * @example + * // Create a simple bar chart + * var data = { + * labels: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri'], + * series: [ + * [5, 2, 4, 2, 0] + * ] + * }; + * + * // In the global name space Chartist we call the Bar function to initialize a bar chart. As a first parameter we pass in a selector where we would like to get our chart created and as a second parameter we pass our data object. + * new Chartist.Bar('.ct-chart', data); + * + * @example + * // This example creates a bipolar grouped bar chart where the boundaries are limitted to -10 and 10 + * new Chartist.Bar('.ct-chart', { + * labels: [1, 2, 3, 4, 5, 6, 7], + * series: [ + * [1, 3, 2, -5, -3, 1, -6], + * [-5, -2, -4, -1, 2, -3, 1] + * ] + * }, { + * seriesBarDistance: 12, + * low: -10, + * high: 10 + * }); + * + */ + constructor(query, data, options, responsiveOptions) { + super(query, data, defaultOptions, extend({}, defaultOptions, options), responsiveOptions); + } + + /** + * Creates a new chart + * + */ + createChart(options) { + var data; + var highLow; + + if(options.distributeSeries) { + data = normalizeData(this.data, options.reverseData, options.horizontalBars ? 'x' : 'y'); + data.normalized.series = data.normalized.series.map(function(value) { + return [value]; + }); + } else { + data = normalizeData(this.data, options.reverseData, options.horizontalBars ? 'x' : 'y'); + } + + // Create new svg element + this.svg = createSvg( + this.container, + options.width, + options.height, + options.classNames.chart + (options.horizontalBars ? ' ' + options.classNames.horizontalBars : '') + ); + + // Drawing groups in correct order + var gridGroup = this.svg.elem('g').addClass(options.classNames.gridGroup); + var seriesGroup = this.svg.elem('g'); + var labelGroup = this.svg.elem('g').addClass(options.classNames.labelGroup); + + if(options.stackBars && data.normalized.series.length !== 0) { + + // If stacked bars we need to calculate the high low from stacked values from each series + var serialSums = serialMap(data.normalized.series, function serialSums() { + return Array.prototype.slice.call(arguments).map(function(value) { + return value; + }).reduce(function(prev, curr) { + return { + x: prev.x + (curr && curr.x) || 0, + y: prev.y + (curr && curr.y) || 0 + }; + }, {x: 0, y: 0}); + }); + + highLow = getHighLow([serialSums], options, options.horizontalBars ? 'x' : 'y'); + + } else { + + highLow = getHighLow(data.normalized.series, options, options.horizontalBars ? 'x' : 'y'); + } + + // Overrides of high / low from settings + highLow.high = +options.high || (options.high === 0 ? 0 : highLow.high); + highLow.low = +options.low || (options.low === 0 ? 0 : highLow.low); + + var chartRect = createChartRect(this.svg, options, defaultOptions.padding); + + var valueAxis, + labelAxisTicks, + labelAxis, + axisX, + axisY; + + // We need to set step count based on some options combinations + if(options.distributeSeries && options.stackBars) { + // If distributed series are enabled and bars need to be stacked, we'll only have one bar and therefore should + // use only the first label for the step axis + labelAxisTicks = data.normalized.labels.slice(0, 1); + } else { + // If distributed series are enabled but stacked bars aren't, we should use the series labels + // If we are drawing a regular bar chart with two dimensional series data, we just use the labels array + // as the bars are normalized + labelAxisTicks = data.normalized.labels; + } + + // Set labelAxis and valueAxis based on the horizontalBars setting. This setting will flip the axes if necessary. + if(options.horizontalBars) { + if(options.axisX.type === undefined) { + valueAxis = axisX = new AutoScaleAxis(axisUnits.x, data.normalized.series, chartRect, extend({}, options.axisX, { + highLow: highLow, + referenceValue: 0 + })); + } else { + valueAxis = axisX = new options.axisX.type(axisUnits.x, data.normalized.series, chartRect, extend({}, options.axisX, { + highLow: highLow, + referenceValue: 0 + })); + } + + if(options.axisY.type === undefined) { + labelAxis = axisY = new StepAxis(axisUnits.y, data.normalized.series, chartRect, { + ticks: labelAxisTicks + }); + } else { + labelAxis = axisY = new options.axisY.type(axisUnits.y, data.normalized.series, chartRect, options.axisY); + } + } else { + if(options.axisX.type === undefined) { + labelAxis = axisX = new StepAxis(axisUnits.x, data.normalized.series, chartRect, { + ticks: labelAxisTicks + }); + } else { + labelAxis = axisX = new options.axisX.type(axisUnits.x, data.normalized.series, chartRect, options.axisX); + } + + if(options.axisY.type === undefined) { + valueAxis = axisY = new AutoScaleAxis(axisUnits.y, data.normalized.series, chartRect, extend({}, options.axisY, { + highLow: highLow, + referenceValue: 0 + })); + } else { + valueAxis = axisY = new options.axisY.type(axisUnits.units.y, data.normalized.series, chartRect, extend({}, options.axisY, { + highLow: highLow, + referenceValue: 0 + })); + } + } + + // Projected 0 point + var zeroPoint = options.horizontalBars ? (chartRect.x1 + valueAxis.projectValue(0)) : (chartRect.y1 - valueAxis.projectValue(0)); + // Used to track the screen coordinates of stacked bars + var stackedBarValues = []; + + labelAxis.createGridAndLabels(gridGroup, labelGroup, this.supportsForeignObject, options, this.eventEmitter); + valueAxis.createGridAndLabels(gridGroup, labelGroup, this.supportsForeignObject, options, this.eventEmitter); + + if (options.showGridBackground) { + createGridBackground(gridGroup, chartRect, options.classNames.gridBackground, this.eventEmitter); + } + + // Draw the series + data.raw.series.forEach(function(series, seriesIndex) { + // Calculating bi-polar value of index for seriesOffset. For i = 0..4 biPol will be -1.5, -0.5, 0.5, 1.5 etc. + var biPol = seriesIndex - (data.raw.series.length - 1) / 2; + // Half of the period width between vertical grid lines used to position bars + var periodHalfLength; + // Current series SVG element + var seriesElement; + + // We need to set periodHalfLength based on some options combinations + if(options.distributeSeries && !options.stackBars) { + // If distributed series are enabled but stacked bars aren't, we need to use the length of the normaizedData array + // which is the series count and divide by 2 + periodHalfLength = labelAxis.axisLength / data.normalized.series.length / 2; + } else if(options.distributeSeries && options.stackBars) { + // If distributed series and stacked bars are enabled we'll only get one bar so we should just divide the axis + // length by 2 + periodHalfLength = labelAxis.axisLength / 2; + } else { + // On regular bar charts we should just use the series length + periodHalfLength = labelAxis.axisLength / data.normalized.series[seriesIndex].length / 2; + } + + // Adding the series group to the series element + seriesElement = seriesGroup.elem('g'); + + // Write attributes to series group element. If series name or meta is undefined the attributes will not be written + seriesElement.attr({ + 'ct:series-name': series.name, + 'ct:meta': serialize(series.meta) + }); + + // Use series class from series data or if not set generate one + seriesElement.addClass([ + options.classNames.series, + (series.className || options.classNames.series + '-' + alphaNumerate(seriesIndex)) + ].join(' ')); + + data.normalized.series[seriesIndex].forEach(function(value, valueIndex) { + var projected, + bar, + previousStack, + labelAxisValueIndex; + + // We need to set labelAxisValueIndex based on some options combinations + if(options.distributeSeries && !options.stackBars) { + // If distributed series are enabled but stacked bars aren't, we can use the seriesIndex for later projection + // on the step axis for label positioning + labelAxisValueIndex = seriesIndex; + } else if(options.distributeSeries && options.stackBars) { + // If distributed series and stacked bars are enabled, we will only get one bar and therefore always use + // 0 for projection on the label step axis + labelAxisValueIndex = 0; + } else { + // On regular bar charts we just use the value index to project on the label step axis + labelAxisValueIndex = valueIndex; + } + + // We need to transform coordinates differently based on the chart layout + if(options.horizontalBars) { + projected = { + x: chartRect.x1 + valueAxis.projectValue(value && value.x ? value.x : 0, valueIndex, data.normalized.series[seriesIndex]), + y: chartRect.y1 - labelAxis.projectValue(value && value.y ? value.y : 0, labelAxisValueIndex, data.normalized.series[seriesIndex]) + }; + } else { + projected = { + x: chartRect.x1 + labelAxis.projectValue(value && value.x ? value.x : 0, labelAxisValueIndex, data.normalized.series[seriesIndex]), + y: chartRect.y1 - valueAxis.projectValue(value && value.y ? value.y : 0, valueIndex, data.normalized.series[seriesIndex]) + } + } + + // If the label axis is a step based axis we will offset the bar into the middle of between two steps using + // the periodHalfLength value. Also we do arrange the different series so that they align up to each other using + // the seriesBarDistance. If we don't have a step axis, the bar positions can be chosen freely so we should not + // add any automated positioning. + if(labelAxis instanceof StepAxis) { + // Offset to center bar between grid lines, but only if the step axis is not stretched + if(!labelAxis.options.stretch) { + projected[labelAxis.units.pos] += periodHalfLength * (options.horizontalBars ? -1 : 1); + } + // Using bi-polar offset for multiple series if no stacked bars or series distribution is used + projected[labelAxis.units.pos] += (options.stackBars || options.distributeSeries) ? 0 : biPol * options.seriesBarDistance * (options.horizontalBars ? -1 : 1); + } + + // Enter value in stacked bar values used to remember previous screen value for stacking up bars + previousStack = stackedBarValues[valueIndex] || zeroPoint; + stackedBarValues[valueIndex] = previousStack - (zeroPoint - projected[labelAxis.counterUnits.pos]); + + // Skip if value is undefined + if(value === undefined) { + return; + } + + var positions = {}; + positions[labelAxis.units.pos + '1'] = projected[labelAxis.units.pos]; + positions[labelAxis.units.pos + '2'] = projected[labelAxis.units.pos]; + + if(options.stackBars && (options.stackMode === 'accumulate' || !options.stackMode)) { + // Stack mode: accumulate (default) + // If bars are stacked we use the stackedBarValues reference and otherwise base all bars off the zero line + // We want backwards compatibility, so the expected fallback without the 'stackMode' option + // to be the original behaviour (accumulate) + positions[labelAxis.counterUnits.pos + '1'] = previousStack; + positions[labelAxis.counterUnits.pos + '2'] = stackedBarValues[valueIndex]; + } else { + // Draw from the zero line normally + // This is also the same code for Stack mode: overlap + positions[labelAxis.counterUnits.pos + '1'] = zeroPoint; + positions[labelAxis.counterUnits.pos + '2'] = projected[labelAxis.counterUnits.pos]; + } + + // Limit x and y so that they are within the chart rect + positions.x1 = Math.min(Math.max(positions.x1, chartRect.x1), chartRect.x2); + positions.x2 = Math.min(Math.max(positions.x2, chartRect.x1), chartRect.x2); + positions.y1 = Math.min(Math.max(positions.y1, chartRect.y2), chartRect.y1); + positions.y2 = Math.min(Math.max(positions.y2, chartRect.y2), chartRect.y1); + + var metaData = getMetaData(series, valueIndex); + + // Create bar element + bar = seriesElement.elem('line', positions, options.classNames.bar).attr({ + 'ct:value': [value.x, value.y].filter(isNumeric).join(','), + 'ct:meta': serialize(metaData) + }); + + this.eventEmitter.emit('draw', extend({ + type: 'bar', + value: value, + index: valueIndex, + meta: metaData, + series: series, + seriesIndex: seriesIndex, + axisX: axisX, + axisY: axisY, + chartRect: chartRect, + group: seriesElement, + element: bar + }, positions)); + }.bind(this)); + }.bind(this)); + + this.eventEmitter.emit('created', { + bounds: valueAxis.bounds, + chartRect: chartRect, + axisX: axisX, + axisY: axisY, + svg: this.svg, + options: options + }); + } +} diff --git a/src/charts/base.js b/src/charts/base.js new file mode 100644 index 00000000..4b2a8e0e --- /dev/null +++ b/src/charts/base.js @@ -0,0 +1,174 @@ +import {querySelector, extend, optionsProvider} from '../core/core'; +import {EventEmitter} from '../event/event-emitter'; +import {isSupported} from '../svg/svg'; + +export class BaseChart { + /** + * Constructor of chart base class. + * + * @param query + * @param data + * @param defaultOptions + * @param options + * @param responsiveOptions + * @constructor + */ + constructor(query, data, defaultOptions, options, responsiveOptions) { + this.container = querySelector(query); + this.data = data || {}; + this.data.labels = this.data.labels || []; + this.data.series = this.data.series || []; + this.defaultOptions = defaultOptions; + this.options = options; + this.responsiveOptions = responsiveOptions; + this.eventEmitter = new EventEmitter(); + this.supportsForeignObject = isSupported('Extensibility'); + this.supportsAnimations = isSupported('AnimationEventsAttribute'); + this.resizeListener = function resizeListener(){ + this.update(); + }.bind(this); + + if(this.container) { + // If chartist was already initialized in this container we are detaching all event listeners first + if(this.container.__chartist__) { + this.container.__chartist__.detach(); + } + + this.container.__chartist__ = this; + } + + // Using event loop for first draw to make it possible to register event listeners in the same call stack where + // the chart was created. + this.initializeTimeoutId = setTimeout(this.initialize.bind(this), 0); + } + + createChart() { + throw new Error('Base chart type can\'t be instantiated!'); + } + + // TODO: Currently we need to re-draw the chart on window resize. This is usually very bad and will affect performance. + // This is done because we can't work with relative coordinates when drawing the chart because SVG Path does not + // work with relative positions yet. We need to check if we can do a viewBox hack to switch to percentage. + // See http://mozilla.6506.n7.nabble.com/Specyfing-paths-with-percentages-unit-td247474.html + // Update: can be done using the above method tested here: http://codepen.io/gionkunz/pen/KDvLj + // The problem is with the label offsets that can't be converted into percentage and affecting the chart container + /** + * Updates the chart which currently does a full reconstruction of the SVG DOM + * + * @param {Object} [data] Optional data you'd like to set for the chart before it will update. If not specified the update method will use the data that is already configured with the chart. + * @param {Object} [options] Optional options you'd like to add to the previous options for the chart before it will update. If not specified the update method will use the options that have been already configured with the chart. + * @param {Boolean} [override] If set to true, the passed options will be used to extend the options that have been configured already. Otherwise the chart default options will be used as the base + * @memberof Chartist.Base + */ + update(data, options, override) { + if(data) { + this.data = data || {}; + this.data.labels = this.data.labels || []; + this.data.series = this.data.series || []; + // Event for data transformation that allows to manipulate the data before it gets rendered in the charts + this.eventEmitter.emit('data', { + type: 'update', + data: this.data + }); + } + + if(options) { + this.options = extend({}, override ? this.options : this.defaultOptions, options); + + // If chartist was not initialized yet, we just set the options and leave the rest to the initialization + // Otherwise we re-create the optionsProvider at this point + if(!this.initializeTimeoutId) { + this.optionsProvider.removeMediaQueryListeners(); + this.optionsProvider = optionsProvider(this.options, this.responsiveOptions, this.eventEmitter); + } + } + + // Only re-created the chart if it has been initialized yet + if(!this.initializeTimeoutId) { + this.createChart(this.optionsProvider.getCurrentOptions()); + } + + // Return a reference to the chart object to chain up calls + return this; + } + + /** + * This method can be called on the API object of each chart and will un-register all event listeners that were added to other components. This currently includes a window.resize listener as well as media query listeners if any responsive options have been provided. Use this function if you need to destroy and recreate Chartist charts dynamically. + * + * @memberof Chartist.Base + */ + detach() { + // Only detach if initialization already occurred on this chart. If this chart still hasn't initialized (therefore + // the initializationTimeoutId is still a valid timeout reference, we will clear the timeout + if(!this.initializeTimeoutId) { + window.removeEventListener('resize', this.resizeListener); + this.optionsProvider.removeMediaQueryListeners(); + } else { + window.clearTimeout(this.initializeTimeoutId); + } + + return this; + } + + /** + * Use this function to register event handlers. The handler callbacks are synchronous and will run in the main thread rather than the event loop. + * + * @memberof Chartist.Base + * @param {String} event Name of the event. Check the examples for supported events. + * @param {Function} handler The handler function that will be called when an event with the given name was emitted. This function will receive a data argument which contains event data. See the example for more details. + */ + on(event, handler) { + this.eventEmitter.addEventHandler(event, handler); + return this; + } + + /** + * Use this function to un-register event handlers. If the handler function parameter is omitted all handlers for the given event will be un-registered. + * + * @memberof Chartist.Base + * @param {String} event Name of the event for which a handler should be removed + * @param {Function} [handler] The handler function that that was previously used to register a new event handler. This handler will be removed from the event handler list. If this parameter is omitted then all event handlers for the given event are removed from the list. + */ + off(event, handler) { + this.eventEmitter.removeEventHandler(event, handler); + return this; + } + + initialize() { + // Add window resize listener that re-creates the chart + window.addEventListener('resize', this.resizeListener); + + // Obtain current options based on matching media queries (if responsive options are given) + // This will also register a listener that is re-creating the chart based on media changes + this.optionsProvider = optionsProvider(this.options, this.responsiveOptions, this.eventEmitter); + // Register options change listener that will trigger a chart update + this.eventEmitter.addEventHandler('optionsChanged', function() { + this.update(); + }.bind(this)); + + // Before the first chart creation we need to register us with all plugins that are configured + // Initialize all relevant plugins with our chart object and the plugin options specified in the config + if(this.options.plugins) { + this.options.plugins.forEach(function(plugin) { + if(plugin instanceof Array) { + plugin[0](this, plugin[1]); + } else { + plugin(this); + } + }.bind(this)); + } + + // Event for data transformation that allows to manipulate the data before it gets rendered in the charts + this.eventEmitter.emit('data', { + type: 'initial', + data: this.data + }); + + // Create the first chart + this.createChart(this.optionsProvider.getCurrentOptions()); + + // As chart is initialized from the event loop now we can reset our timeout reference + // This is important if the chart gets initialized on the same element twice + this.initializeTimeoutId = undefined; + } +} diff --git a/src/charts/charts.js b/src/charts/charts.js new file mode 100644 index 00000000..a0a33a9d --- /dev/null +++ b/src/charts/charts.js @@ -0,0 +1,4 @@ +export {BaseChart} from './base'; +export {LineChart} from './line'; +export {BarChart} from './bar'; +export {PieChart} from './pie'; diff --git a/src/charts/line.js b/src/charts/line.js new file mode 100644 index 00000000..83ada68f --- /dev/null +++ b/src/charts/line.js @@ -0,0 +1,402 @@ +import {isNumeric, alphaNumerate} from '../core/lang'; +import {noop} from '../core/functional'; +import {extend} from '../core/extend'; +import {normalizeData, serialize, getMetaData, getSeriesOption} from '../core/data'; +import {createSvg, createChartRect, createGridBackground} from '../core/creation'; +import {StepAxis, AutoScaleAxis, axisUnits} from '../axes/axes'; +import {BaseChart} from './base'; +import {monotoneCubic, none} from '../interpolation/interpolation'; + +/** + * Default options in line charts. Expand the code view to see a detailed list of options with comments. + * + * @memberof Chartist.Line + */ +const defaultOptions = { + // Options for X-Axis + axisX: { + // The offset of the labels to the chart area + offset: 30, + // Position where labels are placed. Can be set to `start` or `end` where `start` is equivalent to left or top on vertical axis and `end` is equivalent to right or bottom on horizontal axis. + position: 'end', + // Allows you to correct label positioning on this axis by positive or negative x and y offset. + labelOffset: { + x: 0, + y: 0 + }, + // If labels should be shown or not + showLabel: true, + // If the axis grid should be drawn or not + showGrid: true, + // Interpolation function that allows you to intercept the value from the axis label + labelInterpolationFnc: noop, + // Set the axis type to be used to project values on this axis. If not defined, Chartist.StepAxis will be used for the X-Axis, where the ticks option will be set to the labels in the data and the stretch option will be set to the global fullWidth option. This type can be changed to any axis constructor available (e.g. Chartist.FixedScaleAxis), where all axis options should be present here. + type: undefined + }, + // Options for Y-Axis + axisY: { + // The offset of the labels to the chart area + offset: 40, + // Position where labels are placed. Can be set to `start` or `end` where `start` is equivalent to left or top on vertical axis and `end` is equivalent to right or bottom on horizontal axis. + position: 'start', + // Allows you to correct label positioning on this axis by positive or negative x and y offset. + labelOffset: { + x: 0, + y: 0 + }, + // If labels should be shown or not + showLabel: true, + // If the axis grid should be drawn or not + showGrid: true, + // Interpolation function that allows you to intercept the value from the axis label + labelInterpolationFnc: noop, + // Set the axis type to be used to project values on this axis. If not defined, Chartist.AutoScaleAxis will be used for the Y-Axis, where the high and low options will be set to the global high and low options. This type can be changed to any axis constructor available (e.g. Chartist.FixedScaleAxis), where all axis options should be present here. + type: undefined, + // This value specifies the minimum height in pixel of the scale steps + scaleMinSpace: 20, + // Use only integer values (whole numbers) for the scale steps + onlyInteger: false + }, + // Specify a fixed width for the chart as a string (i.e. '100px' or '50%') + width: undefined, + // Specify a fixed height for the chart as a string (i.e. '100px' or '50%') + height: undefined, + // If the line should be drawn or not + showLine: true, + // If dots should be drawn or not + showPoint: true, + // If the line chart should draw an area + showArea: false, + // The base for the area chart that will be used to close the area shape (is normally 0) + areaBase: 0, + // Specify if the lines should be smoothed. This value can be true or false where true will result in smoothing using the default smoothing interpolation function Chartist.Interpolation.cardinal and false results in Chartist.Interpolation.none. You can also choose other smoothing / interpolation functions available in the Chartist.Interpolation module, or write your own interpolation function. Check the examples for a brief description. + lineSmooth: true, + // If the line chart should add a background fill to the .ct-grids group. + showGridBackground: false, + // Overriding the natural low of the chart allows you to zoom in or limit the charts lowest displayed value + low: undefined, + // Overriding the natural high of the chart allows you to zoom in or limit the charts highest displayed value + high: undefined, + // Padding of the chart drawing area to the container element and labels as a number or padding object {top: 5, right: 5, bottom: 5, left: 5} + chartPadding: { + top: 15, + right: 15, + bottom: 5, + left: 10 + }, + // When set to true, the last grid line on the x-axis is not drawn and the chart elements will expand to the full available width of the chart. For the last label to be drawn correctly you might need to add chart padding or offset the last label with a draw event handler. + fullWidth: false, + // If true the whole data is reversed including labels, the series order as well as the whole series data arrays. + reverseData: false, + // Override the class names that get used to generate the SVG structure of the chart + classNames: { + chart: 'ct-chart-line', + label: 'ct-label', + labelGroup: 'ct-labels', + series: 'ct-series', + line: 'ct-line', + point: 'ct-point', + area: 'ct-area', + grid: 'ct-grid', + gridGroup: 'ct-grids', + gridBackground: 'ct-grid-background', + vertical: 'ct-vertical', + horizontal: 'ct-horizontal', + start: 'ct-start', + end: 'ct-end' + } +}; + +export class LineChart extends BaseChart { + /** + * This method creates a new line chart. + * + * @memberof Chartist.Line + * @param {String|Node} query A selector query string or directly a DOM element + * @param {Object} data The data object that needs to consist of a labels and a series array + * @param {Object} [options] The options object with options that override the default options. Check the examples for a detailed list. + * @param {Array} [responsiveOptions] Specify an array of responsive option arrays which are a media query and options object pair => [[mediaQueryString, optionsObject],[more...]] + * @return {Object} An object which exposes the API for the created chart + * + * @example + * // Create a simple line chart + * var data = { + * // A labels array that can contain any sort of values + * labels: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri'], + * // Our series array that contains series objects or in this case series data arrays + * series: [ + * [5, 2, 4, 2, 0] + * ] + * }; + * + * // As options we currently only set a static size of 300x200 px + * var options = { + * width: '300px', + * height: '200px' + * }; + * + * // In the global name space Chartist we call the Line function to initialize a line chart. As a first parameter we pass in a selector where we would like to get our chart created. Second parameter is the actual data object and as a third parameter we pass in our options + * new Chartist.Line('.ct-chart', data, options); + * + * @example + * // Use specific interpolation function with configuration from the Chartist.Interpolation module + * + * var chart = new Chartist.Line('.ct-chart', { + * labels: [1, 2, 3, 4, 5], + * series: [ + * [1, 1, 8, 1, 7] + * ] + * }, { + * lineSmooth: Chartist.Interpolation.cardinal({ + * tension: 0.2 + * }) + * }); + * + * @example + * // Create a line chart with responsive options + * + * var data = { + * // A labels array that can contain any sort of values + * labels: ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'], + * // Our series array that contains series objects or in this case series data arrays + * series: [ + * [5, 2, 4, 2, 0] + * ] + * }; + * + * // In addition to the regular options we specify responsive option overrides that will override the default configutation based on the matching media queries. + * var responsiveOptions = [ + * ['screen and (min-width: 641px) and (max-width: 1024px)', { + * showPoint: false, + * axisX: { + * labelInterpolationFnc: function(value) { + * // Will return Mon, Tue, Wed etc. on medium screens + * return value.slice(0, 3); + * } + * } + * }], + * ['screen and (max-width: 640px)', { + * showLine: false, + * axisX: { + * labelInterpolationFnc: function(value) { + * // Will return M, T, W etc. on small screens + * return value[0]; + * } + * } + * }] + * ]; + * + * new Chartist.Line('.ct-chart', data, null, responsiveOptions); + * + */ + constructor(query, data, options, responsiveOptions) { + super(query, data, defaultOptions, extend({}, defaultOptions, options), responsiveOptions); + } + + /** + * Creates a new chart + * + */ + createChart(options) { + var data = normalizeData(this.data, options.reverseData, true); + + // Create new svg object + this.svg = createSvg(this.container, options.width, options.height, options.classNames.chart); + // Create groups for labels, grid and series + var gridGroup = this.svg.elem('g').addClass(options.classNames.gridGroup); + var seriesGroup = this.svg.elem('g'); + var labelGroup = this.svg.elem('g').addClass(options.classNames.labelGroup); + + var chartRect = createChartRect(this.svg, options, defaultOptions.padding); + var axisX, axisY; + + if(options.axisX.type === undefined) { + axisX = new StepAxis(axisUnits.x, data.normalized.series, chartRect, extend({}, options.axisX, { + ticks: data.normalized.labels, + stretch: options.fullWidth + })); + } else { + axisX = new options.axisX.type(axisUnits.x, data.normalized.series, chartRect, options.axisX); + } + + if(options.axisY.type === undefined) { + axisY = new AutoScaleAxis(axisUnits.y, data.normalized.series, chartRect, extend({}, options.axisY, { + high: isNumeric(options.high) ? options.high : options.axisY.high, + low: isNumeric(options.low) ? options.low : options.axisY.low + })); + } else { + axisY = new options.axisY.type(axisUnits.y, data.normalized.series, chartRect, options.axisY); + } + + axisX.createGridAndLabels(gridGroup, labelGroup, this.supportsForeignObject, options, this.eventEmitter); + axisY.createGridAndLabels(gridGroup, labelGroup, this.supportsForeignObject, options, this.eventEmitter); + + if (options.showGridBackground) { + createGridBackground(gridGroup, chartRect, options.classNames.gridBackground, this.eventEmitter); + } + + // Draw the series + data.raw.series.forEach(function(series, seriesIndex) { + var seriesElement = seriesGroup.elem('g'); + + // Write attributes to series group element. If series name or meta is undefined the attributes will not be written + seriesElement.attr({ + 'ct:series-name': series.name, + 'ct:meta': serialize(series.meta) + }); + + // Use series class from series data or if not set generate one + seriesElement.addClass([ + options.classNames.series, + (series.className || options.classNames.series + '-' + alphaNumerate(seriesIndex)) + ].join(' ')); + + var pathCoordinates = [], + pathData = []; + + data.normalized.series[seriesIndex].forEach(function(value, valueIndex) { + var p = { + x: chartRect.x1 + axisX.projectValue(value, valueIndex, data.normalized.series[seriesIndex]), + y: chartRect.y1 - axisY.projectValue(value, valueIndex, data.normalized.series[seriesIndex]) + }; + pathCoordinates.push(p.x, p.y); + pathData.push({ + value: value, + valueIndex: valueIndex, + meta: getMetaData(series, valueIndex) + }); + }.bind(this)); + + var seriesOptions = { + lineSmooth: getSeriesOption(series, options, 'lineSmooth'), + showPoint: getSeriesOption(series, options, 'showPoint'), + showLine: getSeriesOption(series, options, 'showLine'), + showArea: getSeriesOption(series, options, 'showArea'), + areaBase: getSeriesOption(series, options, 'areaBase') + }; + + var smoothing = typeof seriesOptions.lineSmooth === 'function' ? + seriesOptions.lineSmooth : (seriesOptions.lineSmooth ? monotoneCubic() : none()); + // Interpolating path where pathData will be used to annotate each path element so we can trace back the original + // index, value and meta data + var path = smoothing(pathCoordinates, pathData); + + // If we should show points we need to create them now to avoid secondary loop + // Points are drawn from the pathElements returned by the interpolation function + // Small offset for Firefox to render squares correctly + if (seriesOptions.showPoint) { + + path.pathElements.forEach(function(pathElement) { + var point = seriesElement.elem('line', { + x1: pathElement.x, + y1: pathElement.y, + x2: pathElement.x + 0.01, + y2: pathElement.y + }, options.classNames.point).attr({ + 'ct:value': [pathElement.data.value.x, pathElement.data.value.y].filter(isNumeric).join(','), + 'ct:meta': serialize(pathElement.data.meta) + }); + + this.eventEmitter.emit('draw', { + type: 'point', + value: pathElement.data.value, + index: pathElement.data.valueIndex, + meta: pathElement.data.meta, + series: series, + seriesIndex: seriesIndex, + axisX: axisX, + axisY: axisY, + group: seriesElement, + element: point, + x: pathElement.x, + y: pathElement.y + }); + }.bind(this)); + } + + if(seriesOptions.showLine) { + var line = seriesElement.elem('path', { + d: path.stringify() + }, options.classNames.line, true); + + this.eventEmitter.emit('draw', { + type: 'line', + values: data.normalized.series[seriesIndex], + path: path.clone(), + chartRect: chartRect, + index: seriesIndex, + series: series, + seriesIndex: seriesIndex, + seriesMeta: series.meta, + axisX: axisX, + axisY: axisY, + group: seriesElement, + element: line + }); + } + + // Area currently only works with axes that support a range! + if(seriesOptions.showArea && axisY.range) { + // If areaBase is outside the chart area (< min or > max) we need to set it respectively so that + // the area is not drawn outside the chart area. + var areaBase = Math.max(Math.min(seriesOptions.areaBase, axisY.range.max), axisY.range.min); + + // We project the areaBase value into screen coordinates + var areaBaseProjected = chartRect.y1 - axisY.projectValue(areaBase); + + // In order to form the area we'll first split the path by move commands so we can chunk it up into segments + path.splitByCommand('M').filter(function onlySolidSegments(pathSegment) { + // We filter only "solid" segments that contain more than one point. Otherwise there's no need for an area + return pathSegment.pathElements.length > 1; + }).map(function convertToArea(solidPathSegments) { + // Receiving the filtered solid path segments we can now convert those segments into fill areas + var firstElement = solidPathSegments.pathElements[0]; + var lastElement = solidPathSegments.pathElements[solidPathSegments.pathElements.length - 1]; + + // Cloning the solid path segment with closing option and removing the first move command from the clone + // We then insert a new move that should start at the area base and draw a straight line up or down + // at the end of the path we add an additional straight line to the projected area base value + // As the closing option is set our path will be automatically closed + return solidPathSegments.clone(true) + .position(0) + .remove(1) + .move(firstElement.x, areaBaseProjected) + .line(firstElement.x, firstElement.y) + .position(solidPathSegments.pathElements.length + 1) + .line(lastElement.x, areaBaseProjected); + + }).forEach(function createArea(areaPath) { + // For each of our newly created area paths, we'll now create path elements by stringifying our path objects + // and adding the created DOM elements to the correct series group + var area = seriesElement.elem('path', { + d: areaPath.stringify() + }, options.classNames.area, true); + + // Emit an event for each area that was drawn + this.eventEmitter.emit('draw', { + type: 'area', + values: data.normalized.series[seriesIndex], + path: areaPath.clone(), + series: series, + seriesIndex: seriesIndex, + axisX: axisX, + axisY: axisY, + chartRect: chartRect, + index: seriesIndex, + group: seriesElement, + element: area + }); + }.bind(this)); + } + }.bind(this)); + + this.eventEmitter.emit('created', { + bounds: axisY.bounds, + chartRect: chartRect, + axisX: axisX, + axisY: axisY, + svg: this.svg, + options: options + }); + } +} diff --git a/src/charts/pie.js b/src/charts/pie.js new file mode 100644 index 00000000..b8a7e0bb --- /dev/null +++ b/src/charts/pie.js @@ -0,0 +1,359 @@ +import {alphaNumerate, quantity, isFalseyButZero} from '../core/lang'; +import {noop} from '../core/functional'; +import {polarToCartesian} from '../core/math'; +import {extend} from '../core/extend'; +import {normalizeData, serialize} from '../core/data'; +import {createSvg, createChartRect} from '../core/creation'; +import {SvgPath} from '../svg/svg-path'; +import {BaseChart} from './base'; + +/** + * Default options in line charts. Expand the code view to see a detailed list of options with comments. + * + * @memberof Chartist.Pie + */ +const defaultOptions = { + // Specify a fixed width for the chart as a string (i.e. '100px' or '50%') + width: undefined, + // Specify a fixed height for the chart as a string (i.e. '100px' or '50%') + height: undefined, + // Padding of the chart drawing area to the container element and labels as a number or padding object {top: 5, right: 5, bottom: 5, left: 5} + chartPadding: 5, + // Override the class names that are used to generate the SVG structure of the chart + classNames: { + chartPie: 'ct-chart-pie', + chartDonut: 'ct-chart-donut', + series: 'ct-series', + slicePie: 'ct-slice-pie', + sliceDonut: 'ct-slice-donut', + label: 'ct-label' + }, + // The start angle of the pie chart in degrees where 0 points north. A higher value offsets the start angle clockwise. + startAngle: 0, + // An optional total you can specify. By specifying a total value, the sum of the values in the series must be this total in order to draw a full pie. You can use this parameter to draw only parts of a pie or gauge charts. + total: undefined, + // If specified the donut CSS classes will be used and strokes will be drawn instead of pie slices. + donut: false, + // Specify the donut stroke width, currently done in javascript for convenience. May move to CSS styles in the future. + // This option can be set as number or string to specify a relative width (i.e. 100 or '30%'). + donutWidth: 60, + // If a label should be shown or not + showLabel: true, + // Label position offset from the standard position which is half distance of the radius. This value can be either positive or negative. Positive values will position the label away from the center. + labelOffset: 0, + // This option can be set to 'inside', 'outside' or 'center'. Positioned with 'inside' the labels will be placed on half the distance of the radius to the border of the Pie by respecting the 'labelOffset'. The 'outside' option will place the labels at the border of the pie and 'center' will place the labels in the absolute center point of the chart. The 'center' option only makes sense in conjunction with the 'labelOffset' option. + labelPosition: 'inside', + // An interpolation function for the label value + labelInterpolationFnc: noop, + // Label direction can be 'neutral', 'explode' or 'implode'. The labels anchor will be positioned based on those settings as well as the fact if the labels are on the right or left side of the center of the chart. Usually explode is useful when labels are positioned far away from the center. + labelDirection: 'neutral', + // If true the whole data is reversed including labels, the series order as well as the whole series data arrays. + reverseData: false, + // If true empty values will be ignored to avoid drawing unncessary slices and labels + ignoreEmptyValues: false +}; + +/** + * Determines SVG anchor position based on direction and center parameter + * + * @param center + * @param label + * @param direction + * @return {string} + */ +export function determineAnchorPosition(center, label, direction) { + var toTheRight = label.x > center.x; + + if (toTheRight && direction === 'explode' || + !toTheRight && direction === 'implode') { + return 'start'; + } else if (toTheRight && direction === 'implode' || + !toTheRight && direction === 'explode') { + return 'end'; + } else { + return 'middle'; + } +} + +export class PieChart extends BaseChart { + /** + * This method creates a new pie chart and returns an object that can be used to redraw the chart. + * + * @memberof Chartist.Pie + * @param {String|Node} query A selector query string or directly a DOM element + * @param {Object} data The data object in the pie chart needs to have a series property with a one dimensional data array. The values will be normalized against each other and don't necessarily need to be in percentage. The series property can also be an array of value objects that contain a value property and a className property to override the CSS class name for the series group. + * @param {Object} [options] The options object with options that override the default options. Check the examples for a detailed list. + * @param {Array} [responsiveOptions] Specify an array of responsive option arrays which are a media query and options object pair => [[mediaQueryString, optionsObject],[more...]] + * @return {Object} An object with a version and an update method to manually redraw the chart + * + * @example + * // Simple pie chart example with four series + * new Chartist.Pie('.ct-chart', { + * series: [10, 2, 4, 3] + * }); + * + * @example + * // Drawing a donut chart + * new Chartist.Pie('.ct-chart', { + * series: [10, 2, 4, 3] + * }, { + * donut: true + * }); + * + * @example + * // Using donut, startAngle and total to draw a gauge chart + * new Chartist.Pie('.ct-chart', { + * series: [20, 10, 30, 40] + * }, { + * donut: true, + * donutWidth: 20, + * startAngle: 270, + * total: 200 + * }); + * + * @example + * // Drawing a pie chart with padding and labels that are outside the pie + * new Chartist.Pie('.ct-chart', { + * series: [20, 10, 30, 40] + * }, { + * chartPadding: 30, + * labelOffset: 50, + * labelDirection: 'explode' + * }); + * + * @example + * // Overriding the class names for individual series as well as a name and meta data. + * // The name will be written as ct:series-name attribute and the meta data will be serialized and written + * // to a ct:meta attribute. + * new Chartist.Pie('.ct-chart', { + * series: [{ + * value: 20, + * name: 'Series 1', + * className: 'my-custom-class-one', + * meta: 'Meta One' + * }, { + * value: 10, + * name: 'Series 2', + * className: 'my-custom-class-two', + * meta: 'Meta Two' + * }, { + * value: 70, + * name: 'Series 3', + * className: 'my-custom-class-three', + * meta: 'Meta Three' + * }] + * }); + */ + constructor(query, data, options, responsiveOptions) { + super(query, data, defaultOptions, extend({}, defaultOptions, options), responsiveOptions); + } + + /** + * Creates the pie chart + * + * @param options + */ + createChart(options) { + var data = normalizeData(this.data); + var seriesGroups = [], + labelsGroup, + chartRect, + radius, + labelRadius, + totalDataSum, + startAngle = options.startAngle; + + // Create SVG.js draw + this.svg = createSvg(this.container, options.width, options.height, options.donut ? options.classNames.chartDonut : options.classNames.chartPie); + // Calculate charting rect + chartRect = createChartRect(this.svg, options, defaultOptions.padding); + // Get biggest circle radius possible within chartRect + radius = Math.min(chartRect.width() / 2, chartRect.height() / 2); + // Calculate total of all series to get reference value or use total reference from optional options + totalDataSum = options.total || data.normalized.series.reduce(function (previousValue, currentValue) { + return previousValue + currentValue; + }, 0); + + var donutWidth = quantity(options.donutWidth); + if (donutWidth.unit === '%') { + donutWidth.value *= radius / 100; + } + + // If this is a donut chart we need to adjust our radius to enable strokes to be drawn inside + // Unfortunately this is not possible with the current SVG Spec + // See this proposal for more details: http://lists.w3.org/Archives/Public/www-svg/2003Oct/0000.html + radius -= options.donut ? donutWidth.value / 2 : 0; + + // If labelPosition is set to `outside` or a donut chart is drawn then the label position is at the radius, + // if regular pie chart it's half of the radius + if (options.labelPosition === 'outside' || options.donut) { + labelRadius = radius; + } else if (options.labelPosition === 'center') { + // If labelPosition is center we start with 0 and will later wait for the labelOffset + labelRadius = 0; + } else { + // Default option is 'inside' where we use half the radius so the label will be placed in the center of the pie + // slice + labelRadius = radius / 2; + } + // Add the offset to the labelRadius where a negative offset means closed to the center of the chart + labelRadius += options.labelOffset; + + // Calculate end angle based on total sum and current data value and offset with padding + var center = { + x: chartRect.x1 + chartRect.width() / 2, + y: chartRect.y2 + chartRect.height() / 2 + }; + + // Check if there is only one non-zero value in the series array. + var hasSingleValInSeries = data.raw.series.filter(function (val) { + return val.hasOwnProperty('value') ? val.value !== 0 : val !== 0; + }).length === 1; + + // Creating the series groups + data.raw.series.forEach(function (series, index) { + seriesGroups[index] = this.svg.elem('g', null, null); + }.bind(this)); + //if we need to show labels we create the label group now + if (options.showLabel) { + labelsGroup = this.svg.elem('g', null, null); + } + + // Draw the series + // initialize series groups + data.raw.series.forEach(function (series, index) { + // If current value is zero and we are ignoring empty values then skip to next value + if (data.normalized.series[index] === 0 && options.ignoreEmptyValues) return; + + // If the series is an object and contains a name or meta data we add a custom attribute + seriesGroups[index].attr({ + 'ct:series-name': series.name + }); + + // Use series class from series data or if not set generate one + seriesGroups[index].addClass([ + options.classNames.series, + (series.className || options.classNames.series + '-' + alphaNumerate(index)) + ].join(' ')); + + // If the whole dataset is 0 endAngle should be zero. Can't divide by 0. + var endAngle = (totalDataSum > 0 ? startAngle + data.normalized.series[index] / totalDataSum * 360 : 0); + + // Use slight offset so there are no transparent hairline issues + var overlappigStartAngle = Math.max(0, startAngle - (index === 0 || hasSingleValInSeries ? 0 : 0.2)); + + // If we need to draw the arc for all 360 degrees we need to add a hack where we close the circle + // with Z and use 359.99 degrees + if (endAngle - overlappigStartAngle >= 359.99) { + endAngle = overlappigStartAngle + 359.99; + } + + var start = polarToCartesian(center.x, center.y, radius, overlappigStartAngle), + end = polarToCartesian(center.x, center.y, radius, endAngle); + + // Create a new path element for the pie chart. If this isn't a donut chart we should close the path for a correct stroke + var path = new SvgPath(!options.donut) + .move(end.x, end.y) + .arc(radius, radius, 0, endAngle - startAngle > 180, 0, start.x, start.y); + + // If regular pie chart (no donut) we add a line to the center of the circle for completing the pie + if (!options.donut) { + path.line(center.x, center.y); + } + + // Create the SVG path + // If this is a donut chart we add the donut class, otherwise just a regular slice + var pathElement = seriesGroups[index].elem('path', { + d: path.stringify() + }, options.donut ? options.classNames.sliceDonut : options.classNames.slicePie); + + // Adding the pie series value to the path + pathElement.attr({ + 'ct:value': data.normalized.series[index], + 'ct:meta': serialize(series.meta) + }); + + // If this is a donut, we add the stroke-width as style attribute + if (options.donut) { + pathElement.attr({ + 'style': 'stroke-width: ' + donutWidth.value + 'px' + }); + } + + // Fire off draw event + this.eventEmitter.emit('draw', { + type: 'slice', + value: data.normalized.series[index], + totalDataSum: totalDataSum, + index: index, + meta: series.meta, + series: series, + group: seriesGroups[index], + element: pathElement, + path: path.clone(), + center: center, + radius: radius, + startAngle: startAngle, + endAngle: endAngle + }); + + // If we need to show labels we need to add the label for this slice now + if (options.showLabel) { + var labelPosition; + if (data.raw.series.length === 1) { + // If we have only 1 series, we can position the label in the center of the pie + labelPosition = { + x: center.x, + y: center.y + }; + } else { + // Position at the labelRadius distance from center and between start and end angle + labelPosition = polarToCartesian( + center.x, + center.y, + labelRadius, + startAngle + (endAngle - startAngle) / 2 + ); + } + + var rawValue; + if (data.normalized.labels && !isFalseyButZero(data.normalized.labels[index])) { + rawValue = data.normalized.labels[index]; + } else { + rawValue = data.normalized.series[index]; + } + + var interpolatedValue = options.labelInterpolationFnc(rawValue, index); + + if (interpolatedValue || interpolatedValue === 0) { + var labelElement = labelsGroup.elem('text', { + dx: labelPosition.x, + dy: labelPosition.y, + 'text-anchor': determineAnchorPosition(center, labelPosition, options.labelDirection) + }, options.classNames.label).text('' + interpolatedValue); + + // Fire off draw event + this.eventEmitter.emit('draw', { + type: 'label', + index: index, + group: labelsGroup, + element: labelElement, + text: '' + interpolatedValue, + x: labelPosition.x, + y: labelPosition.y + }); + } + } + + // Set next startAngle to current endAngle. + // (except for last slice) + startAngle = endAngle; + }.bind(this)); + + this.eventEmitter.emit('created', { + chartRect: chartRect, + svg: this.svg, + options: options + }); + } +} diff --git a/src/core/core.js b/src/core/core.js new file mode 100644 index 00000000..01430174 --- /dev/null +++ b/src/core/core.js @@ -0,0 +1,8 @@ +export * from './globals'; +export * from './lang'; +export * from './functional'; +export * from './math'; +export * from './data'; +export * from './creation'; +export {extend} from './extend'; +export {optionsProvider} from './options-provider'; diff --git a/src/core/creation.js b/src/core/creation.js new file mode 100644 index 00000000..dfe1c86b --- /dev/null +++ b/src/core/creation.js @@ -0,0 +1,233 @@ +import {namespaces} from './globals'; +import {Svg} from '../svg/svg'; +import {quantity} from './lang'; +import {extend} from './extend'; + +/** + * Create or reinitialize the SVG element for the chart + * + * @memberof Chartist.Core + * @param {Node} container The containing DOM Node object that will be used to plant the SVG element + * @param {String} width Set the width of the SVG element. Default is 100% + * @param {String} height Set the height of the SVG element. Default is 100% + * @param {String} className Specify a class to be added to the SVG element + * @return {Object} The created/reinitialized SVG element + */ +export function createSvg(container, width, height, className) { + var svg; + + width = width || '100%'; + height = height || '100%'; + + // Check if there is a previous SVG element in the container that contains the Chartist XML namespace and remove it + // Since the DOM API does not support namespaces we need to manually search the returned list http://www.w3.org/TR/selectors-api/ + Array.prototype.slice.call(container.querySelectorAll('svg')).filter(function filterChartistSvgObjects(svg) { + return svg.getAttributeNS(namespaces.xmlns, 'ct'); + }).forEach(function removePreviousElement(svg) { + container.removeChild(svg); + }); + + // Create svg object with width and height or use 100% as default + svg = new Svg('svg').attr({ + width: width, + height: height + }).addClass(className).attr({ + style: 'width: ' + width + '; height: ' + height + ';' + }); + + // Add the DOM node to our container + container.appendChild(svg._node); + + return svg; +} + +/** + * Converts a number into a padding object. + * + * @memberof Chartist.Core + * @param {Object|Number} padding + * @param {Number} [fallback] This value is used to fill missing values if a incomplete padding object was passed + * @returns {Object} Returns a padding object containing top, right, bottom, left properties filled with the padding number passed in as argument. If the argument is something else than a number (presumably already a correct padding object) then this argument is directly returned. + */ +export function normalizePadding(padding, fallback) { + fallback = fallback || 0; + + return typeof padding === 'number' ? { + top: padding, + right: padding, + bottom: padding, + left: padding + } : { + top: typeof padding.top === 'number' ? padding.top : fallback, + right: typeof padding.right === 'number' ? padding.right : fallback, + bottom: typeof padding.bottom === 'number' ? padding.bottom : fallback, + left: typeof padding.left === 'number' ? padding.left : fallback + }; +} + +/** + * Initialize chart drawing rectangle (area where chart is drawn) x1,y1 = bottom left / x2,y2 = top right + * + * @memberof Chartist.Core + * @param {Object} svg The svg element for the chart + * @param {Object} options The Object that contains all the optional values for the chart + * @param {Number} [fallbackPadding] The fallback padding if partial padding objects are used + * @return {Object} The chart rectangles coordinates inside the svg element plus the rectangles measurements + */ +export function createChartRect(svg, options, fallbackPadding) { + var hasAxis = !!(options.axisX || options.axisY); + var yAxisOffset = hasAxis ? options.axisY.offset : 0; + var xAxisOffset = hasAxis ? options.axisX.offset : 0; + // If width or height results in invalid value (including 0) we fallback to the unitless settings or even 0 + var width = svg.width() || quantity(options.width).value || 0; + var height = svg.height() || quantity(options.height).value || 0; + var normalizedPadding = normalizePadding(options.chartPadding, fallbackPadding); + + // If settings were to small to cope with offset (legacy) and padding, we'll adjust + width = Math.max(width, yAxisOffset + normalizedPadding.left + normalizedPadding.right); + height = Math.max(height, xAxisOffset + normalizedPadding.top + normalizedPadding.bottom); + + var chartRect = { + padding: normalizedPadding, + width: function () { + return this.x2 - this.x1; + }, + height: function () { + return this.y1 - this.y2; + } + }; + + if(hasAxis) { + if (options.axisX.position === 'start') { + chartRect.y2 = normalizedPadding.top + xAxisOffset; + chartRect.y1 = Math.max(height - normalizedPadding.bottom, chartRect.y2 + 1); + } else { + chartRect.y2 = normalizedPadding.top; + chartRect.y1 = Math.max(height - normalizedPadding.bottom - xAxisOffset, chartRect.y2 + 1); + } + + if (options.axisY.position === 'start') { + chartRect.x1 = normalizedPadding.left + yAxisOffset; + chartRect.x2 = Math.max(width - normalizedPadding.right, chartRect.x1 + 1); + } else { + chartRect.x1 = normalizedPadding.left; + chartRect.x2 = Math.max(width - normalizedPadding.right - yAxisOffset, chartRect.x1 + 1); + } + } else { + chartRect.x1 = normalizedPadding.left; + chartRect.x2 = Math.max(width - normalizedPadding.right, chartRect.x1 + 1); + chartRect.y2 = normalizedPadding.top; + chartRect.y1 = Math.max(height - normalizedPadding.bottom, chartRect.y2 + 1); + } + + return chartRect; +} + +/** + * Creates a grid line based on a projected value. + * + * @memberof Chartist.Core + * @param position + * @param index + * @param axis + * @param offset + * @param length + * @param group + * @param classes + * @param eventEmitter + */ +export function createGrid(position, index, axis, offset, length, group, classes, eventEmitter) { + var positionalData = {}; + positionalData[axis.units.pos + '1'] = position; + positionalData[axis.units.pos + '2'] = position; + positionalData[axis.counterUnits.pos + '1'] = offset; + positionalData[axis.counterUnits.pos + '2'] = offset + length; + + var gridElement = group.elem('line', positionalData, classes.join(' ')); + + // Event for grid draw + eventEmitter.emit('draw', + extend({ + type: 'grid', + axis: axis, + index: index, + group: group, + element: gridElement + }, positionalData) + ); +} + +/** + * Creates a grid background rect and emits the draw event. + * + * @memberof Chartist.Core + * @param gridGroup + * @param chartRect + * @param className + * @param eventEmitter + */ +export function createGridBackground(gridGroup, chartRect, className, eventEmitter) { + var gridBackground = gridGroup.elem('rect', { + x: chartRect.x1, + y: chartRect.y2, + width: chartRect.width(), + height: chartRect.height() + }, className, true); + + // Event for grid background draw + eventEmitter.emit('draw', { + type: 'gridBackground', + group: gridGroup, + element: gridBackground + }); +} + +/** + * Creates a label based on a projected value and an axis. + * + * @memberof Chartist.Core + * @param position + * @param length + * @param index + * @param labels + * @param axis + * @param axisOffset + * @param labelOffset + * @param group + * @param classes + * @param useForeignObject + * @param eventEmitter + */ +export function createLabel(position, length, index, labels, axis, axisOffset, labelOffset, group, classes, useForeignObject, eventEmitter) { + var labelElement; + var positionalData = {}; + + positionalData[axis.units.pos] = position + labelOffset[axis.units.pos]; + positionalData[axis.counterUnits.pos] = labelOffset[axis.counterUnits.pos]; + positionalData[axis.units.len] = length; + positionalData[axis.counterUnits.len] = Math.max(0, axisOffset - 10); + + if(useForeignObject) { + // We need to set width and height explicitly to px as span will not expand with width and height being + // 100% in all browsers + var content = '' + + labels[index] + ''; + + labelElement = group.foreignObject(content, extend({ + style: 'overflow: visible;' + }, positionalData)); + } else { + labelElement = group.elem('text', positionalData, classes.join(' ')).text(labels[index]); + } + + eventEmitter.emit('draw', extend({ + type: 'label', + axis: axis, + index: index, + group: group, + element: labelElement, + text: labels[index] + }, positionalData)); +} diff --git a/src/core/creation.spec.js b/src/core/creation.spec.js new file mode 100644 index 00000000..2893b411 --- /dev/null +++ b/src/core/creation.spec.js @@ -0,0 +1,216 @@ +import {addFixture, initializeFixtures, destroyFixtures} from '../testing/fixtures'; +import {createSvg, createGrid, createGridBackground, normalizePadding} from './creation'; +import {EventEmitter} from '../event/event-emitter'; +import {Svg} from '../svg/svg'; + +describe('Creation', () => { + beforeEach(() => initializeFixtures()); + afterEach(() => destroyFixtures()); + + describe('createSvg', () => { + it('should not remove non-chartist svg elements', () => { + const fixture = addFixture(` +
+ +
+ +
+
+ `); + + const container = fixture.wrapper.querySelector('#chart-container'); + const svg = createSvg(container, '500px', '400px', 'ct-fish-bar'); + + expect(svg).toBeDefined(); + expect(svg.classes()).toContain('ct-fish-bar'); + expect(container).toContainElement('#foo'); + expect(container).toContainElement('#bar'); + }); + + it('should remove previous chartist svg elements', () => { + const fixture = addFixture(`
`); + + const container = fixture.wrapper.querySelector('#chart-container'); + const svg1 = createSvg(container, '500px', '400px', 'ct-fish-bar'); + const svg2 = createSvg(container, '800px', '200px', 'ct-snake-bar'); + + expect(svg1).toBeDefined(); + expect(svg1.classes()).toContain('ct-fish-bar'); + expect(svg2).toBeDefined(); + expect(svg2.classes()).toContain('ct-snake-bar'); + expect(container).not.toContainElement('.ct-fish-bar'); + expect(container).toContainElement('.ct-snake-bar'); + }); + }); + + describe('createGrid', () => { + let group, axis, classes, eventEmitter, position, length, offset; + + beforeEach(() => { + eventEmitter = new EventEmitter(); + group = new Svg('g'); + axis = { + units: { + pos : 'x' + }, + counterUnits: { + pos : 'y' + } + }; + classes = []; + position = 10; + length = 100; + offset = 20; + }); + + function onCreated(fn, done) { + eventEmitter.addEventHandler('draw', (grid) => { + fn(grid); + done(); + }); + createGrid(position, 1, axis, offset, length, group, classes, eventEmitter); + } + + it('should add single grid line to group', (done) => { + onCreated(() => expect(group.querySelectorAll('line').svgElements.length).toBe(1), done); + }); + + it('should draw line', (done) => { + onCreated(() => { + const line = group.querySelector('line'); + expect(line.attr('x1')).toBe('10'); + expect(line.attr('x2')).toBe('10'); + expect(line.attr('y1')).toBe('20'); + expect(line.attr('y2')).toBe('120'); + }, done); + }); + + it('should draw horizontal line', (done) => { + axis.units.pos = 'y'; + axis.counterUnits.pos = 'x'; + onCreated(() => { + const line = group.querySelector('line'); + expect(line.attr('y1')).toBe('10'); + expect(line.attr('y2')).toBe('10'); + expect(line.attr('x1')).toBe('20'); + expect(line.attr('x2')).toBe('120'); + }, done); + }); + }); + + describe('createGridBackground', () => { + let group, chartRect, className, eventEmitter; + + beforeEach(() => { + eventEmitter = new EventEmitter(); + group = new Svg('g'); + className = 'ct-test'; + chartRect = { + x1: 5, + y2: 10, + _width: 100, + _height: 50, + width() { + return this._width; + }, + height() { + return this._height; + } + }; + }); + + function onCreated(fn, done) { + eventEmitter.addEventHandler('draw', (data) => { + fn(data); + done(); + }); + createGridBackground(group, chartRect, className, eventEmitter); + } + + it('should add rect', (done) => { + onCreated(() => { + const rects = group.querySelectorAll('rect').svgElements; + expect(rects.length).toBe(1); + const rect = rects[0]; + expect(rect.attr('x')).toBe('5'); + expect(rect.attr('y')).toBe('10'); + expect(rect.attr('width')).toBe('100'); + expect(rect.attr('height')).toBe('50'); + expect(rect.classes()).toEqual(['ct-test']); + }, done); + }); + + it('should pass grid to event', (done) => { + onCreated((data) => { + expect(data.type).toBe('gridBackground'); + const rect = data.element; + expect(rect.attr('x')).toBe('5'); + expect(rect.attr('y')).toBe('10'); + }, done); + }); + }); + + describe('padding normalization', () => { + it('should normalize number padding', () => { + expect(normalizePadding(10)).toEqual({ + top: 10, + right: 10, + bottom: 10, + left: 10 + }); + }); + + it('should normalize number padding when 0 is passed', () => { + expect(normalizePadding(0)).toEqual({ + top: 0, + right: 0, + bottom: 0, + left: 0 + }); + }); + + it('should normalize empty padding object with default fallback', () => { + expect(normalizePadding({})).toEqual({ + top: 0, + right: 0, + bottom: 0, + left: 0 + }); + }); + + it('should normalize empty padding object with specified fallback', () => { + expect(normalizePadding({}, 10)).toEqual({ + top: 10, + right: 10, + bottom: 10, + left: 10 + }); + }); + + it('should normalize partial padding object with specified fallback', () => { + expect(normalizePadding({ + top: 5, + left: 5 + }, 10)).toEqual({ + top: 5, + right: 10, + bottom: 10, + left: 5 + }); + }); + + it('should not modify complete padding object', () => { + expect(normalizePadding({ + top: 5, + right: 5, + bottom: 5, + left: 5 + }, 10)).toEqual({ + top: 5, + right: 5, + bottom: 5, + left: 5 + }); + }); + }); +}); diff --git a/src/core/data.js b/src/core/data.js new file mode 100644 index 00000000..d3be0515 --- /dev/null +++ b/src/core/data.js @@ -0,0 +1,482 @@ +import {escapingMap} from './globals'; +import {replaceAll, safeHasProperty, getNumberOrUndefined} from './lang'; +import {times} from './functional'; +import {extend} from './extend'; +import {orderOfMagnitude, projectLength, roundWithPrecision, rho} from './math'; + +/** + * This function serializes arbitrary data to a string. In case of data that can't be easily converted to a string, this function will create a wrapper object and serialize the data using JSON.stringify. The outcoming string will always be escaped using Chartist.escapingMap. + * If called with null or undefined the function will return immediately with null or undefined. + * + * @memberof Chartist.Core + * @param {Number|String|Object} data + * @return {String} + */ +export function serialize(data) { + if(data === null || data === undefined) { + return data; + } else if(typeof data === 'number') { + data = ''+data; + } else if(typeof data === 'object') { + data = JSON.stringify({data: data}); + } + + return Object.keys(escapingMap).reduce(function(result, key) { + return replaceAll(result, key, escapingMap[key]); + }, data); +} + +/** + * This function de-serializes a string previously serialized with Chartist.serialize. The string will always be unescaped using Chartist.escapingMap before it's returned. Based on the input value the return type can be Number, String or Object. JSON.parse is used with try / catch to see if the unescaped string can be parsed into an Object and this Object will be returned on success. + * + * @memberof Chartist.Core + * @param {String} data + * @return {String|Number|Object} + */ +export function deserialize(data) { + if(typeof data !== 'string') { + return data; + } + + data = Object.keys(escapingMap).reduce(function(result, key) { + return replaceAll(result, escapingMap[key], key); + }, data); + + try { + data = JSON.parse(data); + data = data.data !== undefined ? data.data : data; + } catch(e) {} + + return data; +} + +/** + * Ensures that the data object passed as second argument to the charts is present and correctly initialized. + * + * @param {Object} data The data object that is passed as second argument to the charts + * @return {Object} The normalized data object + */ +export function normalizeData(data, reverse, multi) { + var labelCount; + var output = { + raw: data, + normalized: {} + }; + + // Check if we should generate some labels based on existing series data + output.normalized.series = getDataArray({ + series: data.series || [] + }, reverse, multi); + + // If all elements of the normalized data array are arrays we're dealing with + // multi series data and we need to find the largest series if they are un-even + if (output.normalized.series.every(function(value) { + return value instanceof Array; + })) { + // Getting the series with the the most elements + labelCount = Math.max.apply(null, output.normalized.series.map(function(series) { + return series.length; + })); + } else { + // We're dealing with Pie data so we just take the normalized array length + labelCount = output.normalized.series.length; + } + + output.normalized.labels = (data.labels || []).slice(); + // Padding the labels to labelCount with empty strings + Array.prototype.push.apply( + output.normalized.labels, + times(Math.max(0, labelCount - output.normalized.labels.length)).map(function() { + return ''; + }) + ); + + if(reverse) { + reverseData(output.normalized); + } + + return output; +} + +/** + * Get meta data of a specific value in a series. + * + * @param series + * @param index + * @returns {*} + */ +export function getMetaData(series, index) { + var value = series.data ? series.data[index] : series[index]; + return value ? value.meta : undefined; +} + +/** + * Checks if a value is considered a hole in the data series. + * + * @param {*} value + * @returns {boolean} True if the value is considered a data hole + */ +export function isDataHoleValue(value) { + return value === null || + value === undefined || + (typeof value === 'number' && isNaN(value)); +} + +/** + * Reverses the series, labels and series data arrays. + * + * @memberof Chartist.Core + * @param data + */ +export function reverseData(data) { + data.labels.reverse(); + data.series.reverse(); + for (var i = 0; i < data.series.length; i++) { + if(typeof(data.series[i]) === 'object' && data.series[i].data !== undefined) { + data.series[i].data.reverse(); + } else if(data.series[i] instanceof Array) { + data.series[i].reverse(); + } + } +} + +/** + * Convert data series into plain array + * + * @memberof Chartist.Core + * @param {Object} data The series object that contains the data to be visualized in the chart + * @param {Boolean} [reverse] If true the whole data is reversed by the getDataArray call. This will modify the data object passed as first parameter. The labels as well as the series order is reversed. The whole series data arrays are reversed too. + * @param {Boolean} [multi] Create a multi dimensional array from a series data array where a value object with `x` and `y` values will be created. + * @return {Array} A plain array that contains the data to be visualized in the chart + */ +export function getDataArray(data, reverse, multi) { + // Recursively walks through nested arrays and convert string values to numbers and objects with value properties + // to values. Check the tests in data core -> data normalization for a detailed specification of expected values + function recursiveConvert(value) { + if(safeHasProperty(value, 'value')) { + // We are dealing with value object notation so we need to recurse on value property + return recursiveConvert(value.value); + } else if(safeHasProperty(value, 'data')) { + // We are dealing with series object notation so we need to recurse on data property + return recursiveConvert(value.data); + } else if(value instanceof Array) { + // Data is of type array so we need to recurse on the series + return value.map(recursiveConvert); + } else if(isDataHoleValue(value)) { + // We're dealing with a hole in the data and therefore need to return undefined + // We're also returning undefined for multi value output + return undefined; + } else { + // We need to prepare multi value output (x and y data) + if(multi) { + var multiValue = {}; + + // Single series value arrays are assumed to specify the Y-Axis value + // For example: [1, 2] => [{x: undefined, y: 1}, {x: undefined, y: 2}] + // If multi is a string then it's assumed that it specified which dimension should be filled as default + if(typeof multi === 'string') { + multiValue[multi] = getNumberOrUndefined(value); + } else { + multiValue.y = getNumberOrUndefined(value); + } + + multiValue.x = value.hasOwnProperty('x') ? getNumberOrUndefined(value.x) : multiValue.x; + multiValue.y = value.hasOwnProperty('y') ? getNumberOrUndefined(value.y) : multiValue.y; + + return multiValue; + + } else { + // We can return simple data + return getNumberOrUndefined(value); + } + } + } + + return data.series.map(recursiveConvert); +} + +/** + * Checks if provided value object is multi value (contains x or y properties) + * + * @memberof Chartist.Core + * @param value + */ +export function isMultiValue(value) { + return typeof value === 'object' && ('x' in value || 'y' in value); +} + +/** + * Gets a value from a dimension `value.x` or `value.y` while returning value directly if it's a valid numeric value. If the value is not numeric and it's falsey this function will return `defaultValue`. + * + * @memberof Chartist.Core + * @param value + * @param dimension + * @param defaultValue + * @returns {*} + */ +export function getMultiValue(value, dimension) { + if(isMultiValue(value)) { + return getNumberOrUndefined(value[dimension || 'y']); + } else { + return getNumberOrUndefined(value); + } +} + +/** + * Helper to read series specific options from options object. It automatically falls back to the global option if + * there is no option in the series options. + * + * @param {Object} series Series object + * @param {Object} options Chartist options object + * @param {string} key The options key that should be used to obtain the options + * @returns {*} + */ +export function getSeriesOption(series, options, key) { + if(series.name && options.series && options.series[series.name]) { + var seriesOptions = options.series[series.name]; + return seriesOptions.hasOwnProperty(key) ? seriesOptions[key] : options[key]; + } else { + return options[key]; + } +} + +/** + * Splits a list of coordinates and associated values into segments. Each returned segment contains a pathCoordinates + * valueData property describing the segment. + * + * With the default options, segments consist of contiguous sets of points that do not have an undefined value. Any + * points with undefined values are discarded. + * + * **Options** + * The following options are used to determine how segments are formed + * ```javascript + * var options = { + * // If fillHoles is true, undefined values are simply discarded without creating a new segment. Assuming other options are default, this returns single segment. + * fillHoles: false, + * // If increasingX is true, the coordinates in all segments have strictly increasing x-values. + * increasingX: false + * }; + * ``` + * + * @memberof Chartist.Core + * @param {Array} pathCoordinates List of point coordinates to be split in the form [x1, y1, x2, y2 ... xn, yn] + * @param {Array} valueData List of associated point values in the form [v1, v2 .. vn] + * @param {Object} [options] Options set by user + * @return {Array} List of segments, each containing a pathCoordinates and valueData property. + */ +export function splitIntoSegments(pathCoordinates, valueData, options) { + var defaultOptions = { + increasingX: false, + fillHoles: false + }; + + options = extend({}, defaultOptions, options); + + var segments = []; + var hole = true; + + for(var i = 0; i < pathCoordinates.length; i += 2) { + // If this value is a "hole" we set the hole flag + if(getMultiValue(valueData[i / 2].value) === undefined) { + // if(valueData[i / 2].value === undefined) { + if(!options.fillHoles) { + hole = true; + } + } else { + if(options.increasingX && i >= 2 && pathCoordinates[i] <= pathCoordinates[i-2]) { + // X is not increasing, so we need to make sure we start a new segment + hole = true; + } + + + // If it's a valid value we need to check if we're coming out of a hole and create a new empty segment + if(hole) { + segments.push({ + pathCoordinates: [], + valueData: [] + }); + // As we have a valid value now, we are not in a "hole" anymore + hole = false; + } + + // Add to the segment pathCoordinates and valueData + segments[segments.length - 1].pathCoordinates.push(pathCoordinates[i], pathCoordinates[i + 1]); + segments[segments.length - 1].valueData.push(valueData[i / 2]); + } + } + + return segments; +} + +/** + * Get highest and lowest value of data array. This Array contains the data that will be visualized in the chart. + * + * @memberof Chartist.Core + * @param {Array} data The array that contains the data to be visualized in the chart + * @param {Object} options The Object that contains the chart options + * @param {String} dimension Axis dimension 'x' or 'y' used to access the correct value and high / low configuration + * @return {Object} An object that contains the highest and lowest value that will be visualized on the chart. + */ +export function getHighLow(data, options, dimension) { + // TODO: Remove workaround for deprecated global high / low config. Axis high / low configuration is preferred + options = extend({}, options, dimension ? options['axis' + dimension.toUpperCase()] : {}); + + var highLow = { + high: options.high === undefined ? -Number.MAX_VALUE : +options.high, + low: options.low === undefined ? Number.MAX_VALUE : +options.low + }; + var findHigh = options.high === undefined; + var findLow = options.low === undefined; + + // Function to recursively walk through arrays and find highest and lowest number + function recursiveHighLow(data) { + if(data === undefined) { + return undefined; + } else if(data instanceof Array) { + for (var i = 0; i < data.length; i++) { + recursiveHighLow(data[i]); + } + } else { + var value = dimension ? +data[dimension] : +data; + + if (findHigh && value > highLow.high) { + highLow.high = value; + } + + if (findLow && value < highLow.low) { + highLow.low = value; + } + } + } + + // Start to find highest and lowest number recursively + if(findHigh || findLow) { + recursiveHighLow(data); + } + + // Overrides of high / low based on reference value, it will make sure that the invisible reference value is + // used to generate the chart. This is useful when the chart always needs to contain the position of the + // invisible reference value in the view i.e. for bipolar scales. + if (options.referenceValue || options.referenceValue === 0) { + highLow.high = Math.max(options.referenceValue, highLow.high); + highLow.low = Math.min(options.referenceValue, highLow.low); + } + + // If high and low are the same because of misconfiguration or flat data (only the same value) we need + // to set the high or low to 0 depending on the polarity + if (highLow.high <= highLow.low) { + // If both values are 0 we set high to 1 + if (highLow.low === 0) { + highLow.high = 1; + } else if (highLow.low < 0) { + // If we have the same negative value for the bounds we set bounds.high to 0 + highLow.high = 0; + } else if (highLow.high > 0) { + // If we have the same positive value for the bounds we set bounds.low to 0 + highLow.low = 0; + } else { + // If data array was empty, values are Number.MAX_VALUE and -Number.MAX_VALUE. Set bounds to prevent errors + highLow.high = 1; + highLow.low = 0; + } + } + + return highLow; +} + +/** + * Calculate and retrieve all the bounds for the chart and return them in one array + * + * @memberof Chartist.Core + * @param {Number} axisLength The length of the Axis used for + * @param {Object} highLow An object containing a high and low property indicating the value range of the chart. + * @param {Number} scaleMinSpace The minimum projected length a step should result in + * @param {Boolean} onlyInteger + * @return {Object} All the values to set the bounds of the chart + */ +export function getBounds(axisLength, highLow, scaleMinSpace, onlyInteger) { + var i, + optimizationCounter = 0, + newMin, + newMax, + bounds = { + high: highLow.high, + low: highLow.low + }; + + bounds.valueRange = bounds.high - bounds.low; + bounds.oom = orderOfMagnitude(bounds.valueRange); + bounds.step = Math.pow(10, bounds.oom); + bounds.min = Math.floor(bounds.low / bounds.step) * bounds.step; + bounds.max = Math.ceil(bounds.high / bounds.step) * bounds.step; + bounds.range = bounds.max - bounds.min; + bounds.numberOfSteps = Math.round(bounds.range / bounds.step); + + // Optimize scale step by checking if subdivision is possible based on horizontalGridMinSpace + // If we are already below the scaleMinSpace value we will scale up + var length = projectLength(axisLength, bounds.step, bounds); + var scaleUp = length < scaleMinSpace; + var smallestFactor = onlyInteger ? rho(bounds.range) : 0; + + // First check if we should only use integer steps and if step 1 is still larger than scaleMinSpace so we can use 1 + if(onlyInteger && projectLength(axisLength, 1, bounds) >= scaleMinSpace) { + bounds.step = 1; + } else if(onlyInteger && smallestFactor < bounds.step && projectLength(axisLength, smallestFactor, bounds) >= scaleMinSpace) { + // If step 1 was too small, we can try the smallest factor of range + // If the smallest factor is smaller than the current bounds.step and the projected length of smallest factor + // is larger than the scaleMinSpace we should go for it. + bounds.step = smallestFactor; + } else { + // Trying to divide or multiply by 2 and find the best step value + while (true) { + if (scaleUp && projectLength(axisLength, bounds.step, bounds) <= scaleMinSpace) { + bounds.step *= 2; + } else if (!scaleUp && projectLength(axisLength, bounds.step / 2, bounds) >= scaleMinSpace) { + bounds.step /= 2; + if(onlyInteger && bounds.step % 1 !== 0) { + bounds.step *= 2; + break; + } + } else { + break; + } + + if(optimizationCounter++ > 1000) { + throw new Error('Exceeded maximum number of iterations while optimizing scale step!'); + } + } + } + + var EPSILON = 2.221E-16; + bounds.step = Math.max(bounds.step, EPSILON); + function safeIncrement(value, increment) { + // If increment is too small use *= (1+EPSILON) as a simple nextafter + if (value === (value += increment)) { + value *= (1 + (increment > 0 ? EPSILON : -EPSILON)); + } + return value; + } + + // Narrow min and max based on new step + newMin = bounds.min; + newMax = bounds.max; + while (newMin + bounds.step <= bounds.low) { + newMin = safeIncrement(newMin, bounds.step); + } + while (newMax - bounds.step >= bounds.high) { + newMax = safeIncrement(newMax, -bounds.step); + } + bounds.min = newMin; + bounds.max = newMax; + bounds.range = bounds.max - bounds.min; + + var values = []; + for (i = bounds.min; i <= bounds.max; i = safeIncrement(i, bounds.step)) { + var value = roundWithPrecision(i); + if (value !== values[values.length - 1]) { + values.push(i); + } + } + bounds.values = values; + return bounds; +} diff --git a/src/core/data.spec.js b/src/core/data.spec.js new file mode 100644 index 00000000..86e5eec7 --- /dev/null +++ b/src/core/data.spec.js @@ -0,0 +1,357 @@ +import {serialize, deserialize, getDataArray, getBounds, splitIntoSegments} from './data'; + +describe('Data', () => { + describe('serialization', () => { + it('should serialize and deserialize regular strings', () => { + const input = 'String test'; + expect(input).toMatch(deserialize(serialize(input))); + }); + + it('should serialize and deserialize strings with critical characters', () => { + const input = 'String test with critical characters " < > \' & &'; + expect(input).toMatch(deserialize(serialize(input))); + }); + + it('should serialize and deserialize numbers', () => { + const input = 12345.6789; + expect(input).toEqual(deserialize(serialize(input))); + }); + + it('should serialize and deserialize dates', () => { + const input = new Date(0); + expect(+input).toEqual(+new Date(deserialize(serialize(input)))); + }); + + it('should serialize and deserialize complex object types', () => { + const input = { + a: { + b: 100, + c: 'String test', + d: 'String test with critical characters " < > \' & &', + e: { + f: 'String test' + } + } + }; + + expect(input).toEqual(deserialize(serialize(input))); + }); + + it('should serialize and deserialize null, undefined and NaN', () => { + expect(null).toEqual(deserialize(serialize(null))); + expect(undefined).toEqual(deserialize(serialize(undefined))); + expect(NaN).toMatch(deserialize(serialize('NaN'))); + }); + }); + + describe('data normalization', () => { + it('should normalize mixed series types correctly', () => { + const data = { + labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + series: [ + {data: [1, 0, 3, 4, 5, 6]}, + [1, {value: 0}, 3, {value: 4}, 5, 6, 7, 8], + {data: [1, 0, {value: 3}]} + ] + }; + + expect(getDataArray(data)).toEqual( + [ + [1, 0, 3, 4, 5, 6], + [1, 0, 3, 4, 5, 6, 7, 8], + [1, 0, 3] + ] + ); + }); + + it('should normalize mixed series for pie chart correctly', () => { + const data = { + series: [1, {value: 0}, 3, {value: 4}, 5, 6, 7, 8] + }; + + expect(getDataArray(data)).toEqual( + [1, 0, 3, 4, 5, 6, 7, 8] + ); + }); + + it('should normalize mixed series with string values for pie chart correctly', () => { + const data = { + series: ['1', {value: '0'}, '3', {value: '4'}, '5', '6', '7', '8'] + }; + + expect(getDataArray(data)).toEqual( + [1, 0, 3, 4, 5, 6, 7, 8] + ); + }); + + it('should normalize mixed series types with string values correctly', () => { + const data = { + labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + series: [ + {data: ['1', '0', '3', '4', '5', '6']}, + ['1', {value: '0'}, '3', {value: '4'}, '5', '6', '7', '8'], + {data: ['1', '0', {value: '3'}]} + ] + }; + + expect(getDataArray(data)).toEqual( + [ + [1, 0, 3, 4, 5, 6], + [1, 0, 3, 4, 5, 6, 7, 8], + [1, 0, 3] + ] + ); + }); + + it('should normalize mixed series types with weird values correctly', () => { + const data = { + labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + series: [ + {data: [null, NaN, undefined, '4', '5', '6']}, + ['1', {value: null}, '3', {value: NaN}, '5', '6', '7', '8'], + {data: ['1', '0', {value: undefined}]} + ] + }; + + expect(getDataArray(data)).toEqual( + [ + [undefined, undefined, undefined, 4, 5, 6], + [1, undefined, 3, undefined, 5, 6, 7, 8], + [1, 0, undefined] + ] + ); + }); + + it('should normalize correctly with 0 values in data series array objects', () => { + const data = { + labels: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri'], + series: [{ + data: [ + {value: 1}, + {value: 4}, + {value: 2}, + {value: 7}, + {value: 2}, + {value: 0} + ] + }] + }; + + expect(getDataArray(data)).toEqual( + [[1, 4, 2, 7, 2, 0]] + ); + }); + + it('should normalize correctly with mixed dimensional input into multi dimensional output', () => { + const data = { + labels: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri'], + series: [{ + data: [ + {value: 1}, + {value: {y: 4, x: 1}}, + {y: 2, x: 2}, + NaN, + null, + {value: 7}, + {value: 2}, + {value: null}, + {y: undefined, x: NaN} + ] + }] + }; + + expect(getDataArray(data, false, true)).toEqual( + [[ + {x: undefined, y: 1}, + {x: 1, y: 4}, + {x: 2, y: 2}, + undefined, + undefined, + {x: undefined, y: 7}, + {x: undefined, y: 2}, + undefined, + {x: undefined, y: undefined} + ]] + ); + }); + + it('should normalize boolean series correctly', () => { + const data = { + series: [true, false, false, true] + }; + + expect(getDataArray(data)).toEqual( + [1, 0, 0, 1] + ); + }); + + it('should normalize date series correctly', () => { + const data = { + series: [new Date(0), new Date(1), new Date(2), new Date(3)] + }; + + expect(getDataArray(data)).toEqual( + [0, 1, 2, 3] + ); + }); + }); + + describe('getBounds', () => { + it('should return 10 steps', () => { + const bounds = getBounds(100, {high: 10, low: 1}, 10, false); + expect(bounds.min).toBe(1); + expect(bounds.max).toBe(10); + expect(bounds.values).toEqual([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]); + }); + + it('should return 5 steps', () => { + const bounds = getBounds(100, {high: 10, low: 1}, 20, false); + expect(bounds.min).toBe(1); + expect(bounds.max).toBe(10); + expect(bounds.values).toEqual([1, 3, 5, 7, 9]); + }); + + it('should return non integer steps', () => { + const bounds = getBounds(100, {high: 2, low: 1}, 20, false); + expect(bounds.min).toBe(1); + expect(bounds.max).toBe(2); + expect(bounds.values).toEqual([1, 1.25, 1.5, 1.75, 2]); + }); + + it('should return integer steps only', () => { + const bounds = getBounds(100, {high: 3, low: 1}, 20, true); + expect(bounds.min).toBe(1); + expect(bounds.max).toBe(3); + expect(bounds.values).toEqual([1, 2, 3]); + }); + + it('should return single integer step', () => { + const bounds = getBounds(100, {high: 2, low: 1}, 20, true); + expect(bounds.min).toBe(1); + expect(bounds.max).toBe(2); + expect(bounds.values).toEqual([1, 2]); + }); + + it('should floor/ceil min/max', () => { + const bounds = getBounds(100, {high: 9.9, low: 1.01}, 20, false); + expect(bounds.min).toBe(1); + expect(bounds.max).toBe(10); + expect(bounds.values).toEqual([1, 3, 5, 7, 9]); + }); + + it('should floor/ceil min/max for non integers', () => { + const bounds = getBounds(100, {high: 2.9, low: 1.01}, 20, false); + expect(bounds.min).toBe(1); + expect(bounds.max).toBe(3); + expect(bounds.values).toEqual([1, 1.5, 2, 2.5, 3]); + }); + + it('should floor/ceil min/max if integers only', () => { + const bounds = getBounds(100, {high: 2.9, low: 1.01}, 20, true); + expect(bounds.min).toBe(1); + expect(bounds.max).toBe(3); + expect(bounds.values).toEqual([1, 2, 3]); + }); + + it('should return neg and pos values', () => { + const bounds = getBounds(100, {high: 1.9, low: -0.9}, 20, false); + expect(bounds.min).toBe(-1); + expect(bounds.max).toBe(2); + expect(bounds.values).toEqual([-1, 0, 1, 2]); + }); + + it('should return two steps if no space', () => { + const bounds = getBounds(100, {high: 5, low: 0}, 45, false); + expect(bounds.min).toBe(0); + expect(bounds.max).toBe(5); + expect(bounds.values).toEqual([0, 4]); + }); + + it('should return single step if no space', () => { + const bounds = getBounds(100, {high: 5, low: 0}, 80, false); + expect(bounds.min).toBe(0); + expect(bounds.max).toBe(5); + expect(bounds.values).toEqual([0]); + }); + + /* + TODO: This is currently failing with the ES6 refactoring and I can't tell why + it('should return single step if range is less than epsilon', () => { + const bounds = getBounds(100, { high: 1.0000000000000002, low: 1 }, 20, false); + expect(bounds.min).toBe(1); + expect(bounds.max).toBe(1.0000000000000002); + expect(bounds.low).toBe(1); + expect(bounds.high).toBe(1.0000000000000002); + expect(bounds.values).toEqual([1]); + });*/ + + it('should return single step if range is less than smallest increment', () => { + const bounds = getBounds(613.234375, {high: 1000.0000000000001, low: 999.9999999999997}, 50, false); + expect(bounds.min).toBe(999.9999999999999); + expect(bounds.max).toBe(1000); + expect(bounds.low).toBe(999.9999999999997); + expect(bounds.high).toBe(1000.0000000000001); + expect(bounds.values).toEqual([999.9999999999999]); + }); + }); + + describe('splitIntoSegments', () => { + function makeValues(arr) { + return arr.map(function (x) { + return {value: x}; + }); + } + + it('should return empty array for empty input', () => { + expect(splitIntoSegments([], [])).toEqual([]); + }); + + it('should remove undefined values', () => { + const coords = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]; + const values = makeValues([1, undefined, undefined, 4, undefined, 6]); + + expect(splitIntoSegments(coords, values)).toEqual([{ + pathCoordinates: [1, 2], + valueData: makeValues([1]) + }, { + pathCoordinates: [7, 8], + valueData: makeValues([4]) + }, { + pathCoordinates: [11, 12], + valueData: makeValues([6]) + }]); + }); + + it('should respect fillHoles option', () => { + const coords = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]; + const values = makeValues([1, undefined, undefined, 4, undefined, 6]); + const options = { + fillHoles: true + }; + + expect(splitIntoSegments(coords, values, options)).toEqual([{ + pathCoordinates: [1, 2, 7, 8, 11, 12], + valueData: makeValues([1, 4, 6]) + }]); + }); + + it('should respect increasingX option', () => { + const coords = [1, 2, 3, 4, 5, 6, 5, 6, 7, 8, 1, 2]; + const values = makeValues([1, 2, 3, 4, 5, 6]); + const options = { + increasingX: true + }; + + expect(splitIntoSegments(coords, values, options)).toEqual([{ + pathCoordinates: [1, 2, 3, 4, 5, 6], + valueData: makeValues([1, 2, 3]) + }, { + pathCoordinates: [5, 6, 7, 8], + valueData: makeValues([4, 5]) + }, { + pathCoordinates: [1, 2], + valueData: makeValues([6]) + }]); + }); + }); +}); diff --git a/src/core/extend.js b/src/core/extend.js new file mode 100644 index 00000000..610a3a31 --- /dev/null +++ b/src/core/extend.js @@ -0,0 +1,26 @@ +/** + * Simple recursive object extend + * + * @memberof Chartist.Core + * @param {Object} target Target object where the source will be merged into + * @param {Object...} sources This object (objects) will be merged into target and then target is returned + * @return {Object} An object that has the same reference as target but is extended and merged with the properties of source + */ +export function extend(target) { + var i, source, sourceProp; + target = target || {}; + + for (i = 1; i < arguments.length; i++) { + source = arguments[i]; + for (var prop in source) { + sourceProp = source[prop]; + if (typeof sourceProp === 'object' && sourceProp !== null && !(sourceProp instanceof Array)) { + target[prop] = extend(target[prop], sourceProp); + } else { + target[prop] = sourceProp; + } + } + } + + return target; +} diff --git a/src/core/functional.js b/src/core/functional.js new file mode 100644 index 00000000..465b5e05 --- /dev/null +++ b/src/core/functional.js @@ -0,0 +1,84 @@ +/** + * Helps to simplify functional style code + * + * @memberof Chartist.Core + * @param {*} n This exact value will be returned by the noop function + * @return {*} The same value that was provided to the n parameter + */ +export function noop(n) { + return n; +} + +/** + * Functional style helper to produce array with given length initialized with undefined values + * + * @memberof Chartist.Core + * @param length + * @return {Array} + */ +export function times(length) { + return Array.apply(null, new Array(length)); +} + +/** + * Sum helper to be used in reduce functions + * + * @memberof Chartist.Core + * @param previous + * @param current + * @return {*} + */ +export function sum(previous, current) { + return previous + (current ? current : 0); +} + +/** + * Multiply helper to be used in `Array.map` for multiplying each value of an array with a factor. + * + * @memberof Chartist.Core + * @param {Number} factor + * @returns {Function} Function that can be used in `Array.map` to multiply each value in an array + */ +export function mapMultiply(factor) { + return function(num) { + return num * factor; + }; +} + +/** + * Add helper to be used in `Array.map` for adding a addend to each value of an array. + * + * @memberof Chartist.Core + * @param {Number} addend + * @returns {Function} Function that can be used in `Array.map` to add a addend to each value in an array + */ +export function mapAdd(addend) { + return function(num) { + return num + addend; + }; +} + +/** + * Map for multi dimensional arrays where their nested arrays will be mapped in serial. The output array will have the length of the largest nested array. The callback function is called with variable arguments where each argument is the nested array value (or undefined if there are no more values). + * + * @memberof Chartist.Core + * @param arr + * @param cb + * @return {Array} + */ +export function serialMap(arr, cb) { + var result = [], + length = Math.max.apply(null, arr.map(function(e) { + return e.length; + })); + + times(length).forEach(function(e, index) { + var args = arr.map(function(e) { + return e[index]; + }); + + result[index] = cb.apply(null, args); + }); + + return result; +} diff --git a/src/core/globals.js b/src/core/globals.js new file mode 100644 index 00000000..c365e880 --- /dev/null +++ b/src/core/globals.js @@ -0,0 +1,34 @@ +export {version} from 'package.json!version'; + +/** + * This object contains all namespaces used within Chartist. + * + * @type {{svg: string, xmlns: string, xhtml: string, xlink: string, ct: string}} + */ +export let namespaces = { + svg: 'http://www.w3.org/2000/svg', + xmlns: 'http://www.w3.org/2000/xmlns/', + xhtml: 'http://www.w3.org/1999/xhtml', + xlink: 'http://www.w3.org/1999/xlink', + ct: 'http://gionkunz.github.com/chartist-js/ct' +}; + +/** + * Precision level used internally in Chartist for rounding. If you require more decimal places you can increase this number. + * + * @type {number} + */ +export let precision = 8; + +/** + * A map with characters to escape for strings to be safely used as attribute values. + * + * @type {Object} + */ +export let escapingMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + '\'': ''' +}; diff --git a/src/core/lang.js b/src/core/lang.js new file mode 100644 index 00000000..ccf189b7 --- /dev/null +++ b/src/core/lang.js @@ -0,0 +1,114 @@ +/** + * Replaces all occurrences of subStr in str with newSubStr and returns a new string. + * + * @param {String} str + * @param {String} subStr + * @param {String} newSubStr + * @return {String} + */ +export function replaceAll(str, subStr, newSubStr) { + return str.replace(new RegExp(subStr, 'g'), newSubStr); +} + +/** + * This is a wrapper around document.querySelector that will return the query if it's already of type Node + * + * @memberof Chartist.Core + * @param {String|Node} query The query to use for selecting a Node or a DOM node that will be returned directly + * @return {Node} + */ +export function querySelector(query) { + return query instanceof Node ? query : document.querySelector(query); +} + +/** + * This function safely checks if an objects has an owned property. + * + * @param {Object} object The object where to check for a property + * @param {string} property The property name + * @returns {boolean} Returns true if the object owns the specified property + */ +export function safeHasProperty(object, property) { + return object !== null && + typeof object === 'object' && + object.hasOwnProperty(property); +} + +/** + * Checks if a value can be safely coerced to a number. This includes all values except null which result in finite numbers when coerced. This excludes NaN, since it's not finite. + * + * @memberof Chartist.Core + * @param value + * @returns {Boolean} + */ +export function isNumeric(value) { + return value === null ? false : isFinite(value); +} + +/** + * Returns true on all falsey values except the numeric value 0. + * + * @memberof Chartist.Core + * @param value + * @returns {boolean} + */ +export function isFalseyButZero(value) { + return !value && value !== 0; +} + +/** + * Returns a number if the passed parameter is a valid number or the function will return undefined. On all other values than a valid number, this function will return undefined. + * + * @memberof Chartist.Core + * @param value + * @returns {*} + */ +export function getNumberOrUndefined(value) { + return isNumeric(value) ? +value : undefined; +} + +/** + * Converts a number to a string with a unit. If a string is passed then this will be returned unmodified. + * + * @memberof Chartist.Core + * @param {Number} value + * @param {String} unit + * @return {String} Returns the passed number value with unit. + */ +export function ensureUnit(value, unit) { + if(typeof value === 'number') { + value = value + unit; + } + + return value; +} + +/** + * Converts a number or string to a quantity object. + * + * @memberof Chartist.Core + * @param {String|Number} input + * @return {Object} Returns an object containing the value as number and the unit as string. + */ +export function quantity(input) { + if (typeof input === 'string') { + var match = (/^(\d+)\s*(.*)$/g).exec(input); + return { + value : +match[1], + unit: match[2] || undefined + }; + } + return { value: input }; +} + +/** + * Generates a-z from a number 0 to 26 + * + * @memberof Chartist.Core + * @param {Number} n A number from 0 to 26 that will result in a letter a-z + * @return {String} A character from a-z based on the input number n + */ +export function alphaNumerate(n) { + // Limit to a-z + return String.fromCharCode(97 + n % 26); +} diff --git a/src/core/lang.spec.js b/src/core/lang.spec.js new file mode 100644 index 00000000..719a750a --- /dev/null +++ b/src/core/lang.spec.js @@ -0,0 +1,24 @@ +import {quantity} from './lang'; + +describe('Lang', () => { + describe('quantity', () => { + it('should return value for numbers', () => { + expect(quantity(100)).toEqual({value: 100}); + expect(quantity(0)).toEqual({value: 0}); + expect(quantity(NaN)).toEqual({value: NaN}); + expect(quantity(null)).toEqual({value: null}); + expect(quantity(undefined)).toEqual({value: undefined}); + }); + + it('should return value without unit from string', () => { + expect(quantity('100')).toEqual({value: 100, unit: undefined}); + expect(quantity('0')).toEqual({value: 0, unit: undefined}); + }); + + it('should return value and unit from string', () => { + expect(quantity('100%')).toEqual({value: 100, unit: '%'}); + expect(quantity('100 %')).toEqual({value: 100, unit: '%'}); + expect(quantity('0px')).toEqual({value: 0, unit: 'px'}); + }); + }); +}); diff --git a/src/core/math.js b/src/core/math.js new file mode 100644 index 00000000..529906bb --- /dev/null +++ b/src/core/math.js @@ -0,0 +1,95 @@ +import {precision} from './globals'; + +/** + * Calculate the order of magnitude for the chart scale + * + * @memberof Chartist.Core + * @param {Number} value The value Range of the chart + * @return {Number} The order of magnitude + */ +export function orderOfMagnitude(value) { + return Math.floor(Math.log(Math.abs(value)) / Math.LN10); +} + +/** + * Project a data length into screen coordinates (pixels) + * + * @memberof Chartist.Core + * @param {Object} axisLength The svg element for the chart + * @param {Number} length Single data value from a series array + * @param {Object} bounds All the values to set the bounds of the chart + * @return {Number} The projected data length in pixels + */ +export function projectLength(axisLength, length, bounds) { + return length / bounds.range * axisLength; +} + +/** + * This helper function can be used to round values with certain precision level after decimal. This is used to prevent rounding errors near float point precision limit. + * + * @memberof Chartist.Core + * @param {Number} value The value that should be rounded with precision + * @param {Number} [digits] The number of digits after decimal used to do the rounding + * @returns {number} Rounded value + */ +export function roundWithPrecision(value, digits) { + var precision = Math.pow(10, digits || precision); + return Math.round(value * precision) / precision; +} + +/** + * Pollard Rho Algorithm to find smallest factor of an integer value. There are more efficient algorithms for factorization, but this one is quite efficient and not so complex. + * + * @memberof Chartist.Core + * @param {Number} num An integer number where the smallest factor should be searched for + * @returns {Number} The smallest integer factor of the parameter num. + */ +export function rho(num) { + if(num === 1) { + return num; + } + + function gcd(p, q) { + if (p % q === 0) { + return q; + } else { + return gcd(q, p % q); + } + } + + function f(x) { + return x * x + 1; + } + + var x1 = 2, x2 = 2, divisor; + if (num % 2 === 0) { + return 2; + } + + do { + x1 = f(x1) % num; + x2 = f(f(x2)) % num; + divisor = gcd(Math.abs(x1 - x2), num); + } while (divisor === 1); + + return divisor; +} + +/** + * Calculate cartesian coordinates of polar coordinates + * + * @memberof Chartist.Core + * @param {Number} centerX X-axis coordinates of center point of circle segment + * @param {Number} centerY X-axis coordinates of center point of circle segment + * @param {Number} radius Radius of circle segment + * @param {Number} angleInDegrees Angle of circle segment in degrees + * @return {{x:Number, y:Number}} Coordinates of point on circumference + */ +export function polarToCartesian(centerX, centerY, radius, angleInDegrees) { + var angleInRadians = (angleInDegrees - 90) * Math.PI / 180.0; + + return { + x: centerX + (radius * Math.cos(angleInRadians)), + y: centerY + (radius * Math.sin(angleInRadians)) + }; +} diff --git a/src/core/options-provider.js b/src/core/options-provider.js new file mode 100644 index 00000000..18c4a1aa --- /dev/null +++ b/src/core/options-provider.js @@ -0,0 +1,64 @@ +import {extend} from './extend'; + +/** + * Provides options handling functionality with callback for options changes triggered by responsive options and media query matches + * + * @memberof Chartist.Core + * @param {Object} options Options set by user + * @param {Array} responsiveOptions Optional functions to add responsive behavior to chart + * @param {Object} eventEmitter The event emitter that will be used to emit the options changed events + * @return {Object} The consolidated options object from the defaults, base and matching responsive options + */ +export function optionsProvider(options, responsiveOptions, eventEmitter) { + var baseOptions = extend({}, options), + currentOptions, + mediaQueryListeners = [], + i; + + function updateCurrentOptions(mediaEvent) { + var previousOptions = currentOptions; + currentOptions = extend({}, baseOptions); + + if (responsiveOptions) { + for (i = 0; i < responsiveOptions.length; i++) { + var mql = window.matchMedia(responsiveOptions[i][0]); + if (mql.matches) { + currentOptions = extend(currentOptions, responsiveOptions[i][1]); + } + } + } + + if(eventEmitter && mediaEvent) { + eventEmitter.emit('optionsChanged', { + previousOptions: previousOptions, + currentOptions: currentOptions + }); + } + } + + function removeMediaQueryListeners() { + mediaQueryListeners.forEach(function(mql) { + mql.removeListener(updateCurrentOptions); + }); + } + + if (!window.matchMedia) { + throw 'window.matchMedia not found! Make sure you\'re using a polyfill.'; + } else if (responsiveOptions) { + + for (i = 0; i < responsiveOptions.length; i++) { + var mql = window.matchMedia(responsiveOptions[i][0]); + mql.addListener(updateCurrentOptions); + mediaQueryListeners.push(mql); + } + } + // Execute initially without an event argument so we get the correct options + updateCurrentOptions(); + + return { + removeMediaQueryListeners: removeMediaQueryListeners, + getCurrentOptions: function getCurrentOptions() { + return extend({}, currentOptions); + } + }; +} diff --git a/src/event/event-emitter.js b/src/event/event-emitter.js new file mode 100644 index 00000000..c00bcf09 --- /dev/null +++ b/src/event/event-emitter.js @@ -0,0 +1,63 @@ +export class EventEmitter { + constructor() { + this.handlers = []; + } + + /** + * Add an event handler for a specific event + * + * @memberof Chartist.Event + * @param {String} event The event name + * @param {Function} handler A event handler function + */ + addEventHandler(event, handler) { + this.handlers[event] = this.handlers[event] || []; + this.handlers[event].push(handler); + } + + /** + * Remove an event handler of a specific event name or remove all event handlers for a specific event. + * + * @memberof Chartist.Event + * @param {String} event The event name where a specific or all handlers should be removed + * @param {Function} [handler] An optional event handler function. If specified only this specific handler will be removed and otherwise all handlers are removed. + */ + removeEventHandler(event, handler) { + // Only do something if there are event handlers with this name existing + if(this.handlers[event]) { + // If handler is set we will look for a specific handler and only remove this + if(handler) { + this.handlers[event].splice(this.handlers[event].indexOf(handler), 1); + if(this.handlers[event].length === 0) { + delete this.handlers[event]; + } + } else { + // If no handler is specified we remove all handlers for this event + delete this.handlers[event]; + } + } + } + + /** + * Use this function to emit an event. All handlers that are listening for this event will be triggered with the data parameter. + * + * @memberof Chartist.Event + * @param {String} event The event name that should be triggered + * @param {*} data Arbitrary data that will be passed to the event handler callback functions + */ + emit(event, data) { + // Only do something if there are event handlers with this name existing + if(this.handlers[event]) { + this.handlers[event].forEach(function(handler) { + handler(data); + }); + } + + // Emit event to star event handlers + if(this.handlers['*']) { + this.handlers['*'].forEach(function(starHandler) { + starHandler(event, data); + }); + } + } +} diff --git a/src/index.js b/src/index.js new file mode 100644 index 00000000..b2dad7d9 --- /dev/null +++ b/src/index.js @@ -0,0 +1,11 @@ +export * from './core/core'; +export {EventEmitter} from './event/event-emitter'; +export * from './charts/charts'; +export * from './axes/axes'; +import * as Interpolation from './interpolation/interpolation'; +export { + Interpolation +}; +export * from './svg/svg'; +export * from './svg/svg-list'; +export * from './svg/svg-path'; diff --git a/src/interpolation/cardinal.js b/src/interpolation/cardinal.js new file mode 100644 index 00000000..2c51abab --- /dev/null +++ b/src/interpolation/cardinal.js @@ -0,0 +1,111 @@ +import {extend, splitIntoSegments} from '../core/core'; +import {SvgPath} from '../svg/svg-path'; +import {none} from './none'; + +/** + * Cardinal / Catmull-Rome spline interpolation is the default smoothing function in Chartist. It produces nice results where the splines will always meet the points. It produces some artifacts though when data values are increased or decreased rapidly. The line may not follow a very accurate path and if the line should be accurate this smoothing function does not produce the best results. + * + * Cardinal splines can only be created if there are more than two data points. If this is not the case this smoothing will fallback to `Chartist.Smoothing.none`. + * + * All smoothing functions within Chartist are factory functions that accept an options parameter. The cardinal interpolation function accepts one configuration parameter `tension`, between 0 and 1, which controls the smoothing intensity. + * + * @example + * var chart = new Chartist.Line('.ct-chart', { + * labels: [1, 2, 3, 4, 5], + * series: [[1, 2, 8, 1, 7]] + * }, { + * lineSmooth: Chartist.Interpolation.cardinal({ + * tension: 1, + * fillHoles: false + * }) + * }); + * + * @memberof Chartist.Interpolation + * @param {Object} options The options of the cardinal factory function. + * @return {Function} + */ +export function cardinal(options) { + var defaultOptions = { + tension: 1, + fillHoles: false + }; + + options = extend({}, defaultOptions, options); + + var t = Math.min(1, Math.max(0, options.tension)), + c = 1 - t; + + return function cardinal(pathCoordinates, valueData) { + // First we try to split the coordinates into segments + // This is necessary to treat "holes" in line charts + var segments = splitIntoSegments(pathCoordinates, valueData, { + fillHoles: options.fillHoles + }); + + if(!segments.length) { + // If there were no segments return 'none' interpolation + return none()([]); + } else if(segments.length > 1) { + // If the split resulted in more that one segment we need to interpolate each segment individually and join them + // afterwards together into a single path. + var paths = []; + // For each segment we will recurse the cardinal function + segments.forEach(function(segment) { + paths.push(cardinal(segment.pathCoordinates, segment.valueData)); + }); + // Join the segment path data into a single path and return + return SvgPath.join(paths); + } else { + // If there was only one segment we can proceed regularly by using pathCoordinates and valueData from the first + // segment + pathCoordinates = segments[0].pathCoordinates; + valueData = segments[0].valueData; + + // If less than two points we need to fallback to no smoothing + if(pathCoordinates.length <= 4) { + return none()(pathCoordinates, valueData); + } + + var path = new SvgPath().move(pathCoordinates[0], pathCoordinates[1], false, valueData[0]), + z; + + for (var i = 0, iLen = pathCoordinates.length; iLen - 2 * !z > i; i += 2) { + var p = [ + {x: +pathCoordinates[i - 2], y: +pathCoordinates[i - 1]}, + {x: +pathCoordinates[i], y: +pathCoordinates[i + 1]}, + {x: +pathCoordinates[i + 2], y: +pathCoordinates[i + 3]}, + {x: +pathCoordinates[i + 4], y: +pathCoordinates[i + 5]} + ]; + if (z) { + if (!i) { + p[0] = {x: +pathCoordinates[iLen - 2], y: +pathCoordinates[iLen - 1]}; + } else if (iLen - 4 === i) { + p[3] = {x: +pathCoordinates[0], y: +pathCoordinates[1]}; + } else if (iLen - 2 === i) { + p[2] = {x: +pathCoordinates[0], y: +pathCoordinates[1]}; + p[3] = {x: +pathCoordinates[2], y: +pathCoordinates[3]}; + } + } else { + if (iLen - 4 === i) { + p[3] = p[2]; + } else if (!i) { + p[0] = {x: +pathCoordinates[i], y: +pathCoordinates[i + 1]}; + } + } + + path.curve( + (t * (-p[0].x + 6 * p[1].x + p[2].x) / 6) + (c * p[2].x), + (t * (-p[0].y + 6 * p[1].y + p[2].y) / 6) + (c * p[2].y), + (t * (p[1].x + 6 * p[2].x - p[3].x) / 6) + (c * p[2].x), + (t * (p[1].y + 6 * p[2].y - p[3].y) / 6) + (c * p[2].y), + p[2].x, + p[2].y, + false, + valueData[(i + 2) / 2] + ); + } + + return path; + } + }; +} diff --git a/src/interpolation/interpolation.js b/src/interpolation/interpolation.js new file mode 100644 index 00000000..439af287 --- /dev/null +++ b/src/interpolation/interpolation.js @@ -0,0 +1,5 @@ +export {none} from './none'; +export {simple} from './simple'; +export {step} from './step'; +export {cardinal} from './cardinal'; +export {monotoneCubic} from './monotone-cubic'; diff --git a/src/interpolation/monotone-cubic.js b/src/interpolation/monotone-cubic.js new file mode 100644 index 00000000..91792330 --- /dev/null +++ b/src/interpolation/monotone-cubic.js @@ -0,0 +1,134 @@ +import {extend, splitIntoSegments} from '../core/core'; +import {SvgPath} from '../svg/svg-path'; +import {none} from './none'; + +/** + * Monotone Cubic spline interpolation produces a smooth curve which preserves monotonicity. Unlike cardinal splines, the curve will not extend beyond the range of y-values of the original data points. + * + * Monotone Cubic splines can only be created if there are more than two data points. If this is not the case this smoothing will fallback to `Chartist.Smoothing.none`. + * + * The x-values of subsequent points must be increasing to fit a Monotone Cubic spline. If this condition is not met for a pair of adjacent points, then there will be a break in the curve between those data points. + * + * All smoothing functions within Chartist are factory functions that accept an options parameter. + * + * @example + * var chart = new Chartist.Line('.ct-chart', { + * labels: [1, 2, 3, 4, 5], + * series: [[1, 2, 8, 1, 7]] + * }, { + * lineSmooth: Chartist.Interpolation.monotoneCubic({ + * fillHoles: false + * }) + * }); + * + * @memberof Chartist.Interpolation + * @param {Object} [options] The options of the monotoneCubic factory function. + * @return {Function} + */ +export function monotoneCubic(options) { + var defaultOptions = { + fillHoles: false + }; + + options = extend({}, defaultOptions, options); + + return function monotoneCubic(pathCoordinates, valueData) { + // First we try to split the coordinates into segments + // This is necessary to treat "holes" in line charts + var segments = splitIntoSegments(pathCoordinates, valueData, { + fillHoles: options.fillHoles, + increasingX: true + }); + + if(!segments.length) { + // If there were no segments return 'Chartist.Interpolation.none' + return none()([]); + } else if(segments.length > 1) { + // If the split resulted in more that one segment we need to interpolate each segment individually and join them + // afterwards together into a single path. + var paths = []; + // For each segment we will recurse the monotoneCubic fn function + segments.forEach(function(segment) { + paths.push(monotoneCubic(segment.pathCoordinates, segment.valueData)); + }); + // Join the segment path data into a single path and return + return SvgPath.join(paths); + } else { + // If there was only one segment we can proceed regularly by using pathCoordinates and valueData from the first + // segment + pathCoordinates = segments[0].pathCoordinates; + valueData = segments[0].valueData; + + // If less than three points we need to fallback to no smoothing + if(pathCoordinates.length <= 4) { + return none()(pathCoordinates, valueData); + } + + var xs = [], + ys = [], + i, + n = pathCoordinates.length / 2, + ms = [], + ds = [], dys = [], dxs = [], + path; + + // Populate x and y coordinates into separate arrays, for readability + + for(i = 0; i < n; i++) { + xs[i] = pathCoordinates[i * 2]; + ys[i] = pathCoordinates[i * 2 + 1]; + } + + // Calculate deltas and derivative + + for(i = 0; i < n - 1; i++) { + dys[i] = ys[i + 1] - ys[i]; + dxs[i] = xs[i + 1] - xs[i]; + ds[i] = dys[i] / dxs[i]; + } + + // Determine desired slope (m) at each point using Fritsch-Carlson method + // See: http://math.stackexchange.com/questions/45218/implementation-of-monotone-cubic-interpolation + + ms[0] = ds[0]; + ms[n - 1] = ds[n - 2]; + + for(i = 1; i < n - 1; i++) { + if(ds[i] === 0 || ds[i - 1] === 0 || (ds[i - 1] > 0) !== (ds[i] > 0)) { + ms[i] = 0; + } else { + ms[i] = 3 * (dxs[i - 1] + dxs[i]) / ( + (2 * dxs[i] + dxs[i - 1]) / ds[i - 1] + + (dxs[i] + 2 * dxs[i - 1]) / ds[i]); + + if(!isFinite(ms[i])) { + ms[i] = 0; + } + } + } + + // Now build a path from the slopes + + path = new SvgPath().move(xs[0], ys[0], false, valueData[0]); + + for(i = 0; i < n - 1; i++) { + path.curve( + // First control point + xs[i] + dxs[i] / 3, + ys[i] + ms[i] * dxs[i] / 3, + // Second control point + xs[i + 1] - dxs[i] / 3, + ys[i + 1] - ms[i + 1] * dxs[i] / 3, + // End point + xs[i + 1], + ys[i + 1], + + false, + valueData[i + 1] + ); + } + + return path; + } + }; +} diff --git a/src/interpolation/none.js b/src/interpolation/none.js new file mode 100644 index 00000000..c2e5e6c7 --- /dev/null +++ b/src/interpolation/none.js @@ -0,0 +1,51 @@ +import {extend, getMultiValue} from '../core/core'; +import {SvgPath} from '../svg/svg-path'; + +/** + * This interpolation function does not smooth the path and the result is only containing lines and no curves. + * + * @example + * var chart = new Chartist.Line('.ct-chart', { + * labels: [1, 2, 3, 4, 5], + * series: [[1, 2, 8, 1, 7]] + * }, { + * lineSmooth: Chartist.Interpolation.none({ + * fillHoles: false + * }) + * }); + * + * + * @memberof Chartist.Interpolation + * @return {Function} + */ +export function none(options) { + var defaultOptions = { + fillHoles: false + }; + options = extend({}, defaultOptions, options); + return function none(pathCoordinates, valueData) { + var path = new SvgPath(); + var hole = true; + + for(var i = 0; i < pathCoordinates.length; i += 2) { + var currX = pathCoordinates[i]; + var currY = pathCoordinates[i + 1]; + var currData = valueData[i / 2]; + + if(getMultiValue(currData.value) !== undefined) { + + if(hole) { + path.move(currX, currY, false, currData); + } else { + path.line(currX, currY, false, currData); + } + + hole = false; + } else if(!options.fillHoles) { + hole = true; + } + } + + return path; + }; +} diff --git a/src/interpolation/simple.js b/src/interpolation/simple.js new file mode 100644 index 00000000..b3fc806c --- /dev/null +++ b/src/interpolation/simple.js @@ -0,0 +1,73 @@ +import {extend} from '../core/core'; +import {SvgPath} from '../svg/svg-path'; + +/** + * Simple smoothing creates horizontal handles that are positioned with a fraction of the length between two data points. You can use the divisor option to specify the amount of smoothing. + * + * Simple smoothing can be used instead of `Chartist.Smoothing.cardinal` if you'd like to get rid of the artifacts it produces sometimes. Simple smoothing produces less flowing lines but is accurate by hitting the points and it also doesn't swing below or above the given data point. + * + * All smoothing functions within Chartist are factory functions that accept an options parameter. The simple interpolation function accepts one configuration parameter `divisor`, between 1 and ∞, which controls the smoothing characteristics. + * + * @example + * var chart = new Chartist.Line('.ct-chart', { + * labels: [1, 2, 3, 4, 5], + * series: [[1, 2, 8, 1, 7]] + * }, { + * lineSmooth: Chartist.Interpolation.simple({ + * divisor: 2, + * fillHoles: false + * }) + * }); + * + * + * @memberof Chartist.Interpolation + * @param {Object} options The options of the simple interpolation factory function. + * @return {Function} + */ +export function simple(options) { + var defaultOptions = { + divisor: 2, + fillHoles: false + }; + options = extend({}, defaultOptions, options); + + var d = 1 / Math.max(1, options.divisor); + + return function simple(pathCoordinates, valueData) { + var path = new SvgPath(); + var prevX, prevY, prevData; + + for(var i = 0; i < pathCoordinates.length; i += 2) { + var currX = pathCoordinates[i]; + var currY = pathCoordinates[i + 1]; + var length = (currX - prevX) * d; + var currData = valueData[i / 2]; + + if(currData.value !== undefined) { + + if(prevData === undefined) { + path.move(currX, currY, false, currData); + } else { + path.curve( + prevX + length, + prevY, + currX - length, + currY, + currX, + currY, + false, + currData + ); + } + + prevX = currX; + prevY = currY; + prevData = currData; + } else if(!options.fillHoles) { + prevX = currX = prevData = undefined; + } + } + + return path; + }; +} diff --git a/src/interpolation/step.js b/src/interpolation/step.js new file mode 100644 index 00000000..8fadea0e --- /dev/null +++ b/src/interpolation/step.js @@ -0,0 +1,68 @@ +import {extend} from '../core/core'; +import {SvgPath} from '../svg/svg-path'; + +/** + * Step interpolation will cause the line chart to move in steps rather than diagonal or smoothed lines. This interpolation will create additional points that will also be drawn when the `showPoint` option is enabled. + * + * All smoothing functions within Chartist are factory functions that accept an options parameter. The step interpolation function accepts one configuration parameter `postpone`, that can be `true` or `false`. The default value is `true` and will cause the step to occur where the value actually changes. If a different behaviour is needed where the step is shifted to the left and happens before the actual value, this option can be set to `false`. + * + * @example + * var chart = new Chartist.Line('.ct-chart', { + * labels: [1, 2, 3, 4, 5], + * series: [[1, 2, 8, 1, 7]] + * }, { + * lineSmooth: Chartist.Interpolation.step({ + * postpone: true, + * fillHoles: false + * }) + * }); + * + * @memberof Chartist.Interpolation + * @param options + * @returns {Function} + */ +export function step(options) { + var defaultOptions = { + postpone: true, + fillHoles: false + }; + + options = extend({}, defaultOptions, options); + + return function step(pathCoordinates, valueData) { + var path = new SvgPath(); + + var prevX, prevY, prevData; + + for (var i = 0; i < pathCoordinates.length; i += 2) { + var currX = pathCoordinates[i]; + var currY = pathCoordinates[i + 1]; + var currData = valueData[i / 2]; + + // If the current point is also not a hole we can draw the step lines + if(currData.value !== undefined) { + if(prevData === undefined) { + path.move(currX, currY, false, currData); + } else { + if(options.postpone) { + // If postponed we should draw the step line with the value of the previous value + path.line(currX, prevY, false, prevData); + } else { + // If not postponed we should draw the step line with the value of the current value + path.line(prevX, currY, false, currData); + } + // Line to the actual point (this should only be a Y-Axis movement + path.line(currX, currY, false, currData); + } + + prevX = currX; + prevY = currY; + prevData = currData; + } else if(!options.fillHoles) { + prevX = prevY = prevData = undefined; + } + } + + return path; + }; +} diff --git a/src/styles/chartist.scss b/src/styles/chartist.scss new file mode 100644 index 00000000..e3caaa6b --- /dev/null +++ b/src/styles/chartist.scss @@ -0,0 +1,241 @@ +@import "settings/chartist-settings"; + +@mixin ct-responsive-svg-container($width: 100%, $ratio: $ct-container-ratio) { + display: block; + position: relative; + width: $width; + + &:before { + display: block; + float: left; + content: ""; + width: 0; + height: 0; + padding-bottom: $ratio * 100%; + } + + &:after { + content: ""; + display: table; + clear: both; + } + + > svg { + display: block; + position: absolute; + top: 0; + left: 0; + } +} + +@mixin ct-align-justify($ct-text-align: $ct-text-align, $ct-text-justify: $ct-text-justify) { + -webkit-box-align: $ct-text-align; + -webkit-align-items: $ct-text-align; + -ms-flex-align: $ct-text-align; + align-items: $ct-text-align; + -webkit-box-pack: $ct-text-justify; + -webkit-justify-content: $ct-text-justify; + -ms-flex-pack: $ct-text-justify; + justify-content: $ct-text-justify; + // Fallback to text-align for non-flex browsers + @if($ct-text-justify == 'flex-start') { + text-align: left; + } @else if ($ct-text-justify == 'flex-end') { + text-align: right; + } @else { + text-align: center; + } +} + +@mixin ct-flex() { + // Fallback to block + display: block; + display: -webkit-box; + display: -moz-box; + display: -ms-flexbox; + display: -webkit-flex; + display: flex; +} + +@mixin ct-chart-label($ct-text-color: $ct-text-color, $ct-text-size: $ct-text-size, $ct-text-line-height: $ct-text-line-height) { + fill: $ct-text-color; + color: $ct-text-color; + font-size: $ct-text-size; + line-height: $ct-text-line-height; +} + +@mixin ct-chart-grid($ct-grid-color: $ct-grid-color, $ct-grid-width: $ct-grid-width, $ct-grid-dasharray: $ct-grid-dasharray) { + stroke: $ct-grid-color; + stroke-width: $ct-grid-width; + + @if ($ct-grid-dasharray) { + stroke-dasharray: $ct-grid-dasharray; + } +} + +@mixin ct-chart-point($ct-point-size: $ct-point-size, $ct-point-shape: $ct-point-shape) { + stroke-width: $ct-point-size; + stroke-linecap: $ct-point-shape; +} + +@mixin ct-chart-line($ct-line-width: $ct-line-width, $ct-line-dasharray: $ct-line-dasharray) { + fill: none; + stroke-width: $ct-line-width; + + @if ($ct-line-dasharray) { + stroke-dasharray: $ct-line-dasharray; + } +} + +@mixin ct-chart-area($ct-area-opacity: $ct-area-opacity) { + stroke: none; + fill-opacity: $ct-area-opacity; +} + +@mixin ct-chart-bar($ct-bar-width: $ct-bar-width) { + fill: none; + stroke-width: $ct-bar-width; +} + +@mixin ct-chart-donut($ct-donut-width: $ct-donut-width) { + fill: none; + stroke-width: $ct-donut-width; +} + +@mixin ct-chart-series-color($color) { + .#{$ct-class-point}, .#{$ct-class-line}, .#{$ct-class-bar}, .#{$ct-class-slice-donut} { + stroke: $color; + } + + .#{$ct-class-slice-pie}, .#{$ct-class-area} { + fill: $color; + } +} + +@mixin ct-chart($ct-container-ratio: $ct-container-ratio, $ct-text-color: $ct-text-color, $ct-text-size: $ct-text-size, $ct-grid-color: $ct-grid-color, $ct-grid-width: $ct-grid-width, $ct-grid-dasharray: $ct-grid-dasharray, $ct-point-size: $ct-point-size, $ct-point-shape: $ct-point-shape, $ct-line-width: $ct-line-width, $ct-bar-width: $ct-bar-width, $ct-donut-width: $ct-donut-width, $ct-series-names: $ct-series-names, $ct-series-colors: $ct-series-colors) { + + .#{$ct-class-label} { + @include ct-chart-label($ct-text-color, $ct-text-size); + } + + .#{$ct-class-chart-line} .#{$ct-class-label}, + .#{$ct-class-chart-bar} .#{$ct-class-label} { + @include ct-flex(); + } + + .#{$ct-class-chart-pie} .#{$ct-class-label}, + .#{$ct-class-chart-donut} .#{$ct-class-label} { + dominant-baseline: central; + } + + .#{$ct-class-label}.#{$ct-class-horizontal}.#{$ct-class-start} { + @include ct-align-justify(flex-end, flex-start); + // Fallback for browsers that don't support foreignObjects + text-anchor: start; + } + + .#{$ct-class-label}.#{$ct-class-horizontal}.#{$ct-class-end} { + @include ct-align-justify(flex-start, flex-start); + // Fallback for browsers that don't support foreignObjects + text-anchor: start; + } + + .#{$ct-class-label}.#{$ct-class-vertical}.#{$ct-class-start} { + @include ct-align-justify(flex-end, flex-end); + // Fallback for browsers that don't support foreignObjects + text-anchor: end; + } + + .#{$ct-class-label}.#{$ct-class-vertical}.#{$ct-class-end} { + @include ct-align-justify(flex-end, flex-start); + // Fallback for browsers that don't support foreignObjects + text-anchor: start; + } + + .#{$ct-class-chart-bar} .#{$ct-class-label}.#{$ct-class-horizontal}.#{$ct-class-start} { + @include ct-align-justify(flex-end, center); + // Fallback for browsers that don't support foreignObjects + text-anchor: start; + } + + .#{$ct-class-chart-bar} .#{$ct-class-label}.#{$ct-class-horizontal}.#{$ct-class-end} { + @include ct-align-justify(flex-start, center); + // Fallback for browsers that don't support foreignObjects + text-anchor: start; + } + + .#{$ct-class-chart-bar}.#{$ct-class-horizontal-bars} .#{$ct-class-label}.#{$ct-class-horizontal}.#{$ct-class-start} { + @include ct-align-justify(flex-end, flex-start); + // Fallback for browsers that don't support foreignObjects + text-anchor: start; + } + + .#{$ct-class-chart-bar}.#{$ct-class-horizontal-bars} .#{$ct-class-label}.#{$ct-class-horizontal}.#{$ct-class-end} { + @include ct-align-justify(flex-start, flex-start); + // Fallback for browsers that don't support foreignObjects + text-anchor: start; + } + + .#{$ct-class-chart-bar}.#{$ct-class-horizontal-bars} .#{$ct-class-label}.#{$ct-class-vertical}.#{$ct-class-start} { + //@include ct-chart-label($ct-text-color, $ct-text-size, center, $ct-vertical-text-justify); + @include ct-align-justify(center, flex-end); + // Fallback for browsers that don't support foreignObjects + text-anchor: end; + } + + .#{$ct-class-chart-bar}.#{$ct-class-horizontal-bars} .#{$ct-class-label}.#{$ct-class-vertical}.#{$ct-class-end} { + @include ct-align-justify(center, flex-start); + // Fallback for browsers that don't support foreignObjects + text-anchor: end; + } + + .#{$ct-class-grid} { + @include ct-chart-grid($ct-grid-color, $ct-grid-width, $ct-grid-dasharray); + } + + .#{$ct-class-grid-background} { + fill: $ct-grid-background-fill; + } + + .#{$ct-class-point} { + @include ct-chart-point($ct-point-size, $ct-point-shape); + } + + .#{$ct-class-line} { + @include ct-chart-line($ct-line-width); + } + + .#{$ct-class-area} { + @include ct-chart-area(); + } + + .#{$ct-class-bar} { + @include ct-chart-bar($ct-bar-width); + } + + .#{$ct-class-slice-donut} { + @include ct-chart-donut($ct-donut-width); + } + + @if $ct-include-colored-series { + @for $i from 0 to length($ct-series-names) { + .#{$ct-class-series}-#{nth($ct-series-names, $i + 1)} { + $color: nth($ct-series-colors, $i + 1); + + @include ct-chart-series-color($color); + } + } + } +} + +@if $ct-include-classes { + @include ct-chart(); + + @if $ct-include-alternative-responsive-containers { + @for $i from 0 to length($ct-scales-names) { + .#{nth($ct-scales-names, $i + 1)} { + @include ct-responsive-svg-container($ratio: nth($ct-scales, $i + 1)); + } + } + } +} diff --git a/src/styles/settings/_chartist-settings.scss b/src/styles/settings/_chartist-settings.scss new file mode 100644 index 00000000..4d0370eb --- /dev/null +++ b/src/styles/settings/_chartist-settings.scss @@ -0,0 +1,87 @@ +// Scales for responsive SVG containers +$ct-scales: ((1), (15/16), (8/9), (5/6), (4/5), (3/4), (2/3), (5/8), (1/1.618), (3/5), (9/16), (8/15), (1/2), (2/5), (3/8), (1/3), (1/4)) !default; +$ct-scales-names: (ct-square, ct-minor-second, ct-major-second, ct-minor-third, ct-major-third, ct-perfect-fourth, ct-perfect-fifth, ct-minor-sixth, ct-golden-section, ct-major-sixth, ct-minor-seventh, ct-major-seventh, ct-octave, ct-major-tenth, ct-major-eleventh, ct-major-twelfth, ct-double-octave) !default; + +// Class names to be used when generating CSS +$ct-class-chart: ct-chart !default; +$ct-class-chart-line: ct-chart-line !default; +$ct-class-chart-bar: ct-chart-bar !default; +$ct-class-horizontal-bars: ct-horizontal-bars !default; +$ct-class-chart-pie: ct-chart-pie !default; +$ct-class-chart-donut: ct-chart-donut !default; +$ct-class-label: ct-label !default; +$ct-class-series: ct-series !default; +$ct-class-line: ct-line !default; +$ct-class-point: ct-point !default; +$ct-class-area: ct-area !default; +$ct-class-bar: ct-bar !default; +$ct-class-slice-pie: ct-slice-pie !default; +$ct-class-slice-donut: ct-slice-donut !default; +$ct-class-grid: ct-grid !default; +$ct-class-grid-background: ct-grid-background !default; +$ct-class-vertical: ct-vertical !default; +$ct-class-horizontal: ct-horizontal !default; +$ct-class-start: ct-start !default; +$ct-class-end: ct-end !default; + +// Container ratio +$ct-container-ratio: (1/1.618) !default; + +// Text styles for labels +$ct-text-color: rgba(0, 0, 0, 0.4) !default; +$ct-text-size: 0.75rem !default; +$ct-text-align: flex-start !default; +$ct-text-justify: flex-start !default; +$ct-text-line-height: 1; + +// Grid styles +$ct-grid-color: rgba(0, 0, 0, 0.2) !default; +$ct-grid-dasharray: 2px !default; +$ct-grid-width: 1px !default; +$ct-grid-background-fill: none !default; + +// Line chart properties +$ct-line-width: 4px !default; +$ct-line-dasharray: false !default; +$ct-point-size: 10px !default; +// Line chart point, can be either round or square +$ct-point-shape: round !default; +// Area fill transparency between 0 and 1 +$ct-area-opacity: 0.1 !default; + +// Bar chart bar width +$ct-bar-width: 10px !default; + +// Donut width (If donut width is to big it can cause issues where the shape gets distorted) +$ct-donut-width: 60px !default; + +// If set to true it will include the default classes and generate CSS output. If you're planning to use the mixins you +// should set this property to false +$ct-include-classes: true !default; + +// If this is set to true the CSS will contain colored series. You can extend or change the color with the +// properties below +$ct-include-colored-series: $ct-include-classes !default; + +// If set to true this will include all responsive container variations using the scales defined at the top of the script +$ct-include-alternative-responsive-containers: $ct-include-classes !default; + +// Series names and colors. This can be extended or customized as desired. Just add more series and colors. +$ct-series-names: (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o) !default; +$ct-series-colors: ( + #d70206, + #f05b4f, + #f4c63d, + #d17905, + #453d3f, + #59922b, + #0544d3, + #6b0392, + #f05b4f, + #dda458, + #eacf7d, + #86797d, + #b2c326, + #6188e2, + #a748ca +) !default; diff --git a/src/svg/svg-list.js b/src/svg/svg-list.js new file mode 100644 index 00000000..b56d40b6 --- /dev/null +++ b/src/svg/svg-list.js @@ -0,0 +1,41 @@ +import {Svg} from './svg'; + +/** + * This helper class is to wrap multiple `Svg` elements into a list where you can call the `Svg` functions on all elements in the list with one call. This is helpful when you'd like to perform calls with `Svg` on multiple elements. + * An instance of this class is also returned by `Svg.querySelectorAll`. + * + * @memberof Svg + * @param {Array|NodeList} nodeList An Array of SVG DOM nodes or a SVG DOM NodeList (as returned by document.querySelectorAll) + * @constructor + */ +export class SvgList { + constructor(nodeList) { + var list = this; + + this.svgElements = []; + for(var i = 0; i < nodeList.length; i++) { + this.svgElements.push(new Svg(nodeList[i])); + } + + // Add delegation methods for Svg + Object.keys(Svg.prototype).filter(function(prototypeProperty) { + return ['constructor', + 'parent', + 'querySelector', + 'querySelectorAll', + 'replace', + 'append', + 'classes', + 'height', + 'width'].indexOf(prototypeProperty) === -1; + }).forEach(function(prototypeProperty) { + list[prototypeProperty] = function() { + var args = Array.prototype.slice.call(arguments, 0); + list.svgElements.forEach(function(element) { + Svg.prototype[prototypeProperty].apply(element, args); + }); + return list; + }; + }); + } +} diff --git a/src/svg/svg-path.js b/src/svg/svg-path.js new file mode 100644 index 00000000..d634d9ee --- /dev/null +++ b/src/svg/svg-path.js @@ -0,0 +1,358 @@ +import {extend} from '../core/core'; + +/** + * Contains the descriptors of supported element types in a SVG path. Currently only move, line and curve are supported. + * + * @memberof SvgPath + * @type {Object} + */ +const elementDescriptions = { + m: ['x', 'y'], + l: ['x', 'y'], + c: ['x1', 'y1', 'x2', 'y2', 'x', 'y'], + a: ['rx', 'ry', 'xAr', 'lAf', 'sf', 'x', 'y'] +}; + +/** + * Default options for newly created SVG path objects. + * + * @memberof SvgPath + * @type {Object} + */ +const defaultOptions = { + // The accuracy in digit count after the decimal point. This will be used to round numbers in the SVG path. If this option is set to false then no rounding will be performed. + accuracy: 3 +}; + +function element(command, params, pathElements, pos, relative, data) { + var pathElement = extend({ + command: relative ? command.toLowerCase() : command.toUpperCase() + }, params, data ? { data: data } : {} ); + + pathElements.splice(pos, 0, pathElement); +} + +function forEachParam(pathElements, cb) { + pathElements.forEach(function(pathElement, pathElementIndex) { + elementDescriptions[pathElement.command.toLowerCase()].forEach(function(paramName, paramIndex) { + cb(pathElement, paramName, pathElementIndex, paramIndex, pathElements); + }); + }); +} + +/** + * Used to construct a new path object. + * + * @memberof SvgPath + * @param {Boolean} close If set to true then this path will be closed when stringified (with a Z at the end) + * @param {Object} options Options object that overrides the default objects. See default options for more details. + * @constructor + */ +export class SvgPath { + /** + * This static function on `SvgPath` is joining multiple paths together into one paths. + * + * @memberof SvgPath + * @param {Array} paths A list of paths to be joined together. The order is important. + * @param {boolean} [close] If the newly created path should be a closed path + * @param {Object} [options] Path options for the newly created path. + * @return {SvgPath} + */ + static join(paths, close, options) { + var joinedPath = new SvgPath(close, options); + for(var i = 0; i < paths.length; i++) { + var path = paths[i]; + for(var j = 0; j < path.pathElements.length; j++) { + joinedPath.pathElements.push(path.pathElements[j]); + } + } + return joinedPath; + } + + constructor(close, options) { + this.pathElements = []; + this.pos = 0; + this.close = close; + this.options = extend({}, defaultOptions, options); + } + + /** + * Gets or sets the current position (cursor) inside of the path. You can move around the cursor freely but limited to 0 or the count of existing elements. All modifications with element functions will insert new elements at the position of this cursor. + * + * @memberof SvgPath + * @param {Number} [pos] If a number is passed then the cursor is set to this position in the path element array. + * @return {SvgPath|Number} If the position parameter was passed then the return value will be the path object for easy call chaining. If no position parameter was passed then the current position is returned. + */ + position(pos) { + if(pos !== undefined) { + this.pos = Math.max(0, Math.min(this.pathElements.length, pos)); + return this; + } else { + return this.pos; + } + } + + /** + * Removes elements from the path starting at the current position. + * + * @memberof SvgPath + * @param {Number} count Number of path elements that should be removed from the current position. + * @return {SvgPath} The current path object for easy call chaining. + */ + remove(count) { + this.pathElements.splice(this.pos, count); + return this; + } + + /** + * Use this function to add a new move SVG path element. + * + * @memberof SvgPath + * @param {Number} x The x coordinate for the move element. + * @param {Number} y The y coordinate for the move element. + * @param {Boolean} [relative] If set to true the move element will be created with relative coordinates (lowercase letter) + * @param {*} [data] Any data that should be stored with the element object that will be accessible in pathElement + * @return {SvgPath} The current path object for easy call chaining. + */ + move(x, y, relative, data) { + element('M', { + x: +x, + y: +y + }, this.pathElements, this.pos++, relative, data); + return this; + } + + /** + * Use this function to add a new line SVG path element. + * + * @memberof SvgPath + * @param {Number} x The x coordinate for the line element. + * @param {Number} y The y coordinate for the line element. + * @param {Boolean} [relative] If set to true the line element will be created with relative coordinates (lowercase letter) + * @param {*} [data] Any data that should be stored with the element object that will be accessible in pathElement + * @return {SvgPath} The current path object for easy call chaining. + */ + line(x, y, relative, data) { + element('L', { + x: +x, + y: +y + }, this.pathElements, this.pos++, relative, data); + return this; + } + + /** + * Use this function to add a new curve SVG path element. + * + * @memberof SvgPath + * @param {Number} x1 The x coordinate for the first control point of the bezier curve. + * @param {Number} y1 The y coordinate for the first control point of the bezier curve. + * @param {Number} x2 The x coordinate for the second control point of the bezier curve. + * @param {Number} y2 The y coordinate for the second control point of the bezier curve. + * @param {Number} x The x coordinate for the target point of the curve element. + * @param {Number} y The y coordinate for the target point of the curve element. + * @param {Boolean} [relative] If set to true the curve element will be created with relative coordinates (lowercase letter) + * @param {*} [data] Any data that should be stored with the element object that will be accessible in pathElement + * @return {SvgPath} The current path object for easy call chaining. + */ + curve(x1, y1, x2, y2, x, y, relative, data) { + element('C', { + x1: +x1, + y1: +y1, + x2: +x2, + y2: +y2, + x: +x, + y: +y + }, this.pathElements, this.pos++, relative, data); + return this; + } + + /** + * Use this function to add a new non-bezier curve SVG path element. + * + * @memberof SvgPath + * @param {Number} rx The radius to be used for the x-axis of the arc. + * @param {Number} ry The radius to be used for the y-axis of the arc. + * @param {Number} xAr Defines the orientation of the arc + * @param {Number} lAf Large arc flag + * @param {Number} sf Sweep flag + * @param {Number} x The x coordinate for the target point of the curve element. + * @param {Number} y The y coordinate for the target point of the curve element. + * @param {Boolean} [relative] If set to true the curve element will be created with relative coordinates (lowercase letter) + * @param {*} [data] Any data that should be stored with the element object that will be accessible in pathElement + * @return {SvgPath} The current path object for easy call chaining. + */ + arc(rx, ry, xAr, lAf, sf, x, y, relative, data) { + element('A', { + rx: +rx, + ry: +ry, + xAr: +xAr, + lAf: +lAf, + sf: +sf, + x: +x, + y: +y + }, this.pathElements, this.pos++, relative, data); + return this; + } + + /** + * Parses an SVG path seen in the d attribute of path elements, and inserts the parsed elements into the existing path object at the current cursor position. Any closing path indicators (Z at the end of the path) will be ignored by the parser as this is provided by the close option in the options of the path object. + * + * @memberof SvgPath + * @param {String} path Any SVG path that contains move (m), line (l) or curve (c) components. + * @return {SvgPath} The current path object for easy call chaining. + */ + parse(path) { + // Parsing the SVG path string into an array of arrays [['M', '10', '10'], ['L', '100', '100']] + var chunks = path.replace(/([A-Za-z])([0-9])/g, '$1 $2') + .replace(/([0-9])([A-Za-z])/g, '$1 $2') + .split(/[\s,]+/) + .reduce(function(result, element) { + if(element.match(/[A-Za-z]/)) { + result.push([]); + } + + result[result.length - 1].push(element); + return result; + }, []); + + // If this is a closed path we remove the Z at the end because this is determined by the close option + if(chunks[chunks.length - 1][0].toUpperCase() === 'Z') { + chunks.pop(); + } + + // Using svgPathElementDescriptions to map raw path arrays into objects that contain the command and the parameters + // For example {command: 'M', x: '10', y: '10'} + var elements = chunks.map(function(chunk) { + var command = chunk.shift(), + description = elementDescriptions[command.toLowerCase()]; + + return extend({ + command: command + }, description.reduce(function(result, paramName, index) { + result[paramName] = +chunk[index]; + return result; + }, {})); + }); + + // Preparing a splice call with the elements array as var arg params and insert the parsed elements at the current position + var spliceArgs = [this.pos, 0]; + Array.prototype.push.apply(spliceArgs, elements); + Array.prototype.splice.apply(this.pathElements, spliceArgs); + // Increase the internal position by the element count + this.pos += elements.length; + + return this; + } + + /** + * This function renders to current SVG path object into a final SVG string that can be used in the d attribute of SVG path elements. It uses the accuracy option to round big decimals. If the close parameter was set in the constructor of this path object then a path closing Z will be appended to the output string. + * + * @memberof SvgPath + * @return {String} + */ + stringify() { + var accuracyMultiplier = Math.pow(10, this.options.accuracy); + + return this.pathElements.reduce(function(path, pathElement) { + var params = elementDescriptions[pathElement.command.toLowerCase()].map(function(paramName) { + return this.options.accuracy ? + (Math.round(pathElement[paramName] * accuracyMultiplier) / accuracyMultiplier) : + pathElement[paramName]; + }.bind(this)); + + return path + pathElement.command + params.join(','); + }.bind(this), '') + (this.close ? 'Z' : ''); + } + + /** + * Scales all elements in the current SVG path object. There is an individual parameter for each coordinate. Scaling will also be done for control points of curves, affecting the given coordinate. + * + * @memberof SvgPath + * @param {Number} x The number which will be used to scale the x, x1 and x2 of all path elements. + * @param {Number} y The number which will be used to scale the y, y1 and y2 of all path elements. + * @return {SvgPath} The current path object for easy call chaining. + */ + scale(x, y) { + forEachParam(this.pathElements, function(pathElement, paramName) { + pathElement[paramName] *= paramName[0] === 'x' ? x : y; + }); + return this; + } + + /** + * Translates all elements in the current SVG path object. The translation is relative and there is an individual parameter for each coordinate. Translation will also be done for control points of curves, affecting the given coordinate. + * + * @memberof SvgPath + * @param {Number} x The number which will be used to translate the x, x1 and x2 of all path elements. + * @param {Number} y The number which will be used to translate the y, y1 and y2 of all path elements. + * @return {SvgPath} The current path object for easy call chaining. + */ + translate(x, y) { + forEachParam(this.pathElements, function(pathElement, paramName) { + pathElement[paramName] += paramName[0] === 'x' ? x : y; + }); + return this; + } + + /** + * This function will run over all existing path elements and then loop over their attributes. The callback function will be called for every path element attribute that exists in the current path. + * The method signature of the callback function looks like this: + * ```javascript + * function(pathElement, paramName, pathElementIndex, paramIndex, pathElements) + * ``` + * If something else than undefined is returned by the callback function, this value will be used to replace the old value. This allows you to build custom transformations of path objects that can't be achieved using the basic transformation functions scale and translate. + * + * @memberof SvgPath + * @param {Function} transformFnc The callback function for the transformation. Check the signature in the function description. + * @return {SvgPath} The current path object for easy call chaining. + */ + transform(transformFnc) { + forEachParam(this.pathElements, function(pathElement, paramName, pathElementIndex, paramIndex, pathElements) { + var transformed = transformFnc(pathElement, paramName, pathElementIndex, paramIndex, pathElements); + if(transformed || transformed === 0) { + pathElement[paramName] = transformed; + } + }); + return this; + } + + /** + * This function clones a whole path object with all its properties. This is a deep clone and path element objects will also be cloned. + * + * @memberof SvgPath + * @param {Boolean} [close] Optional option to set the new cloned path to closed. If not specified or false, the original path close option will be used. + * @return {SvgPath} + */ + clone(close) { + var c = new SvgPath(close || this.close); + c.pos = this.pos; + c.pathElements = this.pathElements.slice().map(function cloneElements(pathElement) { + return extend({}, pathElement); + }); + c.options = extend({}, this.options); + return c; + } + + /** + * Split a Svg.Path object by a specific command in the path chain. The path chain will be split and an array of newly created paths objects will be returned. This is useful if you'd like to split an SVG path by it's move commands, for example, in order to isolate chunks of drawings. + * + * @memberof SvgPath + * @param {String} command The command you'd like to use to split the path + * @return {Array} + */ + splitByCommand(command) { + var split = [ + new SvgPath() + ]; + + this.pathElements.forEach(function(pathElement) { + if(pathElement.command === command.toUpperCase() && split[split.length - 1].pathElements.length !== 0) { + split.push(new SvgPath()); + } + + split[split.length - 1].pathElements.push(pathElement); + }); + + return split; + } +} diff --git a/src/svg/svg.js b/src/svg/svg.js new file mode 100644 index 00000000..cc605f06 --- /dev/null +++ b/src/svg/svg.js @@ -0,0 +1,525 @@ +import {namespaces, ensureUnit, quantity, extend} from '../core/core'; +import {SvgList} from './svg-list'; + +/** + * Svg creates a new SVG object wrapper with a starting element. You can use the wrapper to fluently create sub-elements and modify them. + * + * @memberof Svg + * @constructor + * @param {String|Element} name The name of the SVG element to create or an SVG dom element which should be wrapped into Svg + * @param {Object} attributes An object with properties that will be added as attributes to the SVG element that is created. Attributes with undefined values will not be added. + * @param {String} className This class or class list will be added to the SVG element + * @param {Object} parent The parent SVG wrapper object where this newly created wrapper and it's element will be attached to as child + * @param {Boolean} insertFirst If this param is set to true in conjunction with a parent element the newly created element will be added as first child element in the parent element + */ +export class Svg { + + constructor(name, attributes, className, parent, insertFirst) { + // If Svg is getting called with an SVG element we just return the wrapper + if(name instanceof Element) { + this._node = name; + } else { + this._node = document.createElementNS(namespaces.svg, name); + + // If this is an SVG element created then custom namespace + if(name === 'svg') { + this.attr({ + 'xmlns:ct': namespaces.ct + }); + } + } + + if(attributes) { + this.attr(attributes); + } + + if(className) { + this.addClass(className); + } + + if(parent) { + if (insertFirst && parent._node.firstChild) { + parent._node.insertBefore(this._node, parent._node.firstChild); + } else { + parent._node.appendChild(this._node); + } + } + } + + /** + * Set attributes on the current SVG element of the wrapper you're currently working on. + * + * @memberof Svg + * @param {Object|String} attributes An object with properties that will be added as attributes to the SVG element that is created. Attributes with undefined values will not be added. If this parameter is a String then the function is used as a getter and will return the attribute value. + * @param {String} [ns] If specified, the attribute will be obtained using getAttributeNs. In order to write namepsaced attributes you can use the namespace:attribute notation within the attributes object. + * @return {Object|String} The current wrapper object will be returned so it can be used for chaining or the attribute value if used as getter function. + */ + attr(attributes, ns) { + if(typeof attributes === 'string') { + if(ns) { + return this._node.getAttributeNS(ns, attributes); + } else { + return this._node.getAttribute(attributes); + } + } + + Object.keys(attributes).forEach(function(key) { + // If the attribute value is undefined we can skip this one + if(attributes[key] === undefined) { + return; + } + + if (key.indexOf(':') !== -1) { + var namespacedAttribute = key.split(':'); + this._node.setAttributeNS(namespaces[namespacedAttribute[0]], key, attributes[key]); + } else { + this._node.setAttribute(key, attributes[key]); + } + }.bind(this)); + + return this; + } + + /** + * Create a new SVG element whose wrapper object will be selected for further operations. This way you can also create nested groups easily. + * + * @memberof Svg + * @param {String} name The name of the SVG element that should be created as child element of the currently selected element wrapper + * @param {Object} [attributes] An object with properties that will be added as attributes to the SVG element that is created. Attributes with undefined values will not be added. + * @param {String} [className] This class or class list will be added to the SVG element + * @param {Boolean} [insertFirst] If this param is set to true in conjunction with a parent element the newly created element will be added as first child element in the parent element + * @return {Svg} Returns a Svg wrapper object that can be used to modify the containing SVG data + */ + elem(name, attributes, className, insertFirst) { + return new Svg(name, attributes, className, this, insertFirst); + } + + /** + * Returns the parent Chartist.SVG wrapper object + * + * @memberof Svg + * @return {Svg} Returns a Svg wrapper around the parent node of the current node. If the parent node is not existing or it's not an SVG node then this function will return null. + */ + parent() { + return this._node.parentNode instanceof SVGElement ? new Svg(this._node.parentNode) : null; + } + + /** + * This method returns a Svg wrapper around the root SVG element of the current tree. + * + * @memberof Svg + * @return {Svg} The root SVG element wrapped in a Svg element + */ + root() { + var node = this._node; + while(node.nodeName !== 'svg') { + node = node.parentNode; + } + return new Svg(node); + } + + /** + * Find the first child SVG element of the current element that matches a CSS selector. The returned object is a Svg wrapper. + * + * @memberof Svg + * @param {String} selector A CSS selector that is used to query for child SVG elements + * @return {Svg} The SVG wrapper for the element found or null if no element was found + */ + querySelector(selector) { + var foundNode = this._node.querySelector(selector); + return foundNode ? new Svg(foundNode) : null; + } + + /** + * Find the all child SVG elements of the current element that match a CSS selector. The returned object is a Svg.List wrapper. + * + * @memberof Svg + * @param {String} selector A CSS selector that is used to query for child SVG elements + * @return {SvgList} The SVG wrapper list for the element found or null if no element was found + */ + querySelectorAll(selector) { + var foundNodes = this._node.querySelectorAll(selector); + return foundNodes.length ? new SvgList(foundNodes) : null; + } + + /** + * Returns the underlying SVG node for the current element. + * + * @memberof Svg + * @returns {Node} + */ + getNode() { + return this._node; + } + + /** + * This method creates a foreignObject (see https://developer.mozilla.org/en-US/docs/Web/SVG/Element/foreignObject) that allows to embed HTML content into a SVG graphic. With the help of foreignObjects you can enable the usage of regular HTML elements inside of SVG where they are subject for SVG positioning and transformation but the Browser will use the HTML rendering capabilities for the containing DOM. + * + * @memberof Svg + * @param {Node|String} content The DOM Node, or HTML string that will be converted to a DOM Node, that is then placed into and wrapped by the foreignObject + * @param {String} [attributes] An object with properties that will be added as attributes to the foreignObject element that is created. Attributes with undefined values will not be added. + * @param {String} [className] This class or class list will be added to the SVG element + * @param {Boolean} [insertFirst] Specifies if the foreignObject should be inserted as first child + * @return {Svg} New wrapper object that wraps the foreignObject element + */ + foreignObject(content, attributes, className, insertFirst) { + // If content is string then we convert it to DOM + // TODO: Handle case where content is not a string nor a DOM Node + if(typeof content === 'string') { + var container = document.createElement('div'); + container.innerHTML = content; + content = container.firstChild; + } + + // Adding namespace to content element + content.setAttribute('xmlns', namespaces.xmlns); + + // Creating the foreignObject without required extension attribute (as described here + // http://www.w3.org/TR/SVG/extend.html#ForeignObjectElement) + var fnObj = this.elem('foreignObject', attributes, className, insertFirst); + + // Add content to foreignObjectElement + fnObj._node.appendChild(content); + + return fnObj; + } + + /** + * This method adds a new text element to the current Svg wrapper. + * + * @memberof Svg + * @param {String} t The text that should be added to the text element that is created + * @return {Svg} The same wrapper object that was used to add the newly created element + */ + text(t) { + this._node.appendChild(document.createTextNode(t)); + return this; + } + + /** + * This method will clear all child nodes of the current wrapper object. + * + * @memberof Svg + * @return {Svg} The same wrapper object that got emptied + */ + empty() { + while (this._node.firstChild) { + this._node.removeChild(this._node.firstChild); + } + + return this; + } + + /** + * This method will cause the current wrapper to remove itself from its parent wrapper. Use this method if you'd like to get rid of an element in a given DOM structure. + * + * @memberof Svg + * @return {Svg} The parent wrapper object of the element that got removed + */ + remove() { + this._node.parentNode.removeChild(this._node); + return this.parent(); + } + + /** + * This method will replace the element with a new element that can be created outside of the current DOM. + * + * @memberof Svg + * @param {Svg} newElement The new Svg object that will be used to replace the current wrapper object + * @return {Svg} The wrapper of the new element + */ + replace(newElement) { + this._node.parentNode.replaceChild(newElement._node, this._node); + return newElement; + } + + /** + * This method will append an element to the current element as a child. + * + * @memberof Svg + * @param {Svg} element The Svg element that should be added as a child + * @param {Boolean} [insertFirst] Specifies if the element should be inserted as first child + * @return {Svg} The wrapper of the appended object + */ + append(element, insertFirst) { + if(insertFirst && this._node.firstChild) { + this._node.insertBefore(element._node, this._node.firstChild); + } else { + this._node.appendChild(element._node); + } + + return this; + } + + /** + * Returns an array of class names that are attached to the current wrapper element. This method can not be chained further. + * + * @memberof Svg + * @return {Array} A list of classes or an empty array if there are no classes on the current element + */ + classes() { + return this._node.getAttribute('class') ? this._node.getAttribute('class').trim().split(/\s+/) : []; + } + + /** + * Adds one or a space separated list of classes to the current element and ensures the classes are only existing once. + * + * @memberof Svg + * @param {String} names A white space separated list of class names + * @return {Svg} The wrapper of the current element + */ + addClass(names) { + this._node.setAttribute('class', + this.classes() + .concat(names.trim().split(/\s+/)) + .filter(function(elem, pos, self) { + return self.indexOf(elem) === pos; + }).join(' ') + ); + + return this; + } + + /** + * Removes one or a space separated list of classes from the current element. + * + * @memberof Svg + * @param {String} names A white space separated list of class names + * @return {Svg} The wrapper of the current element + */ + removeClass(names) { + var removedClasses = names.trim().split(/\s+/); + + this._node.setAttribute('class', this.classes().filter(function(name) { + return removedClasses.indexOf(name) === -1; + }).join(' ')); + + return this; + } + + /** + * Removes all classes from the current element. + * + * @memberof Svg + * @return {Svg} The wrapper of the current element + */ + removeAllClasses() { + this._node.setAttribute('class', ''); + return this; + } + + /** + * Get element height using `getBoundingClientRect` + * + * @memberof Svg + * @return {Number} The elements height in pixels + */ + height() { + return this._node.getBoundingClientRect().height; + } + + /** + * Get element width using `getBoundingClientRect` + * + * @memberof Chartist.Core + * @return {Number} The elements width in pixels + */ + width() { + return this._node.getBoundingClientRect().width; + } + + /** + * The animate function lets you animate the current element with SMIL animations. You can add animations for multiple attributes at the same time by using an animation definition object. This object should contain SMIL animation attributes. Please refer to http://www.w3.org/TR/SVG/animate.html for a detailed specification about the available animation attributes. Additionally an easing property can be passed in the animation definition object. This can be a string with a name of an easing function in `Svg.Easing` or an array with four numbers specifying a cubic Bézier curve. + * **An animations object could look like this:** + * ```javascript + * element.animate({ + * opacity: { + * dur: 1000, + * from: 0, + * to: 1 + * }, + * x1: { + * dur: '1000ms', + * from: 100, + * to: 200, + * easing: 'easeOutQuart' + * }, + * y1: { + * dur: '2s', + * from: 0, + * to: 100 + * } + * }); + * ``` + * **Automatic unit conversion** + * For the `dur` and the `begin` animate attribute you can also omit a unit by passing a number. The number will automatically be converted to milli seconds. + * **Guided mode** + * The default behavior of SMIL animations with offset using the `begin` attribute is that the attribute will keep it's original value until the animation starts. Mostly this behavior is not desired as you'd like to have your element attributes already initialized with the animation `from` value even before the animation starts. Also if you don't specify `fill="freeze"` on an animate element or if you delete the animation after it's done (which is done in guided mode) the attribute will switch back to the initial value. This behavior is also not desired when performing simple one-time animations. For one-time animations you'd want to trigger animations immediately instead of relative to the document begin time. That's why in guided mode Svg will also use the `begin` property to schedule a timeout and manually start the animation after the timeout. If you're using multiple SMIL definition objects for an attribute (in an array), guided mode will be disabled for this attribute, even if you explicitly enabled it. + * If guided mode is enabled the following behavior is added: + * - Before the animation starts (even when delayed with `begin`) the animated attribute will be set already to the `from` value of the animation + * - `begin` is explicitly set to `indefinite` so it can be started manually without relying on document begin time (creation) + * - The animate element will be forced to use `fill="freeze"` + * - The animation will be triggered with `beginElement()` in a timeout where `begin` of the definition object is interpreted in milli seconds. If no `begin` was specified the timeout is triggered immediately. + * - After the animation the element attribute value will be set to the `to` value of the animation + * - The animate element is deleted from the DOM + * + * @memberof Svg + * @param {Object} animations An animations object where the property keys are the attributes you'd like to animate. The properties should be objects again that contain the SMIL animation attributes (usually begin, dur, from, and to). The property begin and dur is auto converted (see Automatic unit conversion). You can also schedule multiple animations for the same attribute by passing an Array of SMIL definition objects. Attributes that contain an array of SMIL definition objects will not be executed in guided mode. + * @param {Boolean} guided Specify if guided mode should be activated for this animation (see Guided mode). If not otherwise specified, guided mode will be activated. + * @param {Object} eventEmitter If specified, this event emitter will be notified when an animation starts or ends. + * @return {Svg} The current element where the animation was added + */ + animate(animations, guided, eventEmitter) { + if(guided === undefined) { + guided = true; + } + + Object.keys(animations).forEach(function createAnimateForAttributes(attribute) { + + function createAnimate(animationDefinition, guided) { + var attributeProperties = {}, + animate, + timeout, + animationEasing; + + // Check if an easing is specified in the definition object and delete it from the object as it will not + // be part of the animate element attributes. + if(animationDefinition.easing) { + // If already an easing Bézier curve array we take it or we lookup a easing array in the Easing object + animationEasing = animationDefinition.easing instanceof Array ? + animationDefinition.easing : + easings[animationDefinition.easing]; + delete animationDefinition.easing; + } + + // If numeric dur or begin was provided we assume milli seconds + animationDefinition.begin = ensureUnit(animationDefinition.begin, 'ms'); + animationDefinition.dur = ensureUnit(animationDefinition.dur, 'ms'); + + if(animationEasing) { + animationDefinition.calcMode = 'spline'; + animationDefinition.keySplines = animationEasing.join(' '); + animationDefinition.keyTimes = '0;1'; + } + + // Adding "fill: freeze" if we are in guided mode and set initial attribute values + if(guided) { + animationDefinition.fill = 'freeze'; + // Animated property on our element should already be set to the animation from value in guided mode + attributeProperties[attribute] = animationDefinition.from; + this.attr(attributeProperties); + + // In guided mode we also set begin to indefinite so we can trigger the start manually and put the begin + // which needs to be in ms aside + timeout = quantity(animationDefinition.begin || 0).value; + animationDefinition.begin = 'indefinite'; + } + + animate = this.elem('animate', extend({ + attributeName: attribute + }, animationDefinition)); + + if(guided) { + // If guided we take the value that was put aside in timeout and trigger the animation manually with a timeout + setTimeout(function() { + // If beginElement fails we set the animated attribute to the end position and remove the animate element + // This happens if the SMIL ElementTimeControl interface is not supported or any other problems occured in + // the browser. (Currently FF 34 does not support animate elements in foreignObjects) + try { + animate._node.beginElement(); + } catch(err) { + // Set animated attribute to current animated value + attributeProperties[attribute] = animationDefinition.to; + this.attr(attributeProperties); + // Remove the animate element as it's no longer required + animate.remove(); + } + }.bind(this), timeout); + } + + if(eventEmitter) { + animate._node.addEventListener('beginEvent', function handleBeginEvent() { + eventEmitter.emit('animationBegin', { + element: this, + animate: animate._node, + params: animationDefinition + }); + }.bind(this)); + } + + animate._node.addEventListener('endEvent', function handleEndEvent() { + if(eventEmitter) { + eventEmitter.emit('animationEnd', { + element: this, + animate: animate._node, + params: animationDefinition + }); + } + + if(guided) { + // Set animated attribute to current animated value + attributeProperties[attribute] = animationDefinition.to; + this.attr(attributeProperties); + // Remove the animate element as it's no longer required + animate.remove(); + } + }.bind(this)); + } + + // If current attribute is an array of definition objects we create an animate for each and disable guided mode + if(animations[attribute] instanceof Array) { + animations[attribute].forEach(function(animationDefinition) { + createAnimate.bind(this)(animationDefinition, false); + }.bind(this)); + } else { + createAnimate.bind(this)(animations[attribute], guided); + } + + }.bind(this)); + + return this; + } +} + +/** + * This method checks for support of a given SVG feature like Extensibility, SVG-animation or the like. Check http://www.w3.org/TR/SVG11/feature for a detailed list. + * + * @memberof Svg + * @param {String} feature The SVG 1.1 feature that should be checked for support. + * @return {Boolean} True of false if the feature is supported or not + */ +export function isSupported(feature) { + return document.implementation.hasFeature('http://www.w3.org/TR/SVG11/feature#' + feature, '1.1'); +} + +/** + * This Object contains some standard easing cubic bezier curves. Then can be used with their name in the `Svg.animate`. You can also extend the list and use your own name in the `animate` function. Click the show code button to see the available bezier functions. + * + * @memberof Svg + */ +export const easings = { + easeInSine: [0.47, 0, 0.745, 0.715], + easeOutSine: [0.39, 0.575, 0.565, 1], + easeInOutSine: [0.445, 0.05, 0.55, 0.95], + easeInQuad: [0.55, 0.085, 0.68, 0.53], + easeOutQuad: [0.25, 0.46, 0.45, 0.94], + easeInOutQuad: [0.455, 0.03, 0.515, 0.955], + easeInCubic: [0.55, 0.055, 0.675, 0.19], + easeOutCubic: [0.215, 0.61, 0.355, 1], + easeInOutCubic: [0.645, 0.045, 0.355, 1], + easeInQuart: [0.895, 0.03, 0.685, 0.22], + easeOutQuart: [0.165, 0.84, 0.44, 1], + easeInOutQuart: [0.77, 0, 0.175, 1], + easeInQuint: [0.755, 0.05, 0.855, 0.06], + easeOutQuint: [0.23, 1, 0.32, 1], + easeInOutQuint: [0.86, 0, 0.07, 1], + easeInExpo: [0.95, 0.05, 0.795, 0.035], + easeOutExpo: [0.19, 1, 0.22, 1], + easeInOutExpo: [1, 0, 0, 1], + easeInCirc: [0.6, 0.04, 0.98, 0.335], + easeOutCirc: [0.075, 0.82, 0.165, 1], + easeInOutCirc: [0.785, 0.135, 0.15, 0.86], + easeInBack: [0.6, -0.28, 0.735, 0.045], + easeOutBack: [0.175, 0.885, 0.32, 1.275], + easeInOutBack: [0.68, -0.55, 0.265, 1.55] +}; diff --git a/src/testing/fixtures.js b/src/testing/fixtures.js new file mode 100644 index 00000000..8501638d --- /dev/null +++ b/src/testing/fixtures.js @@ -0,0 +1,37 @@ +export let container = null; + +export function initializeFixtures() { + if (!container) { + container = document.createElement('div'); + container.setAttribute('data-fixture-container', `${+new Date()}`); + document.body.appendChild(container); + } +} + +export function destroyFixtures() { + if (container) { + document.body.removeChild(container); + container = null; + } + } + +export function loadFixture(path) { + if (!container) { + initializeFixtures(); + } + + return SystemJS.import(path).then((module) => { + return addFixture(module.default || module); + }); +} + +export function addFixture(fixture) { + const wrapper = document.createElement('div'); + wrapper.innerHTML += fixture; + container.appendChild(wrapper); + return { + wrapper, + container, + fixture + }; +} diff --git a/src/testing/jasmine-dom-matchers.js b/src/testing/jasmine-dom-matchers.js new file mode 100644 index 00000000..d09c4b2c --- /dev/null +++ b/src/testing/jasmine-dom-matchers.js @@ -0,0 +1,35 @@ +function createCustomMatchers(matchers) { + return Object.keys(matchers).reduce((customMatchers, matcherName) => { + customMatchers[matcherName] = (util, customEqualityTesters) => { + return { + compare: (actual, expected) => { + return matchers[matcherName](actual, expected, util, customEqualityTesters); + } + }; + }; + return customMatchers; + }, {}); +} + +const domMatchers = { + toHaveClass(actual, expected) { + console.log(actual); + console.log(expected); + + const pass = actual.classList.contains(expected); + return { + pass, + message: `Expected ${actual.classList} to contain ${expected}` + }; + }, + + toContainElement(actual, expected) { + const pass = !!actual.querySelector(expected); + return { + pass, + message: `Expected ${actual} to contain element with selector ${expected}` + }; + } +}; + +beforeEach(() => jasmine.addMatchers(createCustomMatchers(domMatchers))); diff --git a/src/testing/spec/fixture-with-multiple-elements.html b/src/testing/spec/fixture-with-multiple-elements.html new file mode 100644 index 00000000..bcefe8be --- /dev/null +++ b/src/testing/spec/fixture-with-multiple-elements.html @@ -0,0 +1 @@ +

First element-

Second element-

Third element
diff --git a/src/testing/spec/fixture-with-single-element.html b/src/testing/spec/fixture-with-single-element.html new file mode 100644 index 00000000..8bb33e88 --- /dev/null +++ b/src/testing/spec/fixture-with-single-element.html @@ -0,0 +1 @@ +

This is a test fixture

diff --git a/src/testing/spec/fixtures.spec.js b/src/testing/spec/fixtures.spec.js new file mode 100644 index 00000000..3cbb3b3f --- /dev/null +++ b/src/testing/spec/fixtures.spec.js @@ -0,0 +1,47 @@ +import {loadFixture, destroyFixtures, initializeFixtures, container} from '../fixtures'; + +describe('Fixtures', () => { + beforeEach(() => initializeFixtures()); + afterEach(() => destroyFixtures()); + + it('should initialize correctly and add container to body', () => { + initializeFixtures(); + expect(document.querySelector('[data-fixture-container]')).toBe(container); + expect(container.parentNode).toBe(document.body); + }); + + it('should destroy correctly and remove any existing container', () => { + initializeFixtures(); + destroyFixtures(); + expect(document.querySelector('[data-fixture-container]')).toBeFalsy(); + expect(container).toBeFalsy(); + }); + + it('should load fixtures with single element and set wrapper, fixture and container correctly', (done) => { + loadFixture('chartist/testing/spec/fixture-with-single-element.html!text').then((context) => { + expect(context.container).toBe(container); + expect(context.wrapper.textContent.trim()).toBe('This is a test fixture'); + expect(context.fixture.trim()).toBe('

This is a test fixture

'); + done(); + }); + }); + + it('should load fixtures with multiple elements', (done) => { + loadFixture('/src/testing/spec/fixture-with-multiple-elements.html!text').then((context) => { + expect(context.container.textContent.trim()).toBe('First element-Second element-Third element'); + done(); + }); + }); + + it('should load multiple fixtures correctly', (done) => { + Promise.all([ + loadFixture('/src/testing/spec/fixture-with-single-element.html!text'), + loadFixture('/src/testing/spec/fixture-with-multiple-elements.html!text') + ]).then(() => { + expect(container.childNodes.length).toBe(2); + expect(container.childNodes[0].textContent.trim()).toBe('This is a test fixture'); + expect(container.childNodes[1].textContent.trim()).toBe('First element-Second element-Third element'); + done(); + }); + }); +}); diff --git a/tooling/node/banner.js b/tooling/node/banner.js new file mode 100755 index 00000000..549b8fb3 --- /dev/null +++ b/tooling/node/banner.js @@ -0,0 +1,12 @@ +#!/usr/bin/env node + +const fsp = require('fs-promise'); +const interpolate = require('interpolate'); +const pkg = require('../../package.json'); +let content = interpolate(pkg.config.banner, { + pkg, + year: new Date().getFullYear() +}); + +fsp.readFile(process.argv[2]) + .then((data) => fsp.writeFile(process.argv[3], content + data)); diff --git a/tooling/node/compile-sass.js b/tooling/node/compile-sass.js new file mode 100644 index 00000000..7849601e --- /dev/null +++ b/tooling/node/compile-sass.js @@ -0,0 +1,50 @@ +function compileSass(inFilePath, outDirectoryPath) { + const sass = require('node-sass'); + const postcss = require('postcss'); + const fsp = require('fs-promise'); + const path = require('path'); + const baseFileName = path.basename(inFilePath, '.scss'); + const cssBaseName = `${baseFileName}.css`; + const cssMapBaseName = `${baseFileName}.css.map`; + const cssMinBaseName = `${baseFileName}.min.css`; + const cssMinMapBaseName = `${baseFileName}.min.css.map`; + + sass.render({ + file: inFilePath, + sourceMap: true, + outFile: cssBaseName + }, (err, result) => { + postcss([require('autoprefixer')]) + .process(result.css.toString(), { + from: cssBaseName, + to: cssBaseName, + map: { + prev: result.map.toString() + } + }) + .then((postCssResult) => { + return Promise.all([ + fsp.writeFile(path.join(outDirectoryPath, cssBaseName), postCssResult.css), + fsp.writeFile(path.join(outDirectoryPath, cssMapBaseName), JSON.stringify(postCssResult.map)) + ]).then(() => postCssResult) + }) + .then((postCssResult) => { + return postcss([require('cssnano')]) + .process(postCssResult.css, { + from: cssBaseName, + to: cssMinBaseName, + map: { + prev: JSON.stringify(postCssResult.map) + } + }); + }) + .then((postCssResult) => { + return Promise.all([ + fsp.writeFile(path.join(outDirectoryPath, cssMinBaseName), postCssResult.css), + fsp.writeFile(path.join(outDirectoryPath, cssMinMapBaseName), JSON.stringify(postCssResult.map)) + ]).then(() => postCssResult) + }); + }); +} + +module.exports = compileSass; diff --git a/tooling/node/styles-watch.js b/tooling/node/styles-watch.js new file mode 100755 index 00000000..f74ed8c8 --- /dev/null +++ b/tooling/node/styles-watch.js @@ -0,0 +1,16 @@ +#!/usr/bin/env node + +const chokidar = require('chokidar'); +const compileSass = require('./compile-sass'); +const debounce = require('debounce'); + +const compileStyles = debounce(() => { + console.log(`Compiling styles.`); + compileSass('src/styles/chartist.scss', 'dist'); +}, 200); + +chokidar.watch('./src/**/*.scss') + .on('all', (event, path) => { + console.log(`Changes on path ${path}`); + compileStyles(); + }); diff --git a/tooling/node/styles.js b/tooling/node/styles.js new file mode 100755 index 00000000..fce1010a --- /dev/null +++ b/tooling/node/styles.js @@ -0,0 +1,3 @@ +#!/usr/bin/env node + +require('./compile-sass')(process.argv[2], process.argv[3]); diff --git a/tooling/system-loaders/version-loader-plugin.js b/tooling/system-loaders/version-loader-plugin.js new file mode 100644 index 00000000..884fa294 --- /dev/null +++ b/tooling/system-loaders/version-loader-plugin.js @@ -0,0 +1,3 @@ +export function translate(load) { + return `export const version = '${JSON.parse(load.source).version}'`; +} diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 00000000..2c197b35 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,4118 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 +abbrev@1: + version "1.0.9" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" + +accepts@~1.3.3, accepts@1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca" + dependencies: + mime-types "~2.1.11" + negotiator "0.6.1" + +accepts@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.1.4.tgz#d71c96f7d41d0feda2c38cd14e8a27c04158df4a" + dependencies: + mime-types "~2.0.4" + negotiator "0.4.9" + +after@0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/after/-/after-0.8.1.tgz#ab5d4fb883f596816d3515f8f791c0af486dd627" + +align-text@^0.1.1, align-text@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" + dependencies: + kind-of "^3.0.2" + longest "^1.0.1" + repeat-string "^1.5.2" + +alphanum-sort@^1.0.1, alphanum-sort@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" + +amdefine@>=0.0.4: + version "1.0.0" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.0.tgz#fd17474700cb5cc9c2b709f0be9d23ce3c198c33" + +ansi-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.0.0.tgz#c5061b6e0ef8a81775e50f5d66151bf6bf371107" + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + +any-promise@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + +anymatch@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507" + dependencies: + arrify "^1.0.0" + micromatch "^2.1.5" + +aproba@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.0.4.tgz#2713680775e7614c8ba186c065d4e2e52d1072c0" + +are-we-there-yet@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.2.tgz#80e470e95a084794fe1899262c5667c6e88de1b3" + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.0 || ^1.1.13" + +argparse@^1.0.7: + version "1.0.9" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" + dependencies: + sprintf-js "~1.0.2" + +arr-diff@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + dependencies: + arr-flatten "^1.0.1" + +arr-flatten@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.1.tgz#e5ffe54d45e19f32f216e91eb99c8ce892bb604b" + +array-find-index@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" + +array-index@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-index/-/array-index-1.0.0.tgz#ec56a749ee103e4e08c790b9c353df16055b97f9" + dependencies: + debug "^2.2.0" + es6-symbol "^3.0.2" + +array-slice@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5" + +array-unique@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + +arraybuffer.slice@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz#f33b2159f0532a3f3107a272c0ccfbd1ad2979ca" + +arrify@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + +asn1@~0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" + +asn1@0.1.11: + version "0.1.11" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.1.11.tgz#559be18376d08a4ec4dbe80877d27818639b2df7" + +assert-plus@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.1.5.tgz#ee74009413002d84cec7219c6ac811812e723160" + +assert-plus@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" + +assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + +async-each-series@0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/async-each-series/-/async-each-series-0.1.1.tgz#7617c1917401fd8ca4a28aadce3dbae98afeb432" + +async-each@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" + +async-foreach@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" + +async@^2.0.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/async/-/async-2.1.2.tgz#612a4ab45ef42a70cde806bad86ee6db047e8385" + dependencies: + lodash "^4.14.0" + +async@~0.2.6: + version "0.2.10" + resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" + +async@0.1.15: + version "0.1.15" + resolved "https://registry.yarnpkg.com/async/-/async-0.1.15.tgz#2180eaca2cf2a6ca5280d41c0585bec9b3e49bd3" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + +autoprefixer, autoprefixer@^6.3.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.5.1.tgz#ae759a5221e709f3da17c2d656230e67c43cbb75" + dependencies: + browserslist "~1.4.0" + caniuse-db "^1.0.30000554" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + postcss "^5.2.4" + postcss-value-parser "^3.2.3" + +aws-sign2@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" + +aws4@^1.2.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.5.0.tgz#0a29ffb79c31c9e712eeb087e8e7a64b4a56d755" + +babel-code-frame@^6.16.0: + version "6.16.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.16.0.tgz#f90e60da0862909d3ce098733b5d3987c97cb8de" + dependencies: + chalk "^1.1.0" + esutils "^2.0.2" + js-tokens "^2.0.0" + +babel-core@^6.16.0, babel-core@^6.9.0: + version "6.17.0" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.17.0.tgz#6c4576447df479e241e58c807e4bc7da4db7f425" + dependencies: + babel-code-frame "^6.16.0" + babel-generator "^6.17.0" + babel-helpers "^6.16.0" + babel-messages "^6.8.0" + babel-register "^6.16.0" + babel-runtime "^6.9.1" + babel-template "^6.16.0" + babel-traverse "^6.16.0" + babel-types "^6.16.0" + babylon "^6.11.0" + convert-source-map "^1.1.0" + debug "^2.1.1" + json5 "^0.4.0" + lodash "^4.2.0" + minimatch "^3.0.2" + path-exists "^1.0.0" + path-is-absolute "^1.0.0" + private "^0.1.6" + shebang-regex "^1.0.0" + slash "^1.0.0" + source-map "^0.5.0" + +babel-generator@^6.17.0: + version "6.17.0" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.17.0.tgz#b894e3808beef7800f2550635bfe024b6226cf33" + dependencies: + babel-messages "^6.8.0" + babel-runtime "^6.9.0" + babel-types "^6.16.0" + detect-indent "^3.0.1" + jsesc "^1.3.0" + lodash "^4.2.0" + source-map "^0.5.0" + +babel-helper-hoist-variables@^6.8.0: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.8.0.tgz#8b0766dc026ea9ea423bc2b34e665a4da7373aaf" + dependencies: + babel-runtime "^6.0.0" + babel-types "^6.8.0" + +babel-helpers@^6.16.0: + version "6.16.0" + resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.16.0.tgz#1095ec10d99279460553e67eb3eee9973d3867e3" + dependencies: + babel-runtime "^6.0.0" + babel-template "^6.16.0" + +babel-messages@^6.8.0: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.8.0.tgz#bf504736ca967e6d65ef0adb5a2a5f947c8e0eb9" + dependencies: + babel-runtime "^6.0.0" + +babel-plugin-transform-cjs-system-require@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-cjs-system-require/-/babel-plugin-transform-cjs-system-require-0.1.1.tgz#ffef26d31bc270e82bdbbd437db2777e85162a29" + +babel-plugin-transform-cjs-system-wrapper@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-cjs-system-wrapper/-/babel-plugin-transform-cjs-system-wrapper-0.2.1.tgz#e855078877b56d4d1b92b9f91b37f599db0200e3" + dependencies: + babel-plugin-transform-cjs-system-require "^0.1.1" + babel-template "^6.9.0" + +babel-plugin-transform-es2015-modules-systemjs@^6.6.5: + version "6.14.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.14.0.tgz#c519b5c73e32388e679c9b1edf41b2fc23dc3303" + dependencies: + babel-helper-hoist-variables "^6.8.0" + babel-runtime "^6.11.6" + babel-template "^6.14.0" + +babel-plugin-transform-global-system-wrapper@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-global-system-wrapper/-/babel-plugin-transform-global-system-wrapper-0.0.1.tgz#afb469cec0e04689b9fe7e8b1fd280fc94a6d8f2" + dependencies: + babel-template "^6.9.0" + +babel-plugin-transform-system-register@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-system-register/-/babel-plugin-transform-system-register-0.0.1.tgz#9dff40390c2763ac518f0b2ad7c5ea4f65a5be25" + +babel-register@^6.16.0: + version "6.16.3" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.16.3.tgz#7b0c0ca7bfdeb9188ba4c27e5fcb7599a497c624" + dependencies: + babel-core "^6.16.0" + babel-runtime "^6.11.6" + core-js "^2.4.0" + home-or-tmp "^1.0.0" + lodash "^4.2.0" + mkdirp "^0.5.1" + path-exists "^1.0.0" + source-map-support "^0.4.2" + +babel-runtime@^6.0.0, babel-runtime@^6.11.6, babel-runtime@^6.9.0, babel-runtime@^6.9.1: + version "6.11.6" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.11.6.tgz#6db707fef2d49c49bfa3cb64efdb436b518b8222" + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.9.5" + +babel-template@^6.14.0, babel-template@^6.16.0, babel-template@^6.9.0: + version "6.16.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.16.0.tgz#e149dd1a9f03a35f817ddbc4d0481988e7ebc8ca" + dependencies: + babel-runtime "^6.9.0" + babel-traverse "^6.16.0" + babel-types "^6.16.0" + babylon "^6.11.0" + lodash "^4.2.0" + +babel-traverse@^6.16.0: + version "6.16.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.16.0.tgz#fba85ae1fd4d107de9ce003149cc57f53bef0c4f" + dependencies: + babel-code-frame "^6.16.0" + babel-messages "^6.8.0" + babel-runtime "^6.9.0" + babel-types "^6.16.0" + babylon "^6.11.0" + debug "^2.2.0" + globals "^8.3.0" + invariant "^2.2.0" + lodash "^4.2.0" + +babel-types@^6.16.0, babel-types@^6.8.0: + version "6.16.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.16.0.tgz#71cca1dbe5337766225c5c193071e8ebcbcffcfe" + dependencies: + babel-runtime "^6.9.1" + esutils "^2.0.2" + lodash "^4.2.0" + to-fast-properties "^1.0.1" + +babylon@^6.11.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.13.0.tgz#58ed40dd2a8120612be5f318c2c0bedbebde4a0b" + +backo2@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" + +balanced-match@^0.4.1, balanced-match@^0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" + +balanced-match@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.1.0.tgz#b504bd05869b39259dd0c5efc35d843176dccc4a" + +base64-arraybuffer@0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.2.tgz#474df4a9f2da24e05df3158c3b1db3c3cd46a154" + +base64-arraybuffer@0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8" + +base64id@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/base64id/-/base64id-0.1.0.tgz#02ce0fdeee0cef4f40080e1e73e834f0b1bfce3f" + +batch@0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.5.3.tgz#3f3414f380321743bfc1042f9a83ff1d5824d464" + +bcrypt-pbkdf@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.0.tgz#3ca76b85241c7170bf7d9703e7b9aa74630040d4" + dependencies: + tweetnacl "^0.14.3" + +benchmark@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/benchmark/-/benchmark-1.0.0.tgz#2f1e2fa4c359f11122aa183082218e957e390c73" + +better-assert@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522" + dependencies: + callsite "1.0.0" + +binary-extensions@^1.0.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.7.0.tgz#6c1610db163abfb34edfe42fa423343a1e01185d" + +bl@^1.0.0, bl@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/bl/-/bl-1.1.2.tgz#fdca871a99713aa00d19e3bbba41c44787a65398" + dependencies: + readable-stream "~2.0.5" + +bl@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/bl/-/bl-1.0.3.tgz#fc5421a28fd4226036c3b3891a66a25bc64d226e" + dependencies: + readable-stream "~2.0.5" + +blob@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.4.tgz#bcf13052ca54463f30f9fc7e95b9a47630a94921" + +block-stream@*: + version "0.0.9" + resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + dependencies: + inherits "~2.0.0" + +bluebird@^3.0.5, bluebird@^3.3.0, bluebird@^3.3.4: + version "3.4.6" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.6.tgz#01da8d821d87813d158967e743d5fe6c62cf8c0f" + +body-parser@^1.12.4: + version "1.15.2" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.15.2.tgz#d7578cf4f1d11d5f6ea804cef35dc7a7ff6dae67" + dependencies: + bytes "2.4.0" + content-type "~1.0.2" + debug "~2.2.0" + depd "~1.1.0" + http-errors "~1.5.0" + iconv-lite "0.4.13" + on-finished "~2.3.0" + qs "6.2.0" + raw-body "~2.1.7" + type-is "~1.6.13" + +boom@2.x.x: + version "2.10.1" + resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" + dependencies: + hoek "2.x.x" + +brace-expansion@^1.0.0: + version "1.1.6" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.6.tgz#7197d7eaa9b87e648390ea61fc66c84427420df9" + dependencies: + balanced-match "^0.4.1" + concat-map "0.0.1" + +braces@^0.1.2: + version "0.1.5" + resolved "https://registry.yarnpkg.com/braces/-/braces-0.1.5.tgz#c085711085291d8b75fdd74eab0f8597280711e6" + dependencies: + expand-range "^0.1.0" + +braces@^1.8.2: + version "1.8.5" + resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + dependencies: + expand-range "^1.8.1" + preserve "^0.2.0" + repeat-element "^1.1.2" + +browser-sync: + version "2.17.5" + resolved "https://registry.yarnpkg.com/browser-sync/-/browser-sync-2.17.5.tgz#8e0a9ddfc2e162e7aada085f76181c57b6dbdf7a" + dependencies: + browser-sync-client "^2.3.3" + browser-sync-ui "0.6.1" + bs-recipes "1.2.3" + chokidar "1.6.0" + connect "3.5.0" + dev-ip "^1.0.1" + easy-extender "2.3.2" + eazy-logger "3.0.2" + emitter-steward "^1.0.0" + fs-extra "0.30.0" + http-proxy "1.15.1" + immutable "3.8.1" + localtunnel "1.8.1" + micromatch "2.3.11" + opn "4.0.2" + portscanner "^1.0.0" + qs "6.2.1" + resp-modifier "6.0.2" + rx "4.1.0" + serve-index "1.8.0" + serve-static "1.11.1" + server-destroy "1.0.1" + socket.io "1.5.0" + ua-parser-js "0.7.10" + yargs "6.0.0" + +browser-sync-client@^2.3.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/browser-sync-client/-/browser-sync-client-2.4.3.tgz#e965033e0c83e5f06caacb516755b694836cea4f" + dependencies: + etag "^1.7.0" + fresh "^0.3.0" + +browser-sync-ui@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/browser-sync-ui/-/browser-sync-ui-0.6.1.tgz#d8b98ea3b755632287350a37ee2eaaacabea28d2" + dependencies: + async-each-series "0.1.1" + connect-history-api-fallback "^1.1.0" + immutable "^3.7.6" + server-destroy "1.0.1" + stream-throttle "^0.1.3" + weinre "^2.0.0-pre-I0Z7U9OV" + +browserslist@~1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-1.4.0.tgz#9cfdcf5384d9158f5b70da2aa00b30e8ff019049" + dependencies: + caniuse-db "^1.0.30000539" + +bs-recipes@1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/bs-recipes/-/bs-recipes-1.2.3.tgz#0e4d17bb1cff92ef6c36608b8487d9a07571ac54" + +bser@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bser/-/bser-1.0.2.tgz#381116970b2a6deea5646dd15dd7278444b56169" + dependencies: + node-int64 "^0.4.0" + +buffer-peek-stream@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/buffer-peek-stream/-/buffer-peek-stream-1.0.1.tgz#53b47570a1347787c5bad4ca2ca3021f9d8b3cfd" + +buffer-shims@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" + +builtin-modules@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + +bytes@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.4.0.tgz#7d97196f9d5baf7f6935e25985549edd2a6c2339" + +callsite@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" + +camelcase-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" + dependencies: + camelcase "^2.0.0" + map-obj "^1.0.0" + +camelcase@^1.0.2, camelcase@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" + +camelcase@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + +camelcase@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" + +caniuse-db@^1.0.30000539, caniuse-db@^1.0.30000554: + version "1.0.30000564" + resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000564.tgz#840a4d9e5c15dc9c6df84d7051f28e30514cc00b" + +caseless@~0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" + +center-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" + dependencies: + align-text "^0.1.3" + lazy-cache "^1.0.3" + +chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + dependencies: + 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" + +chokidar, chokidar@^1.4.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.6.1.tgz#2f4447ab5e96e50fb3d789fd90d4c72e0e4c70c2" + dependencies: + anymatch "^1.3.0" + async-each "^1.0.0" + glob-parent "^2.0.0" + inherits "^2.0.1" + is-binary-path "^1.0.0" + is-glob "^2.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.0.0" + optionalDependencies: + fsevents "^1.0.0" + +chokidar@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.6.0.tgz#90c32ad4802901d7713de532dc284e96a63ad058" + dependencies: + anymatch "^1.3.0" + async-each "^1.0.0" + glob-parent "^2.0.0" + inherits "^2.0.1" + is-binary-path "^1.0.0" + is-glob "^2.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.0.0" + optionalDependencies: + fsevents "^1.0.0" + +clap@^1.0.9: + version "1.1.1" + resolved "https://registry.yarnpkg.com/clap/-/clap-1.1.1.tgz#a8a93e0bfb7581ac199c4f001a5525a724ce696d" + dependencies: + chalk "^1.1.3" + +cli-color@^0.3.2: + version "0.3.3" + resolved "https://registry.yarnpkg.com/cli-color/-/cli-color-0.3.3.tgz#12d5bdd158ff8a0b0db401198913c03df069f6f5" + dependencies: + d "~0.1.1" + es5-ext "~0.10.6" + memoizee "~0.3.8" + timers-ext "0.1" + +cliui@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" + dependencies: + center-align "^0.1.1" + right-align "^0.1.1" + wordwrap "0.0.2" + +cliui@^3.0.3, cliui@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrap-ansi "^2.0.0" + +clone@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149" + +coa@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/coa/-/coa-1.0.1.tgz#7f959346cfc8719e3f7233cd6852854a7c67d8a3" + dependencies: + q "^1.1.2" + +code-point-at@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.0.1.tgz#1104cd34f9b5b45d3eba88f1babc1924e1ce35fb" + dependencies: + number-is-nan "^1.0.0" + +color-convert@^1.3.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.5.0.tgz#7a2b4efb4488df85bca6443cb038b7100fbe7de1" + +color-name@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.1.tgz#4b1415304cf50028ea81643643bd82ea05803689" + +color-string@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-0.3.0.tgz#27d46fb67025c5c2fa25993bfbf579e47841b991" + dependencies: + color-name "^1.0.0" + +color@^0.11.0: + version "0.11.3" + resolved "https://registry.yarnpkg.com/color/-/color-0.11.3.tgz#4bad1d0d52499dd00dbd6f0868442467e49394e6" + dependencies: + clone "^1.0.2" + color-convert "^1.3.0" + color-string "^0.3.0" + +colormin@^1.0.5: + version "1.1.2" + resolved "https://registry.yarnpkg.com/colormin/-/colormin-1.1.2.tgz#ea2f7420a72b96881a38aae59ec124a6f7298133" + dependencies: + color "^0.11.0" + css-color-names "0.0.4" + has "^1.0.1" + +colors@^1.1.0, colors@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" + +combine-lists@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/combine-lists/-/combine-lists-1.0.1.tgz#458c07e09e0d900fc28b70a3fec2dacd1d2cb7f6" + dependencies: + lodash "^4.5.0" + +combined-stream@^1.0.5, combined-stream@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" + dependencies: + delayed-stream "~1.0.0" + +commander@^2.2.0, commander@^2.9.0, commander@2.9.x: + version "2.9.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" + dependencies: + graceful-readlink ">= 1.0.0" + +component-bind@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" + +component-emitter@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.1.2.tgz#296594f2753daa63996d2af08d15a95116c9aec3" + +component-emitter@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.0.tgz#ccd113a86388d06482d03de3fc7df98526ba8efe" + +component-inherit@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + +concat-stream@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.5.0.tgz#53f7d43c51c5e43f81c8fdd03321c631be68d611" + dependencies: + inherits "~2.0.1" + readable-stream "~2.0.0" + typedarray "~0.0.5" + +connect-history-api-fallback@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.3.0.tgz#e51d17f8f0ef0db90a64fdb47de3051556e9f169" + +connect@^3.3.5, connect@3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/connect/-/connect-3.5.0.tgz#b357525a0b4c1f50599cd983e1d9efeea9677198" + dependencies: + debug "~2.2.0" + finalhandler "0.5.0" + parseurl "~1.3.1" + utils-merge "1.0.0" + +connect@1.x: + version "1.9.2" + resolved "https://registry.yarnpkg.com/connect/-/connect-1.9.2.tgz#42880a22e9438ae59a8add74e437f58ae8e52807" + dependencies: + formidable "1.0.x" + mime ">= 0.0.1" + qs ">= 0.4.0" + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + +content-type@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.2.tgz#b7d113aee7a8dd27bd21133c4dc2529df1721eed" + +convert-source-map@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.3.0.tgz#e9f3e9c6e2728efc2676696a70eb382f73106a67" + +core-js@^1.2.6: + version "1.2.7" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" + +core-js@^2.2.0, core-js@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" + +core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + +cross-spawn@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982" + dependencies: + lru-cache "^4.0.1" + which "^1.2.9" + +cryptiles@2.x.x: + version "2.0.5" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" + dependencies: + boom "2.x.x" + +css-color-names@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" + +cssnano: + version "3.7.7" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-3.7.7.tgz#27fac611380c6a49d6f722c0537e5a988a785010" + dependencies: + autoprefixer "^6.3.1" + decamelize "^1.1.2" + defined "^1.0.0" + has "^1.0.1" + object-assign "^4.0.1" + postcss "^5.0.14" + postcss-calc "^5.2.0" + postcss-colormin "^2.1.8" + postcss-convert-values "^2.3.4" + postcss-discard-comments "^2.0.4" + postcss-discard-duplicates "^2.0.1" + postcss-discard-empty "^2.0.1" + postcss-discard-overridden "^0.1.1" + postcss-discard-unused "^2.2.1" + postcss-filter-plugins "^2.0.0" + postcss-merge-idents "^2.1.5" + postcss-merge-longhand "^2.0.1" + postcss-merge-rules "^2.0.3" + postcss-minify-font-values "^1.0.2" + postcss-minify-gradients "^1.0.1" + postcss-minify-params "^1.0.4" + postcss-minify-selectors "^2.0.4" + postcss-normalize-charset "^1.1.0" + postcss-normalize-url "^3.0.7" + postcss-ordered-values "^2.1.0" + postcss-reduce-idents "^2.2.2" + postcss-reduce-initial "^1.0.0" + postcss-reduce-transforms "^1.0.3" + postcss-svgo "^2.1.1" + postcss-unique-selectors "^2.0.2" + postcss-value-parser "^3.2.3" + postcss-zindex "^2.0.1" + +csso@~2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/csso/-/csso-2.2.1.tgz#51fbb5347e50e81e6ed51668a48490ae6fe2afe2" + dependencies: + clap "^1.0.9" + source-map "^0.5.3" + +ctype@0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/ctype/-/ctype-0.5.3.tgz#82c18c2461f74114ef16c135224ad0b9144ca12f" + +currently-unhandled@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" + dependencies: + array-find-index "^1.0.1" + +custom-event@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425" + +d@^0.1.1, d@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/d/-/d-0.1.1.tgz#da184c535d18d8ee7ba2aa229b914009fae11309" + dependencies: + es5-ext "~0.10.2" + +d@1: + version "1.0.0" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" + dependencies: + es5-ext "^0.10.9" + +dashdash@^1.12.0: + version "1.14.0" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.0.tgz#29e486c5418bf0f356034a993d51686a33e84141" + dependencies: + assert-plus "^1.0.0" + +data-uri-to-buffer@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-0.0.4.tgz#46e13ab9da8e309745c8d01ce547213ebdb2fe3f" + +date-now@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/date-now/-/date-now-1.0.1.tgz#bb7d086438debe4182a485fb3df3fbfb99d6153c" + +debounce: + version "1.0.0" + resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.0.0.tgz#0948af513d2e4ce407916f8506a423d3f9cf72d8" + dependencies: + date-now "1.0.1" + +debug@^2.1.1, debug@^2.2.0, debug@~2.2.0, debug@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" + dependencies: + ms "0.7.1" + +debug@0.7.4: + version "0.7.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-0.7.4.tgz#06e1ea8082c2cb14e39806e22e2f6f757f92af39" + +decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + +deep-extend@~0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.1.tgz#efe4113d08085f4e6f9687759810f807469e2253" + +defined@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + +depd@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.0.tgz#e1bd82c6aab6ced965b97b88b17ed3e528ca18c3" + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + +detect-file@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-0.1.0.tgz#4935dedfd9488648e006b0129566e9386711ea63" + dependencies: + fs-exists-sync "^0.1.0" + +detect-indent@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-3.0.1.tgz#9dc5e5ddbceef8325764b9451b02bc6d54084f75" + dependencies: + get-stdin "^4.0.1" + minimist "^1.1.0" + repeating "^1.1.0" + +dev-ip@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/dev-ip/-/dev-ip-1.0.1.tgz#a76a3ed1855be7a012bb8ac16cb80f3c00dc28f0" + +di@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" + +dom-serialize@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b" + dependencies: + custom-event "~1.0.0" + ent "~2.2.0" + extend "^3.0.0" + void-elements "^2.0.0" + +easy-extender@2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/easy-extender/-/easy-extender-2.3.2.tgz#3d3248febe2b159607316d8f9cf491c16648221d" + dependencies: + lodash "^3.10.1" + +eazy-logger@3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/eazy-logger/-/eazy-logger-3.0.2.tgz#a325aa5e53d13a2225889b2ac4113b2b9636f4fc" + dependencies: + tfunk "^3.0.1" + +ecc-jsbn@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" + dependencies: + jsbn "~0.1.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + +emitter-steward@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/emitter-steward/-/emitter-steward-1.0.0.tgz#f3411ade9758a7565df848b2da0cbbd1b46cbd64" + +encodeurl@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20" + +end-of-stream@^1.0.0, end-of-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.1.0.tgz#e9353258baa9108965efc41cb0ef8ade2f3cfb07" + dependencies: + once "~1.3.0" + +engine.io-client@1.6.9: + version "1.6.9" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-1.6.9.tgz#1d6ad48048a5083c95096943b29d36efdb212401" + dependencies: + 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" + +engine.io-client@1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-1.7.0.tgz#0bb81d3563ab7afb668f1e1b400c9403b03006ee" + dependencies: + component-emitter "1.1.2" + component-inherit "0.0.3" + debug "2.2.0" + engine.io-parser "1.3.0" + has-cors "1.1.0" + indexof "0.0.1" + parsejson "0.0.1" + parseqs "0.0.2" + parseuri "0.0.4" + ws "1.1.1" + xmlhttprequest-ssl "1.5.1" + yeast "0.1.2" + +engine.io-parser@1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-1.2.4.tgz#e0897b0bf14e792d4cd2a5950553919c56948c42" + dependencies: + 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" + +engine.io-parser@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-1.3.0.tgz#61a35c7f3a3ccd1b179e4f52257a7a8cfacaeb21" + dependencies: + after "0.8.1" + arraybuffer.slice "0.0.6" + base64-arraybuffer "0.1.5" + blob "0.0.4" + has-binary "0.1.6" + wtf-8 "1.0.0" + +engine.io@1.6.10: + version "1.6.10" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-1.6.10.tgz#f87d84e1bd21d1a2ec7f8deef0c62054acdfb27a" + dependencies: + accepts "1.1.4" + base64id "0.1.0" + debug "2.2.0" + engine.io-parser "1.2.4" + ws "1.0.1" + +engine.io@1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-1.7.0.tgz#a417857af4995d9bbdf8a0e03a87e473ebe64fbe" + dependencies: + accepts "1.3.3" + base64id "0.1.0" + debug "2.2.0" + engine.io-parser "1.3.0" + ws "1.1.1" + +ent@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d" + +err-code@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/err-code/-/err-code-1.1.1.tgz#739d71b6851f24d050ea18c79a5b722420771d59" + +error-ex@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.0.tgz#e67b43f3e82c96ea3a584ffee0b9fc3325d802d9" + dependencies: + is-arrayish "^0.2.1" + +es5-ext@^0.10.12, es5-ext@^0.10.7, es5-ext@^0.10.9, es5-ext@~0.10.11, es5-ext@~0.10.2, es5-ext@~0.10.5, es5-ext@~0.10.6, es5-ext@~0.10.7: + version "0.10.12" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.12.tgz#aa84641d4db76b62abba5e45fd805ecbab140047" + dependencies: + es6-iterator "2" + es6-symbol "~3.1" + +es6-iterator@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-0.1.3.tgz#d6f58b8c4fc413c249b4baa19768f8e4d7c8944e" + dependencies: + d "~0.1.1" + es5-ext "~0.10.5" + es6-symbol "~2.0.1" + +es6-iterator@2: + version "2.0.0" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.0.tgz#bd968567d61635e33c0b80727613c9cb4b096bac" + dependencies: + d "^0.1.1" + es5-ext "^0.10.7" + es6-symbol "3" + +es6-promise@~4.0.3: + version "4.0.5" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.0.5.tgz#7882f30adde5b240ccfa7f7d78c548330951ae42" + +es6-symbol@^3.0.2, es6-symbol@~3.1, es6-symbol@3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.0.tgz#94481c655e7a7cad82eba832d97d5433496d7ffa" + dependencies: + d "~0.1.1" + es5-ext "~0.10.11" + +es6-symbol@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-2.0.1.tgz#761b5c67cfd4f1d18afb234f691d678682cb3bf3" + dependencies: + d "~0.1.1" + es5-ext "~0.10.5" + +es6-template-strings@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/es6-template-strings/-/es6-template-strings-2.0.1.tgz#b166c6a62562f478bb7775f6ca96103a599b4b2c" + dependencies: + es5-ext "^0.10.12" + esniff "^1.1" + +es6-weak-map@~0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-0.1.4.tgz#706cef9e99aa236ba7766c239c8b9e286ea7d228" + dependencies: + d "~0.1.1" + es5-ext "~0.10.6" + es6-iterator "~0.1.3" + es6-symbol "~2.0.1" + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + +escape-string-regexp@^1.0.2: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + +esniff@^1.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/esniff/-/esniff-1.1.0.tgz#c66849229f91464dede2e0d40201ed6abf65f2ac" + dependencies: + d "1" + es5-ext "^0.10.12" + +esprima@^2.6.0: + version "2.7.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" + +esutils@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + +etag@^1.7.0, etag@~1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.7.0.tgz#03d30b5f67dd6e632d2945d30d6652731a34d5d8" + +event-emitter@~0.3.4: + version "0.3.4" + resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.4.tgz#8d63ddfb4cfe1fae3b32ca265c4c720222080bb5" + dependencies: + d "~0.1.1" + es5-ext "~0.10.7" + +eventemitter3@1.x.x: + version "1.2.0" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508" + +exec-sh@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.0.tgz#14f75de3f20d286ef933099b2ce50a90359cef10" + dependencies: + merge "^1.1.3" + +expand-braces@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/expand-braces/-/expand-braces-0.1.2.tgz#488b1d1d2451cb3d3a6b192cfc030f44c5855fea" + dependencies: + array-slice "^0.2.3" + array-unique "^0.2.1" + braces "^0.1.2" + +expand-brackets@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + dependencies: + is-posix-bracket "^0.1.0" + +expand-range@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-0.1.1.tgz#4cb8eda0993ca56fa4f41fc42f3cbb4ccadff044" + dependencies: + is-number "^0.1.1" + repeat-string "^0.2.2" + +expand-range@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + dependencies: + fill-range "^2.1.0" + +expand-tilde@^1.2.0, expand-tilde@^1.2.1, expand-tilde@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-1.2.2.tgz#0b81eba897e5a3d31d1c3d102f8f01441e559449" + dependencies: + os-homedir "^1.0.1" + +express@2.5.x: + version "2.5.11" + resolved "https://registry.yarnpkg.com/express/-/express-2.5.11.tgz#4ce8ea1f3635e69e49f0ebb497b6a4b0a51ce6f0" + dependencies: + connect "1.x" + mime "1.2.4" + mkdirp "0.3.0" + qs "0.4.x" + +extend@^3.0.0, extend@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4" + +extglob@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + dependencies: + is-extglob "^1.0.0" + +extract-zip@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.5.0.tgz#92ccf6d81ef70a9fa4c1747114ccef6d8688a6c4" + dependencies: + concat-stream "1.5.0" + debug "0.7.4" + mkdirp "0.5.0" + yauzl "2.4.1" + +extsprintf@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" + +fb-watchman@^1.8.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-1.9.0.tgz#6f268f1f347a6b3c875d1e89da7e1ed79adfc0ec" + dependencies: + bser "^1.0.2" + +fd-slicer@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65" + dependencies: + pend "~1.2.0" + +filename-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.0.tgz#996e3e80479b98b9897f15a8a58b3d084e926775" + +fill-range@^2.1.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" + dependencies: + is-number "^2.1.0" + isobject "^2.0.0" + randomatic "^1.1.3" + repeat-element "^1.1.2" + repeat-string "^1.5.2" + +finalhandler@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-0.5.0.tgz#e9508abece9b6dba871a6942a1d7911b91911ac7" + dependencies: + debug "~2.2.0" + escape-html "~1.0.3" + on-finished "~2.3.0" + statuses "~1.3.0" + unpipe "~1.0.0" + +find-up@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + +findup-sync@^0.4.2: + version "0.4.3" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.4.3.tgz#40043929e7bc60adf0b7f4827c4c6e75a0deca12" + dependencies: + detect-file "^0.1.0" + is-glob "^2.0.1" + micromatch "^2.3.7" + resolve-dir "^0.1.0" + +fined@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/fined/-/fined-1.0.2.tgz#5b28424b760d7598960b7ef8480dff8ad3660e97" + dependencies: + expand-tilde "^1.2.1" + lodash.assignwith "^4.0.7" + lodash.isempty "^4.2.1" + lodash.isplainobject "^4.0.4" + lodash.isstring "^4.0.1" + lodash.pick "^4.2.1" + parse-filepath "^1.0.1" + +flagged-respawn@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-0.3.2.tgz#ff191eddcd7088a675b2610fffc976be9b8074b5" + +flatten@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782" + +for-in@^0.1.5: + version "0.1.6" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.6.tgz#c9f96e89bfad18a545af5ec3ed352a1d9e5b4dc8" + +for-own@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.4.tgz#0149b41a39088c7515f51ebe1c1386d45f935072" + dependencies: + for-in "^0.1.5" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + +form-data@~1.0.0-rc3, form-data@~1.0.0-rc4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-1.0.1.tgz#ae315db9a4907fa065502304a66d7733475ee37c" + dependencies: + async "^2.0.1" + combined-stream "^1.0.5" + mime-types "^2.1.11" + +form-data@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.0.0.tgz#6f0aebadcc5da16c13e1ecc11137d85f9b883b25" + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.5" + mime-types "^2.1.11" + +formidable@1.0.x: + version "1.0.17" + resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.0.17.tgz#ef5491490f9433b705faa77249c99029ae348559" + +fresh@^0.3.0, fresh@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.3.0.tgz#651f838e22424e7566de161d8358caa199f83d4f" + +fs-exists-sync@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add" + +fs-extra@^0.26.5: + version "0.26.7" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.26.7.tgz#9ae1fdd94897798edab76d0918cf42d0c3184fa9" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^2.1.0" + klaw "^1.0.0" + path-is-absolute "^1.0.0" + rimraf "^2.2.8" + +fs-extra@~0.30.0, fs-extra@0.30.0: + version "0.30.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^2.1.0" + klaw "^1.0.0" + path-is-absolute "^1.0.0" + rimraf "^2.2.8" + +fs-promise: + version "0.5.0" + resolved "https://registry.yarnpkg.com/fs-promise/-/fs-promise-0.5.0.tgz#4347d6bf624655a7061a4319213c393276ad3ef3" + dependencies: + any-promise "^1.0.0" + fs-extra "^0.26.5" + mz "^2.3.1" + thenify-all "^1.6.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + +fsevents@^1.0.0: + version "1.0.14" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.0.14.tgz#558e8cc38643d8ef40fe45158486d0d25758eee4" + dependencies: + nan "^2.3.0" + node-pre-gyp "^0.6.29" + +fstream-ignore@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" + dependencies: + fstream "^1.0.0" + inherits "2" + minimatch "^3.0.0" + +fstream@^1.0.0, fstream@^1.0.2, fstream@~1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.10.tgz#604e8a92fe26ffd9f6fae30399d4984e1ab22822" + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + +function-bind@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.0.tgz#16176714c801798e4e8f2cf7f7529467bb4a5771" + +gauge@~2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.6.0.tgz#d35301ad18e96902b4751dcbbe40f4218b942a46" + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-color "^0.1.7" + 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" + +gaze@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.2.tgz#847224677adb8870d679257ed3388fdb61e40105" + dependencies: + globule "^1.0.0" + +generate-function@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" + +generate-object-property@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" + dependencies: + is-property "^1.0.0" + +get-caller-file@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" + +get-stdin@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + +getpass@^0.1.1: + version "0.1.6" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.6.tgz#283ffd9fc1256840875311c1b60e8c40187110e6" + dependencies: + assert-plus "^1.0.0" + +glob-base@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + dependencies: + glob-parent "^2.0.0" + is-glob "^2.0.0" + +glob-parent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + dependencies: + is-glob "^2.0.0" + +glob@^6.0.1: + version "6.0.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "2 || 3" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.0.0, glob@^7.0.3, glob@^7.0.5: + version "7.1.1" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.2" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@~3.2: + version "3.2.11" + resolved "https://registry.yarnpkg.com/glob/-/glob-3.2.11.tgz#4a973f635b9190f715d10987d5c00fd2815ebe3d" + dependencies: + inherits "2" + minimatch "0.3" + +glob@~7.0.3: + version "7.0.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.6.tgz#211bafaf49e525b8cd93260d14ab136152b3f57a" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.2" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@5.0.x: + version "5.0.15" + resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "2 || 3" + once "^1.3.0" + path-is-absolute "^1.0.0" + +global-modules@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-0.2.3.tgz#ea5a3bed42c6d6ce995a4f8a1269b5dae223828d" + dependencies: + global-prefix "^0.1.4" + is-windows "^0.2.0" + +global-prefix@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-0.1.4.tgz#05158db1cde2dd491b455e290eb3ab8bfc45c6e1" + dependencies: + ini "^1.3.4" + is-windows "^0.2.0" + osenv "^0.1.3" + which "^1.2.10" + +globals@^8.3.0: + version "8.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-8.18.0.tgz#93d4a62bdcac38cfafafc47d6b034768cb0ffcb4" + +globule@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/globule/-/globule-1.0.0.tgz#f22aebaacce02be492453e979c3ae9b6983f1c6c" + dependencies: + glob "~7.0.3" + lodash "~4.9.0" + minimatch "~3.0.0" + +graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6: + version "4.1.9" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.9.tgz#baacba37d19d11f9d146d3578bc99958c3787e29" + +"graceful-readlink@>= 1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" + +har-validator@~2.0.2, har-validator@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d" + dependencies: + chalk "^1.1.1" + commander "^2.9.0" + is-my-json-valid "^2.12.4" + pinkie-promise "^2.0.0" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + dependencies: + ansi-regex "^2.0.0" + +has-binary@0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/has-binary/-/has-binary-0.1.6.tgz#25326f39cfa4f616ad8787894e3af2cfbc7b6e10" + dependencies: + isarray "0.0.1" + +has-binary@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/has-binary/-/has-binary-0.1.7.tgz#68e61eb16210c9545a0a5cce06a873912fe1e68c" + dependencies: + isarray "0.0.1" + +has-color@^0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/has-color/-/has-color-0.1.7.tgz#67144a5260c34fc3cca677d041daf52fe7b78b2f" + +has-cors@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" + +has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + +has@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" + dependencies: + function-bind "^1.0.2" + +hasha@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/hasha/-/hasha-2.2.0.tgz#78d7cbfc1e6d66303fe79837365984517b2f6ee1" + dependencies: + is-stream "^1.0.1" + pinkie-promise "^2.0.0" + +hawk@~3.1.0, hawk@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" + dependencies: + boom "2.x.x" + cryptiles "2.x.x" + hoek "2.x.x" + sntp "1.x.x" + +hoek@2.x.x: + version "2.16.3" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" + +home-or-tmp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-1.0.0.tgz#4b9f1e40800c3e50c6c27f781676afcce71f3985" + dependencies: + os-tmpdir "^1.0.1" + user-home "^1.1.1" + +hosted-git-info@^2.1.4: + version "2.1.5" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.1.5.tgz#0ba81d90da2e25ab34a332e6ec77936e1598118b" + +html-comment-regex@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.1.tgz#668b93776eaae55ebde8f3ad464b307a4963625e" + +http-errors@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.5.0.tgz#b1cb3d8260fd8e2386cad3189045943372d48211" + dependencies: + inherits "2.0.1" + setprototypeof "1.0.1" + statuses ">= 1.3.0 < 2" + +http-proxy@^1.13.0: + version "1.15.2" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.15.2.tgz#642fdcaffe52d3448d2bda3b0079e9409064da31" + dependencies: + eventemitter3 "1.x.x" + requires-port "1.x.x" + +http-proxy@1.15.1: + version "1.15.1" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.15.1.tgz#91a6088172e79bc0e821d5eb04ce702f32446393" + dependencies: + eventemitter3 "1.x.x" + requires-port "1.x.x" + +http-signature@~0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-0.11.0.tgz#1796cf67a001ad5cd6849dca0991485f09089fe6" + dependencies: + asn1 "0.1.11" + assert-plus "^0.1.5" + ctype "0.5.3" + +http-signature@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" + dependencies: + assert-plus "^0.2.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +iconv-lite@0.4.13: + version "0.4.13" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2" + +immutable@^3.7.6, immutable@3.8.1: + version "3.8.1" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.1.tgz#200807f11ab0f72710ea485542de088075f68cd2" + +in-publish@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51" + +indent-string@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" + dependencies: + repeating "^2.0.0" + +indexes-of@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + +indexof@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.1, inherits@2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + +ini@^1.3.4, ini@~1.3.0: + version "1.3.4" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" + +interpolate: + version "0.1.0" + resolved "https://registry.yarnpkg.com/interpolate/-/interpolate-0.1.0.tgz#b60177a4ba941fb3724c821905d99aade13d1df9" + +invariant@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.1.tgz#b097010547668c7e337028ebe816ebe36c8a8d54" + dependencies: + loose-envify "^1.0.0" + +invert-kv@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + +is-absolute-url@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.0.0.tgz#9c4b20b0e5c0cbef9a479a367ede6f991679f359" + +is-absolute@^0.2.3: + version "0.2.6" + resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-0.2.6.tgz#20de69f3db942ef2d87b9c2da36f172235b1b5eb" + dependencies: + is-relative "^0.2.1" + is-windows "^0.2.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + dependencies: + binary-extensions "^1.0.0" + +is-buffer@^1.0.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.4.tgz#cfc86ccd5dc5a52fa80489111c6920c457e2d98b" + +is-builtin-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" + dependencies: + builtin-modules "^1.0.0" + +is-dotfile@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d" + +is-equal-shallow@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + dependencies: + is-primitive "^2.0.0" + +is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + +is-extglob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + +is-finite@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + dependencies: + number-is-nan "^1.0.0" + +is-glob@^2.0.0, is-glob@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + dependencies: + is-extglob "^1.0.0" + +is-my-json-valid@^2.12.4: + version "2.15.0" + resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.15.0.tgz#936edda3ca3c211fd98f3b2d3e08da43f7b2915b" + dependencies: + generate-function "^2.0.0" + generate-object-property "^1.1.0" + jsonpointer "^4.0.0" + xtend "^4.0.0" + +is-number@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-0.1.1.tgz#69a7af116963d47206ec9bd9b48a14216f1e3806" + +is-number@^2.0.2, is-number@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + dependencies: + kind-of "^3.0.2" + +is-plain-obj@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + +is-posix-bracket@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + +is-primitive@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + +is-property@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" + +is-relative@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-0.2.1.tgz#d27f4c7d516d175fb610db84bbeef23c3bc97aa5" + dependencies: + is-unc-path "^0.1.1" + +is-stream@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + +is-svg@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-2.0.1.tgz#f93ab3bf1d6bbca30e9753cd3485b1300eebc013" + dependencies: + html-comment-regex "^1.1.0" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + +is-unc-path@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-0.1.1.tgz#ab2533d77ad733561124c3dc0f5cd8b90054c86b" + dependencies: + unc-path-regex "^0.1.0" + +is-utf8@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + +is-windows@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c" + +is@~0.2.6: + version "0.2.7" + resolved "https://registry.yarnpkg.com/is/-/is-0.2.7.tgz#3b34a2c48f359972f35042849193ae7264b63562" + +isarray@~1.0.0, isarray@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + +isbinaryfile@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.1.tgz#6e99573675372e841a0520c036b41513d783e79e" + +isexe@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-1.1.2.tgz#36f3e22e60750920f5e7241a476a8c6a42275ad0" + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + dependencies: + isarray "1.0.0" + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + +jasmine-core: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-2.5.2.tgz#6f61bd79061e27f43e6f9355e44b3c6cab6ff297" + +jodid25519@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967" + dependencies: + jsbn "~0.1.0" + +js-base64@^2.1.9: + version "2.1.9" + resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.1.9.tgz#f0e80ae039a4bd654b5f281fc93f04a914a7fcce" + +js-tokens@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-1.0.3.tgz#14e56eb68c8f1a92c43d59f5014ec29dc20f2ae1" + +js-tokens@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-2.0.0.tgz#79903f5563ee778cc1162e6dcf1a0027c97f9cb5" + +js-yaml@~3.6.1: + version "3.6.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.6.1.tgz#6e5fe67d8b205ce4d22fad05b7781e8dadcc4b30" + dependencies: + argparse "^1.0.7" + esprima "^2.6.0" + +jsbn@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.0.tgz#650987da0dd74f4ebf5a11377a2aa2d273e97dfd" + +jsesc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + +json3@3.2.6: + version "3.2.6" + resolved "https://registry.yarnpkg.com/json3/-/json3-3.2.6.tgz#f6efc93c06a04de9aec53053df2559bb19e2038b" + +json3@3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" + +json5@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.4.0.tgz#054352e4c4c80c86c0923877d449de176a732c8d" + +jsonfile@^2.1.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonpointer@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.0.tgz#6661e161d2fc445f19f98430231343722e1fcbd5" + +jspm-github@^0.14.11: + version "0.14.11" + resolved "https://registry.yarnpkg.com/jspm-github/-/jspm-github-0.14.11.tgz#5093b3a79289d63ff6e3982f3b527878ac808d5c" + dependencies: + bluebird "^3.0.5" + expand-tilde "^1.2.0" + graceful-fs "^4.1.3" + mkdirp "^0.5.1" + netrc "^0.1.3" + request "^2.74.0" + rimraf "^2.5.4" + semver "^5.0.1" + tar-fs "^1.13.0" + which "^1.0.9" + +jspm-npm@^0.29.5: + version "0.29.7" + resolved "https://registry.yarnpkg.com/jspm-npm/-/jspm-npm-0.29.7.tgz#029159c3fe210d20f6965821697082e9a2be40ce" + dependencies: + bluebird "^3.0.5" + buffer-peek-stream "^1.0.1" + graceful-fs "^4.1.3" + mkdirp "^0.5.1" + readdirp "^2.0.0" + request "^2.58.0" + rmdir "^1.1.0" + semver "^5.0.1" + systemjs-builder "^0.15.20" + tar-fs "^1.13.0" + traceur "0.0.105" + which "^1.1.1" + +jspm-registry@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/jspm-registry/-/jspm-registry-0.4.1.tgz#2a30c419906ad71d4da692d1532009dd201c5b14" + dependencies: + graceful-fs "^4.1.3" + rimraf "^2.3.2" + rsvp "^3.0.18" + semver "^4.3.3" + +jspm@beta: + version "0.17.0-beta.29" + resolved "https://registry.yarnpkg.com/jspm/-/jspm-0.17.0-beta.29.tgz#b75f13db7734ba492285409bb57499fb6956e7b2" + dependencies: + bluebird "^3.0.5" + chalk "^1.1.1" + core-js "^1.2.6" + glob "^6.0.1" + graceful-fs "^4.1.2" + jspm-github "^0.14.11" + jspm-npm "^0.29.5" + jspm-registry "^0.4.1" + liftoff "^2.2.0" + minimatch "^3.0.0" + mkdirp "~0.5.1" + ncp "^2.0.0" + proper-lockfile "^1.1.2" + request "^2.67.0" + rimraf "^2.4.4" + sane "^1.3.3" + semver "^5.1.0" + systemjs "0.19.39" + systemjs-builder "0.15.32" + traceur "0.0.105" + uglify-js "^2.6.1" + +jsprim@^1.2.2: + version "1.3.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.3.1.tgz#2a7256f70412a29ee3670aaca625994c4dcff252" + dependencies: + extsprintf "1.0.2" + json-schema "0.2.3" + verror "1.3.6" + +karma: + version "1.3.0" + resolved "https://registry.yarnpkg.com/karma/-/karma-1.3.0.tgz#b2b94e8f499fadd0069d54f9aef4a4d48ec5cc1f" + dependencies: + bluebird "^3.3.0" + body-parser "^1.12.4" + chokidar "^1.4.1" + colors "^1.1.0" + combine-lists "^1.0.0" + connect "^3.3.5" + core-js "^2.2.0" + di "^0.0.1" + dom-serialize "^2.2.0" + expand-braces "^0.1.1" + glob "^7.0.3" + graceful-fs "^4.1.2" + http-proxy "^1.13.0" + isbinaryfile "^3.0.0" + lodash "^3.8.0" + log4js "^0.6.31" + mime "^1.3.4" + minimatch "^3.0.0" + optimist "^0.6.1" + qjobs "^1.1.4" + range-parser "^1.2.0" + rimraf "^2.3.3" + socket.io "1.4.7" + source-map "^0.5.3" + tmp "0.0.28" + useragent "^2.1.9" + +karma-jasmine: + version "1.0.2" + resolved "https://registry.yarnpkg.com/karma-jasmine/-/karma-jasmine-1.0.2.tgz#c0b3ab327bf207db60e17fa27db37cfdef5d8e6c" + +karma-jspm: + version "2.2.0" + resolved "https://registry.yarnpkg.com/karma-jspm/-/karma-jspm-2.2.0.tgz#ce8eaa730896e0b95ab3645b9b8ec5b3a1c419a7" + dependencies: + glob "~3.2" + +karma-nyan-reporter: + version "0.2.4" + resolved "https://registry.yarnpkg.com/karma-nyan-reporter/-/karma-nyan-reporter-0.2.4.tgz#361bc4135002cbe504a36e38f3506e866d6a852c" + dependencies: + cli-color "^0.3.2" + +karma-phantomjs-launcher: + version "1.0.2" + resolved "https://registry.yarnpkg.com/karma-phantomjs-launcher/-/karma-phantomjs-launcher-1.0.2.tgz#19e1041498fd75563ed86730a22c1fe579fa8fb1" + dependencies: + lodash "^4.0.1" + phantomjs-prebuilt "^2.1.7" + +kew@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/kew/-/kew-0.7.0.tgz#79d93d2d33363d6fdd2970b335d9141ad591d79b" + +kind-of@^3.0.2: + version "3.0.4" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.0.4.tgz#7b8ecf18a4e17f8269d73b501c9f232c96887a74" + dependencies: + is-buffer "^1.0.2" + +klaw@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.0.tgz#8857bfbc1d824badf13d3d0241d8bbe46fb12f73" + +lazy-cache@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + +lcid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + dependencies: + invert-kv "^1.0.0" + +liftoff@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-2.3.0.tgz#a98f2ff67183d8ba7cfaca10548bd7ff0550b385" + dependencies: + extend "^3.0.0" + findup-sync "^0.4.2" + fined "^1.0.1" + flagged-respawn "^0.3.2" + lodash.isplainobject "^4.0.4" + lodash.isstring "^4.0.1" + lodash.mapvalues "^4.4.0" + rechoir "^0.6.2" + resolve "^1.1.7" + +limiter@^1.0.5: + version "1.1.0" + resolved "https://registry.yarnpkg.com/limiter/-/limiter-1.1.0.tgz#6e2bd12ca3fcdaa11f224e2e53c896df3f08d913" + +load-json-file@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" + +localtunnel@1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/localtunnel/-/localtunnel-1.8.1.tgz#d51b2bb7a7066afb05b57fc9db844015098f2e17" + dependencies: + debug "2.2.0" + openurl "1.1.0" + request "2.65.0" + yargs "3.29.0" + +lodash.assign@^4.0.3, lodash.assign@^4.0.6, lodash.assign@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" + +lodash.assignwith@^4.0.7: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.assignwith/-/lodash.assignwith-4.2.0.tgz#127a97f02adc41751a954d24b0de17e100e038eb" + +lodash.clonedeep@^4.3.2: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + +lodash.indexof@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/lodash.indexof/-/lodash.indexof-4.0.5.tgz#53714adc2cddd6ed87638f893aa9b6c24e31ef3c" + +lodash.isempty@^4.2.1: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.isempty/-/lodash.isempty-4.4.0.tgz#6f86cbedd8be4ec987be9aaf33c9684db1b31e7e" + +lodash.isplainobject@^4.0.4: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + +lodash.isstring@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" + +lodash.mapvalues@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz#1bafa5005de9dd6f4f26668c30ca37230cc9689c" + +lodash.pick@^4.2.1: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" + +lodash@^3.10.1, lodash@^3.8.0: + version "3.10.1" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" + +lodash@^4.0.0, lodash@^4.0.1, lodash@^4.14.0, lodash@^4.2.0, lodash@^4.5.0: + version "4.16.4" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.16.4.tgz#01ce306b9bad1319f2a5528674f88297aeb70127" + +lodash@~4.9.0: + version "4.9.0" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.9.0.tgz#4c20d742f03ce85dc700e0dd7ab9bcab85e6fc14" + +log4js@^0.6.31: + version "0.6.38" + resolved "https://registry.yarnpkg.com/log4js/-/log4js-0.6.38.tgz#2c494116695d6fb25480943d3fc872e662a522fd" + dependencies: + readable-stream "~1.0.2" + semver "~4.3.3" + +longest@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" + +loose-envify@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.2.0.tgz#69a65aad3de542cf4ee0f4fe74e8e33c709ccb0f" + dependencies: + js-tokens "^1.0.1" + +loud-rejection@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" + dependencies: + currently-unhandled "^0.4.1" + signal-exit "^3.0.0" + +lru-cache@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.0.1.tgz#1343955edaf2e37d9b9e7ee7241e27c4b9fb72be" + dependencies: + pseudomap "^1.0.1" + yallist "^2.0.0" + +lru-cache@2: + version "2.7.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" + +lru-cache@2.2.x: + version "2.2.4" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.2.4.tgz#6c658619becf14031d0d0b594b16042ce4dc063d" + +lru-queue@0.1: + version "0.1.0" + resolved "https://registry.yarnpkg.com/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3" + dependencies: + es5-ext "~0.10.2" + +macaddress@^0.2.8: + version "0.2.8" + resolved "https://registry.yarnpkg.com/macaddress/-/macaddress-0.2.8.tgz#5904dc537c39ec6dbefeae902327135fa8511f12" + +makeerror@1.0.x: + version "1.0.11" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" + dependencies: + tmpl "1.0.x" + +map-cache@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + +map-obj@^1.0.0, map-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + +math-expression-evaluator@^1.2.14: + version "1.2.14" + resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.14.tgz#39511771ed9602405fba9affff17eb4d2a3843ab" + dependencies: + lodash.indexof "^4.0.5" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + +memoizee@~0.3.8: + version "0.3.10" + resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.3.10.tgz#4eca0d8aed39ec9d017f4c5c2f2f6432f42e5c8f" + dependencies: + d "~0.1.1" + es5-ext "~0.10.11" + es6-weak-map "~0.1.4" + event-emitter "~0.3.4" + lru-queue "0.1" + next-tick "~0.2.2" + timers-ext "0.1" + +meow@^3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" + dependencies: + 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@^1.1.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da" + +micromatch@^2.1.5, micromatch@^2.3.7, micromatch@2.3.11: + version "2.3.11" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + dependencies: + arr-diff "^2.0.0" + array-unique "^0.2.1" + braces "^1.8.2" + expand-brackets "^0.1.4" + extglob "^0.3.1" + filename-regex "^2.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.1" + kind-of "^3.0.2" + normalize-path "^2.0.1" + object.omit "^2.0.0" + parse-glob "^3.0.4" + regex-cache "^0.4.2" + +mime-db@~1.12.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.12.0.tgz#3d0c63180f458eb10d325aaa37d7c58ae312e9d7" + +mime-db@~1.24.0: + version "1.24.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.24.0.tgz#e2d13f939f0016c6e4e9ad25a8652f126c467f0c" + +mime-types@^2.1.11, mime-types@~2.1.11, mime-types@~2.1.7: + version "2.1.12" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.12.tgz#152ba256777020dd4663f54c2e7bc26381e71729" + dependencies: + mime-db "~1.24.0" + +mime-types@~2.0.4: + version "2.0.14" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.0.14.tgz#310e159db23e077f8bb22b748dabfa4957140aa6" + dependencies: + mime-db "~1.12.0" + +mime@^1.3.4, "mime@>= 0.0.1", mime@1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" + +mime@1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.2.4.tgz#11b5fdaf29c2509255176b80ad520294f5de92b7" + +minimatch@^3.0.0, minimatch@^3.0.2, minimatch@~3.0.0, "minimatch@2 || 3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" + dependencies: + brace-expansion "^1.0.0" + +minimatch@0.3: + version "0.3.0" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.3.0.tgz#275d8edaac4f1bb3326472089e7949c8394699dd" + dependencies: + lru-cache "2" + sigmund "~1.0.0" + +minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + +minimist@~0.0.1: + version "0.0.10" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + +mkdirp@^0.5.0, mkdirp@^0.5.1, "mkdirp@>=0.5 0", mkdirp@~0.5.0, mkdirp@~0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + dependencies: + minimist "0.0.8" + +mkdirp@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.0.tgz#1bbf5ab1ba827af23575143490426455f481fe1e" + +mkdirp@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.0.tgz#1d73076a6df986cd9344e15e71fcc05a4c9abf12" + dependencies: + minimist "0.0.8" + +ms@0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" + +mz@^2.3.1: + version "2.4.0" + resolved "https://registry.yarnpkg.com/mz/-/mz-2.4.0.tgz#987ba9624d89395388c37cb4741e2caf4dd13b1a" + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" + +nan@^2.3.0, nan@^2.3.2: + version "2.4.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.4.0.tgz#fb3c59d45fe4effe215f0b890f8adf6eb32d2232" + +ncp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ncp/-/ncp-2.0.0.tgz#195a21d6c46e361d2fb1281ba38b91e9df7bdbb3" + +negotiator@0.4.9: + version "0.4.9" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.4.9.tgz#92e46b6db53c7e421ed64a2bc94f08be7630df3f" + +negotiator@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" + +netrc@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/netrc/-/netrc-0.1.4.tgz#6be94fcaca8d77ade0a9670dc460914c94472444" + +next-tick@~0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-0.2.2.tgz#75da4a927ee5887e39065880065b7336413b310d" + +node-gyp@^3.3.1: + version "3.4.0" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.4.0.tgz#dda558393b3ecbbe24c9e6b8703c71194c63fa36" + dependencies: + fstream "^1.0.0" + glob "^7.0.3" + graceful-fs "^4.1.2" + minimatch "^3.0.2" + mkdirp "^0.5.0" + nopt "2 || 3" + npmlog "0 || 1 || 2 || 3" + osenv "0" + path-array "^1.0.0" + request "2" + rimraf "2" + semver "2.x || 3.x || 4 || 5" + tar "^2.0.0" + which "1" + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + +node-pre-gyp@^0.6.29: + version "0.6.30" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.30.tgz#64d3073a6f573003717ccfe30c89023297babba1" + dependencies: + mkdirp "~0.5.0" + nopt "~3.0.1" + npmlog "4.x" + rc "~1.1.0" + request "2.x" + rimraf "~2.5.0" + semver "~5.3.0" + tar "~2.2.0" + tar-pack "~3.1.0" + +node-sass: + version "3.10.1" + resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-3.10.1.tgz#c535b2e1a5439240591e06d7308cb663820d616c" + dependencies: + async-foreach "^0.1.3" + chalk "^1.1.1" + cross-spawn "^3.0.0" + gaze "^1.0.0" + get-stdin "^4.0.1" + glob "^7.0.3" + in-publish "^2.0.0" + lodash.assign "^4.2.0" + lodash.clonedeep "^4.3.2" + meow "^3.7.0" + mkdirp "^0.5.1" + nan "^2.3.2" + node-gyp "^3.3.1" + npmlog "^4.0.0" + request "^2.61.0" + sass-graph "^2.1.1" + +node-uuid@~1.4.3, node-uuid@~1.4.7: + version "1.4.7" + resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.7.tgz#6da5a17668c4b3dd59623bda11cf7fa4c1f60a6f" + +node.extend@1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/node.extend/-/node.extend-1.0.8.tgz#bab04379f7383f4587990c9df07b6a7f65db772b" + dependencies: + is "~0.2.6" + object-keys "~0.4.0" + +node.flow@1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/node.flow/-/node.flow-1.2.3.tgz#e1c44a82aeca8d78b458a77fb3dc642f2eba2649" + dependencies: + node.extend "1.0.8" + +nopt@~3.0.1, "nopt@2 || 3", nopt@3.0.x: + version "3.0.6" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + dependencies: + abbrev "1" + +normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: + version "2.3.5" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.5.tgz#8d924f142960e1777e7ffe170543631cc7cb02df" + dependencies: + 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@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.0.1.tgz#47886ac1662760d4261b7d979d241709d3ce3f7a" + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + +normalize-url@^1.4.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.7.0.tgz#d82452d98d38821cffddab4d77a5f8d20ce66db0" + dependencies: + object-assign "^4.0.1" + prepend-http "^1.0.0" + query-string "^4.1.0" + sort-keys "^1.0.0" + +npmlog@^4.0.0, npmlog@4.x: + version "4.0.0" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.0.0.tgz#e094503961c70c1774eb76692080e8d578a9f88f" + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.6.0" + set-blocking "~2.0.0" + +"npmlog@0 || 1 || 2 || 3": + version "3.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-3.1.2.tgz#2d46fa874337af9498a2f12bb43d8d0be4a36873" + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.6.0" + set-blocking "~2.0.0" + +num2fraction@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + +oauth-sign@~0.8.0, oauth-sign@~0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" + +object-assign@^4.0.1, object-assign@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" + +object-component@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291" + +object-keys@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" + +object-path@^0.9.0: + version "0.9.2" + resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.9.2.tgz#0fd9a74fc5fad1ae3968b586bda5c632bd6c05a5" + +object.omit@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.0.tgz#868597333d54e60662940bb458605dd6ae12fe94" + dependencies: + for-own "^0.1.3" + is-extendable "^0.1.1" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + dependencies: + ee-first "1.1.1" + +once@^1.3.0, once@^1.3.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + dependencies: + wrappy "1" + +once@~1.3.0, once@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" + dependencies: + wrappy "1" + +openurl@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/openurl/-/openurl-1.1.0.tgz#e2f2189d999c04823201f083f0f1a7cd8903187a" + +opn@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/opn/-/opn-4.0.2.tgz#7abc22e644dff63b0a96d5ab7f2790c0f01abc95" + dependencies: + object-assign "^4.0.1" + pinkie-promise "^2.0.0" + +optimist@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + dependencies: + minimist "~0.0.1" + wordwrap "~0.0.2" + +options@>=0.0.5: + version "0.0.6" + resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f" + +os-homedir@^1.0.0, os-homedir@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + +os-locale@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" + dependencies: + lcid "^1.0.0" + +os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + +osenv@^0.1.3, osenv@0: + version "0.1.3" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.3.tgz#83cf05c6d6458fc4d5ac6362ea325d92f2754217" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +parse-filepath@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.1.tgz#159d6155d43904d16c10ef698911da1e91969b73" + dependencies: + is-absolute "^0.2.3" + map-cache "^0.2.0" + path-root "^0.1.1" + +parse-glob@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + dependencies: + glob-base "^0.3.0" + is-dotfile "^1.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.0" + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + dependencies: + error-ex "^1.2.0" + +parsejson@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/parsejson/-/parsejson-0.0.1.tgz#9b10c6c0d825ab589e685153826de0a3ba278bcc" + dependencies: + better-assert "~1.0.0" + +parseqs@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.2.tgz#9dfe70b2cddac388bde4f35b1f240fa58adbe6c7" + dependencies: + better-assert "~1.0.0" + +parseuri@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.4.tgz#806582a39887e1ea18dd5e2fe0e01902268e9350" + dependencies: + better-assert "~1.0.0" + +parseurl@~1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.1.tgz#c8ab8c9223ba34888aa64a297b28853bec18da56" + +path-array@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-array/-/path-array-1.0.1.tgz#7e2f0f35f07a2015122b868b7eac0eb2c4fec271" + dependencies: + array-index "^1.0.0" + +path-exists@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-1.0.0.tgz#d5a8998eb71ef37a74c34eb0d9eba6e878eea081" + +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + dependencies: + pinkie-promise "^2.0.0" + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + +path-root-regex@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d" + +path-root@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7" + dependencies: + path-root-regex "^0.1.0" + +path-type@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + +phantomjs-prebuilt@^2.1.7: + version "2.1.13" + resolved "https://registry.yarnpkg.com/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.13.tgz#66556ad9e965d893ca5a7dc9e763df7e8697f76d" + dependencies: + es6-promise "~4.0.3" + extract-zip "~1.5.0" + fs-extra "~0.30.0" + hasha "~2.2.0" + kew "~0.7.0" + progress "~1.1.8" + request "~2.74.0" + request-progress "~2.0.1" + which "~1.2.10" + +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + +portscanner@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/portscanner/-/portscanner-1.0.0.tgz#3b5cfe393828b5160abc600e6270ebc2f1590558" + dependencies: + async "0.1.15" + +postcss, postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0.14, postcss@^5.0.16, postcss@^5.0.2, postcss@^5.0.4, postcss@^5.0.5, postcss@^5.0.8, postcss@^5.2.4: + version "5.2.5" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.5.tgz#ec428c27dffc7fac65961340a9b022fa4af5f056" + dependencies: + chalk "^1.1.3" + js-base64 "^2.1.9" + source-map "^0.5.6" + supports-color "^3.1.2" + +postcss-calc@^5.2.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-5.3.1.tgz#77bae7ca928ad85716e2fda42f261bf7c1d65b5e" + dependencies: + postcss "^5.0.2" + postcss-message-helpers "^2.0.0" + reduce-css-calc "^1.2.6" + +postcss-colormin@^2.1.8: + version "2.2.1" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-2.2.1.tgz#dc5421b6ae6f779ef6bfd47352b94abe59d0316b" + dependencies: + colormin "^1.0.5" + postcss "^5.0.13" + postcss-value-parser "^3.2.3" + +postcss-convert-values@^2.3.4: + version "2.4.1" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-2.4.1.tgz#45dce4d4e33b7d967b97a4d937f270ea98d2fe7a" + dependencies: + postcss "^5.0.11" + postcss-value-parser "^3.1.2" + +postcss-discard-comments@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz#befe89fafd5b3dace5ccce51b76b81514be00e3d" + dependencies: + postcss "^5.0.14" + +postcss-discard-duplicates@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-2.0.1.tgz#5fae3f1a71df3e19cffb37309d1a7dba56c4589c" + dependencies: + postcss "^5.0.4" + +postcss-discard-empty@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz#d2b4bd9d5ced5ebd8dcade7640c7d7cd7f4f92b5" + dependencies: + postcss "^5.0.14" + +postcss-discard-overridden@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz#8b1eaf554f686fb288cd874c55667b0aa3668d58" + dependencies: + postcss "^5.0.16" + +postcss-discard-unused@^2.2.1: + version "2.2.2" + resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-2.2.2.tgz#5d72f7d05d11de0a9589e001958067ccae1b4931" + dependencies: + postcss "^5.0.14" + uniqs "^2.0.0" + +postcss-filter-plugins@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/postcss-filter-plugins/-/postcss-filter-plugins-2.0.2.tgz#6d85862534d735ac420e4a85806e1f5d4286d84c" + dependencies: + postcss "^5.0.4" + uniqid "^4.0.0" + +postcss-merge-idents@^2.1.5: + version "2.1.7" + resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz#4c5530313c08e1d5b3bbf3d2bbc747e278eea270" + dependencies: + has "^1.0.1" + postcss "^5.0.10" + postcss-value-parser "^3.1.1" + +postcss-merge-longhand@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-2.0.1.tgz#ff59b5dec6d586ce2cea183138f55c5876fa9cdc" + dependencies: + postcss "^5.0.4" + +postcss-merge-rules@^2.0.3: + version "2.0.10" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-2.0.10.tgz#54b360be804e7e69a5c7222635247b92a3569e9b" + dependencies: + postcss "^5.0.4" + vendors "^1.0.0" + +postcss-message-helpers@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz#a4f2f4fab6e4fe002f0aed000478cdf52f9ba60e" + +postcss-minify-font-values@^1.0.2: + version "1.0.5" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz#4b58edb56641eba7c8474ab3526cafd7bbdecb69" + dependencies: + object-assign "^4.0.1" + postcss "^5.0.4" + postcss-value-parser "^3.0.2" + +postcss-minify-gradients@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-1.0.4.tgz#47d4fef7efbcc64e541fae6115c9a3cc84d47006" + dependencies: + postcss "^5.0.12" + postcss-value-parser "^3.3.0" + +postcss-minify-params@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-1.0.5.tgz#82d602643b8616a61fb3634d7ede0289836d67f9" + dependencies: + alphanum-sort "^1.0.1" + postcss "^5.0.2" + postcss-value-parser "^3.0.2" + uniqs "^2.0.0" + +postcss-minify-selectors@^2.0.4: + version "2.0.5" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-2.0.5.tgz#4e1f966fb49c95266804016ba9a3c6645bb601e0" + dependencies: + alphanum-sort "^1.0.2" + postcss "^5.0.14" + postcss-selector-parser "^2.0.0" + +postcss-normalize-charset@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-1.1.0.tgz#2fbd30e12248c442981d31ea2484d46fd0628970" + dependencies: + postcss "^5.0.5" + +postcss-normalize-url@^3.0.7: + version "3.0.7" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-3.0.7.tgz#6bd90d0a4bc5a1df22c26ea65c53257dc3829f4e" + dependencies: + is-absolute-url "^2.0.0" + normalize-url "^1.4.0" + postcss "^5.0.14" + postcss-value-parser "^3.2.3" + +postcss-ordered-values@^2.1.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-2.2.2.tgz#be8b511741fab2dac8e614a2302e9d10267b0771" + dependencies: + postcss "^5.0.4" + postcss-value-parser "^3.0.1" + +postcss-reduce-idents@^2.2.2: + version "2.3.1" + resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-2.3.1.tgz#024e8e219f52773313408573db9645ba62d2d2fe" + dependencies: + postcss "^5.0.4" + postcss-value-parser "^3.0.2" + +postcss-reduce-initial@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-1.0.0.tgz#8f739b938289ef2e48936d7101783e4741ca9bbb" + dependencies: + postcss "^5.0.4" + +postcss-reduce-transforms@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.3.tgz#fc193e435a973c10f9801c74700a830f79643343" + dependencies: + postcss "^5.0.8" + postcss-value-parser "^3.0.1" + +postcss-selector-parser@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-2.2.1.tgz#fdbf696103b12b0a64060e5610507f410491f7c8" + dependencies: + flatten "^1.0.2" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-svgo@^2.1.1: + version "2.1.5" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-2.1.5.tgz#46fc0363f01bab6a36a9abb01c229fcc45363094" + dependencies: + is-svg "^2.0.0" + postcss "^5.0.14" + postcss-value-parser "^3.2.3" + svgo "^0.7.0" + +postcss-unique-selectors@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz#981d57d29ddcb33e7b1dfe1fd43b8649f933ca1d" + dependencies: + alphanum-sort "^1.0.1" + postcss "^5.0.4" + uniqs "^2.0.0" + +postcss-value-parser@^3.0.1, postcss-value-parser@^3.0.2, postcss-value-parser@^3.1.1, postcss-value-parser@^3.1.2, postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz#87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15" + +postcss-zindex@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-2.1.1.tgz#ea3fbe656c9738aa8729e2ee96ec2a46089b720f" + dependencies: + postcss "^5.0.4" + uniqs "^2.0.0" + +prepend-http@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + +preserve@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + +private@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.6.tgz#55c6a976d0f9bafb9924851350fe47b9b5fbb7c1" + +process-nextick-args@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" + +progress@~1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" + +proper-lockfile@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/proper-lockfile/-/proper-lockfile-1.2.0.tgz#ceff5dd89d3e5f10fb75e1e8e76bc75801a59c34" + dependencies: + err-code "^1.0.0" + extend "^3.0.0" + graceful-fs "^4.1.2" + retry "^0.10.0" + +pseudomap@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + +pump@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/pump/-/pump-1.0.1.tgz#f1f1409fb9bd1085bbdb576b43b84ec4b5eadc1a" + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +q@^1.1.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.4.1.tgz#55705bcd93c5f3673530c2c2cbc0c2b3addc286e" + +qjobs@^1.1.4: + version "1.1.5" + resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.1.5.tgz#659de9f2cf8dcc27a1481276f205377272382e73" + +"qs@>= 0.4.0": + version "6.3.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.0.tgz#f403b264f23bc01228c74131b407f18d5ea5d442" + +qs@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-5.2.1.tgz#801fee030e0b9450d6385adc48a4cc55b44aedfc" + +qs@~6.2.0, qs@6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.1.tgz#ce03c5ff0935bc1d9d69a9f14cbd18e568d67625" + +qs@0.4.x: + version "0.4.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-0.4.2.tgz#3cac4c861e371a8c9c4770ac23cda8de639b8e5f" + +qs@6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.0.tgz#3b7848c03c2dece69a9522b0fae8c4126d745f3b" + +query-string@^4.1.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.2.3.tgz#9f27273d207a25a8ee4c7b8c74dcd45d556db822" + dependencies: + object-assign "^4.1.0" + strict-uri-encode "^1.0.0" + +randomatic@^1.1.3: + version "1.1.5" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.5.tgz#5e9ef5f2d573c67bd2b8124ae90b5156e457840b" + dependencies: + is-number "^2.0.2" + kind-of "^3.0.2" + +range-parser@^1.2.0, range-parser@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + +raw-body@~2.1.7: + version "2.1.7" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.1.7.tgz#adfeace2e4fb3098058014d08c072dcc59758774" + dependencies: + bytes "2.4.0" + iconv-lite "0.4.13" + unpipe "1.0.0" + +rc@~1.1.0: + version "1.1.6" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.1.6.tgz#43651b76b6ae53b5c802f1151fa3fc3b059969c9" + dependencies: + deep-extend "~0.4.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~1.0.4" + +read-pkg-up@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + dependencies: + find-up "^1.0.0" + read-pkg "^1.0.0" + +read-pkg@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" + path-type "^1.0.0" + +readable-stream@^2.0.0, "readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.0.2, readable-stream@~2.1.4: + version "2.1.5" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.1.5.tgz#66fa8b720e1438b364681f2ad1a63c618448c9d0" + dependencies: + buffer-shims "^1.0.0" + 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" + +readable-stream@~1.0.2: + version "1.0.34" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@~2.0.0, readable-stream@~2.0.5: + version "2.0.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" + dependencies: + 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@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" + dependencies: + graceful-fs "^4.1.2" + minimatch "^3.0.2" + readable-stream "^2.0.2" + set-immediate-shim "^1.0.1" + +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + dependencies: + resolve "^1.1.6" + +redent@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" + dependencies: + indent-string "^2.1.0" + strip-indent "^1.0.1" + +reduce-css-calc@^1.2.6: + version "1.3.0" + resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz#747c914e049614a4c9cfbba629871ad1d2927716" + dependencies: + balanced-match "^0.4.2" + math-expression-evaluator "^1.2.14" + reduce-function-call "^1.0.1" + +reduce-function-call@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/reduce-function-call/-/reduce-function-call-1.0.1.tgz#fa02e126e695824263cab91d3a5b0fdc1dd27a9a" + dependencies: + balanced-match "~0.1.0" + +regenerator-runtime@^0.9.5: + version "0.9.5" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.9.5.tgz#403d6d40a4bdff9c330dd9392dcbb2d9a8bba1fc" + +regex-cache@^0.4.2: + version "0.4.3" + resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" + dependencies: + is-equal-shallow "^0.1.3" + is-primitive "^2.0.0" + +repeat-element@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" + +repeat-string@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-0.2.2.tgz#c7a8d3236068362059a7e4651fc6884e8b1fb4ae" + +repeat-string@^1.5.2: + version "1.5.4" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.5.4.tgz#64ec0c91e0f4b475f90d5b643651e3e6e5b6c2d5" + +repeating@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-1.1.3.tgz#3d4114218877537494f97f77f9785fab810fa4ac" + dependencies: + is-finite "^1.0.0" + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + dependencies: + is-finite "^1.0.0" + +request-progress@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-2.0.1.tgz#5d36bb57961c673aa5b788dbc8141fdf23b44e08" + dependencies: + throttleit "^1.0.0" + +request@^2.58.0, request@^2.61.0, request@^2.67.0, request@^2.74.0, request@2, request@2.x: + version "2.75.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.75.0.tgz#d2b8268a286da13eaa5d01adf5d18cc90f657d93" + dependencies: + 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" + +request@~2.74.0: + version "2.74.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.74.0.tgz#7693ca768bbb0ea5c8ce08c084a45efa05b892ab" + dependencies: + 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 "~1.0.0-rc4" + 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" + +request@2.65.0: + version "2.65.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.65.0.tgz#cc1a3bc72b96254734fc34296da322f9486ddeba" + dependencies: + aws-sign2 "~0.6.0" + bl "~1.0.0" + caseless "~0.11.0" + combined-stream "~1.0.5" + extend "~3.0.0" + forever-agent "~0.6.1" + form-data "~1.0.0-rc3" + har-validator "~2.0.2" + hawk "~3.1.0" + http-signature "~0.11.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.7" + node-uuid "~1.4.3" + oauth-sign "~0.8.0" + qs "~5.2.0" + stringstream "~0.0.4" + tough-cookie "~2.2.0" + tunnel-agent "~0.4.1" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + +require-main-filename@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + +requires-port@1.x.x: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + +resolve-dir@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-0.1.1.tgz#b219259a5602fac5c5c496ad894a6e8cc430261e" + dependencies: + expand-tilde "^1.2.2" + global-modules "^0.2.3" + +resolve@^1.1.6, resolve@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + +resp-modifier@6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/resp-modifier/-/resp-modifier-6.0.2.tgz#b124de5c4fbafcba541f48ffa73970f4aa456b4f" + dependencies: + debug "^2.2.0" + minimatch "^3.0.2" + +retry@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.0.tgz#649e15ca408422d98318161935e7f7d652d435dd" + +right-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" + dependencies: + align-text "^0.1.1" + +rimraf@^2.2.8, rimraf@^2.3.2, rimraf@^2.3.3, rimraf@^2.4.4, rimraf@^2.5.4, rimraf@~2.5.0, rimraf@~2.5.1, rimraf@2: + version "2.5.4" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04" + dependencies: + glob "^7.0.5" + +rmdir@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/rmdir/-/rmdir-1.2.0.tgz#4fe0357cb06168c258e73e968093dc4e8a0f3253" + dependencies: + node.flow "1.2.3" + +rollup@^0.36.0: + version "0.36.3" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.36.3.tgz#c89ac479828924ff8f69c1d44541cb4ea2fc11fc" + dependencies: + source-map-support "^0.4.0" + +rsvp@^3.0.13, rsvp@^3.0.18: + version "3.3.3" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.3.3.tgz#34633caaf8bc66ceff4be3c2e1dffd032538a813" + +rx@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" + +sane@^1.3.3: + version "1.4.1" + resolved "https://registry.yarnpkg.com/sane/-/sane-1.4.1.tgz#88f763d74040f5f0c256b6163db399bf110ac715" + dependencies: + exec-sh "^0.2.0" + fb-watchman "^1.8.0" + minimatch "^3.0.2" + minimist "^1.1.1" + walker "~1.0.5" + watch "~0.10.0" + +sass-graph@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.1.2.tgz#965104be23e8103cb7e5f710df65935b317da57b" + dependencies: + glob "^7.0.0" + lodash "^4.0.0" + yargs "^4.7.1" + +sax@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.1.tgz#7b8e656190b228e81a66aea748480d828cd2d37a" + +semver@^4.3.3, semver@~4.3.3: + version "4.3.6" + resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" + +semver@^5.0.1, semver@^5.1.0, semver@~5.3.0, "semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5": + version "5.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + +send@0.14.1: + version "0.14.1" + resolved "https://registry.yarnpkg.com/send/-/send-0.14.1.tgz#a954984325392f51532a7760760e459598c89f7a" + dependencies: + debug "~2.2.0" + depd "~1.1.0" + destroy "~1.0.4" + encodeurl "~1.0.1" + escape-html "~1.0.3" + etag "~1.7.0" + fresh "0.3.0" + http-errors "~1.5.0" + mime "1.3.4" + ms "0.7.1" + on-finished "~2.3.0" + range-parser "~1.2.0" + statuses "~1.3.0" + +serve-index@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.8.0.tgz#7c5d96c13fb131101f93c1c5774f8516a1e78d3b" + dependencies: + accepts "~1.3.3" + batch "0.5.3" + debug "~2.2.0" + escape-html "~1.0.3" + http-errors "~1.5.0" + mime-types "~2.1.11" + parseurl "~1.3.1" + +serve-static@1.11.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.11.1.tgz#d6cce7693505f733c759de57befc1af76c0f0805" + dependencies: + encodeurl "~1.0.1" + escape-html "~1.0.3" + parseurl "~1.3.1" + send "0.14.1" + +server-destroy@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/server-destroy/-/server-destroy-1.0.1.tgz#f13bf928e42b9c3e79383e61cc3998b5d14e6cdd" + +set-blocking@^2.0.0, set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + +set-immediate-shim@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" + +setprototypeof@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.1.tgz#52009b27888c4dc48f591949c0a8275834c1ca7e" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + +sigmund@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" + +signal-exit@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.1.tgz#5a4c884992b63a7acd9badb7894c3ee9cfccad81" + +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + +sntp@1.x.x: + version "1.0.9" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" + dependencies: + hoek "2.x.x" + +socket.io-adapter@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-0.4.0.tgz#fb9f82ab1aa65290bf72c3657955b930a991a24f" + dependencies: + debug "2.2.0" + socket.io-parser "2.2.2" + +socket.io-client@1.4.6: + version "1.4.6" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-1.4.6.tgz#49b0ba537efd15b8297c84016e642e1c7c752c3d" + dependencies: + backo2 "1.0.2" + 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" + indexof "0.0.1" + object-component "0.0.3" + parseuri "0.0.4" + socket.io-parser "2.2.6" + to-array "0.1.4" + +socket.io-client@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-1.5.0.tgz#08232d0adb5a665a7c24bd9796557a33f58f38ae" + dependencies: + backo2 "1.0.2" + component-bind "1.0.0" + component-emitter "1.2.0" + debug "2.2.0" + engine.io-client "1.7.0" + has-binary "0.1.7" + indexof "0.0.1" + object-component "0.0.3" + parseuri "0.0.4" + socket.io-parser "2.2.6" + to-array "0.1.4" + +socket.io-parser@2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-2.2.2.tgz#3d7af6b64497e956b7d9fe775f999716027f9417" + dependencies: + benchmark "1.0.0" + component-emitter "1.1.2" + debug "0.7.4" + isarray "0.0.1" + json3 "3.2.6" + +socket.io-parser@2.2.6: + version "2.2.6" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-2.2.6.tgz#38dfd61df50dcf8ab1d9e2091322bf902ba28b99" + dependencies: + benchmark "1.0.0" + component-emitter "1.1.2" + debug "2.2.0" + isarray "0.0.1" + json3 "3.3.2" + +socket.io@1.4.7: + version "1.4.7" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-1.4.7.tgz#92b7f7cb88c5797d4daee279fe8075dbe6d3fa1c" + dependencies: + 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" + +socket.io@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-1.5.0.tgz#024dd9719d9267d6a6984eebe2ab5ceb9a0b8a98" + dependencies: + debug "2.2.0" + engine.io "1.7.0" + has-binary "0.1.7" + socket.io-adapter "0.4.0" + socket.io-client "1.5.0" + socket.io-parser "2.2.6" + +sort-keys@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" + dependencies: + is-plain-obj "^1.0.0" + +source-map-support@^0.4.0, source-map-support@^0.4.2: + version "0.4.5" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.5.tgz#4438df4219e1b3c7feb674614b4c67f9722db1e4" + dependencies: + source-map "^0.5.3" + +source-map-support@~0.2.8: + version "0.2.10" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.2.10.tgz#ea5a3900a1c1cb25096a0ae8cc5c2b4b10ded3dc" + dependencies: + source-map "0.1.32" + +source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1: + version "0.5.6" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" + +source-map@0.1.32: + version "0.1.32" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.32.tgz#c8b6c167797ba4740a8ea33252162ff08591b266" + dependencies: + amdefine ">=0.0.4" + +spdx-correct@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" + dependencies: + spdx-license-ids "^1.0.2" + +spdx-expression-parse@~1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" + +spdx-license-ids@^1.0.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + +sshpk@^1.7.0: + version "1.10.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.10.1.tgz#30e1a5d329244974a1af61511339d595af6638b0" + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + dashdash "^1.12.0" + getpass "^0.1.1" + optionalDependencies: + bcrypt-pbkdf "^1.0.0" + ecc-jsbn "~0.1.1" + jodid25519 "^1.0.0" + jsbn "~0.1.0" + tweetnacl "~0.14.0" + +"statuses@>= 1.3.0 < 2", statuses@~1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.0.tgz#8e55758cb20e7682c1f4fce8dcab30bf01d1e07a" + +stream-throttle@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/stream-throttle/-/stream-throttle-0.1.3.tgz#add57c8d7cc73a81630d31cd55d3961cfafba9c3" + dependencies: + commander "^2.2.0" + limiter "^1.0.5" + +strict-uri-encode@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" + +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + +string-width@^1.0.1, string-width@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +stringstream@~0.0.4: + version "0.0.5" + resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + dependencies: + ansi-regex "^2.0.0" + +strip-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + dependencies: + is-utf8 "^0.2.0" + +strip-indent@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" + dependencies: + get-stdin "^4.0.1" + +strip-json-comments@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + +supports-color@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5" + dependencies: + has-flag "^1.0.0" + +svgo@^0.7.0: + version "0.7.1" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.1.tgz#287320fed972cb097e72c2bb1685f96fe08f8034" + dependencies: + coa "~1.0.1" + colors "~1.1.2" + csso "~2.2.1" + js-yaml "~3.6.1" + mkdirp "~0.5.1" + sax "~1.2.1" + whet.extend "~0.9.9" + +systemjs-builder@^0.15.20, systemjs-builder@0.15.32: + version "0.15.32" + resolved "https://registry.yarnpkg.com/systemjs-builder/-/systemjs-builder-0.15.32.tgz#66795f104792b0302eba40950f29ed53a791cc3e" + dependencies: + babel-core "^6.9.0" + babel-plugin-transform-cjs-system-wrapper "^0.2.1" + babel-plugin-transform-es2015-modules-systemjs "^6.6.5" + babel-plugin-transform-global-system-wrapper "0.0.1" + babel-plugin-transform-system-register "0.0.1" + bluebird "^3.3.4" + data-uri-to-buffer "0.0.4" + es6-template-strings "^2.0.0" + glob "^7.0.3" + mkdirp "^0.5.1" + rollup "^0.36.0" + source-map "^0.5.3" + systemjs "^0.19.39" + traceur "0.0.105" + uglify-js "^2.6.1" + +systemjs@^0.19.39, systemjs@0.19.39: + version "0.19.39" + resolved "https://registry.yarnpkg.com/systemjs/-/systemjs-0.19.39.tgz#e513e6f91a25a37b8b607c51c7989ee0d67b9356" + dependencies: + when "^3.7.5" + +tar-fs@^1.13.0: + version "1.14.0" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-1.14.0.tgz#f99cc074bf33bed21cd921a21720797bb18e6c96" + dependencies: + mkdirp "^0.5.0" + pump "^1.0.0" + tar-stream "^1.1.2" + +tar-pack@~3.1.0: + version "3.1.4" + resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.1.4.tgz#bc8cf9a22f5832739f12f3910dac1eb97b49708c" + dependencies: + debug "~2.2.0" + fstream "~1.0.10" + fstream-ignore "~1.0.5" + once "~1.3.3" + readable-stream "~2.1.4" + rimraf "~2.5.1" + tar "~2.2.1" + uid-number "~0.0.6" + +tar-stream@^1.1.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.5.2.tgz#fbc6c6e83c1a19d4cb48c7d96171fc248effc7bf" + dependencies: + bl "^1.0.0" + end-of-stream "^1.0.0" + readable-stream "^2.0.0" + xtend "^4.0.0" + +tar@^2.0.0, tar@~2.2.0, tar@~2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" + dependencies: + block-stream "*" + fstream "^1.0.2" + inherits "2" + +tfunk@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/tfunk/-/tfunk-3.0.2.tgz#327ebc6176af2680c6cd0d6d22297c79d7f96efd" + dependencies: + chalk "^1.1.1" + object-path "^0.9.0" + +thenify-all@^1.0.0, thenify-all@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + dependencies: + thenify ">= 3.1.0 < 4" + +"thenify@>= 3.1.0 < 4": + version "3.2.1" + resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.2.1.tgz#251fd1c80aff6e5cf57cb179ab1fcb724269bd11" + dependencies: + any-promise "^1.0.0" + +throttleit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c" + +timers-ext@0.1: + version "0.1.0" + resolved "https://registry.yarnpkg.com/timers-ext/-/timers-ext-0.1.0.tgz#00345a2ca93089d1251322054389d263e27b77e2" + dependencies: + es5-ext "~0.10.2" + next-tick "~0.2.2" + +tmp@0.0.28: + version "0.0.28" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.28.tgz#172735b7f614ea7af39664fa84cf0de4e515d120" + dependencies: + os-tmpdir "~1.0.1" + +tmpl@1.0.x: + version "1.0.4" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" + +to-array@0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" + +to-fast-properties@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.2.tgz#f3f5c0c3ba7299a7ef99427e44633257ade43320" + +tough-cookie@~2.2.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.2.2.tgz#c83a1830f4e5ef0b93ef2a3488e724f8de016ac7" + +tough-cookie@~2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.1.tgz#99c77dfbb7d804249e8a299d4cb0fd81fef083fd" + +traceur@0.0.105: + version "0.0.105" + resolved "https://registry.yarnpkg.com/traceur/-/traceur-0.0.105.tgz#5cf9dee83d6b77861c3d6c44d53859aed7ab0479" + dependencies: + commander "2.9.x" + glob "5.0.x" + rsvp "^3.0.13" + semver "^4.3.3" + source-map-support "~0.2.8" + +trim-newlines@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" + +tunnel-agent@~0.4.1: + version "0.4.3" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.3" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.3.tgz#3da382f670f25ded78d7b3d1792119bca0b7132d" + +type-is@~1.6.13: + version "1.6.13" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.13.tgz#6e83ba7bc30cd33a7bb0b7fb00737a2085bf9d08" + dependencies: + media-typer "0.3.0" + mime-types "~2.1.11" + +typedarray@~0.0.5: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + +ua-parser-js@0.7.10: + version "0.7.10" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.10.tgz#917559ddcce07cbc09ece7d80495e4c268f4ef9f" + +uglify-js@^2.6.1: + version "2.7.3" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.7.3.tgz#39b3a7329b89f5ec507e344c6e22568698ef4868" + dependencies: + async "~0.2.6" + source-map "~0.5.1" + uglify-to-browserify "~1.0.0" + yargs "~3.10.0" + +uglify-to-browserify@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" + +uid-number@~0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" + +ultron@1.0.x: + version "1.0.2" + resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa" + +unc-path-regex@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" + +underscore@1.7.x: + version "1.7.0" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.7.0.tgz#6bbaf0877500d36be34ecaa584e0db9fef035209" + +uniq@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + +uniqid@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/uniqid/-/uniqid-4.1.0.tgz#33d9679f65022f48988a03fd24e7dcaf8f109eca" + dependencies: + macaddress "^0.2.8" + +uniqs@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" + +unpipe@~1.0.0, unpipe@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + +user-home@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" + +useragent@^2.1.9: + version "2.1.9" + resolved "https://registry.yarnpkg.com/useragent/-/useragent-2.1.9.tgz#4dba2bc4dad1875777ab15de3ff8098b475000b7" + dependencies: + lru-cache "2.2.x" + +utf8@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/utf8/-/utf8-2.1.0.tgz#0cfec5c8052d44a23e3aaa908104e8075f95dfd5" + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + +utils-merge@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8" + +validate-npm-package-license@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" + dependencies: + spdx-correct "~1.0.0" + spdx-expression-parse "~1.0.0" + +vendors@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.1.tgz#37ad73c8ee417fb3d580e785312307d274847f22" + +verror@1.3.6: + version "1.3.6" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c" + dependencies: + extsprintf "1.0.2" + +void-elements@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" + +walker@~1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" + dependencies: + makeerror "1.0.x" + +watch@~0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/watch/-/watch-0.10.0.tgz#77798b2da0f9910d595f1ace5b0c2258521f21dc" + +weinre@^2.0.0-pre-I0Z7U9OV: + version "2.0.0-pre-I0Z7U9OV" + resolved "https://registry.yarnpkg.com/weinre/-/weinre-2.0.0-pre-I0Z7U9OV.tgz#fef8aa223921f7b40bbbbd4c3ed4302f6fd0a813" + dependencies: + express "2.5.x" + nopt "3.0.x" + underscore "1.7.x" + +when@^3.7.5: + version "3.7.7" + resolved "https://registry.yarnpkg.com/when/-/when-3.7.7.tgz#aba03fc3bb736d6c88b091d013d8a8e590d84718" + +whet.extend@~0.9.9: + version "0.9.9" + resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1" + +which-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" + +which@^1.0.9, which@^1.1.1, which@^1.2.10, which@^1.2.9, which@~1.2.10, which@1: + version "1.2.11" + resolved "https://registry.yarnpkg.com/which/-/which-1.2.11.tgz#c8b2eeea6b8c1659fa7c1dd4fdaabe9533dc5e8b" + dependencies: + isexe "^1.1.1" + +wide-align@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.0.tgz#40edde802a71fea1f070da3e62dcda2e7add96ad" + dependencies: + string-width "^1.0.1" + +window-size@^0.1.2: + version "0.1.4" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876" + +window-size@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075" + +window-size@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" + +wordwrap@~0.0.2: + version "0.0.3" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + +wordwrap@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" + +wrap-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.0.0.tgz#7d30f8f873f9a5bbc3a64dabc8d177e071ae426f" + dependencies: + string-width "^1.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + +ws@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-1.0.1.tgz#7d0b2a2e58cddd819039c29c9de65045e1b310e9" + dependencies: + options ">=0.0.5" + ultron "1.0.x" + +ws@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.1.tgz#082ddb6c641e85d4bb451f03d52f06eabdb1f018" + dependencies: + options ">=0.0.5" + ultron "1.0.x" + +wtf-8@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wtf-8/-/wtf-8-1.0.0.tgz#392d8ba2d0f1c34d1ee2d630f15d0efb68e1048a" + +xmlhttprequest-ssl@1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.1.tgz#3b7741fea4a86675976e908d296d4445961faa67" + +xtend@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + +y18n@^3.2.0, y18n@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" + +yallist@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.0.0.tgz#306c543835f09ee1a4cb23b7bce9ab341c91cdd4" + +yargs-parser@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-2.4.1.tgz#85568de3cf150ff49fa51825f03a8c880ddcc5c4" + dependencies: + camelcase "^3.0.0" + lodash.assign "^4.0.6" + +yargs-parser@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.0.2.tgz#7f7173a8c7cca1d81dc7c18692fc07c2c2e2b1e0" + dependencies: + camelcase "^3.0.0" + +yargs@^4.7.1: + version "4.8.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-4.8.1.tgz#c0c42924ca4aaa6b0e6da1739dfb216439f9ddc0" + dependencies: + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + lodash.assign "^4.0.3" + os-locale "^1.4.0" + read-pkg-up "^1.0.1" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^1.0.1" + which-module "^1.0.0" + window-size "^0.2.0" + y18n "^3.2.1" + yargs-parser "^2.4.1" + +yargs@~3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" + dependencies: + camelcase "^1.0.2" + cliui "^2.1.0" + decamelize "^1.0.0" + window-size "0.1.0" + +yargs@3.29.0: + version "3.29.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.29.0.tgz#1aab9660eae79d8b8f675bcaeeab6ee34c2cf69c" + dependencies: + camelcase "^1.2.1" + cliui "^3.0.3" + decamelize "^1.0.0" + os-locale "^1.4.0" + window-size "^0.1.2" + y18n "^3.2.0" + +yargs@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.0.0.tgz#900479df4e8bf6ab0e87216f5ed2b2760b968345" + dependencies: + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^1.4.0" + read-pkg-up "^1.0.1" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^1.0.2" + which-module "^1.0.0" + window-size "^0.2.0" + y18n "^3.2.1" + yargs-parser "^4.0.2" + +yauzl@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005" + dependencies: + fd-slicer "~1.0.1" + +yeast@0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" + From f623800ef2ff04077ef3c0fdf2ebd73e51636496 Mon Sep 17 00:00:00 2001 From: Gion Kunz Date: Sun, 23 Oct 2016 17:16:43 +0200 Subject: [PATCH 02/44] chore(testing): Added test npm script for travis and fixed dependencies --- karma.ci.config.js | 27 +++++++++++++++++++++++++++ package.json | 22 +++++++++++----------- 2 files changed, 38 insertions(+), 11 deletions(-) create mode 100644 karma.ci.config.js diff --git a/karma.ci.config.js b/karma.ci.config.js new file mode 100644 index 00000000..56a02843 --- /dev/null +++ b/karma.ci.config.js @@ -0,0 +1,27 @@ +module.exports = function(config) { + config.set({ + basePath: './', + frameworks: ['jasmine', 'jspm'], + autoWatch: false, + singleRun: true, + browsers: ['PhantomJS'], + files: [ + { pattern: 'src/**/*.+(js|html)', included: false }, + { pattern: 'tooling/**/*.js', included: false }, + { pattern: 'package.json', included: false }, + { pattern: 'jspm_packages/system-polyfills.js', included: false }, + 'dist/chartist.min.css' + ], + jspm: { + loadFiles: ['src/**/*.js'], + stripExtension: false, + config: 'jspm.config.js' + }, + proxies: { + '/jspm_packages/': '/base/jspm_packages/', + '/src/': '/base/src/', + '/tooling/': '/base/tooling/', + '/package.json': '/base/package.json' + } + }); +}; diff --git a/package.json b/package.json index c2184528..55df6472 100644 --- a/package.json +++ b/package.json @@ -39,16 +39,7 @@ "url": "https://github.com/chartist-js/chartist/blob/master/LICENSE-MIT" } ], - "dependencies": { - "autoprefixer": "^6.5.1", - "chokidar": "^1.6.1", - "cssnano": "^3.7.7", - "debounce": "^1.0.0", - "fs-promise": "^0.5.0", - "interpolate": "^0.1.0", - "node-sass": "^3.10.1", - "postcss": "^5.2.5" - }, + "dependencies": {}, "devDependencies": { "browser-sync": "^2.17.5", "jasmine-core": "^2.5.2", @@ -57,7 +48,15 @@ "karma-jasmine": "^1.0.2", "karma-jspm": "^2.2.0", "karma-nyan-reporter": "^0.2.4", - "karma-phantomjs-launcher": "^1.0.2" + "karma-phantomjs-launcher": "^1.0.2", + "autoprefixer": "^6.5.1", + "chokidar": "^1.6.1", + "cssnano": "^3.7.7", + "debounce": "^1.0.0", + "fs-promise": "^0.5.0", + "interpolate": "^0.1.0", + "node-sass": "^3.10.1", + "postcss": "^5.2.5" }, "engines": { "node": ">=6.9.0" @@ -74,6 +73,7 @@ }, "scripts": { "start": "yarn run test-watch & yarn run server & yarn run styles-watch", + "test": "./node_modules/.bin/karma start karma.ci.config.js", "test-watch": "./node_modules/.bin/karma start karma.watch.config.js", "styles-watch": "./tooling/node/styles-watch.js", "server": "./node_modules/.bin/browser-sync start --config 'bs-config.js'", From 668f92565f402b25a5320b4dd26765d0ff1bb4cc Mon Sep 17 00:00:00 2001 From: Gion Kunz Date: Sun, 23 Oct 2016 17:19:28 +0200 Subject: [PATCH 03/44] chore(testing): Fixed travis config --- .travis.yml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 405a6c49..08077c3b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,3 @@ language: node_js node_js: - - '5.5.0' -before_script: - - 'npm install -g bower grunt-cli' - - 'bower install' + - '6.9.0' From 738b34c519540d80b4c358cee9eb9f495ea93535 Mon Sep 17 00:00:00 2001 From: Gion Kunz Date: Sun, 23 Oct 2016 17:22:09 +0200 Subject: [PATCH 04/44] chore(testing): Added jspm to travis --- .travis.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.travis.yml b/.travis.yml index 08077c3b..78129c84 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,3 +1,6 @@ language: node_js node_js: - '6.9.0' +before_script: + - 'npm install -g jspm' + - 'jspm install' From 89b71b690a439d0598df6a42e8d047a74d94aef6 Mon Sep 17 00:00:00 2001 From: Gion Kunz Date: Sun, 23 Oct 2016 21:40:41 +0200 Subject: [PATCH 05/44] fix(rounding): Fixed rounding issues and shadowing problem in roundWithPrecision --- src/core/data.js | 2 +- src/core/data.spec.js | 21 ++++++++++----------- src/core/math.js | 4 ++-- 3 files changed, 13 insertions(+), 14 deletions(-) diff --git a/src/core/data.js b/src/core/data.js index d3be0515..5c426b0d 100644 --- a/src/core/data.js +++ b/src/core/data.js @@ -474,7 +474,7 @@ export function getBounds(axisLength, highLow, scaleMinSpace, onlyInteger) { for (i = bounds.min; i <= bounds.max; i = safeIncrement(i, bounds.step)) { var value = roundWithPrecision(i); if (value !== values[values.length - 1]) { - values.push(i); + values.push(value); } } bounds.values = values; diff --git a/src/core/data.spec.js b/src/core/data.spec.js index 86e5eec7..16b96592 100644 --- a/src/core/data.spec.js +++ b/src/core/data.spec.js @@ -1,4 +1,5 @@ import {serialize, deserialize, getDataArray, getBounds, splitIntoSegments} from './data'; +import {roundWithPrecision} from './math'; describe('Data', () => { describe('serialization', () => { @@ -274,16 +275,14 @@ describe('Data', () => { expect(bounds.values).toEqual([0]); }); - /* - TODO: This is currently failing with the ES6 refactoring and I can't tell why - it('should return single step if range is less than epsilon', () => { - const bounds = getBounds(100, { high: 1.0000000000000002, low: 1 }, 20, false); - expect(bounds.min).toBe(1); - expect(bounds.max).toBe(1.0000000000000002); - expect(bounds.low).toBe(1); - expect(bounds.high).toBe(1.0000000000000002); - expect(bounds.values).toEqual([1]); - });*/ + it('should return single step if range is less than epsilon', () => { + const bounds = getBounds(100, { high: 1.0000000000000002, low: 1 }, 20, false); + expect(bounds.min).toBe(1); + expect(bounds.max).toBe(1.0000000000000002); + expect(bounds.low).toBe(1); + expect(bounds.high).toBe(1.0000000000000002); + expect(bounds.values).toEqual([1]); + }); it('should return single step if range is less than smallest increment', () => { const bounds = getBounds(613.234375, {high: 1000.0000000000001, low: 999.9999999999997}, 50, false); @@ -291,7 +290,7 @@ describe('Data', () => { expect(bounds.max).toBe(1000); expect(bounds.low).toBe(999.9999999999997); expect(bounds.high).toBe(1000.0000000000001); - expect(bounds.values).toEqual([999.9999999999999]); + expect(bounds.values).toEqual([roundWithPrecision(999.9999999999999)]); }); }); diff --git a/src/core/math.js b/src/core/math.js index 529906bb..de5a11e9 100644 --- a/src/core/math.js +++ b/src/core/math.js @@ -1,4 +1,4 @@ -import {precision} from './globals'; +import {precision as globalPrecision} from './globals'; /** * Calculate the order of magnitude for the chart scale @@ -33,7 +33,7 @@ export function projectLength(axisLength, length, bounds) { * @returns {number} Rounded value */ export function roundWithPrecision(value, digits) { - var precision = Math.pow(10, digits || precision); + var precision = Math.pow(10, digits || globalPrecision); return Math.round(value * precision) / precision; } From b2e9b4eb111ad1730b2257d8176218e8eb02f0b6 Mon Sep 17 00:00:00 2001 From: Gion Kunz Date: Tue, 25 Oct 2016 04:16:24 +0200 Subject: [PATCH 06/44] chore(testing): Refactored all tests to ES6 --- karma.ci.config.js | 1 + karma.watch.config.js | 1 + src/axes/auto-scale-axis.js | 2 +- src/axes/axis.js | 28 +- src/axes/axis.spec.js | 35 +- src/axes/fixed-scale-axis.js | 16 +- src/axes/fixed-scale-axis.spec.js | 49 ++- src/axes/step-axis.js | 2 +- src/axes/step-axis.spec.js | 40 +- src/charts/bar.js | 122 +++--- src/charts/bar.spec.js | 339 ++++++++++++++++ src/charts/base.js | 20 +- src/charts/line.js | 167 ++++---- src/charts/line.spec.js | 582 ++++++++++++++++++++++++++++ src/charts/pie.js | 72 ++-- src/charts/pie.spec.js | 442 +++++++++++++++++++++ src/core/creation.js | 92 +++-- src/core/creation.spec.js | 4 +- src/core/data.js | 137 +++---- src/core/data.spec.js | 4 +- src/core/extend.js | 13 +- src/core/functional.js | 66 +--- src/core/lang.js | 7 +- src/core/math.js | 10 +- src/core/options-provider.js | 36 +- src/event/event-emitter.js | 8 +- src/interpolation/cardinal.js | 37 +- src/interpolation/monotone-cubic.js | 40 +- src/interpolation/none.js | 16 +- src/interpolation/simple.js | 23 +- src/interpolation/step.js | 16 +- src/svg/svg-path.spec.js | 166 ++++++++ src/svg/svg.js | 64 ++- src/svg/svg.spec.js | 165 ++++++++ 34 files changed, 2228 insertions(+), 594 deletions(-) create mode 100644 src/charts/bar.spec.js create mode 100644 src/charts/line.spec.js create mode 100644 src/charts/pie.spec.js create mode 100644 src/svg/svg-path.spec.js create mode 100644 src/svg/svg.spec.js diff --git a/karma.ci.config.js b/karma.ci.config.js index 56a02843..e08d40b8 100644 --- a/karma.ci.config.js +++ b/karma.ci.config.js @@ -6,6 +6,7 @@ module.exports = function(config) { singleRun: true, browsers: ['PhantomJS'], files: [ + 'node_modules/core-js/client/shim.min.js', { pattern: 'src/**/*.+(js|html)', included: false }, { pattern: 'tooling/**/*.js', included: false }, { pattern: 'package.json', included: false }, diff --git a/karma.watch.config.js b/karma.watch.config.js index 95bb102d..9d42a362 100644 --- a/karma.watch.config.js +++ b/karma.watch.config.js @@ -6,6 +6,7 @@ module.exports = function(config) { browsers: ['PhantomJS'], reporters: ['nyan'], files: [ + 'node_modules/core-js/client/shim.min.js', { pattern: 'src/**/*.+(js|html)', included: false }, { pattern: 'tooling/**/*.js', included: false }, { pattern: 'package.json', included: false }, diff --git a/src/axes/auto-scale-axis.js b/src/axes/auto-scale-axis.js index f195c723..5d057dd5 100644 --- a/src/axes/auto-scale-axis.js +++ b/src/axes/auto-scale-axis.js @@ -5,7 +5,7 @@ export class AutoScaleAxis extends Axis { constructor(axisUnit, data, chartRect, options) { super(); // Usually we calculate highLow based on the data but this can be overriden by a highLow object in the options - var highLow = options.highLow || getHighLow(data, options, axisUnit.pos); + const highLow = options.highLow || getHighLow(data, options, axisUnit.pos); this.bounds = getBounds(chartRect[axisUnit.rectEnd] - chartRect[axisUnit.rectStart], highLow, options.scaleMinSpace || 20, options.onlyInteger); this.range = { min: this.bounds.min, diff --git a/src/axes/axis.js b/src/axes/axis.js index 09caa859..09119ca2 100644 --- a/src/axes/axis.js +++ b/src/axes/axis.js @@ -36,19 +36,19 @@ export class Axis { } createGridAndLabels(gridGroup, labelGroup, useForeignObject, chartOptions, eventEmitter) { - var axisOptions = chartOptions['axis' + this.units.pos.toUpperCase()]; - var projectedValues = this.ticks.map(this.projectValue.bind(this)); - var labelValues = this.ticks.map(axisOptions.labelInterpolationFnc); + const axisOptions = chartOptions['axis' + this.units.pos.toUpperCase()]; + const projectedValues = this.ticks.map(this.projectValue.bind(this)); + const labelValues = this.ticks.map(axisOptions.labelInterpolationFnc); - projectedValues.forEach(function(projectedValue, index) { - var labelOffset = { + projectedValues.forEach((projectedValue, index) => { + const labelOffset = { x: 0, y: 0 }; // TODO: Find better solution for solving this problem // Calculate how much space we have available for the label - var labelLength; + let labelLength; if(projectedValues[index + 1]) { // If we still have one label ahead, we can calculate the distance to the next tick / label labelLength = projectedValues[index + 1] - projectedValue; @@ -59,7 +59,7 @@ export class Axis { labelLength = Math.max(this.axisLength - projectedValue, 30); } - // Skip grid lines and labels where interpolated label values are falsey (execpt for 0) + // Skip grid lines and labels where interpolated label values are falsey (except for 0) if(isFalseyButZero(labelValues[index]) && labelValues[index] !== '') { return; } @@ -73,9 +73,13 @@ export class Axis { // If the labels should be positioned in start position (top side for vertical axis) we need to set a // different offset as for positioned with end (bottom) if(chartOptions.axisX.position === 'start') { - labelOffset.y = this.chartRect.padding.top + chartOptions.axisX.labelOffset.y + (useForeignObject ? 5 : 20); + labelOffset.y = this.chartRect.padding.top + + chartOptions.axisX.labelOffset.y + + (useForeignObject ? 5 : 20); } else { - labelOffset.y = this.chartRect.y1 + chartOptions.axisX.labelOffset.y + (useForeignObject ? 5 : 20); + labelOffset.y = this.chartRect.y1 + + chartOptions.axisX.labelOffset.y + + (useForeignObject ? 5 : 20); } } else { projectedValue = this.chartRect.y1 - projectedValue; @@ -84,7 +88,9 @@ export class Axis { // If the labels should be positioned in start position (left side for horizontal axis) we need to set a // different offset as for positioned with end (right side) if(chartOptions.axisY.position === 'start') { - labelOffset.x = useForeignObject ? this.chartRect.padding.left + chartOptions.axisY.labelOffset.x : this.chartRect.x1 - 10; + labelOffset.x = useForeignObject ? + this.chartRect.padding.left + chartOptions.axisY.labelOffset.x : + this.chartRect.x1 - 10; } else { labelOffset.x = this.chartRect.x2 + chartOptions.axisY.labelOffset.x + 10; } @@ -104,6 +110,6 @@ export class Axis { (axisOptions.position === 'start' ? chartOptions.classNames[axisOptions.position] : chartOptions.classNames['end']) ], useForeignObject, eventEmitter); } - }.bind(this)); + }); } } diff --git a/src/axes/axis.spec.js b/src/axes/axis.spec.js index be55efcc..fd3b579c 100644 --- a/src/axes/axis.spec.js +++ b/src/axes/axis.spec.js @@ -2,10 +2,10 @@ import {Svg} from '../svg/svg'; import {EventEmitter} from '../event/event-emitter'; import {Axis, axisUnits} from './axis'; -describe('Axis', function() { - var ticks, chartRect, chartOptions, eventEmitter, gridGroup, labelGroup; +describe('Axis', () => { + let ticks, chartRect, chartOptions, eventEmitter, gridGroup, labelGroup; - beforeEach(function() { + beforeEach(() => { eventEmitter = new EventEmitter(); gridGroup = new Svg('g'); labelGroup = new Svg('g'); @@ -53,16 +53,13 @@ describe('Axis', function() { }; }); - it('should skip all grid lines and labels for interpolated value of null', function() { - chartOptions.axisX.labelInterpolationFnc = function(value, index) { - return index === 0 ? null : value; - }; + it('should skip all grid lines and labels for interpolated value of null', () => { + chartOptions.axisX.labelInterpolationFnc = + (value, index) => index === 0 ? null : value; var axis = new Axis(); axis.initialize(axisUnits.x, chartRect, ticks, null); - axis.projectValue = function(value) { - return value; - }; + axis.projectValue = (value) => value; axis.createGridAndLabels(gridGroup, labelGroup, true, chartOptions, eventEmitter); expect(gridGroup.querySelectorAll('.ct-grid').svgElements.length).toBe(1); @@ -70,15 +67,12 @@ describe('Axis', function() { }); it('should skip all grid lines and labels for interpolated value of undefined', function() { - chartOptions.axisX.labelInterpolationFnc = function(value, index) { - return index === 0 ? undefined : value; - }; + chartOptions.axisX.labelInterpolationFnc = + (value, index) => index === 0 ? undefined : value; var axis = new Axis(); axis.initialize(axisUnits.x, chartRect, ticks, null); - axis.projectValue = function(value) { - return value; - }; + axis.projectValue = (value) => value; axis.createGridAndLabels(gridGroup, labelGroup, true, chartOptions, eventEmitter); expect(gridGroup.querySelectorAll('.ct-grid').svgElements.length).toBe(1); @@ -86,15 +80,12 @@ describe('Axis', function() { }); it('should include all grid lines and labels for interpolated value of empty strings', function() { - chartOptions.axisX.labelInterpolationFnc = function(value, index) { - return index === 0 ? '' : value; - }; + chartOptions.axisX.labelInterpolationFnc = + (value, index) => index === 0 ? '' : value; var axis = new Axis(); axis.initialize(axisUnits.x, chartRect, ticks, null); - axis.projectValue = function(value) { - return value; - }; + axis.projectValue = (value) => value; axis.createGridAndLabels(gridGroup, labelGroup, true, chartOptions, eventEmitter); expect(gridGroup.querySelectorAll('.ct-grid').svgElements.length).toBe(2); diff --git a/src/axes/fixed-scale-axis.js b/src/axes/fixed-scale-axis.js index 117c94fb..9e0c59aa 100644 --- a/src/axes/fixed-scale-axis.js +++ b/src/axes/fixed-scale-axis.js @@ -6,14 +6,13 @@ export class FixedScaleAxis extends Axis { constructor(axisUnit, data, chartRect, options) { super(); - var highLow = options.highLow || getHighLow(data, options, axisUnit.pos); + const highLow = options.highLow || getHighLow(data, options, axisUnit.pos); this.divisor = options.divisor || 1; - this.ticks = options.ticks || times(this.divisor).map(function(value, index) { - return highLow.low + (highLow.high - highLow.low) / this.divisor * index; - }.bind(this)); - this.ticks.sort(function(a, b) { - return a - b; - }); + this.ticks = options.ticks || + times(this.divisor).map( + (value, index) => highLow.low + (highLow.high - highLow.low) / this.divisor * index + ); + this.ticks.sort((a, b) => a - b); this.range = { min: highLow.low, max: highLow.high @@ -25,6 +24,7 @@ export class FixedScaleAxis extends Axis { } projectValue(value) { - return this.axisLength * (+getMultiValue(value, this.units.pos) - this.range.min) / (this.range.max - this.range.min); + return this.axisLength * (+getMultiValue(value, this.units.pos) - this.range.min) / + (this.range.max - this.range.min); } } diff --git a/src/axes/fixed-scale-axis.spec.js b/src/axes/fixed-scale-axis.spec.js index 027cf42d..d1cbce6c 100644 --- a/src/axes/fixed-scale-axis.spec.js +++ b/src/axes/fixed-scale-axis.spec.js @@ -1,9 +1,9 @@ import {FixedScaleAxis} from './fixed-scale-axis'; -describe('FixedScaleAxis', function () { - it('should order the tick array', function () { - var ticks = [10, 5, 0, -5, -10]; - var axisUnit = { +describe('FixedScaleAxis', () => { + it('should order the tick array', () => { + const ticks = [10, 5, 0, -5, -10]; + const axisUnit = { pos: 'y', len: 'height', dir: 'vertical', @@ -11,25 +11,32 @@ describe('FixedScaleAxis', function () { rectEnd: 'y1', rectOffset: 'x1' }; - var data = [[{x: 1, y: 10}, {x: 2, y: 5}, {x: 3, y: -5}]]; - var chartRect = { - 'padding': {'top': 15, 'right': 15, 'bottom': 5, 'left': 10}, - 'y2': 15, - 'y1': 141, - 'x1': 50, - 'x2': 269 + const data = [ + [{x: 1, y: 10}, {x: 2, y: 5}, {x: 3, y: -5}] + ]; + const chartRect = { + padding: { + top: 15, + right: 15, + bottom: 5, + left: 10 + }, + y2: 15, + y1: 141, + x1: 50, + x2: 269 }; - var options = { - 'offset': 40, - 'position': 'start', - 'labelOffset': {'x': 0, 'y': 0}, - 'showLabel': true, - 'showGrid': true, - 'scaleMinSpace': 20, - 'onlyInteger': false, - 'ticks': ticks + const options = { + offset: 40, + position: 'start', + labelOffset: {'x': 0, 'y': 0}, + showLabel: true, + showGrid: true, + scaleMinSpace: 20, + onlyInteger: false, + ticks }; - var fsaxis = new FixedScaleAxis(axisUnit, data, chartRect, options); + const fsaxis = new FixedScaleAxis(axisUnit, data, chartRect, options); expect(fsaxis.ticks).toEqual([-10, -5, 0, 5, 10]); }); }); diff --git a/src/axes/step-axis.js b/src/axes/step-axis.js index dbbd984a..8010e33c 100644 --- a/src/axes/step-axis.js +++ b/src/axes/step-axis.js @@ -5,7 +5,7 @@ export class StepAxis extends Axis { super(); super.initialize(axisUnit, chartRect, options.ticks, options); - var calc = Math.max(1, options.ticks.length - (options.stretch ? 1 : 0)); + const calc = Math.max(1, options.ticks.length - (options.stretch ? 1 : 0)); this.stepLength = this.axisLength / calc; } diff --git a/src/axes/step-axis.spec.js b/src/axes/step-axis.spec.js index bf09501b..85de78e4 100644 --- a/src/axes/step-axis.spec.js +++ b/src/axes/step-axis.spec.js @@ -2,26 +2,26 @@ import {StepAxis} from './step-axis'; describe('StepAxis', function() { it('should return 0 if options.ticks.length == 1', function() { - var ticks = [1], - axisUnit = { - 'pos':'y', - 'len':'height', - 'dir':'vertical', - 'rectStart':'y2', - 'rectEnd':'y1', - 'rectOffset':'x1' - }, - data = [[1]], - chartRect = { - 'y2':0, - 'y1':15, - 'x1':50, - 'x2':100 - }, - options = { - 'ticks': ticks - }, - stepAxis = new StepAxis(axisUnit, data, chartRect, options); + const ticks = [1]; + const axisUnit = { + pos: 'y', + len: 'height', + dir: 'vertical', + rectStart: 'y2', + rectEnd: 'y1', + rectOffset: 'x1' + }; + const data = [[1]]; + const chartRect = { + y2: 0, + y1: 15, + x1: 50, + x2: 100 + }; + const options = { + ticks + }; + const stepAxis = new StepAxis(axisUnit, data, chartRect, options); expect(stepAxis.stepLength).toEqual(15); }); }); diff --git a/src/charts/bar.js b/src/charts/bar.js index 1a88605c..2525abc1 100644 --- a/src/charts/bar.js +++ b/src/charts/bar.js @@ -153,14 +153,12 @@ export class BarChart extends BaseChart { * */ createChart(options) { - var data; - var highLow; + let data; + let highLow; if(options.distributeSeries) { data = normalizeData(this.data, options.reverseData, options.horizontalBars ? 'x' : 'y'); - data.normalized.series = data.normalized.series.map(function(value) { - return [value]; - }); + data.normalized.series = data.normalized.series.map((value) => [value]); } else { data = normalizeData(this.data, options.reverseData, options.horizontalBars ? 'x' : 'y'); } @@ -174,28 +172,26 @@ export class BarChart extends BaseChart { ); // Drawing groups in correct order - var gridGroup = this.svg.elem('g').addClass(options.classNames.gridGroup); - var seriesGroup = this.svg.elem('g'); - var labelGroup = this.svg.elem('g').addClass(options.classNames.labelGroup); + const gridGroup = this.svg.elem('g').addClass(options.classNames.gridGroup); + const seriesGroup = this.svg.elem('g'); + const labelGroup = this.svg.elem('g').addClass(options.classNames.labelGroup); if(options.stackBars && data.normalized.series.length !== 0) { - // If stacked bars we need to calculate the high low from stacked values from each series - var serialSums = serialMap(data.normalized.series, function serialSums() { - return Array.prototype.slice.call(arguments).map(function(value) { - return value; - }).reduce(function(prev, curr) { - return { - x: prev.x + (curr && curr.x) || 0, - y: prev.y + (curr && curr.y) || 0 - }; - }, {x: 0, y: 0}); - }); + var serialSums = serialMap(data.normalized.series, () => + Array.from(arguments) + .map((value) => value) + .reduce((prev, curr) => { + return { + x: prev.x + (curr && curr.x) || 0, + y: prev.y + (curr && curr.y) || 0 + }; + }, {x: 0, y: 0}) + ); highLow = getHighLow([serialSums], options, options.horizontalBars ? 'x' : 'y'); } else { - highLow = getHighLow(data.normalized.series, options, options.horizontalBars ? 'x' : 'y'); } @@ -203,13 +199,12 @@ export class BarChart extends BaseChart { highLow.high = +options.high || (options.high === 0 ? 0 : highLow.high); highLow.low = +options.low || (options.low === 0 ? 0 : highLow.low); - var chartRect = createChartRect(this.svg, options, defaultOptions.padding); - - var valueAxis, - labelAxisTicks, - labelAxis, - axisX, - axisY; + const chartRect = createChartRect(this.svg, options, defaultOptions.padding); + let valueAxis; + let labelAxisTicks; + let labelAxis; + let axisX; + let axisY; // We need to set step count based on some options combinations if(options.distributeSeries && options.stackBars) { @@ -259,7 +254,7 @@ export class BarChart extends BaseChart { referenceValue: 0 })); } else { - valueAxis = axisY = new options.axisY.type(axisUnits.units.y, data.normalized.series, chartRect, extend({}, options.axisY, { + valueAxis = axisY = new options.axisY.type(axisUnits.y, data.normalized.series, chartRect, extend({}, options.axisY, { highLow: highLow, referenceValue: 0 })); @@ -267,9 +262,11 @@ export class BarChart extends BaseChart { } // Projected 0 point - var zeroPoint = options.horizontalBars ? (chartRect.x1 + valueAxis.projectValue(0)) : (chartRect.y1 - valueAxis.projectValue(0)); + const zeroPoint = options.horizontalBars ? + (chartRect.x1 + valueAxis.projectValue(0)) : + (chartRect.y1 - valueAxis.projectValue(0)); // Used to track the screen coordinates of stacked bars - var stackedBarValues = []; + const stackedBarValues = []; labelAxis.createGridAndLabels(gridGroup, labelGroup, this.supportsForeignObject, options, this.eventEmitter); valueAxis.createGridAndLabels(gridGroup, labelGroup, this.supportsForeignObject, options, this.eventEmitter); @@ -279,13 +276,11 @@ export class BarChart extends BaseChart { } // Draw the series - data.raw.series.forEach(function(series, seriesIndex) { + data.raw.series.forEach((series, seriesIndex) => { // Calculating bi-polar value of index for seriesOffset. For i = 0..4 biPol will be -1.5, -0.5, 0.5, 1.5 etc. - var biPol = seriesIndex - (data.raw.series.length - 1) / 2; + const biPol = seriesIndex - (data.raw.series.length - 1) / 2; // Half of the period width between vertical grid lines used to position bars - var periodHalfLength; - // Current series SVG element - var seriesElement; + let periodHalfLength; // We need to set periodHalfLength based on some options combinations if(options.distributeSeries && !options.stackBars) { @@ -302,7 +297,7 @@ export class BarChart extends BaseChart { } // Adding the series group to the series element - seriesElement = seriesGroup.elem('g'); + const seriesElement = seriesGroup.elem('g'); // Write attributes to series group element. If series name or meta is undefined the attributes will not be written seriesElement.attr({ @@ -313,15 +308,11 @@ export class BarChart extends BaseChart { // Use series class from series data or if not set generate one seriesElement.addClass([ options.classNames.series, - (series.className || options.classNames.series + '-' + alphaNumerate(seriesIndex)) + series.className || `${options.classNames.series}-${alphaNumerate(seriesIndex)}` ].join(' ')); - data.normalized.series[seriesIndex].forEach(function(value, valueIndex) { - var projected, - bar, - previousStack, - labelAxisValueIndex; - + data.normalized.series[seriesIndex].forEach((value, valueIndex) => { + let labelAxisValueIndex; // We need to set labelAxisValueIndex based on some options combinations if(options.distributeSeries && !options.stackBars) { // If distributed series are enabled but stacked bars aren't, we can use the seriesIndex for later projection @@ -336,6 +327,7 @@ export class BarChart extends BaseChart { labelAxisValueIndex = valueIndex; } + let projected; // We need to transform coordinates differently based on the chart layout if(options.horizontalBars) { projected = { @@ -363,7 +355,7 @@ export class BarChart extends BaseChart { } // Enter value in stacked bar values used to remember previous screen value for stacking up bars - previousStack = stackedBarValues[valueIndex] || zeroPoint; + const previousStack = stackedBarValues[valueIndex] || zeroPoint; stackedBarValues[valueIndex] = previousStack - (zeroPoint - projected[labelAxis.counterUnits.pos]); // Skip if value is undefined @@ -371,22 +363,22 @@ export class BarChart extends BaseChart { return; } - var positions = {}; - positions[labelAxis.units.pos + '1'] = projected[labelAxis.units.pos]; - positions[labelAxis.units.pos + '2'] = projected[labelAxis.units.pos]; + const positions = {}; + positions[`${labelAxis.units.pos}1`] = projected[labelAxis.units.pos]; + positions[`${labelAxis.units.pos}2`] = projected[labelAxis.units.pos]; if(options.stackBars && (options.stackMode === 'accumulate' || !options.stackMode)) { // Stack mode: accumulate (default) // If bars are stacked we use the stackedBarValues reference and otherwise base all bars off the zero line // We want backwards compatibility, so the expected fallback without the 'stackMode' option // to be the original behaviour (accumulate) - positions[labelAxis.counterUnits.pos + '1'] = previousStack; - positions[labelAxis.counterUnits.pos + '2'] = stackedBarValues[valueIndex]; + positions[`${labelAxis.counterUnits.pos}1`] = previousStack; + positions[`${labelAxis.counterUnits.pos}2`] = stackedBarValues[valueIndex]; } else { // Draw from the zero line normally // This is also the same code for Stack mode: overlap - positions[labelAxis.counterUnits.pos + '1'] = zeroPoint; - positions[labelAxis.counterUnits.pos + '2'] = projected[labelAxis.counterUnits.pos]; + positions[`${labelAxis.counterUnits.pos}1`] = zeroPoint; + positions[`${labelAxis.counterUnits.pos}2`] = projected[labelAxis.counterUnits.pos]; } // Limit x and y so that they are within the chart rect @@ -395,37 +387,37 @@ export class BarChart extends BaseChart { positions.y1 = Math.min(Math.max(positions.y1, chartRect.y2), chartRect.y1); positions.y2 = Math.min(Math.max(positions.y2, chartRect.y2), chartRect.y1); - var metaData = getMetaData(series, valueIndex); + const metaData = getMetaData(series, valueIndex); // Create bar element - bar = seriesElement.elem('line', positions, options.classNames.bar).attr({ + const bar = seriesElement.elem('line', positions, options.classNames.bar).attr({ 'ct:value': [value.x, value.y].filter(isNumeric).join(','), 'ct:meta': serialize(metaData) }); this.eventEmitter.emit('draw', extend({ type: 'bar', - value: value, + value, index: valueIndex, meta: metaData, - series: series, - seriesIndex: seriesIndex, - axisX: axisX, - axisY: axisY, - chartRect: chartRect, + series, + seriesIndex, + axisX, + axisY, + chartRect, group: seriesElement, element: bar }, positions)); - }.bind(this)); - }.bind(this)); + }); + }); this.eventEmitter.emit('created', { bounds: valueAxis.bounds, - chartRect: chartRect, - axisX: axisX, - axisY: axisY, + chartRect, + axisX, + axisY, svg: this.svg, - options: options + options }); } } diff --git a/src/charts/bar.spec.js b/src/charts/bar.spec.js new file mode 100644 index 00000000..133c8459 --- /dev/null +++ b/src/charts/bar.spec.js @@ -0,0 +1,339 @@ +import {AutoScaleAxis} from '../axes/axes'; +import {BarChart} from './bar'; +import {namespaces} from '../core/globals'; +import {deserialize} from '../core/data'; +import {addFixture, destroyFixtures, initializeFixtures} from '../testing/fixtures'; + +describe('BarChart', () => { + let fixture; + let options; + let data; + + function createChart(callback) { + fixture = addFixture('
'); + const chart = new BarChart(fixture.wrapper.querySelector('.ct-chart'), data, options) + .on('created', () => { + callback && callback(); + chart.off('created'); + }); + return chart; + } + + beforeEach(() => initializeFixtures()); + afterEach(() => { + destroyFixtures(); + data = undefined; + options = undefined; + }); + + describe('grids', () => { + beforeEach(() => { + data = { + series: [[ + { x: 1, y: 1 }, + { x: 3, y: 5 } + ]] + }; + options = { + axisX: { + type: AutoScaleAxis, + onlyInteger: true + }, + axisY: { + type: AutoScaleAxis, + onlyInteger: true + } + }; + }); + + it('should contain ct-grids group', (done) => { + data = null; + options = null; + createChart(() => { + expect(fixture.wrapper.querySelectorAll('g.ct-grids').length).toBe(1); + done(); + }); + }); + + it('should draw grid lines', (done) => { + createChart(() => { + expect(fixture.wrapper.querySelectorAll('g.ct-grids line.ct-grid.ct-horizontal').length).toBe(3); + expect(fixture.wrapper.querySelectorAll('g.ct-grids line.ct-grid.ct-vertical').length).toBe(6); + done(); + }); + }); + + it('should draw grid background', (done) => { + options.showGridBackground = true; + createChart(() => { + expect(fixture.wrapper.querySelectorAll('g.ct-grids rect.ct-grid-background').length).toBe(1); + done(); + }); + }); + + it('should not draw grid background if option set to false', (done) => { + options.showGridBackground = false; + createChart(() => { + expect(fixture.wrapper.querySelectorAll('g.ct-grids rect.ct-grid-background').length).toBe(0); + done(); + }); + }); + + }); + + describe('ct:value attribute', () => { + it('should contain x and y value for each bar', (done) => { + data = { + series: [[ + {x: 1, y: 2}, + {x: 3, y: 4} + ]] + }; + options = { + axisX: { + type: AutoScaleAxis + } + }; + + createChart(() => { + const bars = fixture.wrapper.querySelectorAll('.ct-bar'); + expect(bars[0].getAttributeNS(namespaces.ct, 'value')).toEqual('1,2'); + expect(bars[1].getAttributeNS(namespaces.ct, 'value')).toEqual('3,4'); + done(); + }); + }); + + it('should render values that are zero', (done) => { + data = { + series: [[ + {x: 0, y: 1}, + {x: 2, y: 0}, + {x: 0, y: 0} + ]] + }; + options = { + axisX: { + type: AutoScaleAxis + } + }; + + createChart(() => { + const bars = fixture.wrapper.querySelectorAll('.ct-bar'); + expect(bars[0].getAttributeNS(namespaces.ct, 'value')).toEqual('0,1'); + expect(bars[1].getAttributeNS(namespaces.ct, 'value')).toEqual('2,0'); + expect(bars[2].getAttributeNS(namespaces.ct, 'value')).toEqual('0,0'); + done(); + }); + }); + }); + + describe('Meta data tests', () => { + it('should render meta data correctly with mixed value array', (done) => { + const meta = { + test: 'Serialized Test' + }; + + data = { + labels: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu'], + series: [ + [5, 2, 4, { + value: 2, + meta: meta + }, 0] + ] + }; + + createChart(() => { + const bar = fixture.wrapper.querySelectorAll('.ct-bar')[3]; + expect(deserialize(bar.getAttributeNS(namespaces.ct, 'meta'))).toEqual(meta); + done(); + }); + }); + + it('should render meta data correctly with mixed value array and different normalized data length', (done) => { + const meta = { + test: 'Serialized Test' + }; + + data = { + labels: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'], + series: [ + [5, 2, 4, { + value: 2, + meta: meta + }, 0] + ] + }; + + createChart(() => { + const bar = fixture.wrapper.querySelectorAll('.ct-bar')[3]; + expect(deserialize(bar.getAttributeNS(namespaces.ct, 'meta'))).toEqual(meta); + done(); + }); + }); + + it('should render meta data correctly with mixed value array and mixed series notation', (done) => { + const seriesMeta = 9999; + const valueMeta = { + test: 'Serialized Test' + }; + + data = { + labels: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'], + series: [ + [5, 2, 4, { + value: 2, + meta: valueMeta + }, 0], + { + meta: seriesMeta, + data: [5, 2, { + value: 2, + meta: valueMeta + }, 0] + } + ] + }; + + createChart(() => { + expect( + deserialize( + fixture.wrapper.querySelectorAll('.ct-series-a .ct-bar')[3] + .getAttributeNS(namespaces.ct, 'meta') + ) + ).toEqual(valueMeta); + + expect( + deserialize( + fixture.wrapper.querySelector('.ct-series-b') + .getAttributeNS(namespaces.ct, 'meta') + ) + ).toEqual(seriesMeta); + + expect( + deserialize( + fixture.wrapper.querySelectorAll('.ct-series-b .ct-bar')[2] + .getAttributeNS(namespaces.ct, 'meta') + ) + ).toEqual(valueMeta); + + done(); + }); + }); + }); + + describe('Empty data tests', () => { + it('should render empty grid with no data', (done) => { + data = null; + options = null; + + createChart(() => { + // Find at least one vertical grid line + expect(document.querySelector('.ct-grids .ct-grid.ct-vertical')).toBeDefined(); + done(); + }); + }); + + it('should render empty grid with only labels', (done) => { + data = { + labels: [1, 2, 3, 4] + }; + + createChart(() => { + // Find at least one vertical grid line + expect(document.querySelector('.ct-grids .ct-grid.ct-vertical')).toBeDefined(); + // Find exactly as many horizontal grid lines as labels were specified (Step Axis) + expect(document.querySelectorAll('.ct-grids .ct-grid.ct-horizontal').length).toBe(data.labels.length); + done(); + }); + }); + + it('should generate labels and render empty grid with only series in data', (done) => { + data = { + series: [ + [1, 2, 3, 4], + [2, 3, 4], + [3, 4] + ] + }; + + createChart(() => { + // Find at least one vertical grid line + expect(document.querySelector('.ct-grids .ct-grid.ct-vertical')).toBeDefined(); + // Should generate the labels using the largest series count + expect(document.querySelectorAll('.ct-grids .ct-grid.ct-horizontal').length) + .toBe(Math.max(...data.series.map((series) => series.length))); + done(); + }); + }); + + it('should render empty grid with no data and specified high low', (done) => { + options = { + width: 400, + height: 300, + high: 100, + low: -100 + }; + + createChart(() => { + // Find first and last label + const labels = document.querySelectorAll('.ct-labels .ct-label.ct-vertical'); + const firstLabel = labels[0]; + const lastLabel = labels[labels.length - 1]; + + expect(firstLabel.textContent.trim()).toBe('-100'); + expect(lastLabel.textContent.trim()).toBe('100'); + done(); + }); + }); + + it('should render empty grid with no data and reverseData option', (done) => { + options = { + reverseData: true + }; + + createChart(() => { + // Find at least one vertical grid line + expect(document.querySelector('.ct-grids .ct-grid.ct-vertical')).toBeDefined(); + done(); + }); + }); + + it('should render empty grid with no data and stackBars option', (done) => { + options = { + stackBars: true + }; + + createChart(() => { + // Find at least one vertical grid line + expect(document.querySelector('.ct-grids .ct-grid.ct-vertical')).toBeDefined(); + done(); + }); + }); + + it('should render empty grid with no data and horizontalBars option', (done) => { + options = { + horizontalBars: true + }; + + createChart(() => { + // Find at least one vertical grid line + // TODO: In theory the axis should be created with ct-horizontal class + expect(document.querySelector('.ct-grids .ct-grid.ct-vertical')).toBeDefined(); + done(); + }); + }); + + it('should render empty grid with no data and distributeSeries option', (done) => { + options = { + distributeSeries: true + }; + + createChart(() => { + // Find at least one vertical grid line + expect(document.querySelector('.ct-grids .ct-grid.ct-vertical')).toBeDefined(); + done(); + }); + }); + }); +}); diff --git a/src/charts/base.js b/src/charts/base.js index 4b2a8e0e..b9170606 100644 --- a/src/charts/base.js +++ b/src/charts/base.js @@ -24,22 +24,20 @@ export class BaseChart { this.eventEmitter = new EventEmitter(); this.supportsForeignObject = isSupported('Extensibility'); this.supportsAnimations = isSupported('AnimationEventsAttribute'); - this.resizeListener = function resizeListener(){ - this.update(); - }.bind(this); - + this.resizeListener = () => this.update(); + if(this.container) { // If chartist was already initialized in this container we are detaching all event listeners first if(this.container.__chartist__) { this.container.__chartist__.detach(); } - + this.container.__chartist__ = this; } - + // Using event loop for first draw to make it possible to register event listeners in the same call stack where // the chart was created. - this.initializeTimeoutId = setTimeout(this.initialize.bind(this), 0); + this.initializeTimeoutId = setTimeout(() => this.initialize(), 0); } createChart() { @@ -142,20 +140,18 @@ export class BaseChart { // This will also register a listener that is re-creating the chart based on media changes this.optionsProvider = optionsProvider(this.options, this.responsiveOptions, this.eventEmitter); // Register options change listener that will trigger a chart update - this.eventEmitter.addEventHandler('optionsChanged', function() { - this.update(); - }.bind(this)); + this.eventEmitter.addEventHandler('optionsChanged', () => this.update()); // Before the first chart creation we need to register us with all plugins that are configured // Initialize all relevant plugins with our chart object and the plugin options specified in the config if(this.options.plugins) { - this.options.plugins.forEach(function(plugin) { + this.options.plugins.forEach((plugin) => { if(plugin instanceof Array) { plugin[0](this, plugin[1]); } else { plugin(this); } - }.bind(this)); + }); } // Event for data transformation that allows to manipulate the data before it gets rendered in the charts diff --git a/src/charts/line.js b/src/charts/line.js index 83ada68f..caf498ff 100644 --- a/src/charts/line.js +++ b/src/charts/line.js @@ -198,19 +198,20 @@ export class LineChart extends BaseChart { * */ createChart(options) { - var data = normalizeData(this.data, options.reverseData, true); + const data = normalizeData(this.data, options.reverseData, true); // Create new svg object this.svg = createSvg(this.container, options.width, options.height, options.classNames.chart); // Create groups for labels, grid and series - var gridGroup = this.svg.elem('g').addClass(options.classNames.gridGroup); - var seriesGroup = this.svg.elem('g'); - var labelGroup = this.svg.elem('g').addClass(options.classNames.labelGroup); + const gridGroup = this.svg.elem('g').addClass(options.classNames.gridGroup); + const seriesGroup = this.svg.elem('g'); + const labelGroup = this.svg.elem('g').addClass(options.classNames.labelGroup); - var chartRect = createChartRect(this.svg, options, defaultOptions.padding); - var axisX, axisY; + const chartRect = createChartRect(this.svg, options, defaultOptions.padding); + let axisX; + let axisY; - if(options.axisX.type === undefined) { + if (options.axisX.type === undefined) { axisX = new StepAxis(axisUnits.x, data.normalized.series, chartRect, extend({}, options.axisX, { ticks: data.normalized.labels, stretch: options.fullWidth @@ -219,7 +220,7 @@ export class LineChart extends BaseChart { axisX = new options.axisX.type(axisUnits.x, data.normalized.series, chartRect, options.axisX); } - if(options.axisY.type === undefined) { + if (options.axisY.type === undefined) { axisY = new AutoScaleAxis(axisUnits.y, data.normalized.series, chartRect, extend({}, options.axisY, { high: isNumeric(options.high) ? options.high : options.axisY.high, low: isNumeric(options.low) ? options.low : options.axisY.low @@ -236,8 +237,8 @@ export class LineChart extends BaseChart { } // Draw the series - data.raw.series.forEach(function(series, seriesIndex) { - var seriesElement = seriesGroup.elem('g'); + data.raw.series.forEach((series, seriesIndex) => { + const seriesElement = seriesGroup.elem('g'); // Write attributes to series group element. If series name or meta is undefined the attributes will not be written seriesElement.attr({ @@ -248,26 +249,26 @@ export class LineChart extends BaseChart { // Use series class from series data or if not set generate one seriesElement.addClass([ options.classNames.series, - (series.className || options.classNames.series + '-' + alphaNumerate(seriesIndex)) + series.className || `${options.classNames.series}-${alphaNumerate(seriesIndex)}` ].join(' ')); - var pathCoordinates = [], - pathData = []; + const pathCoordinates = []; + const pathData = []; - data.normalized.series[seriesIndex].forEach(function(value, valueIndex) { - var p = { + data.normalized.series[seriesIndex].forEach((value, valueIndex) => { + const p = { x: chartRect.x1 + axisX.projectValue(value, valueIndex, data.normalized.series[seriesIndex]), y: chartRect.y1 - axisY.projectValue(value, valueIndex, data.normalized.series[seriesIndex]) }; pathCoordinates.push(p.x, p.y); pathData.push({ - value: value, - valueIndex: valueIndex, + value, + valueIndex, meta: getMetaData(series, valueIndex) }); - }.bind(this)); + }); - var seriesOptions = { + const seriesOptions = { lineSmooth: getSeriesOption(series, options, 'lineSmooth'), showPoint: getSeriesOption(series, options, 'showPoint'), showLine: getSeriesOption(series, options, 'showLine'), @@ -275,19 +276,19 @@ export class LineChart extends BaseChart { areaBase: getSeriesOption(series, options, 'areaBase') }; - var smoothing = typeof seriesOptions.lineSmooth === 'function' ? + const smoothing = typeof seriesOptions.lineSmooth === 'function' ? seriesOptions.lineSmooth : (seriesOptions.lineSmooth ? monotoneCubic() : none()); // Interpolating path where pathData will be used to annotate each path element so we can trace back the original // index, value and meta data - var path = smoothing(pathCoordinates, pathData); + const path = smoothing(pathCoordinates, pathData); // If we should show points we need to create them now to avoid secondary loop // Points are drawn from the pathElements returned by the interpolation function // Small offset for Firefox to render squares correctly if (seriesOptions.showPoint) { - path.pathElements.forEach(function(pathElement) { - var point = seriesElement.elem('line', { + path.pathElements.forEach((pathElement) => { + const point = seriesElement.elem('line', { x1: pathElement.x, y1: pathElement.y, x2: pathElement.x + 0.01, @@ -302,20 +303,20 @@ export class LineChart extends BaseChart { value: pathElement.data.value, index: pathElement.data.valueIndex, meta: pathElement.data.meta, - series: series, - seriesIndex: seriesIndex, - axisX: axisX, - axisY: axisY, + series, + seriesIndex, + axisX, + axisY, group: seriesElement, element: point, x: pathElement.x, y: pathElement.y }); - }.bind(this)); + }); } - if(seriesOptions.showLine) { - var line = seriesElement.elem('path', { + if (seriesOptions.showLine) { + const line = seriesElement.elem('path', { d: path.stringify() }, options.classNames.line, true); @@ -323,80 +324,84 @@ export class LineChart extends BaseChart { type: 'line', values: data.normalized.series[seriesIndex], path: path.clone(), - chartRect: chartRect, + chartRect, + // TODO: Remove redundant index: seriesIndex, - series: series, - seriesIndex: seriesIndex, + series, + seriesIndex, seriesMeta: series.meta, - axisX: axisX, - axisY: axisY, + axisX, + axisY, group: seriesElement, element: line }); } // Area currently only works with axes that support a range! - if(seriesOptions.showArea && axisY.range) { + if (seriesOptions.showArea && axisY.range) { // If areaBase is outside the chart area (< min or > max) we need to set it respectively so that // the area is not drawn outside the chart area. - var areaBase = Math.max(Math.min(seriesOptions.areaBase, axisY.range.max), axisY.range.min); + const areaBase = Math.max(Math.min(seriesOptions.areaBase, axisY.range.max), axisY.range.min); // We project the areaBase value into screen coordinates - var areaBaseProjected = chartRect.y1 - axisY.projectValue(areaBase); + const areaBaseProjected = chartRect.y1 - axisY.projectValue(areaBase); // In order to form the area we'll first split the path by move commands so we can chunk it up into segments - path.splitByCommand('M').filter(function onlySolidSegments(pathSegment) { + path.splitByCommand('M') // We filter only "solid" segments that contain more than one point. Otherwise there's no need for an area - return pathSegment.pathElements.length > 1; - }).map(function convertToArea(solidPathSegments) { - // Receiving the filtered solid path segments we can now convert those segments into fill areas - var firstElement = solidPathSegments.pathElements[0]; - var lastElement = solidPathSegments.pathElements[solidPathSegments.pathElements.length - 1]; + .filter((pathSegment) => pathSegment.pathElements.length > 1) + .map((solidPathSegments) => { + // Receiving the filtered solid path segments we can now convert those segments into fill areas + const firstElement = solidPathSegments.pathElements[0]; + const lastElement = solidPathSegments.pathElements[solidPathSegments.pathElements.length - 1]; - // Cloning the solid path segment with closing option and removing the first move command from the clone - // We then insert a new move that should start at the area base and draw a straight line up or down - // at the end of the path we add an additional straight line to the projected area base value - // As the closing option is set our path will be automatically closed - return solidPathSegments.clone(true) - .position(0) - .remove(1) - .move(firstElement.x, areaBaseProjected) - .line(firstElement.x, firstElement.y) - .position(solidPathSegments.pathElements.length + 1) - .line(lastElement.x, areaBaseProjected); + // Cloning the solid path segment with closing option and removing the first move command from the clone + // We then insert a new move that should start at the area base and draw a straight line up or down + // at the end of the path we add an additional straight line to the projected area base value + // As the closing option is set our path will be automatically closed + return solidPathSegments.clone(true) + .position(0) + .remove(1) + .move(firstElement.x, areaBaseProjected) + .line(firstElement.x, firstElement.y) + .position(solidPathSegments.pathElements.length + 1) + .line(lastElement.x, areaBaseProjected); - }).forEach(function createArea(areaPath) { - // For each of our newly created area paths, we'll now create path elements by stringifying our path objects - // and adding the created DOM elements to the correct series group - var area = seriesElement.elem('path', { - d: areaPath.stringify() - }, options.classNames.area, true); + }) + .forEach((areaPath) => { + // For each of our newly created area paths, we'll now create path elements by stringifying our path objects + // and adding the created DOM elements to the correct series group + const area = seriesElement.elem('path', { + d: areaPath.stringify() + }, options.classNames.area, true); - // Emit an event for each area that was drawn - this.eventEmitter.emit('draw', { - type: 'area', - values: data.normalized.series[seriesIndex], - path: areaPath.clone(), - series: series, - seriesIndex: seriesIndex, - axisX: axisX, - axisY: axisY, - chartRect: chartRect, - index: seriesIndex, - group: seriesElement, - element: area + // Emit an event for each area that was drawn + this.eventEmitter.emit('draw', { + type: 'area', + values: data.normalized.series[seriesIndex], + path: areaPath.clone(), + series, + seriesIndex, + axisX, + axisY, + chartRect, + // TODO: Remove redundant + index: seriesIndex, + group: seriesElement, + element: area + }); }); - }.bind(this)); } - }.bind(this)); - + }); + this.eventEmitter.emit('created', { + // TODO: Remove redundant bounds: axisY.bounds, - chartRect: chartRect, - axisX: axisX, - axisY: axisY, + chartRect, + axisX, + axisY, svg: this.svg, - options: options + options }); } } diff --git a/src/charts/line.spec.js b/src/charts/line.spec.js new file mode 100644 index 00000000..00435294 --- /dev/null +++ b/src/charts/line.spec.js @@ -0,0 +1,582 @@ +import {AutoScaleAxis, FixedScaleAxis} from '../axes/axes'; +import {LineChart} from './line'; +import * as Interpolation from '../interpolation/interpolation'; +import {namespaces} from '../core/globals'; +import {deserialize} from '../core/data'; +import {addFixture, destroyFixtures, initializeFixtures} from '../testing/fixtures'; + +describe('LineChart', () => { + let fixture; + let options; + let data; + + function createChart(callback) { + fixture = addFixture('
'); + const chart = new LineChart(fixture.wrapper.querySelector('.ct-chart'), data, options) + .on('created', () => { + callback && callback(); + chart.off('created'); + }); + return chart; + } + + beforeEach(() => initializeFixtures()); + afterEach(() => { + destroyFixtures(); + data = undefined; + options = undefined; + }); + + describe('grids', () => { + beforeEach(() => { + data = { + series: [[ + { x: 1, y: 1 }, + { x: 3, y: 5 } + ]] + }; + options = { + axisX: { + type: AutoScaleAxis, + onlyInteger: true + }, + axisY: { + type: AutoScaleAxis, + onlyInteger: true + } + }; + }); + + it('should contain ct-grids group', (done) => { + createChart(() => { + expect(fixture.wrapper.querySelectorAll('.ct-grids').length).toBe(1); + done(); + }); + }); + + it('should draw grid lines', (done) => { + createChart(() => { + expect(fixture.wrapper.querySelectorAll('.ct-grids .ct-grid.ct-horizontal').length).toBe(3); + expect(fixture.wrapper.querySelectorAll('.ct-grids .ct-grid.ct-vertical').length).toBe(5); + done(); + }); + }); + + it('should draw grid background', (done) => { + options.showGridBackground = true; + createChart(() => { + expect(fixture.wrapper.querySelectorAll('.ct-grids .ct-grid-background').length).toBe(1); + done(); + }); + }); + + it('should not draw grid background if option set to false', (done) => { + options.showGridBackground = false; + createChart(() => { + expect(fixture.wrapper.querySelectorAll('.ct-grids .ct-grid-background').length).toBe(0); + done(); + }); + }); + }); + + describe('AxisY position tests', () => { + beforeEach(() => { + data = { + series: [[ + { x: 1, y: 1 }, + { x: 3, y: 5 } + ]] + }; + options = {}; + }); + + it('should have ct-start class if position start', (done) => { + options = { + axisY: { + position: 'start' + } + }; + + createChart(() => { + Array.from(fixture.wrapper.querySelectorAll('.ct-label.ct-vertical')) + .forEach((element) => expect(element.getAttribute('class')).toBe('ct-label ct-vertical ct-start')); + done(); + }); + }); + + it('should have ct-end class if position is any other value than start', (done) => { + options = { + axisY: { + position: 'right' + } + }; + + createChart(() => { + Array.from(fixture.wrapper.querySelectorAll('.ct-label.ct-vertical')) + .forEach((element) => expect(element.getAttribute('class')).toBe('ct-label ct-vertical ct-end')); + done(); + }); + }); + }); + + describe('ct:value attribute', () => { + it('should contain x and y value for each datapoint', (done) => { + data = { + series: [[ + {x: 1, y: 2}, + {x: 3, y: 4} + ]] + }; + options = { + axisX: { + type: FixedScaleAxis + } + }; + + createChart(() => { + const points = fixture.wrapper.querySelectorAll('.ct-point'); + expect(points[0].getAttributeNS(namespaces.ct, 'value')).toBe('1,2'); + expect(points[1].getAttributeNS(namespaces.ct, 'value')).toBe('3,4'); + done(); + }); + }); + + it('should render values that are zero', (done) => { + data = { + series: [[ + {x: 0, y: 1}, + {x: 1, y: 0}, + {x: 0, y: 0} + ]] + }; + options = { + axisX: { + type: FixedScaleAxis + } + }; + + createChart(() => { + const points = fixture.wrapper.querySelectorAll('.ct-point'); + expect(points[0].getAttributeNS(namespaces.ct, 'value')).toBe('0,1'); + expect(points[1].getAttributeNS(namespaces.ct, 'value')).toBe('1,0'); + expect(points[2].getAttributeNS(namespaces.ct, 'value')).toBe('0,0'); + done(); + }); + }); + }); + + describe('Meta data tests', () => { + it('should render meta data correctly with mixed value array', (done) => { + const meta = { + test: 'Serialized Test' + }; + + data = { + labels: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu'], + series: [ + [5, 2, 4, { + value: 2, + meta: meta + }, 0] + ] + }; + + createChart(() => { + const points = fixture.wrapper.querySelectorAll('.ct-point'); + expect(deserialize(points[3].getAttributeNS(namespaces.ct, 'meta'))).toEqual(meta); + done(); + }); + }); + + it('should render meta data correctly with mixed value array and different normalized data length', (done) => { + const meta = { + test: 'Serialized Test' + }; + + data = { + labels: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'], + series: [ + [5, 2, 4, { + value: 2, + meta: meta + }, 0] + ] + }; + + createChart(() => { + const points = fixture.wrapper.querySelectorAll('.ct-point'); + expect(deserialize(points[3].getAttributeNS(namespaces.ct, 'meta'))).toEqual(meta); + done(); + }); + }); + + it('should render meta data correctly with mixed value array and mixed series notation', (done) => { + const seriesMeta = 9999; + const valueMeta = { + test: 'Serialized Test' + }; + + data = { + labels: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'], + series: [ + [5, 2, 4, { + value: 2, + meta: valueMeta + }, 0], + { + meta: seriesMeta, + data: [5, 2, { + value: 2, + meta: valueMeta + }, 0] + } + ] + }; + + createChart(() => { + expect( + deserialize( + fixture.wrapper.querySelectorAll('.ct-series-a .ct-point')[3] + .getAttributeNS(namespaces.ct, 'meta') + ) + ).toEqual(valueMeta); + + expect( + deserialize( + fixture.wrapper.querySelector('.ct-series-b') + .getAttributeNS(namespaces.ct, 'meta') + ) + ).toEqual(seriesMeta); + + expect( + deserialize( + fixture.wrapper.querySelectorAll('.ct-series-b .ct-point')[2] + .getAttributeNS(namespaces.ct, 'meta') + ) + ).toEqual(valueMeta); + + done(); + }); + }); + }); + + describe('Line charts with holes', () => { + it('should render correctly with Interpolation.none and holes everywhere', (done) => { + data = { + labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + series: [ + [NaN, 15, 0, null, 2, 3, 4, undefined, {value: 1, meta: 'meta data'}, null] + ] + }; + options = { + lineSmooth: false + }; + + const chart = createChart(); + chart.on('draw', (context) => { + if (context.type === 'line') { + expect(context.path.pathElements.map((pathElement) => { + return { + command: pathElement.command, + data: pathElement.data + }; + })).toEqual([ + {command: 'M', data: {valueIndex: 1, value: {x: undefined, y: 15}, meta: undefined}}, + {command: 'L', data: {valueIndex: 2, value: {x: undefined, y: 0}, meta: undefined}}, + {command: 'M', data: {valueIndex: 4, value: {x: undefined, y: 2}, meta: undefined}}, + {command: 'L', data: {valueIndex: 5, value: {x: undefined, y: 3}, meta: undefined}}, + {command: 'L', data: {valueIndex: 6, value: {x: undefined, y: 4}, meta: undefined}}, + {command: 'M', data: {valueIndex: 8, value: {x: undefined, y: 1}, meta: 'meta data'}} + ]); + done(); + } + }); + }); + + it('should render correctly with Interpolation.cardinal and holes everywhere', (done) => { + data = { + labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + series: [ + [NaN, 15, 0, null, 2, 3, 4, undefined, {value: 1, meta: 'meta data'}, null] + ] + }; + options = { + lineSmooth: true + }; + + const chart = createChart(); + chart.on('draw', (context) => { + if (context.type === 'line') { + expect(context.path.pathElements.map((pathElement) => { + return { + command: pathElement.command, + data: pathElement.data + }; + })).toEqual([ + {command: 'M', data: {valueIndex: 1, value: {x: undefined, y: 15}, meta: undefined}}, + // Cardinal should create Line path segment if only one connection + {command: 'L', data: {valueIndex: 2, value: {x: undefined, y: 0}, meta: undefined}}, + {command: 'M', data: {valueIndex: 4, value: {x: undefined, y: 2}, meta: undefined}}, + // Cardinal should create Curve path segment for 2 or more connections + {command: 'C', data: {valueIndex: 5, value: {x: undefined, y: 3}, meta: undefined}}, + {command: 'C', data: {valueIndex: 6, value: {x: undefined, y: 4}, meta: undefined}}, + {command: 'M', data: {valueIndex: 8, value: {x: undefined, y: 1}, meta: 'meta data'}} + ]); + done(); + } + }); + }); + + it('should render correctly with Interpolation.monotoneCubic and holes everywhere', (done) => { + data = { + labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + series: [ + [NaN, 15, 0, null, 2, 3, 4, undefined, {value: 1, meta: 'meta data'}, null] + ] + }; + options = { + lineSmooth: Interpolation.monotoneCubic() + }; + + const chart = createChart(); + chart.on('draw', (context) => { + if (context.type === 'line') { + expect(context.path.pathElements.map((pathElement) => { + return { + command: pathElement.command, + data: pathElement.data + }; + })).toEqual([ + {command: 'M', data: {valueIndex: 1, value: {x: undefined, y: 15}, meta: undefined}}, + // Monotone cubic should create Line path segment if only one connection + {command: 'L', data: {valueIndex: 2, value: {x: undefined, y: 0}, meta: undefined}}, + {command: 'M', data: {valueIndex: 4, value: {x: undefined, y: 2}, meta: undefined}}, + // Monotone cubic should create Curve path segment for 2 or more connections + {command: 'C', data: {valueIndex: 5, value: {x: undefined, y: 3}, meta: undefined}}, + {command: 'C', data: {valueIndex: 6, value: {x: undefined, y: 4}, meta: undefined}}, + {command: 'M', data: {valueIndex: 8, value: {x: undefined, y: 1}, meta: 'meta data'}} + ]); + done(); + } + }); + }); + + it('should render correctly with Interpolation.simple and holes everywhere', (done) => { + data = { + labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + series: [ + [NaN, 15, 0, null, 2, 3, 4, undefined, {value: 1, meta: 'meta data'}, null] + ] + }; + options = { + lineSmooth: Interpolation.simple() + }; + + const chart = createChart(); + chart.on('draw', (context) => { + if (context.type === 'line') { + expect(context.path.pathElements.map((pathElement) => { + return { + command: pathElement.command, + data: pathElement.data + }; + })).toEqual([ + {command: 'M', data: {valueIndex: 1, value: {x: undefined, y: 15}, meta: undefined}}, + {command: 'C', data: {valueIndex: 2, value: {x: undefined, y: 0}, meta: undefined}}, + {command: 'M', data: {valueIndex: 4, value: {x: undefined, y: 2}, meta: undefined}}, + {command: 'C', data: {valueIndex: 5, value: {x: undefined, y: 3}, meta: undefined}}, + {command: 'C', data: {valueIndex: 6, value: {x: undefined, y: 4}, meta: undefined}}, + {command: 'M', data: {valueIndex: 8, value: {x: undefined, y: 1}, meta: 'meta data'}} + ]); + done(); + } + }); + }); + + it('should render correctly with postponed Interpolation.step and holes everywhere', (done) => { + data = { + labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + series: [ + [NaN, 15, 0, null, 2, 3, 4, undefined, {value: 1, meta: 'meta data'}, null] + ] + }; + options = { + lineSmooth: Interpolation.step() + }; + + const chart = createChart(); + chart.on('draw', (context) => { + if (context.type === 'line') { + expect(context.path.pathElements.map((pathElement) => { + return { + command: pathElement.command, + data: pathElement.data + }; + })).toEqual([ + {command: 'M', data: {valueIndex: 1, value: {x: undefined, y: 15}, meta: undefined}}, + {command: 'L', data: {valueIndex: 1, value: {x: undefined, y: 15}, meta: undefined}}, + {command: 'L', data: {valueIndex: 2, value: {x: undefined, y: 0}, meta: undefined}}, + {command: 'M', data: {valueIndex: 4, value: {x: undefined, y: 2}, meta: undefined}}, + {command: 'L', data: {valueIndex: 4, value: {x: undefined, y: 2}, meta: undefined}}, + {command: 'L', data: {valueIndex: 5, value: {x: undefined, y: 3}, meta: undefined}}, + {command: 'L', data: {valueIndex: 5, value: {x: undefined, y: 3}, meta: undefined}}, + {command: 'L', data: {valueIndex: 6, value: {x: undefined, y: 4}, meta: undefined}}, + {command: 'M', data: {valueIndex: 8, value: {x: undefined, y: 1}, meta: 'meta data'}} + ]); + done(); + } + }); + }); + + it('should render correctly with preponed Interpolation.step and holes everywhere', (done) => { + data = { + labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + series: [ + [NaN, 15, 0, null, 2, 3, 4, undefined, {value: 1, meta: 'meta data'}, null] + ] + }; + options ={ + lineSmooth: Interpolation.step({ + postpone: false + }) + }; + + const chart = createChart(); + chart.on('draw', (context) => { + if (context.type === 'line') { + expect(context.path.pathElements.map((pathElement) => { + return { + command: pathElement.command, + data: pathElement.data + }; + })).toEqual([ + {command: 'M', data: {valueIndex: 1, value: {x: undefined, y: 15}, meta: undefined}}, + {command: 'L', data: {valueIndex: 2, value: {x: undefined, y: 0}, meta: undefined}}, + {command: 'L', data: {valueIndex: 2, value: {x: undefined, y: 0}, meta: undefined}}, + {command: 'M', data: {valueIndex: 4, value: {x: undefined, y: 2}, meta: undefined}}, + {command: 'L', data: {valueIndex: 5, value: {x: undefined, y: 3}, meta: undefined}}, + {command: 'L', data: {valueIndex: 5, value: {x: undefined, y: 3}, meta: undefined}}, + {command: 'L', data: {valueIndex: 6, value: {x: undefined, y: 4}, meta: undefined}}, + {command: 'L', data: {valueIndex: 6, value: {x: undefined, y: 4}, meta: undefined}}, + {command: 'M', data: {valueIndex: 8, value: {x: undefined, y: 1}, meta: 'meta data'}} + ]); + done(); + } + }); + }); + }); + + describe('Single value data tests', () => { + beforeEach(() => { + data = { + labels: [1], + series: [[1]] + }; + }); + + it('should render without NaN values and points', (done) => { + createChart(() => { + expect(document.querySelector('.ct-line').getAttribute('d')).toBe('M50,15'); + expect(document.querySelector('.ct-point').getAttribute('x1')).toBe('50'); + expect(document.querySelector('.ct-point').getAttribute('x2')).toBe('50.01'); + done(); + }); + }); + }); + + describe('Empty data tests', () => { + it('should render empty grid with no data', (done) => { + createChart(() => { + // Find at least one vertical grid line + expect(document.querySelector('.ct-grids .ct-grid.ct-vertical')).toBeDefined(); + done(); + }); + }); + + it('should render empty grid with only labels', (done) => { + data = { + labels: [1, 2, 3, 4] + }; + + createChart(() => { + // Find at least one vertical grid line + expect(document.querySelector('.ct-grids .ct-grid.ct-vertical')).toBeDefined(); + // Find exactly as many horizontal grid lines as labels were specified (Step Axis) + expect(document.querySelectorAll('.ct-grids .ct-grid.ct-horizontal').length).toBe(data.labels.length); + done(); + }); + }); + + it('should generate labels and render empty grid with only series in data', (done) => { + data = { + series: [ + [1, 2, 3, 4], + [2, 3, 4], + [3, 4] + ] + }; + + createChart(() => { + // Find at least one vertical grid line + expect(document.querySelector('.ct-grids .ct-grid.ct-vertical')).toBeDefined(); + // Should generate the labels using the largest series count + expect(document.querySelectorAll('.ct-grids .ct-grid.ct-horizontal').length) + .toBe(Math.max(...data.series.map((series) => series.length))); + done(); + }); + }); + + it('should render empty grid with no data and specified high low', (done) => { + data = null; + options ={ + width: 400, + height: 300, + high: 100, + low: -100 + }; + + createChart(() => { + // Find first and last label + const labels = document.querySelectorAll('.ct-labels .ct-label.ct-vertical'); + const firstLabel = labels[0]; + const lastLabel = labels[labels.length - 1]; + + expect(firstLabel.textContent.trim()).toBe('-100'); + expect(lastLabel.textContent.trim()).toBe('100'); + done(); + }); + }); + + it('should render empty grid with no data and reverseData option', (done) => { + data = null; + options = { + reverseData: true + }; + + createChart(() => { + // Find at least one vertical grid line + expect(document.querySelector('.ct-grids .ct-grid.ct-vertical')).toBeDefined(); + done(); + }); + }); + }); + + describe('x1 and x2 attribute', () => { + it('should contain just a datapoint', (done) => { + data = { + series: [[ + {x: 1, y: 2} + ]] + }; + options = { + fullWidth: true + }; + + createChart(() => { + expect(document.querySelector('.ct-point').getAttribute('x1')).not.toBe('NaN'); + expect(document.querySelector('.ct-point').getAttribute('x2')).not.toBe('NaN'); + done(); + }); + }); + }); +}); diff --git a/src/charts/pie.js b/src/charts/pie.js index b8a7e0bb..ee0089e5 100644 --- a/src/charts/pie.js +++ b/src/charts/pie.js @@ -1,5 +1,5 @@ import {alphaNumerate, quantity, isFalseyButZero} from '../core/lang'; -import {noop} from '../core/functional'; +import {noop, sum} from '../core/functional'; import {polarToCartesian} from '../core/math'; import {extend} from '../core/extend'; import {normalizeData, serialize} from '../core/data'; @@ -62,7 +62,7 @@ const defaultOptions = { * @return {string} */ export function determineAnchorPosition(center, label, direction) { - var toTheRight = label.x > center.x; + const toTheRight = label.x > center.x; if (toTheRight && direction === 'explode' || !toTheRight && direction === 'implode') { @@ -154,27 +154,23 @@ export class PieChart extends BaseChart { * @param options */ createChart(options) { - var data = normalizeData(this.data); - var seriesGroups = [], - labelsGroup, - chartRect, - radius, - labelRadius, - totalDataSum, - startAngle = options.startAngle; + const data = normalizeData(this.data); + const seriesGroups = []; + let labelsGroup; + let labelRadius; + let startAngle = options.startAngle; // Create SVG.js draw this.svg = createSvg(this.container, options.width, options.height, options.donut ? options.classNames.chartDonut : options.classNames.chartPie); // Calculate charting rect - chartRect = createChartRect(this.svg, options, defaultOptions.padding); + const chartRect = createChartRect(this.svg, options, defaultOptions.padding); // Get biggest circle radius possible within chartRect - radius = Math.min(chartRect.width() / 2, chartRect.height() / 2); + let radius = Math.min(chartRect.width() / 2, chartRect.height() / 2); // Calculate total of all series to get reference value or use total reference from optional options - totalDataSum = options.total || data.normalized.series.reduce(function (previousValue, currentValue) { - return previousValue + currentValue; - }, 0); + const totalDataSum = options.total || + data.normalized.series.reduce(sum, 0); - var donutWidth = quantity(options.donutWidth); + const donutWidth = quantity(options.donutWidth); if (donutWidth.unit === '%') { donutWidth.value *= radius / 100; } @@ -200,20 +196,19 @@ export class PieChart extends BaseChart { labelRadius += options.labelOffset; // Calculate end angle based on total sum and current data value and offset with padding - var center = { + const center = { x: chartRect.x1 + chartRect.width() / 2, y: chartRect.y2 + chartRect.height() / 2 }; // Check if there is only one non-zero value in the series array. - var hasSingleValInSeries = data.raw.series.filter(function (val) { - return val.hasOwnProperty('value') ? val.value !== 0 : val !== 0; - }).length === 1; + const hasSingleValInSeries = data.raw.series + .filter((val) => val.hasOwnProperty('value') ? val.value !== 0 : val !== 0) + .length === 1; // Creating the series groups - data.raw.series.forEach(function (series, index) { - seriesGroups[index] = this.svg.elem('g', null, null); - }.bind(this)); + data.raw.series + .forEach((series, index) => seriesGroups[index] = this.svg.elem('g', null, null)); //if we need to show labels we create the label group now if (options.showLabel) { labelsGroup = this.svg.elem('g', null, null); @@ -221,7 +216,7 @@ export class PieChart extends BaseChart { // Draw the series // initialize series groups - data.raw.series.forEach(function (series, index) { + data.raw.series.forEach((series, index) => { // If current value is zero and we are ignoring empty values then skip to next value if (data.normalized.series[index] === 0 && options.ignoreEmptyValues) return; @@ -233,14 +228,14 @@ export class PieChart extends BaseChart { // Use series class from series data or if not set generate one seriesGroups[index].addClass([ options.classNames.series, - (series.className || options.classNames.series + '-' + alphaNumerate(index)) + series.className || `${options.classNames.series}-${alphaNumerate(index)}` ].join(' ')); // If the whole dataset is 0 endAngle should be zero. Can't divide by 0. - var endAngle = (totalDataSum > 0 ? startAngle + data.normalized.series[index] / totalDataSum * 360 : 0); + let endAngle = (totalDataSum > 0 ? startAngle + data.normalized.series[index] / totalDataSum * 360 : 0); // Use slight offset so there are no transparent hairline issues - var overlappigStartAngle = Math.max(0, startAngle - (index === 0 || hasSingleValInSeries ? 0 : 0.2)); + const overlappigStartAngle = Math.max(0, startAngle - (index === 0 || hasSingleValInSeries ? 0 : 0.2)); // If we need to draw the arc for all 360 degrees we need to add a hack where we close the circle // with Z and use 359.99 degrees @@ -248,11 +243,11 @@ export class PieChart extends BaseChart { endAngle = overlappigStartAngle + 359.99; } - var start = polarToCartesian(center.x, center.y, radius, overlappigStartAngle), - end = polarToCartesian(center.x, center.y, radius, endAngle); + const start = polarToCartesian(center.x, center.y, radius, overlappigStartAngle); + const end = polarToCartesian(center.x, center.y, radius, endAngle); // Create a new path element for the pie chart. If this isn't a donut chart we should close the path for a correct stroke - var path = new SvgPath(!options.donut) + const path = new SvgPath(!options.donut) .move(end.x, end.y) .arc(radius, radius, 0, endAngle - startAngle > 180, 0, start.x, start.y); @@ -263,7 +258,7 @@ export class PieChart extends BaseChart { // Create the SVG path // If this is a donut chart we add the donut class, otherwise just a regular slice - var pathElement = seriesGroups[index].elem('path', { + const pathElement = seriesGroups[index].elem('path', { d: path.stringify() }, options.donut ? options.classNames.sliceDonut : options.classNames.slicePie); @@ -299,7 +294,8 @@ export class PieChart extends BaseChart { // If we need to show labels we need to add the label for this slice now if (options.showLabel) { - var labelPosition; + let labelPosition; + if (data.raw.series.length === 1) { // If we have only 1 series, we can position the label in the center of the pie labelPosition = { @@ -316,14 +312,14 @@ export class PieChart extends BaseChart { ); } - var rawValue; + let rawValue; if (data.normalized.labels && !isFalseyButZero(data.normalized.labels[index])) { rawValue = data.normalized.labels[index]; } else { rawValue = data.normalized.series[index]; } - var interpolatedValue = options.labelInterpolationFnc(rawValue, index); + const interpolatedValue = options.labelInterpolationFnc(rawValue, index); if (interpolatedValue || interpolatedValue === 0) { var labelElement = labelsGroup.elem('text', { @@ -335,7 +331,7 @@ export class PieChart extends BaseChart { // Fire off draw event this.eventEmitter.emit('draw', { type: 'label', - index: index, + index, group: labelsGroup, element: labelElement, text: '' + interpolatedValue, @@ -348,12 +344,12 @@ export class PieChart extends BaseChart { // Set next startAngle to current endAngle. // (except for last slice) startAngle = endAngle; - }.bind(this)); + }); this.eventEmitter.emit('created', { - chartRect: chartRect, + chartRect, svg: this.svg, - options: options + options }); } } diff --git a/src/charts/pie.spec.js b/src/charts/pie.spec.js new file mode 100644 index 00000000..c0a7e2ba --- /dev/null +++ b/src/charts/pie.spec.js @@ -0,0 +1,442 @@ +import {initializeFixtures, destroyFixtures, addFixture} from '../testing/fixtures'; +import {namespaces} from '../core/globals'; +import {deserialize} from '../core/data'; +import {PieChart} from './pie'; + +describe('PieChart', () => { + beforeEach(() => initializeFixtures()); + afterEach(() => destroyFixtures()); + + describe('Meta data tests', () => { + + it('should render meta data correctly on slice with mixed value array', (done) => { + const fixture = addFixture('
'); + const meta = { + test: 'Serialized Test' + }; + + const data = { + labels: ['A', 'B', 'C'], + series: [5, { + value: 8, + meta: meta + }, 1] + }; + + const chartContainer = fixture.wrapper.querySelector('.ct-chart'); + const chart = new PieChart(chartContainer, data); + + chart.on('created', () => { + const metaAttribute = chartContainer + .querySelectorAll('.ct-slice-pie')[1] + .getAttributeNS(namespaces.ct, 'meta'); + expect(deserialize(metaAttribute)).toEqual(meta); + chart.off('created'); + done(); + }); + }); + }); + + describe('Simple Pie Chart', () => { + const num = '\\d+(\\.\\d*)?'; + const sum = (a, b) => a + b; + let data; + let options; + let fixture; + + beforeEach(() => { + data = { + series: [5, 3, 4] + }; + options = { + width: 100, + height: 100, + chartPadding: 10, + labelInterpolationFnc: (value) => `${Math.round(value / data.series.reduce(sum) * 100)}%` + }; + }); + + function createChart(callback) { + fixture = addFixture('
'); + const chart = new PieChart(fixture.wrapper.querySelector('.ct-chart'), data, options) + .on('created', () => { + callback(); + chart.off('created'); + }); + } + + it('should render three slices', (done) => { + createChart(() => { + expect(fixture.wrapper.querySelectorAll('.ct-slice-pie').length).toBe(3); + done(); + }); + }); + + it('should set value attribute', (done) => { + createChart(() => { + const slices = fixture.wrapper.querySelectorAll('.ct-slice-pie'); + expect(slices[0].getAttributeNS(namespaces.ct, 'value')).toBe('5'); + expect(slices[1].getAttributeNS(namespaces.ct, 'value')).toBe('3'); + expect(slices[2].getAttributeNS(namespaces.ct, 'value')).toBe('4'); + done(); + }); + }); + + it('should create slice path', (done) => { + createChart(() => { + Array.from(fixture.wrapper.querySelectorAll('.ct-slice-pie')).forEach((element) => { + const pattern = `M${num},${num}A40,40,0,0,0,${num},${num}L50,50Z$`; + const path = element.getAttribute('d'); + expect(path).toMatch(pattern); + }); + done(); + }); + }); + + it('should add labels', (done) => { + createChart(() => { + const labels = fixture.wrapper.querySelectorAll('.ct-label'); + expect(labels[0].textContent).toBe('42%'); + expect(labels[1].textContent).toBe('25%'); + expect(labels[2].textContent).toBe('33%'); + done(); + }); + }); + + it('should overlap slices', (done) => { + data = { + series: [1, 1] + }; + createChart(() => { + const [slice1, slice2] = Array.from(fixture.wrapper.querySelectorAll('.ct-slice-pie')); + + expect(slice1.getAttribute('d')).toMatch(/^M50,90A40,40,0,0,0,50,10L50,50Z/); + expect(slice2.getAttribute('d')).toMatch(/^M50,10A40,40,0,0,0,50.\d+,90L50,50Z/); + done(); + }); + }); + + it('should set large arc sweep flag', (done) => { + data = { + series: [1, 2] + }; + createChart(() => { + const slice = fixture.wrapper.querySelectorAll('.ct-slice-pie')[1]; + expect(slice.getAttribute('d')).toMatch(/^M50,10A40,40,0,1,0/); + done(); + }, data); + }); + + it('should draw complete circle with gap', (done) => { + data = { + series: [1] + }; + createChart(() => { + const slice = fixture.wrapper.querySelectorAll('.ct-slice-pie')[0]; + expect(slice.getAttribute('d')).toMatch(/^M49.9\d+,10A40,40,0,1,0,50,10L50,50Z/); + done(); + }); + }); + + it('should draw complete circle with startAngle', (done) => { + data.series = [100]; + options.startAngle = 90; + createChart(() => { + const slice = fixture.wrapper.querySelectorAll('.ct-slice-pie')[0]; + expect(slice.getAttribute('d')).toMatch(/^M90,49.9\d+A40,40,0,1,0,90,50L50,50Z/); + done(); + }); + }); + + it('should draw complete circle if values are 0', (done) => { + data = { + series: [0, 1, 0] + }; + createChart(() => { + const slice = fixture.wrapper.querySelectorAll('.ct-slice-pie')[1]; + expect(slice.getAttribute('d')).toMatch(/^M49.9\d+,10A40,40,0,1,0,50,10L50,50Z/); + done(); + }); + }); + + }); + + describe('Pie with small slices', () => { + let data; + let options; + let fixture; + + beforeEach(() => { + data = { + series: [0.001, 2] + }; + options = { + width: 100, + height: 100, + chartPadding: 0 + }; + }); + + function createChart(callback) { + fixture = addFixture('
'); + const chart = new PieChart(fixture.wrapper.querySelector('.ct-chart'), data, options) + .on('created', () => { + callback(); + chart.off('created'); + }); + } + + it('should render correctly with very small slices', (done) => { + createChart(() => { + const [slice1, slice2] = Array.from(fixture.wrapper.querySelectorAll('.ct-slice-pie')); + + expect(slice1.getAttribute('d')).toMatch(/^M50.1\d+,0A50,50,0,0,0,50,0/); + expect(slice2.getAttribute('d')).toMatch(/^M49.9\d*,0A50,50,0,1,0,50,0/); + done(); + }); + }); + + it('should render correctly with very small slices on startAngle', (done) => { + options.startAngle = 90; + createChart(() => { + const [slice1, slice2] = Array.from(fixture.wrapper.querySelectorAll('.ct-slice-pie')); + + expect(slice1.getAttribute('d')).toMatch(/^M100,50.1\d*A50,50,0,0,0,100,50/); + expect(slice2.getAttribute('d')).toMatch(/^M100,49.97\d*A50,50,0,1,0,100,49.98\d*/); + done(); + }); + }); + + it('should render correctly with very small slices', (done) => { + options.donut = true; + createChart(() => { + const [slice1, slice2] = Array.from(fixture.wrapper.querySelectorAll('.ct-slice-donut')); + + expect(slice1.getAttribute('d')).toMatch(/^M50.\d+,30A20,20,0,0,0,50,30/); + expect(slice2.getAttribute('d')).toMatch(/^M49.9\d*,30A20,20,0,1,0,50,30/); + done(); + }); + }); + }); + + describe('Pie with empty values', () => { + let data; + let options; + let fixture; + + beforeEach(() => { + data = { + series: [1, 2, 0, 4] + }; + options = { + width: 100, + height: 100, + ignoreEmptyValues: true + }; + }); + + function createChart(callback) { + fixture = addFixture('
'); + const chart = new PieChart(fixture.wrapper.querySelector('.ct-chart'), data, options) + .on('created', () => { + callback(); + chart.off('created'); + }); + } + + it('should not render empty slices', (done) => { + createChart(() => { + const slices = fixture.wrapper.querySelectorAll('.ct-slice-pie'); + + expect(slices.length).toBe(3); + expect(slices[0].getAttributeNS(namespaces.ct, 'value')).toBe('1'); + expect(slices[1].getAttributeNS(namespaces.ct, 'value')).toBe('2'); + expect(slices[2].getAttributeNS(namespaces.ct, 'value')).toBe('4'); + done(); + }); + }); + + it('should render without NaN values and points', (done) => { + data = { + series: [0, 0, 0] + }; + options = { + width: 400, + height: 400 + }; + + createChart(() => { + const slices = fixture.wrapper.querySelectorAll('.ct-slice-pie'); + + expect(slices.length).toBe(3); + + expect(slices[0].getAttributeNS(namespaces.ct, 'value')).toBe('0'); + expect(slices[1].getAttributeNS(namespaces.ct, 'value')).toBe('0'); + expect(slices[2].getAttributeNS(namespaces.ct, 'value')).toBe('0'); + + expect(slices[0].getAttribute('d')).toBe('M200,5A195,195,0,0,0,200,5L200,200Z'); + expect(slices[1].getAttribute('d')).toBe('M200,5A195,195,0,0,0,200,5L200,200Z'); + expect(slices[2].getAttribute('d')).toBe('M200,5A195,195,0,0,0,200,5L200,200Z'); + done(); + }); + }); + + it('should render empty slices', (done) => { + data = { + series: [1, 2, 0, 4] + }; + options = { + width: 100, + height: 100, + ignoreEmptyValues: false + }; + + createChart(() => { + const slices = fixture.wrapper.querySelectorAll('.ct-slice-pie'); + + expect(slices.length).toBe(4); + + expect(slices[0].getAttributeNS(namespaces.ct, 'value')).toBe('1'); + expect(slices[1].getAttributeNS(namespaces.ct, 'value')).toBe('2'); + expect(slices[2].getAttributeNS(namespaces.ct, 'value')).toBe('0'); + expect(slices[3].getAttributeNS(namespaces.ct, 'value')).toBe('4'); + done(); + }); + }); + }); + + describe('Gauge Chart', () => { + let fixture; + let data; + let options; + + beforeEach(() => { + data = { + series: [20, 10, 30, 40] + }; + options = { + chartPadding: 50, + height: 500, + width: 500, + donut: true, + donutWidth: 60, + startAngle: 270, + total: 200, + showLabel: false + } + }); + + function createChart(callback) { + fixture = addFixture('
'); + const chart = new PieChart(fixture.wrapper.querySelector('.ct-chart'), data, options) + .on('created', () => { + callback(); + chart.off('created'); + }); + } + + it('should render four strokes', (done) => { + createChart(() => { + expect(fixture.wrapper.querySelectorAll('.ct-slice-donut').length).toBe(4); + done(); + }); + }); + + it('should set value attribute', (done) => { + createChart(() => { + const slices = fixture.wrapper.querySelectorAll('.ct-slice-donut'); + expect(slices[0].getAttributeNS(namespaces.ct, 'value')).toBe('20'); + expect(slices[1].getAttributeNS(namespaces.ct, 'value')).toBe('10'); + expect(slices[2].getAttributeNS(namespaces.ct, 'value')).toBe('30'); + expect(slices[3].getAttributeNS(namespaces.ct, 'value')).toBe('40'); + done(); + }); + }); + + it('should create slice path', (done) => { + const num = '\\d+(\\.\\d*)?'; + const pattern = `^M${num},${num}A170,170,0,0,0,${num},${num}$`; + + createChart(() => { + Array.from(fixture.wrapper.querySelectorAll('.ct-slice-donut')) + .forEach((element) => expect(element.getAttribute('d')).toMatch(pattern)); + done(); + }); + }); + + it('should set stroke-width', (done) => { + const strokeWidth = 'stroke-width:\\s*60px'; + + createChart(() => { + Array.from(fixture.wrapper.querySelectorAll('.ct-slice-donut')) + .forEach((element) => expect(element.getAttribute('style')).toMatch(strokeWidth)); + done(); + }); + }); + + it('should not add labels', (done) => { + createChart(() => { + const labels = fixture.wrapper.querySelectorAll('.ct-label'); + expect(labels.length).toBe(0); + done(); + }); + }); + }); + + describe('Pie Chart with relative donutWidth', () => { + let fixture; + let data; + let options; + + beforeEach(() => { + data = { + series: [20, 10, 30, 40] + }; + options = { + chartPadding: 50, + height: 500, + width: 500, + donut: true, + donutWidth: '25%', + showLabel: false + }; + }); + + function createChart(callback) { + fixture = addFixture('
'); + const chart = new PieChart(fixture.wrapper.querySelector('.ct-chart'), data, options) + .on('created', () => { + callback(); + chart.off('created'); + }); + } + + it('should render four strokes', (done) => { + createChart(() => { + expect(fixture.wrapper.querySelectorAll('.ct-slice-donut').length).toBe(4); + done(); + }); + }); + + it('should create slice path', (done) => { + const num = '\\d+(\\.\\d*)?'; + const pattern = `^M${num},${num}A175,175,0,0,0,${num},${num}$`; + + createChart(() => { + Array.from(fixture.wrapper.querySelectorAll('.ct-slice-donut')) + .forEach((element) => expect(element.getAttribute('d')).toMatch(pattern)); + done(); + }); + }); + + it('should set stroke-width', (done) => { + const strokeWidth = 'stroke-width:\\s?50px'; + + createChart(() => { + Array.from(fixture.wrapper.querySelectorAll('.ct-slice-donut')) + .forEach((element) => expect(element.getAttribute('style')).toMatch(strokeWidth)); + done(); + }); + }); + }); +}); diff --git a/src/core/creation.js b/src/core/creation.js index dfe1c86b..623f2fe6 100644 --- a/src/core/creation.js +++ b/src/core/creation.js @@ -13,26 +13,20 @@ import {extend} from './extend'; * @param {String} className Specify a class to be added to the SVG element * @return {Object} The created/reinitialized SVG element */ -export function createSvg(container, width, height, className) { - var svg; - - width = width || '100%'; - height = height || '100%'; - +export function createSvg(container, width = '100%', height = '100%', className) { // Check if there is a previous SVG element in the container that contains the Chartist XML namespace and remove it // Since the DOM API does not support namespaces we need to manually search the returned list http://www.w3.org/TR/selectors-api/ - Array.prototype.slice.call(container.querySelectorAll('svg')).filter(function filterChartistSvgObjects(svg) { - return svg.getAttributeNS(namespaces.xmlns, 'ct'); - }).forEach(function removePreviousElement(svg) { - container.removeChild(svg); - }); + Array.from(container.querySelectorAll('svg')) + .filter((svg) => svg.getAttributeNS(namespaces.xmlns, 'ct')) + .forEach((svg) => container.removeChild(svg)); // Create svg object with width and height or use 100% as default - svg = new Svg('svg').attr({ - width: width, - height: height + const svg = new Svg('svg').attr({ + width, + height }).addClass(className).attr({ - style: 'width: ' + width + '; height: ' + height + ';' + // TODO: Check better solution (browser support) and remove inline styles due to CSP + style: `width: ${width}; height: ${height};` }); // Add the DOM node to our container @@ -49,9 +43,7 @@ export function createSvg(container, width, height, className) { * @param {Number} [fallback] This value is used to fill missing values if a incomplete padding object was passed * @returns {Object} Returns a padding object containing top, right, bottom, left properties filled with the padding number passed in as argument. If the argument is something else than a number (presumably already a correct padding object) then this argument is directly returned. */ -export function normalizePadding(padding, fallback) { - fallback = fallback || 0; - +export function normalizePadding(padding, fallback = 0) { return typeof padding === 'number' ? { top: padding, right: padding, @@ -75,29 +67,29 @@ export function normalizePadding(padding, fallback) { * @return {Object} The chart rectangles coordinates inside the svg element plus the rectangles measurements */ export function createChartRect(svg, options, fallbackPadding) { - var hasAxis = !!(options.axisX || options.axisY); - var yAxisOffset = hasAxis ? options.axisY.offset : 0; - var xAxisOffset = hasAxis ? options.axisX.offset : 0; + const hasAxis = !!(options.axisX || options.axisY); + const yAxisOffset = hasAxis ? options.axisY.offset : 0; + const xAxisOffset = hasAxis ? options.axisX.offset : 0; // If width or height results in invalid value (including 0) we fallback to the unitless settings or even 0 - var width = svg.width() || quantity(options.width).value || 0; - var height = svg.height() || quantity(options.height).value || 0; - var normalizedPadding = normalizePadding(options.chartPadding, fallbackPadding); + let width = svg.width() || quantity(options.width).value || 0; + let height = svg.height() || quantity(options.height).value || 0; + const normalizedPadding = normalizePadding(options.chartPadding, fallbackPadding); // If settings were to small to cope with offset (legacy) and padding, we'll adjust width = Math.max(width, yAxisOffset + normalizedPadding.left + normalizedPadding.right); height = Math.max(height, xAxisOffset + normalizedPadding.top + normalizedPadding.bottom); - var chartRect = { + const chartRect = { padding: normalizedPadding, - width: function () { + width: function() { return this.x2 - this.x1; }, - height: function () { + height: function() { return this.y1 - this.y2; } }; - if(hasAxis) { + if (hasAxis) { if (options.axisX.position === 'start') { chartRect.y2 = normalizedPadding.top + xAxisOffset; chartRect.y1 = Math.max(height - normalizedPadding.bottom, chartRect.y2 + 1); @@ -137,21 +129,21 @@ export function createChartRect(svg, options, fallbackPadding) { * @param eventEmitter */ export function createGrid(position, index, axis, offset, length, group, classes, eventEmitter) { - var positionalData = {}; - positionalData[axis.units.pos + '1'] = position; - positionalData[axis.units.pos + '2'] = position; - positionalData[axis.counterUnits.pos + '1'] = offset; - positionalData[axis.counterUnits.pos + '2'] = offset + length; + const positionalData = {}; + positionalData[`${axis.units.pos}1`] = position; + positionalData[`${axis.units.pos}2`] = position; + positionalData[`${axis.counterUnits.pos}1`] = offset; + positionalData[`${axis.counterUnits.pos}2`] = offset + length; - var gridElement = group.elem('line', positionalData, classes.join(' ')); + const gridElement = group.elem('line', positionalData, classes.join(' ')); // Event for grid draw eventEmitter.emit('draw', extend({ type: 'grid', - axis: axis, - index: index, - group: group, + axis, + index, + group, element: gridElement }, positionalData) ); @@ -167,7 +159,7 @@ export function createGrid(position, index, axis, offset, length, group, classes * @param eventEmitter */ export function createGridBackground(gridGroup, chartRect, className, eventEmitter) { - var gridBackground = gridGroup.elem('rect', { + const gridBackground = gridGroup.elem('rect', { x: chartRect.x1, y: chartRect.y2, width: chartRect.width(), @@ -199,21 +191,25 @@ export function createGridBackground(gridGroup, chartRect, className, eventEmitt * @param eventEmitter */ export function createLabel(position, length, index, labels, axis, axisOffset, labelOffset, group, classes, useForeignObject, eventEmitter) { - var labelElement; - var positionalData = {}; + let labelElement; + const positionalData = {}; positionalData[axis.units.pos] = position + labelOffset[axis.units.pos]; positionalData[axis.counterUnits.pos] = labelOffset[axis.counterUnits.pos]; positionalData[axis.units.len] = length; positionalData[axis.counterUnits.len] = Math.max(0, axisOffset - 10); - if(useForeignObject) { + if (useForeignObject) { // We need to set width and height explicitly to px as span will not expand with width and height being // 100% in all browsers - var content = '' + - labels[index] + ''; + const length = Math.round(positionalData[axis.units.len]); + const counterLength = Math.round(positionalData[axis.counterUnits.len]); + const content = ` + + ${labels[index]} + + `.trim(); labelElement = group.foreignObject(content, extend({ style: 'overflow: visible;' @@ -224,9 +220,9 @@ export function createLabel(position, length, index, labels, axis, axisOffset, l eventEmitter.emit('draw', extend({ type: 'label', - axis: axis, - index: index, - group: group, + axis, + index, + group, element: labelElement, text: labels[index] }, positionalData)); diff --git a/src/core/creation.spec.js b/src/core/creation.spec.js index 2893b411..59baf789 100644 --- a/src/core/creation.spec.js +++ b/src/core/creation.spec.js @@ -51,10 +51,10 @@ describe('Creation', () => { group = new Svg('g'); axis = { units: { - pos : 'x' + pos: 'x' }, counterUnits: { - pos : 'y' + pos: 'y' } }; classes = []; diff --git a/src/core/data.js b/src/core/data.js index 5c426b0d..19ebcb98 100644 --- a/src/core/data.js +++ b/src/core/data.js @@ -2,7 +2,7 @@ import {escapingMap} from './globals'; import {replaceAll, safeHasProperty, getNumberOrUndefined} from './lang'; import {times} from './functional'; import {extend} from './extend'; -import {orderOfMagnitude, projectLength, roundWithPrecision, rho} from './math'; +import {orderOfMagnitude, projectLength, roundWithPrecision, rho, EPSILON} from './math'; /** * This function serializes arbitrary data to a string. In case of data that can't be easily converted to a string, this function will create a wrapper object and serialize the data using JSON.stringify. The outcoming string will always be escaped using Chartist.escapingMap. @@ -16,14 +16,13 @@ export function serialize(data) { if(data === null || data === undefined) { return data; } else if(typeof data === 'number') { - data = ''+data; + data = '' + data; } else if(typeof data === 'object') { data = JSON.stringify({data: data}); } - return Object.keys(escapingMap).reduce(function(result, key) { - return replaceAll(result, key, escapingMap[key]); - }, data); + return Object.keys(escapingMap) + .reduce((result, key) => replaceAll(result, key, escapingMap[key]), data); } /** @@ -38,14 +37,14 @@ export function deserialize(data) { return data; } - data = Object.keys(escapingMap).reduce(function(result, key) { - return replaceAll(result, escapingMap[key], key); - }, data); + data = Object.keys(escapingMap) + .reduce((result, key) => replaceAll(result, escapingMap[key], key), data); try { data = JSON.parse(data); data = data.data !== undefined ? data.data : data; - } catch(e) {} + } catch(e) { + } return data; } @@ -57,8 +56,8 @@ export function deserialize(data) { * @return {Object} The normalized data object */ export function normalizeData(data, reverse, multi) { - var labelCount; - var output = { + let labelCount; + const output = { raw: data, normalized: {} }; @@ -70,13 +69,9 @@ export function normalizeData(data, reverse, multi) { // If all elements of the normalized data array are arrays we're dealing with // multi series data and we need to find the largest series if they are un-even - if (output.normalized.series.every(function(value) { - return value instanceof Array; - })) { + if(output.normalized.series.every((value) => value instanceof Array)) { // Getting the series with the the most elements - labelCount = Math.max.apply(null, output.normalized.series.map(function(series) { - return series.length; - })); + labelCount = Math.max(...output.normalized.series.map((series) => series.length)); } else { // We're dealing with Pie data so we just take the normalized array length labelCount = output.normalized.series.length; @@ -84,12 +79,9 @@ export function normalizeData(data, reverse, multi) { output.normalized.labels = (data.labels || []).slice(); // Padding the labels to labelCount with empty strings - Array.prototype.push.apply( - output.normalized.labels, - times(Math.max(0, labelCount - output.normalized.labels.length)).map(function() { - return ''; - }) - ); + output.normalized.labels + .push(...times(Math.max(0, labelCount - output.normalized.labels.length)) + .map(() => '')); if(reverse) { reverseData(output.normalized); @@ -106,7 +98,7 @@ export function normalizeData(data, reverse, multi) { * @returns {*} */ export function getMetaData(series, index) { - var value = series.data ? series.data[index] : series[index]; + const value = series.data ? series.data[index] : series[index]; return value ? value.meta : undefined; } @@ -131,11 +123,11 @@ export function isDataHoleValue(value) { export function reverseData(data) { data.labels.reverse(); data.series.reverse(); - for (var i = 0; i < data.series.length; i++) { - if(typeof(data.series[i]) === 'object' && data.series[i].data !== undefined) { - data.series[i].data.reverse(); - } else if(data.series[i] instanceof Array) { - data.series[i].reverse(); + for(let series of data.series) { + if(typeof(series) === 'object' && series.data !== undefined) { + series.data.reverse(); + } else if(series instanceof Array) { + series.reverse(); } } } @@ -202,7 +194,8 @@ export function getDataArray(data, reverse, multi) { * @param value */ export function isMultiValue(value) { - return typeof value === 'object' && ('x' in value || 'y' in value); + return typeof value === 'object' && + (value.hasOwnProperty('x') || value.hasOwnProperty('y')); } /** @@ -211,12 +204,11 @@ export function isMultiValue(value) { * @memberof Chartist.Core * @param value * @param dimension - * @param defaultValue * @returns {*} */ -export function getMultiValue(value, dimension) { +export function getMultiValue(value, dimension = 'y') { if(isMultiValue(value)) { - return getNumberOrUndefined(value[dimension || 'y']); + return getNumberOrUndefined(value[dimension]); } else { return getNumberOrUndefined(value); } @@ -233,7 +225,7 @@ export function getMultiValue(value, dimension) { */ export function getSeriesOption(series, options, key) { if(series.name && options.series && options.series[series.name]) { - var seriesOptions = options.series[series.name]; + const seriesOptions = options.series[series.name]; return seriesOptions.hasOwnProperty(key) ? seriesOptions[key] : options[key]; } else { return options[key]; @@ -265,17 +257,17 @@ export function getSeriesOption(series, options, key) { * @return {Array} List of segments, each containing a pathCoordinates and valueData property. */ export function splitIntoSegments(pathCoordinates, valueData, options) { - var defaultOptions = { + const defaultOptions = { increasingX: false, fillHoles: false }; options = extend({}, defaultOptions, options); - var segments = []; - var hole = true; + const segments = []; + let hole = true; - for(var i = 0; i < pathCoordinates.length; i += 2) { + for(let i = 0; i < pathCoordinates.length; i += 2) { // If this value is a "hole" we set the hole flag if(getMultiValue(valueData[i / 2].value) === undefined) { // if(valueData[i / 2].value === undefined) { @@ -283,7 +275,7 @@ export function splitIntoSegments(pathCoordinates, valueData, options) { hole = true; } } else { - if(options.increasingX && i >= 2 && pathCoordinates[i] <= pathCoordinates[i-2]) { + if(options.increasingX && i >= 2 && pathCoordinates[i] <= pathCoordinates[i - 2]) { // X is not increasing, so we need to make sure we start a new segment hole = true; } @@ -321,29 +313,29 @@ export function getHighLow(data, options, dimension) { // TODO: Remove workaround for deprecated global high / low config. Axis high / low configuration is preferred options = extend({}, options, dimension ? options['axis' + dimension.toUpperCase()] : {}); - var highLow = { + const highLow = { high: options.high === undefined ? -Number.MAX_VALUE : +options.high, low: options.low === undefined ? Number.MAX_VALUE : +options.low }; - var findHigh = options.high === undefined; - var findLow = options.low === undefined; + const findHigh = options.high === undefined; + const findLow = options.low === undefined; // Function to recursively walk through arrays and find highest and lowest number function recursiveHighLow(data) { if(data === undefined) { return undefined; } else if(data instanceof Array) { - for (var i = 0; i < data.length; i++) { + for(let i = 0; i < data.length; i++) { recursiveHighLow(data[i]); } } else { - var value = dimension ? +data[dimension] : +data; + const value = dimension ? +data[dimension] : +data; - if (findHigh && value > highLow.high) { + if(findHigh && value > highLow.high) { highLow.high = value; } - if (findLow && value < highLow.low) { + if(findLow && value < highLow.low) { highLow.low = value; } } @@ -357,21 +349,21 @@ export function getHighLow(data, options, dimension) { // Overrides of high / low based on reference value, it will make sure that the invisible reference value is // used to generate the chart. This is useful when the chart always needs to contain the position of the // invisible reference value in the view i.e. for bipolar scales. - if (options.referenceValue || options.referenceValue === 0) { + if(options.referenceValue || options.referenceValue === 0) { highLow.high = Math.max(options.referenceValue, highLow.high); highLow.low = Math.min(options.referenceValue, highLow.low); } // If high and low are the same because of misconfiguration or flat data (only the same value) we need // to set the high or low to 0 depending on the polarity - if (highLow.high <= highLow.low) { + if(highLow.high <= highLow.low) { // If both values are 0 we set high to 1 - if (highLow.low === 0) { + if(highLow.low === 0) { highLow.high = 1; - } else if (highLow.low < 0) { + } else if(highLow.low < 0) { // If we have the same negative value for the bounds we set bounds.high to 0 highLow.high = 0; - } else if (highLow.high > 0) { + } else if(highLow.high > 0) { // If we have the same positive value for the bounds we set bounds.low to 0 highLow.low = 0; } else { @@ -395,14 +387,10 @@ export function getHighLow(data, options, dimension) { * @return {Object} All the values to set the bounds of the chart */ export function getBounds(axisLength, highLow, scaleMinSpace, onlyInteger) { - var i, - optimizationCounter = 0, - newMin, - newMax, - bounds = { - high: highLow.high, - low: highLow.low - }; + const bounds = { + high: highLow.high, + low: highLow.low + }; bounds.valueRange = bounds.high - bounds.low; bounds.oom = orderOfMagnitude(bounds.valueRange); @@ -414,9 +402,9 @@ export function getBounds(axisLength, highLow, scaleMinSpace, onlyInteger) { // Optimize scale step by checking if subdivision is possible based on horizontalGridMinSpace // If we are already below the scaleMinSpace value we will scale up - var length = projectLength(axisLength, bounds.step, bounds); - var scaleUp = length < scaleMinSpace; - var smallestFactor = onlyInteger ? rho(bounds.range) : 0; + const length = projectLength(axisLength, bounds.step, bounds); + const scaleUp = length < scaleMinSpace; + const smallestFactor = onlyInteger ? rho(bounds.range) : 0; // First check if we should only use integer steps and if step 1 is still larger than scaleMinSpace so we can use 1 if(onlyInteger && projectLength(axisLength, 1, bounds) >= scaleMinSpace) { @@ -428,10 +416,11 @@ export function getBounds(axisLength, highLow, scaleMinSpace, onlyInteger) { bounds.step = smallestFactor; } else { // Trying to divide or multiply by 2 and find the best step value - while (true) { - if (scaleUp && projectLength(axisLength, bounds.step, bounds) <= scaleMinSpace) { + let optimizationCounter = 0; + while(true) { + if(scaleUp && projectLength(axisLength, bounds.step, bounds) <= scaleMinSpace) { bounds.step *= 2; - } else if (!scaleUp && projectLength(axisLength, bounds.step / 2, bounds) >= scaleMinSpace) { + } else if(!scaleUp && projectLength(axisLength, bounds.step / 2, bounds) >= scaleMinSpace) { bounds.step /= 2; if(onlyInteger && bounds.step % 1 !== 0) { bounds.step *= 2; @@ -447,36 +436,36 @@ export function getBounds(axisLength, highLow, scaleMinSpace, onlyInteger) { } } - var EPSILON = 2.221E-16; bounds.step = Math.max(bounds.step, EPSILON); function safeIncrement(value, increment) { // If increment is too small use *= (1+EPSILON) as a simple nextafter - if (value === (value += increment)) { + if(value === (value += increment)) { value *= (1 + (increment > 0 ? EPSILON : -EPSILON)); } return value; } // Narrow min and max based on new step - newMin = bounds.min; - newMax = bounds.max; - while (newMin + bounds.step <= bounds.low) { + let newMin = bounds.min; + let newMax = bounds.max; + while(newMin + bounds.step <= bounds.low) { newMin = safeIncrement(newMin, bounds.step); } - while (newMax - bounds.step >= bounds.high) { + while(newMax - bounds.step >= bounds.high) { newMax = safeIncrement(newMax, -bounds.step); } bounds.min = newMin; bounds.max = newMax; bounds.range = bounds.max - bounds.min; - var values = []; - for (i = bounds.min; i <= bounds.max; i = safeIncrement(i, bounds.step)) { + const values = []; + for(let i = bounds.min; i <= bounds.max; i = safeIncrement(i, bounds.step)) { var value = roundWithPrecision(i); - if (value !== values[values.length - 1]) { + if(value !== values[values.length - 1]) { values.push(value); } } bounds.values = values; + return bounds; } diff --git a/src/core/data.spec.js b/src/core/data.spec.js index 16b96592..7990bce6 100644 --- a/src/core/data.spec.js +++ b/src/core/data.spec.js @@ -276,7 +276,7 @@ describe('Data', () => { }); it('should return single step if range is less than epsilon', () => { - const bounds = getBounds(100, { high: 1.0000000000000002, low: 1 }, 20, false); + const bounds = getBounds(100, {high: 1.0000000000000002, low: 1}, 20, false); expect(bounds.min).toBe(1); expect(bounds.max).toBe(1.0000000000000002); expect(bounds.low).toBe(1); @@ -296,7 +296,7 @@ describe('Data', () => { describe('splitIntoSegments', () => { function makeValues(arr) { - return arr.map(function (x) { + return arr.map(function(x) { return {value: x}; }); } diff --git a/src/core/extend.js b/src/core/extend.js index 610a3a31..f6bd4071 100644 --- a/src/core/extend.js +++ b/src/core/extend.js @@ -6,15 +6,14 @@ * @param {Object...} sources This object (objects) will be merged into target and then target is returned * @return {Object} An object that has the same reference as target but is extended and merged with the properties of source */ -export function extend(target) { - var i, source, sourceProp; +export function extend(target = {}, ...sources) { target = target || {}; - for (i = 1; i < arguments.length; i++) { - source = arguments[i]; - for (var prop in source) { - sourceProp = source[prop]; - if (typeof sourceProp === 'object' && sourceProp !== null && !(sourceProp instanceof Array)) { + for(let i = 0; i < sources.length; i++) { + const source = sources[i]; + for(let prop in source) { + const sourceProp = source[prop]; + if(typeof sourceProp === 'object' && sourceProp !== null && !(sourceProp instanceof Array)) { target[prop] = extend(target[prop], sourceProp); } else { target[prop] = sourceProp; diff --git a/src/core/functional.js b/src/core/functional.js index 465b5e05..fbb92d88 100644 --- a/src/core/functional.js +++ b/src/core/functional.js @@ -5,9 +5,7 @@ * @param {*} n This exact value will be returned by the noop function * @return {*} The same value that was provided to the n parameter */ -export function noop(n) { - return n; -} +export const noop = (n) => n; /** * Functional style helper to produce array with given length initialized with undefined values @@ -16,9 +14,7 @@ export function noop(n) { * @param length * @return {Array} */ -export function times(length) { - return Array.apply(null, new Array(length)); -} +export const times = (length) => Array.from({length}); /** * Sum helper to be used in reduce functions @@ -28,57 +24,27 @@ export function times(length) { * @param current * @return {*} */ -export function sum(previous, current) { - return previous + (current ? current : 0); -} +export const sum = (previous, current) => previous + (current ? current : 0); /** - * Multiply helper to be used in `Array.map` for multiplying each value of an array with a factor. + * Map for multi dimensional arrays where their nested arrays will be mapped in serial. The output array will have the length of the largest nested array. The callback function is called with variable arguments where each argument is the nested array value (or undefined if there are no more values). * - * @memberof Chartist.Core - * @param {Number} factor - * @returns {Function} Function that can be used in `Array.map` to multiply each value in an array - */ -export function mapMultiply(factor) { - return function(num) { - return num * factor; - }; -} - -/** - * Add helper to be used in `Array.map` for adding a addend to each value of an array. + * For example: + * @example + * ```javascript + * const data = [[1, 2], [3], []]; + * serialMap(data, cb); * - * @memberof Chartist.Core - * @param {Number} addend - * @returns {Function} Function that can be used in `Array.map` to add a addend to each value in an array - */ -export function mapAdd(addend) { - return function(num) { - return num + addend; - }; -} - -/** - * Map for multi dimensional arrays where their nested arrays will be mapped in serial. The output array will have the length of the largest nested array. The callback function is called with variable arguments where each argument is the nested array value (or undefined if there are no more values). + * // where cb will be called 2 times + * // 1. call arguments: (1, 3, undefined) + * // 2. call arguments: (2, undefined, undefined) + * ``` * * @memberof Chartist.Core * @param arr * @param cb * @return {Array} */ -export function serialMap(arr, cb) { - var result = [], - length = Math.max.apply(null, arr.map(function(e) { - return e.length; - })); - - times(length).forEach(function(e, index) { - var args = arr.map(function(e) { - return e[index]; - }); - - result[index] = cb.apply(null, args); - }); - - return result; -} +export const serialMap = (arr, cb) => + times(Math.max(...arr.map((e) => e.length))) + .map((e, index) => cb(...arr.map((e) => e[index]))); diff --git a/src/core/lang.js b/src/core/lang.js index ccf189b7..8d35b22f 100644 --- a/src/core/lang.js +++ b/src/core/lang.js @@ -92,13 +92,16 @@ export function ensureUnit(value, unit) { */ export function quantity(input) { if (typeof input === 'string') { - var match = (/^(\d+)\s*(.*)$/g).exec(input); + const match = (/^(\d+)\s*(.*)$/g).exec(input); return { value : +match[1], unit: match[2] || undefined }; } - return { value: input }; + + return { + value: input + }; } /** diff --git a/src/core/math.js b/src/core/math.js index de5a11e9..0dadbbe0 100644 --- a/src/core/math.js +++ b/src/core/math.js @@ -1,5 +1,7 @@ import {precision as globalPrecision} from './globals'; +export const EPSILON = 2.221E-16; + /** * Calculate the order of magnitude for the chart scale * @@ -33,7 +35,7 @@ export function projectLength(axisLength, length, bounds) { * @returns {number} Rounded value */ export function roundWithPrecision(value, digits) { - var precision = Math.pow(10, digits || globalPrecision); + const precision = Math.pow(10, digits || globalPrecision); return Math.round(value * precision) / precision; } @@ -61,7 +63,9 @@ export function rho(num) { return x * x + 1; } - var x1 = 2, x2 = 2, divisor; + let x1 = 2; + let x2 = 2; + let divisor; if (num % 2 === 0) { return 2; } @@ -86,7 +90,7 @@ export function rho(num) { * @return {{x:Number, y:Number}} Coordinates of point on circumference */ export function polarToCartesian(centerX, centerY, radius, angleInDegrees) { - var angleInRadians = (angleInDegrees - 90) * Math.PI / 180.0; + const angleInRadians = (angleInDegrees - 90) * Math.PI / 180.0; return { x: centerX + (radius * Math.cos(angleInRadians)), diff --git a/src/core/options-provider.js b/src/core/options-provider.js index 18c4a1aa..b6dff106 100644 --- a/src/core/options-provider.js +++ b/src/core/options-provider.js @@ -10,54 +10,50 @@ import {extend} from './extend'; * @return {Object} The consolidated options object from the defaults, base and matching responsive options */ export function optionsProvider(options, responsiveOptions, eventEmitter) { - var baseOptions = extend({}, options), - currentOptions, - mediaQueryListeners = [], - i; + const baseOptions = extend({}, options); + let currentOptions; + const mediaQueryListeners = []; function updateCurrentOptions(mediaEvent) { - var previousOptions = currentOptions; + const previousOptions = currentOptions; currentOptions = extend({}, baseOptions); if (responsiveOptions) { - for (i = 0; i < responsiveOptions.length; i++) { - var mql = window.matchMedia(responsiveOptions[i][0]); + responsiveOptions.forEach((responsiveOption) => { + const mql = window.matchMedia(responsiveOption[0]); if (mql.matches) { - currentOptions = extend(currentOptions, responsiveOptions[i][1]); + currentOptions = extend(currentOptions, responsiveOption[1]); } - } + }); } if(eventEmitter && mediaEvent) { eventEmitter.emit('optionsChanged', { - previousOptions: previousOptions, - currentOptions: currentOptions + previousOptions, + currentOptions }); } } function removeMediaQueryListeners() { - mediaQueryListeners.forEach(function(mql) { - mql.removeListener(updateCurrentOptions); - }); + mediaQueryListeners.forEach((mql) => mql.removeListener(updateCurrentOptions)); } if (!window.matchMedia) { throw 'window.matchMedia not found! Make sure you\'re using a polyfill.'; } else if (responsiveOptions) { - - for (i = 0; i < responsiveOptions.length; i++) { - var mql = window.matchMedia(responsiveOptions[i][0]); + responsiveOptions.forEach((responsiveOption) => { + const mql = window.matchMedia(responsiveOption[0]); mql.addListener(updateCurrentOptions); mediaQueryListeners.push(mql); - } + }); } // Execute initially without an event argument so we get the correct options updateCurrentOptions(); return { - removeMediaQueryListeners: removeMediaQueryListeners, - getCurrentOptions: function getCurrentOptions() { + removeMediaQueryListeners, + getCurrentOptions() { return extend({}, currentOptions); } }; diff --git a/src/event/event-emitter.js b/src/event/event-emitter.js index c00bcf09..d75966eb 100644 --- a/src/event/event-emitter.js +++ b/src/event/event-emitter.js @@ -48,16 +48,12 @@ export class EventEmitter { emit(event, data) { // Only do something if there are event handlers with this name existing if(this.handlers[event]) { - this.handlers[event].forEach(function(handler) { - handler(data); - }); + this.handlers[event].forEach((handler) => handler(data)); } // Emit event to star event handlers if(this.handlers['*']) { - this.handlers['*'].forEach(function(starHandler) { - starHandler(event, data); - }); + this.handlers['*'].forEach((starHandler) => starHandler(event, data)); } } } diff --git a/src/interpolation/cardinal.js b/src/interpolation/cardinal.js index 2c51abab..ae501000 100644 --- a/src/interpolation/cardinal.js +++ b/src/interpolation/cardinal.js @@ -25,20 +25,20 @@ import {none} from './none'; * @return {Function} */ export function cardinal(options) { - var defaultOptions = { + const defaultOptions = { tension: 1, fillHoles: false }; options = extend({}, defaultOptions, options); - var t = Math.min(1, Math.max(0, options.tension)), - c = 1 - t; + const t = Math.min(1, Math.max(0, options.tension)); + const c = 1 - t; return function cardinal(pathCoordinates, valueData) { // First we try to split the coordinates into segments // This is necessary to treat "holes" in line charts - var segments = splitIntoSegments(pathCoordinates, valueData, { + const segments = splitIntoSegments(pathCoordinates, valueData, { fillHoles: options.fillHoles }); @@ -48,13 +48,11 @@ export function cardinal(options) { } else if(segments.length > 1) { // If the split resulted in more that one segment we need to interpolate each segment individually and join them // afterwards together into a single path. - var paths = []; // For each segment we will recurse the cardinal function - segments.forEach(function(segment) { - paths.push(cardinal(segment.pathCoordinates, segment.valueData)); - }); // Join the segment path data into a single path and return - return SvgPath.join(paths); + return SvgPath.join( + segments.map((segment) => cardinal(segment.pathCoordinates, segment.valueData)) + ); } else { // If there was only one segment we can proceed regularly by using pathCoordinates and valueData from the first // segment @@ -66,29 +64,30 @@ export function cardinal(options) { return none()(pathCoordinates, valueData); } - var path = new SvgPath().move(pathCoordinates[0], pathCoordinates[1], false, valueData[0]), - z; + const path = new SvgPath().move(pathCoordinates[0], pathCoordinates[1], false, valueData[0]); + let z; - for (var i = 0, iLen = pathCoordinates.length; iLen - 2 * !z > i; i += 2) { - var p = [ + for(let i = 0, iLen = pathCoordinates.length; iLen - 2 * !z > i; i += 2) { + const p = [ {x: +pathCoordinates[i - 2], y: +pathCoordinates[i - 1]}, {x: +pathCoordinates[i], y: +pathCoordinates[i + 1]}, {x: +pathCoordinates[i + 2], y: +pathCoordinates[i + 3]}, {x: +pathCoordinates[i + 4], y: +pathCoordinates[i + 5]} ]; - if (z) { - if (!i) { + + if(z) { + if(!i) { p[0] = {x: +pathCoordinates[iLen - 2], y: +pathCoordinates[iLen - 1]}; - } else if (iLen - 4 === i) { + } else if(iLen - 4 === i) { p[3] = {x: +pathCoordinates[0], y: +pathCoordinates[1]}; - } else if (iLen - 2 === i) { + } else if(iLen - 2 === i) { p[2] = {x: +pathCoordinates[0], y: +pathCoordinates[1]}; p[3] = {x: +pathCoordinates[2], y: +pathCoordinates[3]}; } } else { - if (iLen - 4 === i) { + if(iLen - 4 === i) { p[3] = p[2]; - } else if (!i) { + } else if(!i) { p[0] = {x: +pathCoordinates[i], y: +pathCoordinates[i + 1]}; } } diff --git a/src/interpolation/monotone-cubic.js b/src/interpolation/monotone-cubic.js index 91792330..1bdb069d 100644 --- a/src/interpolation/monotone-cubic.js +++ b/src/interpolation/monotone-cubic.js @@ -26,7 +26,7 @@ import {none} from './none'; * @return {Function} */ export function monotoneCubic(options) { - var defaultOptions = { + const defaultOptions = { fillHoles: false }; @@ -35,7 +35,7 @@ export function monotoneCubic(options) { return function monotoneCubic(pathCoordinates, valueData) { // First we try to split the coordinates into segments // This is necessary to treat "holes" in line charts - var segments = splitIntoSegments(pathCoordinates, valueData, { + const segments = splitIntoSegments(pathCoordinates, valueData, { fillHoles: options.fillHoles, increasingX: true }); @@ -46,13 +46,11 @@ export function monotoneCubic(options) { } else if(segments.length > 1) { // If the split resulted in more that one segment we need to interpolate each segment individually and join them // afterwards together into a single path. - var paths = []; // For each segment we will recurse the monotoneCubic fn function - segments.forEach(function(segment) { - paths.push(monotoneCubic(segment.pathCoordinates, segment.valueData)); - }); // Join the segment path data into a single path and return - return SvgPath.join(paths); + return SvgPath.join( + segments.map((segment) => monotoneCubic(segment.pathCoordinates, segment.valueData)) + ); } else { // If there was only one segment we can proceed regularly by using pathCoordinates and valueData from the first // segment @@ -64,24 +62,22 @@ export function monotoneCubic(options) { return none()(pathCoordinates, valueData); } - var xs = [], - ys = [], - i, - n = pathCoordinates.length / 2, - ms = [], - ds = [], dys = [], dxs = [], - path; + const xs = []; + const ys = []; + const n = pathCoordinates.length / 2; + const ms = []; + const ds = []; + const dys = []; + const dxs = []; // Populate x and y coordinates into separate arrays, for readability - - for(i = 0; i < n; i++) { + for(let i = 0; i < n; i++) { xs[i] = pathCoordinates[i * 2]; ys[i] = pathCoordinates[i * 2 + 1]; } // Calculate deltas and derivative - - for(i = 0; i < n - 1; i++) { + for(let i = 0; i < n - 1; i++) { dys[i] = ys[i + 1] - ys[i]; dxs[i] = xs[i + 1] - xs[i]; ds[i] = dys[i] / dxs[i]; @@ -89,11 +85,10 @@ export function monotoneCubic(options) { // Determine desired slope (m) at each point using Fritsch-Carlson method // See: http://math.stackexchange.com/questions/45218/implementation-of-monotone-cubic-interpolation - ms[0] = ds[0]; ms[n - 1] = ds[n - 2]; - for(i = 1; i < n - 1; i++) { + for(let i = 1; i < n - 1; i++) { if(ds[i] === 0 || ds[i - 1] === 0 || (ds[i - 1] > 0) !== (ds[i] > 0)) { ms[i] = 0; } else { @@ -108,10 +103,9 @@ export function monotoneCubic(options) { } // Now build a path from the slopes + const path = new SvgPath().move(xs[0], ys[0], false, valueData[0]); - path = new SvgPath().move(xs[0], ys[0], false, valueData[0]); - - for(i = 0; i < n - 1; i++) { + for(let i = 0; i < n - 1; i++) { path.curve( // First control point xs[i] + dxs[i] / 3, diff --git a/src/interpolation/none.js b/src/interpolation/none.js index c2e5e6c7..777e728a 100644 --- a/src/interpolation/none.js +++ b/src/interpolation/none.js @@ -19,18 +19,20 @@ import {SvgPath} from '../svg/svg-path'; * @return {Function} */ export function none(options) { - var defaultOptions = { + const defaultOptions = { fillHoles: false }; + options = extend({}, defaultOptions, options); + return function none(pathCoordinates, valueData) { - var path = new SvgPath(); - var hole = true; + const path = new SvgPath(); + let hole = true; - for(var i = 0; i < pathCoordinates.length; i += 2) { - var currX = pathCoordinates[i]; - var currY = pathCoordinates[i + 1]; - var currData = valueData[i / 2]; + for(let i = 0; i < pathCoordinates.length; i += 2) { + const currX = pathCoordinates[i]; + const currY = pathCoordinates[i + 1]; + const currData = valueData[i / 2]; if(getMultiValue(currData.value) !== undefined) { diff --git a/src/interpolation/simple.js b/src/interpolation/simple.js index b3fc806c..bec2b7d8 100644 --- a/src/interpolation/simple.js +++ b/src/interpolation/simple.js @@ -25,23 +25,26 @@ import {SvgPath} from '../svg/svg-path'; * @return {Function} */ export function simple(options) { - var defaultOptions = { + const defaultOptions = { divisor: 2, fillHoles: false }; + options = extend({}, defaultOptions, options); - var d = 1 / Math.max(1, options.divisor); + const d = 1 / Math.max(1, options.divisor); return function simple(pathCoordinates, valueData) { - var path = new SvgPath(); - var prevX, prevY, prevData; + const path = new SvgPath(); + let prevX; + let prevY; + let prevData; - for(var i = 0; i < pathCoordinates.length; i += 2) { - var currX = pathCoordinates[i]; - var currY = pathCoordinates[i + 1]; - var length = (currX - prevX) * d; - var currData = valueData[i / 2]; + for(let i = 0; i < pathCoordinates.length; i += 2) { + const currX = pathCoordinates[i]; + const currY = pathCoordinates[i + 1]; + const length = (currX - prevX) * d; + const currData = valueData[i / 2]; if(currData.value !== undefined) { @@ -64,7 +67,7 @@ export function simple(options) { prevY = currY; prevData = currData; } else if(!options.fillHoles) { - prevX = currX = prevData = undefined; + prevX = prevY = prevData = undefined; } } diff --git a/src/interpolation/step.js b/src/interpolation/step.js index 8fadea0e..2581c50b 100644 --- a/src/interpolation/step.js +++ b/src/interpolation/step.js @@ -22,7 +22,7 @@ import {SvgPath} from '../svg/svg-path'; * @returns {Function} */ export function step(options) { - var defaultOptions = { + const defaultOptions = { postpone: true, fillHoles: false }; @@ -30,14 +30,16 @@ export function step(options) { options = extend({}, defaultOptions, options); return function step(pathCoordinates, valueData) { - var path = new SvgPath(); + const path = new SvgPath(); - var prevX, prevY, prevData; + let prevX; + let prevY; + let prevData; - for (var i = 0; i < pathCoordinates.length; i += 2) { - var currX = pathCoordinates[i]; - var currY = pathCoordinates[i + 1]; - var currData = valueData[i / 2]; + for (let i = 0; i < pathCoordinates.length; i += 2) { + const currX = pathCoordinates[i]; + const currY = pathCoordinates[i + 1]; + const currData = valueData[i / 2]; // If the current point is also not a hole we can draw the step lines if(currData.value !== undefined) { diff --git a/src/svg/svg-path.spec.js b/src/svg/svg-path.spec.js new file mode 100644 index 00000000..ee04d546 --- /dev/null +++ b/src/svg/svg-path.spec.js @@ -0,0 +1,166 @@ +import {SvgPath} from './svg-path'; + +describe('SvgPath', () => { + it('should handle position updates correctly', () => { + const path = new SvgPath(); + expect(path.position()).toBe(0); + expect(path.position(100).position()).toBe(0); + expect(path.position(-1).position()).toBe(0); + + path.pathElements = [1, 2, 3]; + expect(path.position(100).position()).toBe(3); + }); + + it('should add absolute and relative path elements correctly', () => { + const path = new SvgPath() + .move(1, 2) + .move(3, 4, true) + .line(5, 6) + .line(7, 8, true) + .curve(9, 10, 11, 12, 13, 14) + .curve(15, 16, 17, 18, 19, 20, true); + + expect(path.pathElements.length).toBe(6); + expect(path.pathElements).toEqual([ + { command: 'M', x: 1, y: 2 }, + { command: 'm', x: 3, y: 4 }, + { command: 'L', x: 5, y: 6 }, + { command: 'l', x: 7, y: 8 }, + { command: 'C', x1: 9, y1: 10, x2: 11, y2: 12, x: 13, y: 14 }, + { command: 'c', x1: 15, y1: 16, x2: 17, y2: 18, x: 19, y: 20 } + ]); + }); + + it('should insert new elements at correct position', () => { + const path = new SvgPath() + .move(1, 2) + .move(7, 8) + .move(9, 10) + .position(1) + .move(3, 4) + .move(5, 6) + .position(100000) + .move(11, 12) + .position(-100000) + .move(-1, 0); + + expect(path.pathElements.length).toBe(7); + expect(path.pathElements).toEqual([ + { command: 'M', x: -1, y: 0 }, + { command: 'M', x: 1, y: 2 }, + { command: 'M', x: 3, y: 4 }, + { command: 'M', x: 5, y: 6 }, + { command: 'M', x: 7, y: 8 }, + { command: 'M', x: 9, y: 10 }, + { command: 'M', x: 11, y: 12 } + ]); + }); + + it('should stringify simple shape correctly', () => { + const path = new SvgPath(true).move(10, 10).line(10, 100).line(100, 100).line(100, 10); + expect(path.stringify()).toEqual('M10,10L10,100L100,100L100,10Z'); + }); + + it('should stringify with configured precision', () => { + const path = new SvgPath(false, { + accuracy: 2 + }).move(10.12345, 10.14345).line(10.14545, 10).line(10.14000000645, 10.3333333333); + expect(path.stringify()).toEqual('M10.12,10.14L10.15,10L10.14,10.33'); + }); + + it('should parse Chartist SVG path style correctly', () => { + const path = new SvgPath().parse('M10,10L10,100L100,100L100,10'); + expect(path.stringify()).toEqual('M10,10L10,100L100,100L100,10'); + }); + + it('should parse MDN SVG path style correctly', () => { + const path = new SvgPath().parse('M10 10 L 10 100 L 100 100 L 100 10 C 1 1, 1 1, 1 1'); + expect(path.stringify()).toEqual('M10,10L10,100L100,100L100,10C1,1,1,1,1,1'); + }); + + it('should parse path with closing command', () => { + const path = new SvgPath().parse('M10 10 L 10 100 L 100 100 L 100 10 C 1 1, 1 1, 1 1 Z'); + expect(path.stringify()).toEqual('M10,10L10,100L100,100L100,10C1,1,1,1,1,1'); + }); + + it('should parse complex path correctly', () => { + const path = new SvgPath(false, { + accuracy: false + }).parse('M7.566371681415929,313.5870318472049L15.132743362831858,322.1479887268699L22.699115044247787,292.49058976570063L30.265486725663717,284.9469379116152L37.83185840707964,277.62070141556273L45.39823008849557,285.4043086222666L52.9646017699115,295.16905806058617L60.530973451327434,288.5395967440654L68.09734513274336,282.3023155078293L75.66371681415929,276.9420221519757L83.23008849557522,271.31296300227655L90.79646017699115,273.1827546735411L98.36283185840708,282.72148250847295L105.929203539823,276.55760703185683L113.49557522123892,278.16318930715545L121.06194690265487,279.67913384762466L128.6283185840708,296.53529757775897L136.1946902654867,324.4003397770142L143.76106194690263,317.1376004332516L151.32743362831857,323.3390406432677L158.89380530973452,328.5597479599146L166.46017699115043,329.67851354926904L174.02654867256635,327.71837583373326L181.5929203539823,335.05972598190976L189.15929203539824,334.29372633331286L196.72566371681415,332.68724934321176L204.29203539823007,330.6752327006325L211.858407079646,325.971917329413L219.42477876106196,328.13057177790404L226.99115044247785,309.6546479835954L234.5575221238938,310.6637826993739L242.12389380530973,310.65221523366176L249.69026548672568,318.40285733188773L257.2566371681416,298.18154267575227L264.8230088495575,307.4788389000347L272.3893805309734,304.189264255087L279.95575221238937,289.0288876874009L287.52212389380526,300.20654714775424L295.0884955752212,298.0164127652739L302.65486725663715,287.69192345832175L310.2212389380531,293.1860711045035L317.78761061946904,300.4760502113585L325.3539823008849,297.94852206276937L332.92035398230087,305.6594311405378L340.4867256637168,306.7859423144216L348.0530973451327,275.68998851331963L355.61946902654864,286.5550640745874L363.1858407079646,288.4952543187362L370.75221238938053,290.1896066608983L378.3185840707965,277.8447927515142L385.88495575221236,282.46018876596827L393.4513274336283,261.617847596371L401.01769911504425,265.06101027918726L408.58407079646014,264.60492966286677L416.1504424778761,252.35288845280365L423.716814159292,239.29220756750195L431.283185840708,229.73170018586225L438.8495575221239,224.1580859168795L446.41592920353986,217.20551113129414L453.9823008849557,212.63435660265037L461.54867256637164,210.4425212857057L469.1150442477876,201.0077146146342L476.6814159292035,182.3934004122068L484.24778761061947,176.98732946386616L491.8141592920354,175.3660655079267L499.38053097345136,181.1589144624976L506.9469026548673,172.81581557677976L514.5132743362832,177.82343674256106L522.079646017699,183.5573714672562L529.646017699115,184.4980688436067L537.2123893805309,201.60789339862924L544.7787610619469,193.42268767053048L552.3451327433628,209.9219909677575L559.9115044247787,221.1318944868172L567.4778761061947,222.47350026973174L575.0442477876105,229.94061399967882L582.6106194690265,213.57676800697396L590.1769911504424,232.97280246785252L597.7433628318583,232.8915724787845L605.3097345132743,231.486089735319L612.8761061946902,234.26534000120475L620.4424778761062,219.90951817170736L628.0088495575221,214.36149678900725L635.5752212389381,204.7245641444236L643.1415929203539,205.04759319834227L650.7079646017698,178.61624621480792L658.2743362831858,174.30656351022486L665.8407079646017,194.06864637030463L673.4070796460177,191.38404795482728L680.9734513274336,188.88380371217903L688.5398230088496,182.47430260433697L696.1061946902654,192.70175438596493L703.6725663716813,182.37945067166908L711.2389380530973,163.80499447227572L718.8053097345132,157.4839718811134L726.3716814159292,149.57403342725343L733.9380530973451,142.6076734278762L741.5044247787611,144.9954413314636L749.070796460177,152.29112878815386L756.637168141593,150.02544379977235L764.2035398230088,139.40203164917125L771.7699115044247,149.22935357717972L779.3362831858407,155.78116263659354L786.9026548672566,145.09966219897575L794.4690265486726,157.52407467202426L802.0353982300885,147.01645902195105L809.6017699115044,141.8658056183404L817.1681415929203,134.36135158737966L824.7345132743362,127.49269525433283L832.3008849557522,120.25886939571154L839.8672566371681,118.26230310074709L847.433628318584,98.76959064327474'); + expect(path.stringify()).toEqual('M7.566371681415929,313.5870318472049L15.132743362831858,322.1479887268699L22.699115044247787,292.49058976570063L30.265486725663717,284.9469379116152L37.83185840707964,277.62070141556273L45.39823008849557,285.4043086222666L52.9646017699115,295.16905806058617L60.530973451327434,288.5395967440654L68.09734513274336,282.3023155078293L75.66371681415929,276.9420221519757L83.23008849557522,271.31296300227655L90.79646017699115,273.1827546735411L98.36283185840708,282.72148250847295L105.929203539823,276.55760703185683L113.49557522123892,278.16318930715545L121.06194690265487,279.67913384762466L128.6283185840708,296.53529757775897L136.1946902654867,324.4003397770142L143.76106194690263,317.1376004332516L151.32743362831857,323.3390406432677L158.89380530973452,328.5597479599146L166.46017699115043,329.67851354926904L174.02654867256635,327.71837583373326L181.5929203539823,335.05972598190976L189.15929203539824,334.29372633331286L196.72566371681415,332.68724934321176L204.29203539823007,330.6752327006325L211.858407079646,325.971917329413L219.42477876106196,328.13057177790404L226.99115044247785,309.6546479835954L234.5575221238938,310.6637826993739L242.12389380530973,310.65221523366176L249.69026548672568,318.40285733188773L257.2566371681416,298.18154267575227L264.8230088495575,307.4788389000347L272.3893805309734,304.189264255087L279.95575221238937,289.0288876874009L287.52212389380526,300.20654714775424L295.0884955752212,298.0164127652739L302.65486725663715,287.69192345832175L310.2212389380531,293.1860711045035L317.78761061946904,300.4760502113585L325.3539823008849,297.94852206276937L332.92035398230087,305.6594311405378L340.4867256637168,306.7859423144216L348.0530973451327,275.68998851331963L355.61946902654864,286.5550640745874L363.1858407079646,288.4952543187362L370.75221238938053,290.1896066608983L378.3185840707965,277.8447927515142L385.88495575221236,282.46018876596827L393.4513274336283,261.617847596371L401.01769911504425,265.06101027918726L408.58407079646014,264.60492966286677L416.1504424778761,252.35288845280365L423.716814159292,239.29220756750195L431.283185840708,229.73170018586225L438.8495575221239,224.1580859168795L446.41592920353986,217.20551113129414L453.9823008849557,212.63435660265037L461.54867256637164,210.4425212857057L469.1150442477876,201.0077146146342L476.6814159292035,182.3934004122068L484.24778761061947,176.98732946386616L491.8141592920354,175.3660655079267L499.38053097345136,181.1589144624976L506.9469026548673,172.81581557677976L514.5132743362832,177.82343674256106L522.079646017699,183.5573714672562L529.646017699115,184.4980688436067L537.2123893805309,201.60789339862924L544.7787610619469,193.42268767053048L552.3451327433628,209.9219909677575L559.9115044247787,221.1318944868172L567.4778761061947,222.47350026973174L575.0442477876105,229.94061399967882L582.6106194690265,213.57676800697396L590.1769911504424,232.97280246785252L597.7433628318583,232.8915724787845L605.3097345132743,231.486089735319L612.8761061946902,234.26534000120475L620.4424778761062,219.90951817170736L628.0088495575221,214.36149678900725L635.5752212389381,204.7245641444236L643.1415929203539,205.04759319834227L650.7079646017698,178.61624621480792L658.2743362831858,174.30656351022486L665.8407079646017,194.06864637030463L673.4070796460177,191.38404795482728L680.9734513274336,188.88380371217903L688.5398230088496,182.47430260433697L696.1061946902654,192.70175438596493L703.6725663716813,182.37945067166908L711.2389380530973,163.80499447227572L718.8053097345132,157.4839718811134L726.3716814159292,149.57403342725343L733.9380530973451,142.6076734278762L741.5044247787611,144.9954413314636L749.070796460177,152.29112878815386L756.637168141593,150.02544379977235L764.2035398230088,139.40203164917125L771.7699115044247,149.22935357717972L779.3362831858407,155.78116263659354L786.9026548672566,145.09966219897575L794.4690265486726,157.52407467202426L802.0353982300885,147.01645902195105L809.6017699115044,141.8658056183404L817.1681415929203,134.36135158737966L824.7345132743362,127.49269525433283L832.3008849557522,120.25886939571154L839.8672566371681,118.26230310074709L847.433628318584,98.76959064327474'); + }); + + it('should scale path along both axes', () => { + const path = new SvgPath() + .move(1, 2) + .line(3, 4) + .curve(5, 6, 7, 8, 9, 10) + .scale(10, 100); + + expect(path.pathElements).toEqual([ + { command: 'M', x: 10, y: 200 }, + { command: 'L', x: 30, y: 400 }, + { command: 'C', x1: 50, y1: 600, x2: 70, y2: 800, x: 90, y: 1000 } + ]); + }); + + it('should translate path along both axes', () => { + const path = new SvgPath() + .move(1, 2) + .line(3, 4) + .curve(5, 6, 7, 8, 9, 10) + .translate(10, 100); + + expect(path.pathElements).toEqual([ + { command: 'M', x: 11, y: 102 }, + { command: 'L', x: 13, y: 104 }, + { command: 'C', x1: 15, y1: 106, x2: 17, y2: 108, x: 19, y: 110 } + ]); + }); + + it('should transform path correctly with custom function', () => { + const path = new SvgPath() + .move(1, 2) + .line(3, 4) + .curve(5, 6, 7, 8, 9, 10) + .transform((element, paramName, elementIndex, paramIndex) => { + if(paramIndex > 3) { + return 0; + } else if(paramName[0] === 'y') { + return 100; + } + }); + + expect(path.pathElements).toEqual([ + { command: 'M', x: 1, y: 100 }, + { command: 'L', x: 3, y: 100 }, + { command: 'C', x1: 5, y1: 100, x2: 7, y2: 100, x: 0, y: 0 } + ]); + }); + + it('should split correctly by move command', () => { + const paths = new SvgPath().parse('M0,0L0,0L0,0L0,0M0,0L0,0L0,0L0,0').splitByCommand('M'); + expect(paths.length).toBe(2); + expect(paths[0].pathElements[0].command).toBe('M'); + expect(paths[0].pathElements.length).toBe(4); + expect(paths[1].pathElements[0].command).toBe('M'); + expect(paths[1].pathElements.length).toBe(4); + }); + + it('should split correctly by move command and tailing move element', () => { + const paths = new SvgPath().parse('M0,0L0,0L0,0L0,0M0,0L0,0L0,0L0,0M0,0').splitByCommand('M'); + expect(paths.length).toBe(3); + expect(paths[2].pathElements[0].command).toBe('M'); + }); + + it('should split correctly by move command and leading other commands', () => { + const paths = new SvgPath().parse('L0,0C0,0,0,0,0,0M0,0L0,0L0,0L0,0M0,0L0,0L0,0L0,0').splitByCommand('M'); + expect(paths.length).toBe(3); + expect(paths[0].pathElements.length).toBe(2); + expect(paths[0].pathElements[0].command).toBe('L'); + expect(paths[0].pathElements[1].command).toBe('C'); + + expect(paths[1].pathElements.length).toBe(4); + expect(paths[1].pathElements[0].command).toBe('M'); + }); +}); diff --git a/src/svg/svg.js b/src/svg/svg.js index cc605f06..4a603404 100644 --- a/src/svg/svg.js +++ b/src/svg/svg.js @@ -38,7 +38,7 @@ export class Svg { } if(parent) { - if (insertFirst && parent._node.firstChild) { + if(insertFirst && parent._node.firstChild) { parent._node.insertBefore(this._node, parent._node.firstChild); } else { parent._node.appendChild(this._node); @@ -69,7 +69,7 @@ export class Svg { return; } - if (key.indexOf(':') !== -1) { + if(key.indexOf(':') !== -1) { var namespacedAttribute = key.split(':'); this._node.setAttributeNS(namespaces[namespacedAttribute[0]], key, attributes[key]); } else { @@ -111,7 +111,7 @@ export class Svg { * @return {Svg} The root SVG element wrapped in a Svg element */ root() { - var node = this._node; + let node = this._node; while(node.nodeName !== 'svg') { node = node.parentNode; } @@ -126,7 +126,7 @@ export class Svg { * @return {Svg} The SVG wrapper for the element found or null if no element was found */ querySelector(selector) { - var foundNode = this._node.querySelector(selector); + const foundNode = this._node.querySelector(selector); return foundNode ? new Svg(foundNode) : null; } @@ -138,7 +138,7 @@ export class Svg { * @return {SvgList} The SVG wrapper list for the element found or null if no element was found */ querySelectorAll(selector) { - var foundNodes = this._node.querySelectorAll(selector); + const foundNodes = this._node.querySelectorAll(selector); return foundNodes.length ? new SvgList(foundNodes) : null; } @@ -166,7 +166,7 @@ export class Svg { // If content is string then we convert it to DOM // TODO: Handle case where content is not a string nor a DOM Node if(typeof content === 'string') { - var container = document.createElement('div'); + const container = document.createElement('div'); container.innerHTML = content; content = container.firstChild; } @@ -176,7 +176,7 @@ export class Svg { // Creating the foreignObject without required extension attribute (as described here // http://www.w3.org/TR/SVG/extend.html#ForeignObjectElement) - var fnObj = this.elem('foreignObject', attributes, className, insertFirst); + const fnObj = this.elem('foreignObject', attributes, className, insertFirst); // Add content to foreignObjectElement fnObj._node.appendChild(content); @@ -203,7 +203,7 @@ export class Svg { * @return {Svg} The same wrapper object that got emptied */ empty() { - while (this._node.firstChild) { + while(this._node.firstChild) { this._node.removeChild(this._node.firstChild); } @@ -288,11 +288,10 @@ export class Svg { * @return {Svg} The wrapper of the current element */ removeClass(names) { - var removedClasses = names.trim().split(/\s+/); + const removedClasses = names.trim().split(/\s+/); - this._node.setAttribute('class', this.classes().filter(function(name) { - return removedClasses.indexOf(name) === -1; - }).join(' ')); + this._node.setAttribute('class', + this.classes().filter((name) => removedClasses.indexOf(name) === -1).join(' ')); return this; } @@ -374,13 +373,12 @@ export class Svg { guided = true; } - Object.keys(animations).forEach(function createAnimateForAttributes(attribute) { + Object.keys(animations).forEach((attribute) => { - function createAnimate(animationDefinition, guided) { - var attributeProperties = {}, - animate, - timeout, - animationEasing; + const createAnimate = (animationDefinition, guided) => { + const attributeProperties = {}; + let animationEasing; + let timeout; // Check if an easing is specified in the definition object and delete it from the object as it will not // be part of the animate element attributes. @@ -415,15 +413,15 @@ export class Svg { animationDefinition.begin = 'indefinite'; } - animate = this.elem('animate', extend({ + const animate = this.elem('animate', extend({ attributeName: attribute }, animationDefinition)); if(guided) { // If guided we take the value that was put aside in timeout and trigger the animation manually with a timeout - setTimeout(function() { + setTimeout(() => { // If beginElement fails we set the animated attribute to the end position and remove the animate element - // This happens if the SMIL ElementTimeControl interface is not supported or any other problems occured in + // This happens if the SMIL ElementTimeControl interface is not supported or any other problems occurred in // the browser. (Currently FF 34 does not support animate elements in foreignObjects) try { animate._node.beginElement(); @@ -434,20 +432,20 @@ export class Svg { // Remove the animate element as it's no longer required animate.remove(); } - }.bind(this), timeout); + }, timeout); } if(eventEmitter) { - animate._node.addEventListener('beginEvent', function handleBeginEvent() { + animate._node.addEventListener('beginEvent', () => eventEmitter.emit('animationBegin', { element: this, animate: animate._node, params: animationDefinition - }); - }.bind(this)); + }) + ); } - animate._node.addEventListener('endEvent', function handleEndEvent() { + animate._node.addEventListener('endEvent', () => { if(eventEmitter) { eventEmitter.emit('animationEnd', { element: this, @@ -463,19 +461,17 @@ export class Svg { // Remove the animate element as it's no longer required animate.remove(); } - }.bind(this)); - } + }); + }; // If current attribute is an array of definition objects we create an animate for each and disable guided mode if(animations[attribute] instanceof Array) { - animations[attribute].forEach(function(animationDefinition) { - createAnimate.bind(this)(animationDefinition, false); - }.bind(this)); + animations[attribute] + .forEach((animationDefinition) => createAnimate(animationDefinition, false)); } else { - createAnimate.bind(this)(animations[attribute], guided); + createAnimate(animations[attribute], guided); } - - }.bind(this)); + }); return this; } diff --git a/src/svg/svg.spec.js b/src/svg/svg.spec.js new file mode 100644 index 00000000..f71b3efe --- /dev/null +++ b/src/svg/svg.spec.js @@ -0,0 +1,165 @@ +import {Svg} from './svg'; +import {namespaces} from '../core/globals'; + +describe('Svg', () => { + it('should create a valid svg dom element', () => { + const svg = new Svg('svg'); + + expect(svg).toBeDefined(); + expect(svg._node).toBeDefined(); + expect(svg._node.nodeName.toLowerCase()).toBe('svg'); + }); + + it('should create a valid svg dom element with attributes', () => { + const svg = new Svg('svg', { + width: '100%', + height: '100%' + }); + + expect(svg).toBeDefined(); + expect(svg._node).toBeDefined(); + expect(svg._node.nodeName.toLowerCase()).toBe('svg'); + expect(svg._node.attributes.width.textContent).toBe('100%'); + expect(svg._node.attributes.height.textContent).toBe('100%'); + }); + + it('should create nested objects with attributes', () => { + const svg = new Svg('svg'); + svg.elem('g').elem('g').elem('circle', { + cx: 100, + cy: 100, + r: 10 + }); + + expect(svg._node).toBeDefined(); + expect(svg._node.firstChild.firstChild.firstChild).toBeDefined(); + expect(svg._node.firstChild.firstChild.firstChild.attributes.cx.textContent).toBe('100'); + expect(svg._node.firstChild.firstChild.firstChild.attributes.cy.textContent).toBe('100'); + expect(svg._node.firstChild.firstChild.firstChild.attributes.r.textContent).toBe('10'); + }); + + it('should allow to set attributes manually', () => { + const svg = new Svg('svg'); + svg.elem('circle').attr({ + cx: 100, + cy: 100, + r: 10 + }); + + expect(svg._node).toBeDefined(); + expect(svg._node.firstChild).toBeDefined(); + expect(svg._node.firstChild.attributes.cx.textContent).toBe('100'); + expect(svg._node.firstChild.attributes.cy.textContent).toBe('100'); + expect(svg._node.firstChild.attributes.r.textContent).toBe('10'); + }); + + it('should allow to set namespaced attributes', () => { + const svg = new Svg('image'); + svg.elem('image').attr({ + x: 100, + y: 100, + height: 100, + width: 100, + 'xlink:href': 'image.jpg' + }); + + expect(svg._node).toBeDefined(); + expect(svg._node.firstChild).toBeDefined(); + expect(svg._node.firstChild.getAttribute('x')).toBe('100'); + expect(svg._node.firstChild.getAttribute('y')).toBe('100'); + expect(svg._node.firstChild.getAttribute('width')).toBe('100'); + expect(svg._node.firstChild.getAttribute('height')).toBe('100'); + expect(svg._node.firstChild.getAttributeNS(namespaces.xlink, 'href')).toBe('image.jpg'); + }); + + it('should clear on each nesting level', () => { + const svg = new Svg('svg'); + const group = svg.elem('g'); + group.elem('circle'); + group.elem('circle'); + group.elem('circle'); + + expect(svg._node).toBeDefined(); + expect(svg._node.firstChild.childNodes.length).toBe(3); + + group.empty(); + expect(svg._node.firstChild.childNodes.length).toBe(0); + + svg.empty(); + expect(svg._node.firstChild).toBeNull(); + }); + + it('should allow to remove a certain element', () => { + const svg = new Svg('svg'); + const text = svg.elem('text'); + + expect(svg._node).toBeDefined(); + expect(svg._node.childNodes.length).toBe(1); + expect(svg._node.firstChild.nodeName.toLowerCase()).toBe('text'); + + text.remove(); + expect(svg._node.childNodes.length).toBe(0); + }); + + it('should allow to write text content into elements', () => { + const svg = new Svg('svg'); + svg.elem('text').text('Hello World'); + + expect(svg._node).toBeDefined(); + expect(svg._node.childNodes.length).toBe(1); + expect(svg._node.firstChild.nodeName.toLowerCase()).toBe('text'); + expect(svg._node.firstChild.firstChild.nodeType).toBe(3); + expect(svg._node.firstChild.firstChild.textContent).toBe('Hello World'); + }); + + it('should allow to add and remove classes on elements', () => { + const svg = new Svg('svg') + .addClass('test-class-1') + .addClass('test-class-2') + // Should not allow duplicates + .addClass('test-class-2') + // Should allow multiple classes with white spaces + .addClass('test-class-3 test-class-4'); + + expect(svg._node).toBeDefined(); + expect(svg._node.getAttribute('class').split(' ')).toEqual([ + 'test-class-1', + 'test-class-2', + 'test-class-3', + 'test-class-4' + ]); + + svg.removeClass('test-class-1'); + // Should allow multiple classes with whitespaces + svg.removeClass('test-class-2 test-class-3'); + + expect(svg._node.getAttribute('class')).toBe('test-class-4'); + }); + + it('should allow to travers up in the fluent API chain and set attributes on the way', () => { + const svg = new Svg('svg'); + svg.elem('g').elem('g').elem('g').elem('circle').parent().attr({ + transform: 'rotate(10 10 10)' + }).parent().attr({ + transform: 'rotate(20 20 20)' + }).parent().attr({ + transform: 'rotate(30 30 30)' + }).parent().attr({ + width: '100%', + height: '100%' + }); + + expect(svg._node).toBeDefined(); + expect(svg._node.attributes.width.textContent).toBe('100%'); + expect(svg._node.attributes.height.textContent).toBe('100%'); + + expect(svg._node.firstChild).toBeDefined(); + expect(svg._node.firstChild.attributes.transform.textContent).toBe('rotate(30 30 30)'); + + expect(svg._node.firstChild.firstChild).toBeDefined(); + expect(svg._node.firstChild.firstChild.attributes.transform.textContent).toBe('rotate(20 20 20)'); + + expect(svg._node.firstChild.firstChild.firstChild).toBeDefined(); + expect(svg._node.firstChild.firstChild.firstChild.attributes.transform.textContent).toBe('rotate(10 10 10)'); + }); +}); From ebaf247dc4afbcc1b67e5a37ae7ddcfe04a9c2a1 Mon Sep 17 00:00:00 2001 From: Gion Kunz Date: Fri, 28 Oct 2016 02:35:16 +0200 Subject: [PATCH 07/44] chore(linting): Added linter and fixed linting issues --- .eslintrc | 224 +++++++++ dist/chartist.esm.js | 711 +++++++++++++++------------- dist/chartist.esm.js.map | 2 +- dist/chartist.umd.js | 8 +- dist/chartist.umd.js.map | 2 +- package.json | 19 +- src/axes/axis.js | 2 +- src/axes/axis.spec.js | 6 +- src/charts/bar.js | 4 +- src/charts/bar.spec.js | 8 +- src/charts/line.js | 25 +- src/charts/line.spec.js | 30 +- src/charts/pie.js | 38 +- src/charts/pie.spec.js | 2 +- src/core/creation.js | 14 +- src/core/creation.spec.js | 2 +- src/core/data.js | 16 +- src/core/functional.js | 10 +- src/core/lang.js | 4 +- src/core/math.js | 6 +- src/core/options-provider.js | 8 +- src/interpolation/cardinal.js | 4 +- src/interpolation/monotone-cubic.js | 4 +- src/interpolation/none.js | 2 +- src/interpolation/simple.js | 2 +- src/interpolation/step.js | 4 +- src/styles/chartist.scss | 2 +- src/svg/svg-list.js | 42 +- src/svg/svg-path.js | 82 ++-- src/svg/svg-path.spec.js | 44 +- src/svg/svg.js | 10 +- src/testing/fixtures.js | 12 +- src/testing/jasmine-dom-matchers.js | 3 - yarn.lock | 507 +++++++++++++++++++- 34 files changed, 1310 insertions(+), 549 deletions(-) create mode 100644 .eslintrc diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 00000000..a667cd4d --- /dev/null +++ b/.eslintrc @@ -0,0 +1,224 @@ +{ + "parser": "babel-eslint", + + "parser-options": { + "ecmaFeatures": { + "binaryLiterals": false, + "blockBindings": false, + "defaultParams": true, + "forOf": false, + "generators": false, + "objectLiteralComputedProperties": true, + "objectLiteralDuplicateProperties": false, + "objectLiteralShorthandMethods": true, + "objectLiteralShorthandProperties": true, + "octalLiterals": false, + "regexUFlag": false, + "regexYFlag": false, + "templateStrings": true, + "unicodeCodePointEscapes": false, + "jsx": false, + "spread": true, + "arrowFunctions": true, + "classes": true, + "modules": true, + "restParams": true, + "destructuring": true + } + }, + "env": { + "browser": true, + "node": false, + "amd": false, + "mocha": false, + "jasmine": true , + "phantomjs": false, + "jquery": false, + "prototypejs": false, + "shelljs": false + }, + + "globals": { + + }, + + "plugins": [ + + ], + + "rules": { + + + "no-comma-dangle": 0, + "no-cond-assign": 0, + "no-console": 2, + "no-constant-condition": 0, + "no-control-regex": 0, + "no-debugger": 2, + "no-dupe-keys": 0, + "no-empty": 0, + "no-empty-class": 0, + "no-ex-assign": 0, + "no-extra-boolean-cast": 0, + "no-extra-parens": 0, + "no-extra-semi": 0, + "no-func-assign": 0, + "no-inner-declarations": 0, + "no-invalid-regexp": 0, + "no-irregular-whitespace": 0, + "no-negated-in-lhs": 0, + "no-obj-calls": 0, + "no-regex-spaces": 0, + "no-reserved-keys": 0, + "no-sparse-arrays": 0, + "no-unreachable": 2, + "use-isnan": 0, + "valid-jsdoc": 0, + "valid-typeof": 0, + + + + + "block-scoped-var": 0, + "complexity": 0, + "consistent-return": 0, + "curly": 2, + "default-case": 0, + "dot-notation": 1, + "eqeqeq": 2, + "guard-for-in": 0, + "no-alert": 2, + "no-caller": 2, + "no-div-regex": 0, + "no-else-return": 0, + "no-empty-label": 0, + "no-eq-null": 0, + "no-eval": 2, + "no-extend-native": 0, + "no-extra-bind": 2, + "no-fallthrough": 0, + "no-floating-decimal": 0, + "no-implied-eval": 2, + "no-iterator": 0, + "no-labels": 0, + "no-lone-blocks": 0, + "no-loop-func": 2, + "no-multi-spaces": 2, + "no-multi-str": 0, + "no-native-reassign": 0, + "no-new": 0, + "no-new-func": 0, + "no-new-wrappers": 0, + "no-octal": 0, + "no-octal-escape": 0, + "no-process-env": 0, + "no-proto": 0, + "no-redeclare": 0, + "no-return-assign": 0, + "no-script-url": 0, + "no-self-compare": 0, + "no-sequences": 0, + "no-unused-expressions": 0, + "no-void": 0, + "no-warning-comments": 0, + "no-with": 2, + "radix": 2, + "vars-on-top": 0, + "wrap-iife": 0, + "yoda": 0, + + + + + "global-strict": 0, + "no-extra-strict": 0, + "strict": 0, + + + + + "no-catch-shadow": 0, + "no-delete-var": 0, + "no-label-var": 0, + "no-shadow": 2, + "no-shadow-restricted-names": 2, + "no-undef": 0, + "no-undef-init": 0, + "no-undefined": 0, + "no-unused-vars": 0, + "no-use-before-define": 0, + + + + + "handle-callback-err": 0, + "no-mixed-requires": 0, + "no-new-require": 0, + "no-path-concat": 0, + "no-process-exit": 0, + "no-restricted-modules": 0, + "no-sync": 0, + + + + + "brace-style": ["error", "1tbs"], + "camelcase": 2, + "comma-spacing": 0, + "comma-style": ["error", "last"], + "consistent-this": 0, + "eol-last": 2, + "func-names": 0, + "func-style": 0, + "key-spacing": 2, + "max-nested-callbacks": 0, + "new-cap": 1, + "new-parens": 0, + "no-array-constructor": 2, + "no-inline-comments": 0, + "no-lonely-if": 0, + "no-mixed-spaces-and-tabs": 2, + "no-multiple-empty-lines": 2, + "no-nested-ternary": 2, + "no-new-object": 0, + "semi-spacing": 2, + "no-spaced-func": 2, + "no-ternary": 0, + "no-trailing-spaces": 2, + "no-underscore-dangle": 0, + "no-wrap-func": 0, + "one-var": 0, + "operator-assignment": 0, + "padded-blocks": 0, + "quote-props": 0, + "quotes": ["error", "single"], + "semi": 0, + "sort-vars": 0, + "space-before-function-paren": ["error", "never"], + "keyword-spacing": 0, + "space-before-blocks": 2, + "space-in-brackets": 0, + "space-in-parens": 0, + "space-infix-ops": 0, + "space-return-throw-case": 0, + "space-unary-ops": 0, + "spaced-comment": 1, + "wrap-regex": 0, + + + + + "no-var": 2, + "generator-star": 0, + + + + + "max-depth": 0, + "max-len": 0, + "max-params": 0, + "max-statements": 0, + "no-bitwise": 0, + "no-plusplus": 0 + } +} diff --git a/dist/chartist.esm.js b/dist/chartist.esm.js index cadb6b24..f3b8ca63 100644 --- a/dist/chartist.esm.js +++ b/dist/chartist.esm.js @@ -1,8 +1,8 @@ /* Chartist.js 1.0.0 * Copyright © 2016 Gion Kunz * Free to use under either the WTFPL license or the MIT license. - * https://raw.githubusercontent.com/gionkunz/chartist-js/master/LICENSE-WTFPL - * https://raw.githubusercontent.com/gionkunz/chartist-js/master/LICENSE-MIT + * https://raw.githubusercontent.com/chartist-js/chartist/master/LICENSE-WTFPL + * https://raw.githubusercontent.com/chartist-js/chartist/master/LICENSE-MIT */ var version = '1.0.0'; @@ -137,7 +137,10 @@ function quantity(input) { unit: match[2] || undefined }; } - return { value: input }; + + return { + value: input + }; } /** @@ -152,6 +155,16 @@ function alphaNumerate(n) { return String.fromCharCode(97 + n % 26); } +var _toConsumableArray = (function (arr) { + if (Array.isArray(arr)) { + for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { + arr2[i] = arr[i]; + }return arr2; + } else { + return Array.from(arr); + } +}); + /** * Helps to simplify functional style code * @@ -159,9 +172,9 @@ function alphaNumerate(n) { * @param {*} n This exact value will be returned by the noop function * @return {*} The same value that was provided to the n parameter */ -function noop(n) { +var noop = function noop(n) { return n; -} +}; /** * Functional style helper to produce array with given length initialized with undefined values @@ -170,9 +183,9 @@ function noop(n) { * @param length * @return {Array} */ -function times(length) { - return Array.apply(null, new Array(length)); -} +var times = function times(length) { + return Array.from({ length: length }); +}; /** * Sum helper to be used in reduce functions @@ -182,60 +195,40 @@ function times(length) { * @param current * @return {*} */ -function sum(previous, current) { +var sum = function sum(previous, current) { return previous + (current ? current : 0); -} +}; /** - * Multiply helper to be used in `Array.map` for multiplying each value of an array with a factor. + * Map for multi dimensional arrays where their nested arrays will be mapped in serial. The output array will have the length of the largest nested array. The callback function is called with variable arguments where each argument is the nested array value (or undefined if there are no more values). * - * @memberof Chartist.Core - * @param {Number} factor - * @returns {Function} Function that can be used in `Array.map` to multiply each value in an array - */ -function mapMultiply(factor) { - return function (num) { - return num * factor; - }; -} - -/** - * Add helper to be used in `Array.map` for adding a addend to each value of an array. + * For example: + * @example + * ```javascript + * const data = [[1, 2], [3], []]; + * serialMap(data, cb); * - * @memberof Chartist.Core - * @param {Number} addend - * @returns {Function} Function that can be used in `Array.map` to add a addend to each value in an array - */ -function mapAdd(addend) { - return function (num) { - return num + addend; - }; -} - -/** - * Map for multi dimensional arrays where their nested arrays will be mapped in serial. The output array will have the length of the largest nested array. The callback function is called with variable arguments where each argument is the nested array value (or undefined if there are no more values). + * // where cb will be called 2 times + * // 1. call arguments: (1, 3, undefined) + * // 2. call arguments: (2, undefined, undefined) + * ``` * * @memberof Chartist.Core - * @param arr - * @param cb + * @param array + * @param callback * @return {Array} */ -function serialMap(arr, cb) { - var result = [], - length = Math.max.apply(null, arr.map(function (e) { - return e.length; - })); - - times(length).forEach(function (e, index) { - var args = arr.map(function (e) { - return e[index]; - }); - - result[index] = cb.apply(null, args); +var serialMap = function serialMap(array, callback) { + return times(Math.max.apply(Math, _toConsumableArray(array.map(function (element) { + return element.length; + })))).map(function (inner, index) { + return callback.apply(undefined, _toConsumableArray(array.map(function (element) { + return element[index]; + }))); }); +}; - return result; -} +var EPSILON = 2.221E-16; /** * Calculate the order of magnitude for the chart scale @@ -270,7 +263,7 @@ function projectLength(axisLength, length, bounds) { * @returns {number} Rounded value */ function roundWithPrecision(value, digits) { - var precision$$1 = Math.pow(10, digits || precision$$1); + var precision$$1 = Math.pow(10, digits || precision); return Math.round(value * precision$$1) / precision$$1; } @@ -298,9 +291,9 @@ function rho(num) { return x * x + 1; } - var x1 = 2, - x2 = 2, - divisor; + var x1 = 2; + var x2 = 2; + var divisor = void 0; if (num % 2 === 0) { return 2; } @@ -341,14 +334,19 @@ function polarToCartesian(centerX, centerY, radius, angleInDegrees) { * @param {Object...} sources This object (objects) will be merged into target and then target is returned * @return {Object} An object that has the same reference as target but is extended and merged with the properties of source */ -function extend(target) { - var i, source, sourceProp; +function extend() { + var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + target = target || {}; - for (i = 1; i < arguments.length; i++) { - source = arguments[i]; + for (var _len = arguments.length, sources = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + sources[_key - 1] = arguments[_key]; + } + + for (var i = 0; i < sources.length; i++) { + var source = sources[i]; for (var prop in source) { - sourceProp = source[prop]; + var sourceProp = source[prop]; if (typeof sourceProp === 'object' && sourceProp !== null && !(sourceProp instanceof Array)) { target[prop] = extend(target[prop], sourceProp); } else { @@ -413,7 +411,9 @@ function deserialize(data) { * @return {Object} The normalized data object */ function normalizeData(data, reverse, multi) { - var labelCount; + var _output$normalized$la; + + var labelCount = void 0; var output = { raw: data, normalized: {} @@ -430,9 +430,9 @@ function normalizeData(data, reverse, multi) { return value instanceof Array; })) { // Getting the series with the the most elements - labelCount = Math.max.apply(null, output.normalized.series.map(function (series) { + labelCount = Math.max.apply(Math, _toConsumableArray(output.normalized.series.map(function (series) { return series.length; - })); + }))); } else { // We're dealing with Pie data so we just take the normalized array length labelCount = output.normalized.series.length; @@ -440,9 +440,9 @@ function normalizeData(data, reverse, multi) { output.normalized.labels = (data.labels || []).slice(); // Padding the labels to labelCount with empty strings - Array.prototype.push.apply(output.normalized.labels, times(Math.max(0, labelCount - output.normalized.labels.length)).map(function () { + (_output$normalized$la = output.normalized.labels).push.apply(_output$normalized$la, _toConsumableArray(times(Math.max(0, labelCount - output.normalized.labels.length)).map(function () { return ''; - })); + }))); if (reverse) { reverseData(output.normalized); @@ -482,11 +482,32 @@ function isDataHoleValue(value) { function reverseData(data) { data.labels.reverse(); data.series.reverse(); - for (var i = 0; i < data.series.length; i++) { - if (typeof data.series[i] === 'object' && data.series[i].data !== undefined) { - data.series[i].data.reverse(); - } else if (data.series[i] instanceof Array) { - data.series[i].reverse(); + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = data.series[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var series = _step.value; + + if (typeof series === 'object' && series.data !== undefined) { + series.data.reverse(); + } else if (series instanceof Array) { + series.reverse(); + } + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator.return) { + _iterator.return(); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } } } } @@ -552,7 +573,7 @@ function getDataArray(data, reverse, multi) { * @param value */ function isMultiValue(value) { - return typeof value === 'object' && ('x' in value || 'y' in value); + return typeof value === 'object' && (value.hasOwnProperty('x') || value.hasOwnProperty('y')); } /** @@ -561,12 +582,13 @@ function isMultiValue(value) { * @memberof Chartist.Core * @param value * @param dimension - * @param defaultValue * @returns {*} */ -function getMultiValue(value, dimension) { +function getMultiValue(value) { + var dimension = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'y'; + if (isMultiValue(value)) { - return getNumberOrUndefined(value[dimension || 'y']); + return getNumberOrUndefined(value[dimension]); } else { return getNumberOrUndefined(value); } @@ -678,15 +700,15 @@ function getHighLow(data, options, dimension) { var findLow = options.low === undefined; // Function to recursively walk through arrays and find highest and lowest number - function recursiveHighLow(data) { - if (data === undefined) { + function recursiveHighLow(sourceData) { + if (sourceData === undefined) { return undefined; - } else if (data instanceof Array) { - for (var i = 0; i < data.length; i++) { - recursiveHighLow(data[i]); + } else if (sourceData instanceof Array) { + for (var i = 0; i < sourceData.length; i++) { + recursiveHighLow(sourceData[i]); } } else { - var value = dimension ? +data[dimension] : +data; + var value = dimension ? +sourceData[dimension] : +sourceData; if (findHigh && value > highLow.high) { highLow.high = value; @@ -744,11 +766,7 @@ function getHighLow(data, options, dimension) { * @return {Object} All the values to set the bounds of the chart */ function getBounds(axisLength, highLow, scaleMinSpace, onlyInteger) { - var i, - optimizationCounter = 0, - newMin, - newMax, - bounds = { + var bounds = { high: highLow.high, low: highLow.low }; @@ -777,6 +795,7 @@ function getBounds(axisLength, highLow, scaleMinSpace, onlyInteger) { bounds.step = smallestFactor; } else { // Trying to divide or multiply by 2 and find the best step value + var optimizationCounter = 0; while (true) { if (scaleUp && projectLength(axisLength, bounds.step, bounds) <= scaleMinSpace) { bounds.step *= 2; @@ -796,7 +815,6 @@ function getBounds(axisLength, highLow, scaleMinSpace, onlyInteger) { } } - var EPSILON = 2.221E-16; bounds.step = Math.max(bounds.step, EPSILON); function safeIncrement(value, increment) { // If increment is too small use *= (1+EPSILON) as a simple nextafter @@ -807,8 +825,8 @@ function getBounds(axisLength, highLow, scaleMinSpace, onlyInteger) { } // Narrow min and max based on new step - newMin = bounds.min; - newMax = bounds.max; + var newMin = bounds.min; + var newMax = bounds.max; while (newMin + bounds.step <= bounds.low) { newMin = safeIncrement(newMin, bounds.step); } @@ -820,13 +838,14 @@ function getBounds(axisLength, highLow, scaleMinSpace, onlyInteger) { bounds.range = bounds.max - bounds.min; var values = []; - for (i = bounds.min; i <= bounds.max; i = safeIncrement(i, bounds.step)) { + for (var i = bounds.min; i <= bounds.max; i = safeIncrement(i, bounds.step)) { var value = roundWithPrecision(i); if (value !== values[values.length - 1]) { - values.push(i); + values.push(value); } } bounds.values = values; + return bounds; } @@ -863,6 +882,8 @@ var _createClass = (function () { * @constructor */ var SvgList = function SvgList(nodeList) { + var _arguments = arguments; + _classCallCheck(this, SvgList); var list = this; @@ -877,9 +898,9 @@ var SvgList = function SvgList(nodeList) { return ['constructor', 'parent', 'querySelector', 'querySelectorAll', 'replace', 'append', 'classes', 'height', 'width'].indexOf(prototypeProperty) === -1; }).forEach(function (prototypeProperty) { list[prototypeProperty] = function () { - var args = Array.prototype.slice.call(arguments, 0); + var args = Array.from(_arguments); list.svgElements.forEach(function (element) { - Svg.prototype[prototypeProperty].apply(element, args); + return Svg.prototype[prototypeProperty].apply(element, args); }); return list; }; @@ -1313,17 +1334,18 @@ var Svg = function () { }, { key: 'animate', value: function animate(animations, guided, eventEmitter) { + var _this = this; + if (guided === undefined) { guided = true; } - Object.keys(animations).forEach(function createAnimateForAttributes(attribute) { + Object.keys(animations).forEach(function (attribute) { - function createAnimate(animationDefinition, guided) { - var attributeProperties = {}, - animate, - timeout, - animationEasing; + var createAnimate = function createAnimate(animationDefinition, createGuided) { + var attributeProperties = {}; + var animationEasing = void 0; + var timeout = void 0; // Check if an easing is specified in the definition object and delete it from the object as it will not // be part of the animate element attributes. @@ -1344,11 +1366,11 @@ var Svg = function () { } // Adding "fill: freeze" if we are in guided mode and set initial attribute values - if (guided) { + if (createGuided) { animationDefinition.fill = 'freeze'; // Animated property on our element should already be set to the animation from value in guided mode attributeProperties[attribute] = animationDefinition.from; - this.attr(attributeProperties); + _this.attr(attributeProperties); // In guided mode we also set begin to indefinite so we can trigger the start manually and put the begin // which needs to be in ms aside @@ -1356,66 +1378,66 @@ var Svg = function () { animationDefinition.begin = 'indefinite'; } - animate = this.elem('animate', extend({ + var animate = _this.elem('animate', extend({ attributeName: attribute }, animationDefinition)); - if (guided) { + if (createGuided) { // If guided we take the value that was put aside in timeout and trigger the animation manually with a timeout setTimeout(function () { // If beginElement fails we set the animated attribute to the end position and remove the animate element - // This happens if the SMIL ElementTimeControl interface is not supported or any other problems occured in + // This happens if the SMIL ElementTimeControl interface is not supported or any other problems occurred in // the browser. (Currently FF 34 does not support animate elements in foreignObjects) try { animate._node.beginElement(); } catch (err) { // Set animated attribute to current animated value attributeProperties[attribute] = animationDefinition.to; - this.attr(attributeProperties); + _this.attr(attributeProperties); // Remove the animate element as it's no longer required animate.remove(); } - }.bind(this), timeout); + }, timeout); } if (eventEmitter) { - animate._node.addEventListener('beginEvent', function handleBeginEvent() { - eventEmitter.emit('animationBegin', { - element: this, + animate._node.addEventListener('beginEvent', function () { + return eventEmitter.emit('animationBegin', { + element: _this, animate: animate._node, params: animationDefinition }); - }.bind(this)); + }); } - animate._node.addEventListener('endEvent', function handleEndEvent() { + animate._node.addEventListener('endEvent', function () { if (eventEmitter) { eventEmitter.emit('animationEnd', { - element: this, + element: _this, animate: animate._node, params: animationDefinition }); } - if (guided) { + if (createGuided) { // Set animated attribute to current animated value attributeProperties[attribute] = animationDefinition.to; - this.attr(attributeProperties); + _this.attr(attributeProperties); // Remove the animate element as it's no longer required animate.remove(); } - }.bind(this)); - } + }); + }; // If current attribute is an array of definition objects we create an animate for each and disable guided mode if (animations[attribute] instanceof Array) { animations[attribute].forEach(function (animationDefinition) { - createAnimate.bind(this)(animationDefinition, false); - }.bind(this)); + return createAnimate(animationDefinition, false); + }); } else { - createAnimate.bind(this)(animations[attribute], guided); + createAnimate(animations[attribute], guided); } - }.bind(this)); + }); return this; } @@ -1477,25 +1499,25 @@ var easings = { * @param {String} className Specify a class to be added to the SVG element * @return {Object} The created/reinitialized SVG element */ -function createSvg(container, width, height, className) { - var svg; - - width = width || '100%'; - height = height || '100%'; +function createSvg(container) { + var width = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '100%'; + var height = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '100%'; + var className = arguments[3]; // Check if there is a previous SVG element in the container that contains the Chartist XML namespace and remove it // Since the DOM API does not support namespaces we need to manually search the returned list http://www.w3.org/TR/selectors-api/ - Array.prototype.slice.call(container.querySelectorAll('svg')).filter(function filterChartistSvgObjects(svg) { + Array.from(container.querySelectorAll('svg')).filter(function (svg) { return svg.getAttributeNS(namespaces.xmlns, 'ct'); - }).forEach(function removePreviousElement(svg) { - container.removeChild(svg); + }).forEach(function (svg) { + return container.removeChild(svg); }); // Create svg object with width and height or use 100% as default - svg = new Svg('svg').attr({ + var svg = new Svg('svg').attr({ width: width, height: height }).addClass(className).attr({ + // TODO: Check better solution (browser support) and remove inline styles due to CSP style: 'width: ' + width + '; height: ' + height + ';' }); @@ -1513,8 +1535,8 @@ function createSvg(container, width, height, className) { * @param {Number} [fallback] This value is used to fill missing values if a incomplete padding object was passed * @returns {Object} Returns a padding object containing top, right, bottom, left properties filled with the padding number passed in as argument. If the argument is something else than a number (presumably already a correct padding object) then this argument is directly returned. */ -function normalizePadding(padding, fallback) { - fallback = fallback || 0; +function normalizePadding(padding) { + var fallback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; return typeof padding === 'number' ? { top: padding, @@ -1661,7 +1683,7 @@ function createGridBackground(gridGroup, chartRect, className, eventEmitter) { * @param eventEmitter */ function createLabel(position, length, index, labels, axis, axisOffset, labelOffset, group, classes, useForeignObject, eventEmitter) { - var labelElement; + var labelElement = void 0; var positionalData = {}; positionalData[axis.units.pos] = position + labelOffset[axis.units.pos]; @@ -1672,7 +1694,9 @@ function createLabel(position, length, index, labels, axis, axisOffset, labelOff if (useForeignObject) { // We need to set width and height explicitly to px as span will not expand with width and height being // 100% in all browsers - var content = '' + labels[index] + ''; + var stepLength = Math.round(positionalData[axis.units.len]); + var stepCounterLength = Math.round(positionalData[axis.counterUnits.len]); + var content = ('\n \n ' + labels[index] + '\n \n ').trim(); labelElement = group.foreignObject(content, extend({ style: 'overflow: visible;' @@ -1701,22 +1725,21 @@ function createLabel(position, length, index, labels, axis, axisOffset, labelOff * @return {Object} The consolidated options object from the defaults, base and matching responsive options */ function optionsProvider(options, responsiveOptions, eventEmitter) { - var baseOptions = extend({}, options), - currentOptions, - mediaQueryListeners = [], - i; + var baseOptions = extend({}, options); + var currentOptions = void 0; + var mediaQueryListeners = []; function updateCurrentOptions(mediaEvent) { var previousOptions = currentOptions; currentOptions = extend({}, baseOptions); if (responsiveOptions) { - for (i = 0; i < responsiveOptions.length; i++) { - var mql = window.matchMedia(responsiveOptions[i][0]); + responsiveOptions.forEach(function (responsiveOption) { + var mql = window.matchMedia(responsiveOption[0]); if (mql.matches) { - currentOptions = extend(currentOptions, responsiveOptions[i][1]); + currentOptions = extend(currentOptions, responsiveOption[1]); } - } + }); } if (eventEmitter && mediaEvent) { @@ -1729,19 +1752,18 @@ function optionsProvider(options, responsiveOptions, eventEmitter) { function removeMediaQueryListeners() { mediaQueryListeners.forEach(function (mql) { - mql.removeListener(updateCurrentOptions); + return mql.removeListener(updateCurrentOptions); }); } if (!window.matchMedia) { throw 'window.matchMedia not found! Make sure you\'re using a polyfill.'; } else if (responsiveOptions) { - - for (i = 0; i < responsiveOptions.length; i++) { - var mql = window.matchMedia(responsiveOptions[i][0]); + responsiveOptions.forEach(function (responsiveOption) { + var mql = window.matchMedia(responsiveOption[0]); mql.addListener(updateCurrentOptions); mediaQueryListeners.push(mql); - } + }); } // Execute initially without an event argument so we get the correct options updateCurrentOptions(); @@ -1817,14 +1839,14 @@ var EventEmitter = function () { // Only do something if there are event handlers with this name existing if (this.handlers[event]) { this.handlers[event].forEach(function (handler) { - handler(data); + return handler(data); }); } // Emit event to star event handlers if (this.handlers['*']) { this.handlers['*'].forEach(function (starHandler) { - starHandler(event, data); + return starHandler(event, data); }); } } @@ -1845,6 +1867,8 @@ var BaseChart = function () { * @constructor */ function BaseChart(query, data, defaultOptions, options, responsiveOptions) { + var _this = this; + _classCallCheck(this, BaseChart); this.container = querySelector$1(query); @@ -1857,9 +1881,9 @@ var BaseChart = function () { this.eventEmitter = new EventEmitter(); this.supportsForeignObject = isSupported('Extensibility'); this.supportsAnimations = isSupported('AnimationEventsAttribute'); - this.resizeListener = function resizeListener() { - this.update(); - }.bind(this); + this.resizeListener = function () { + return _this.update(); + }; if (this.container) { // If chartist was already initialized in this container we are detaching all event listeners first @@ -1872,7 +1896,9 @@ var BaseChart = function () { // Using event loop for first draw to make it possible to register event listeners in the same call stack where // the chart was created. - this.initializeTimeoutId = setTimeout(this.initialize.bind(this), 0); + this.initializeTimeoutId = setTimeout(function () { + return _this.initialize(); + }, 0); } _createClass(BaseChart, [{ @@ -1983,6 +2009,8 @@ var BaseChart = function () { }, { key: 'initialize', value: function initialize() { + var _this2 = this; + // Add window resize listener that re-creates the chart window.addEventListener('resize', this.resizeListener); @@ -1991,19 +2019,19 @@ var BaseChart = function () { this.optionsProvider = optionsProvider(this.options, this.responsiveOptions, this.eventEmitter); // Register options change listener that will trigger a chart update this.eventEmitter.addEventHandler('optionsChanged', function () { - this.update(); - }.bind(this)); + return _this2.update(); + }); // Before the first chart creation we need to register us with all plugins that are configured // Initialize all relevant plugins with our chart object and the plugin options specified in the config if (this.options.plugins) { this.options.plugins.forEach(function (plugin) { if (plugin instanceof Array) { - plugin[0](this, plugin[1]); + plugin[0](_this2, plugin[1]); } else { - plugin(this); + plugin(_this2); } - }.bind(this)); + }); } // Event for data transformation that allows to manipulate the data before it gets rendered in the charts @@ -2091,6 +2119,8 @@ var Axis = function () { }, { key: 'createGridAndLabels', value: function createGridAndLabels(gridGroup, labelGroup, useForeignObject, chartOptions, eventEmitter) { + var _this = this; + var axisOptions = chartOptions['axis' + this.units.pos.toUpperCase()]; var projectedValues = this.ticks.map(this.projectValue.bind(this)); var labelValues = this.ticks.map(axisOptions.labelInterpolationFnc); @@ -2103,7 +2133,7 @@ var Axis = function () { // TODO: Find better solution for solving this problem // Calculate how much space we have available for the label - var labelLength; + var labelLength = void 0; if (projectedValues[index + 1]) { // If we still have one label ahead, we can calculate the distance to the next tick / label labelLength = projectedValues[index + 1] - projectedValue; @@ -2111,48 +2141,48 @@ var Axis = function () { // If we don't have a label ahead and we have only two labels in total, we just take the remaining distance to // on the whole axis length. We limit that to a minimum of 30 pixel, so that labels close to the border will // still be visible inside of the chart padding. - labelLength = Math.max(this.axisLength - projectedValue, 30); + labelLength = Math.max(_this.axisLength - projectedValue, 30); } - // Skip grid lines and labels where interpolated label values are falsey (execpt for 0) + // Skip grid lines and labels where interpolated label values are falsey (except for 0) if (isFalseyButZero(labelValues[index]) && labelValues[index] !== '') { return; } // Transform to global coordinates using the chartRect // We also need to set the label offset for the createLabel function - if (this.units.pos === 'x') { - projectedValue = this.chartRect.x1 + projectedValue; + if (_this.units.pos === 'x') { + projectedValue = _this.chartRect.x1 + projectedValue; labelOffset.x = chartOptions.axisX.labelOffset.x; // If the labels should be positioned in start position (top side for vertical axis) we need to set a // different offset as for positioned with end (bottom) if (chartOptions.axisX.position === 'start') { - labelOffset.y = this.chartRect.padding.top + chartOptions.axisX.labelOffset.y + (useForeignObject ? 5 : 20); + labelOffset.y = _this.chartRect.padding.top + chartOptions.axisX.labelOffset.y + (useForeignObject ? 5 : 20); } else { - labelOffset.y = this.chartRect.y1 + chartOptions.axisX.labelOffset.y + (useForeignObject ? 5 : 20); + labelOffset.y = _this.chartRect.y1 + chartOptions.axisX.labelOffset.y + (useForeignObject ? 5 : 20); } } else { - projectedValue = this.chartRect.y1 - projectedValue; + projectedValue = _this.chartRect.y1 - projectedValue; labelOffset.y = chartOptions.axisY.labelOffset.y - (useForeignObject ? labelLength : 0); // If the labels should be positioned in start position (left side for horizontal axis) we need to set a // different offset as for positioned with end (right side) if (chartOptions.axisY.position === 'start') { - labelOffset.x = useForeignObject ? this.chartRect.padding.left + chartOptions.axisY.labelOffset.x : this.chartRect.x1 - 10; + labelOffset.x = useForeignObject ? _this.chartRect.padding.left + chartOptions.axisY.labelOffset.x : _this.chartRect.x1 - 10; } else { - labelOffset.x = this.chartRect.x2 + chartOptions.axisY.labelOffset.x + 10; + labelOffset.x = _this.chartRect.x2 + chartOptions.axisY.labelOffset.x + 10; } } if (axisOptions.showGrid) { - createGrid(projectedValue, index, this, this.gridOffset, this.chartRect[this.counterUnits.len](), gridGroup, [chartOptions.classNames.grid, chartOptions.classNames[this.units.dir]], eventEmitter); + createGrid(projectedValue, index, _this, _this.gridOffset, _this.chartRect[_this.counterUnits.len](), gridGroup, [chartOptions.classNames.grid, chartOptions.classNames[_this.units.dir]], eventEmitter); } if (axisOptions.showLabel) { - createLabel(projectedValue, labelLength, index, labelValues, this, axisOptions.offset, labelOffset, labelGroup, [chartOptions.classNames.label, chartOptions.classNames[this.units.dir], axisOptions.position === 'start' ? chartOptions.classNames[axisOptions.position] : chartOptions.classNames['end']], useForeignObject, eventEmitter); + createLabel(projectedValue, labelLength, index, labelValues, _this, axisOptions.offset, labelOffset, labelGroup, [chartOptions.classNames.label, chartOptions.classNames[_this.units.dir], axisOptions.position === 'start' ? chartOptions.classNames[axisOptions.position] : chartOptions.classNames.end], useForeignObject, eventEmitter); } - }.bind(this)); + }); } }]); @@ -2225,8 +2255,8 @@ var FixedScaleAxis = function (_Axis) { var highLow = options.highLow || getHighLow(data, options, axisUnit.pos); _this.divisor = options.divisor || 1; _this.ticks = options.ticks || times(_this.divisor).map(function (value, index) { - return highLow.low + (highLow.high - highLow.low) / this.divisor * index; - }.bind(_this)); + return highLow.low + (highLow.high - highLow.low) / _this.divisor * index; + }); _this.ticks.sort(function (a, b) { return a - b; }); @@ -2506,13 +2536,15 @@ var SvgPath = function () { }, { key: 'parse', value: function parse(path) { + var _pathElements; + // Parsing the SVG path string into an array of arrays [['M', '10', '10'], ['L', '100', '100']] - var chunks = path.replace(/([A-Za-z])([0-9])/g, '$1 $2').replace(/([0-9])([A-Za-z])/g, '$1 $2').split(/[\s,]+/).reduce(function (result, element) { - if (element.match(/[A-Za-z]/)) { + var chunks = path.replace(/([A-Za-z])([0-9])/g, '$1 $2').replace(/([0-9])([A-Za-z])/g, '$1 $2').split(/[\s,]+/).reduce(function (result, pathElement) { + if (pathElement.match(/[A-Za-z]/)) { result.push([]); } - result[result.length - 1].push(element); + result[result.length - 1].push(pathElement); return result; }, []); @@ -2524,8 +2556,8 @@ var SvgPath = function () { // Using svgPathElementDescriptions to map raw path arrays into objects that contain the command and the parameters // For example {command: 'M', x: '10', y: '10'} var elements = chunks.map(function (chunk) { - var command = chunk.shift(), - description = elementDescriptions[command.toLowerCase()]; + var command = chunk.shift(); + var description = elementDescriptions[command.toLowerCase()]; return extend({ command: command @@ -2536,9 +2568,7 @@ var SvgPath = function () { }); // Preparing a splice call with the elements array as var arg params and insert the parsed elements at the current position - var spliceArgs = [this.pos, 0]; - Array.prototype.push.apply(spliceArgs, elements); - Array.prototype.splice.apply(this.pathElements, spliceArgs); + (_pathElements = this.pathElements).splice.apply(_pathElements, [this.pos, 0].concat(_toConsumableArray(elements))); // Increase the internal position by the element count this.pos += elements.length; @@ -2555,15 +2585,17 @@ var SvgPath = function () { }, { key: 'stringify', value: function stringify() { + var _this = this; + var accuracyMultiplier = Math.pow(10, this.options.accuracy); return this.pathElements.reduce(function (path, pathElement) { var params = elementDescriptions[pathElement.command.toLowerCase()].map(function (paramName) { - return this.options.accuracy ? Math.round(pathElement[paramName] * accuracyMultiplier) / accuracyMultiplier : pathElement[paramName]; - }.bind(this)); + return _this.options.accuracy ? Math.round(pathElement[paramName] * accuracyMultiplier) / accuracyMultiplier : pathElement[paramName]; + }); return path + pathElement.command + params.join(','); - }.bind(this), '') + (this.close ? 'Z' : ''); + }, '') + (this.close ? 'Z' : ''); } /** @@ -2579,7 +2611,7 @@ var SvgPath = function () { key: 'scale', value: function scale(x, y) { forEachParam(this.pathElements, function (pathElement, paramName) { - pathElement[paramName] *= paramName[0] === 'x' ? x : y; + return pathElement[paramName] *= paramName[0] === 'x' ? x : y; }); return this; } @@ -2597,7 +2629,7 @@ var SvgPath = function () { key: 'translate', value: function translate(x, y) { forEachParam(this.pathElements, function (pathElement, paramName) { - pathElement[paramName] += paramName[0] === 'x' ? x : y; + return pathElement[paramName] += paramName[0] === 'x' ? x : y; }); return this; } @@ -2638,13 +2670,13 @@ var SvgPath = function () { }, { key: 'clone', value: function clone(close) { - var c = new SvgPath(close || this.close); - c.pos = this.pos; - c.pathElements = this.pathElements.slice().map(function cloneElements(pathElement) { + var clone = new SvgPath(close || this.close); + clone.pos = this.pos; + clone.pathElements = this.pathElements.slice().map(function (pathElement) { return extend({}, pathElement); }); - c.options = extend({}, this.options); - return c; + clone.options = extend({}, this.options); + return clone; } /** @@ -2696,8 +2728,10 @@ function none(options) { var defaultOptions = { fillHoles: false }; + options = extend({}, defaultOptions, options); - return function none(pathCoordinates, valueData) { + + return function noneInterpolation(pathCoordinates, valueData) { var path = new SvgPath(); var hole = true; @@ -2752,13 +2786,16 @@ function simple(options) { divisor: 2, fillHoles: false }; + options = extend({}, defaultOptions, options); var d = 1 / Math.max(1, options.divisor); - return function simple(pathCoordinates, valueData) { + return function simpleInterpolation(pathCoordinates, valueData) { var path = new SvgPath(); - var prevX, prevY, prevData; + var prevX = void 0; + var prevY = void 0; + var prevData = void 0; for (var i = 0; i < pathCoordinates.length; i += 2) { var currX = pathCoordinates[i]; @@ -2778,7 +2815,7 @@ function simple(options) { prevY = currY; prevData = currData; } else if (!options.fillHoles) { - prevX = currX = prevData = undefined; + prevX = prevY = prevData = undefined; } } @@ -2814,10 +2851,12 @@ function step(options) { options = extend({}, defaultOptions, options); - return function step(pathCoordinates, valueData) { + return function stepInterpolation(pathCoordinates, valueData) { var path = new SvgPath(); - var prevX, prevY, prevData; + var prevX = void 0; + var prevY = void 0; + var prevData = void 0; for (var i = 0; i < pathCoordinates.length; i += 2) { var currX = pathCoordinates[i]; @@ -2882,10 +2921,10 @@ function cardinal(options) { options = extend({}, defaultOptions, options); - var t = Math.min(1, Math.max(0, options.tension)), - c = 1 - t; + var t = Math.min(1, Math.max(0, options.tension)); + var c = 1 - t; - return function cardinal(pathCoordinates, valueData) { + return function cardinalInterpolation(pathCoordinates, valueData) { // First we try to split the coordinates into segments // This is necessary to treat "holes" in line charts var segments = splitIntoSegments(pathCoordinates, valueData, { @@ -2898,13 +2937,11 @@ function cardinal(options) { } else if (segments.length > 1) { // If the split resulted in more that one segment we need to interpolate each segment individually and join them // afterwards together into a single path. - var paths = []; // For each segment we will recurse the cardinal function - segments.forEach(function (segment) { - paths.push(cardinal(segment.pathCoordinates, segment.valueData)); - }); // Join the segment path data into a single path and return - return SvgPath.join(paths); + return SvgPath.join(segments.map(function (segment) { + return cardinalInterpolation(segment.pathCoordinates, segment.valueData); + })); } else { // If there was only one segment we can proceed regularly by using pathCoordinates and valueData from the first // segment @@ -2916,11 +2953,12 @@ function cardinal(options) { return none()(pathCoordinates, valueData); } - var path = new SvgPath().move(pathCoordinates[0], pathCoordinates[1], false, valueData[0]), - z; + var path = new SvgPath().move(pathCoordinates[0], pathCoordinates[1], false, valueData[0]); + var z = void 0; for (var i = 0, iLen = pathCoordinates.length; iLen - 2 * !z > i; i += 2) { var p = [{ x: +pathCoordinates[i - 2], y: +pathCoordinates[i - 1] }, { x: +pathCoordinates[i], y: +pathCoordinates[i + 1] }, { x: +pathCoordinates[i + 2], y: +pathCoordinates[i + 3] }, { x: +pathCoordinates[i + 4], y: +pathCoordinates[i + 5] }]; + if (z) { if (!i) { p[0] = { x: +pathCoordinates[iLen - 2], y: +pathCoordinates[iLen - 1] }; @@ -2976,7 +3014,7 @@ function monotoneCubic(options) { options = extend({}, defaultOptions, options); - return function monotoneCubic(pathCoordinates, valueData) { + return function monotoneCubicInterpolation(pathCoordinates, valueData) { // First we try to split the coordinates into segments // This is necessary to treat "holes" in line charts var segments = splitIntoSegments(pathCoordinates, valueData, { @@ -2990,13 +3028,11 @@ function monotoneCubic(options) { } else if (segments.length > 1) { // If the split resulted in more that one segment we need to interpolate each segment individually and join them // afterwards together into a single path. - var paths = []; // For each segment we will recurse the monotoneCubic fn function - segments.forEach(function (segment) { - paths.push(monotoneCubic(segment.pathCoordinates, segment.valueData)); - }); // Join the segment path data into a single path and return - return SvgPath.join(paths); + return SvgPath.join(segments.map(function (segment) { + return monotoneCubicInterpolation(segment.pathCoordinates, segment.valueData); + })); } else { // If there was only one segment we can proceed regularly by using pathCoordinates and valueData from the first // segment @@ -3008,61 +3044,55 @@ function monotoneCubic(options) { return none()(pathCoordinates, valueData); } - var xs = [], - ys = [], - i, - n = pathCoordinates.length / 2, - ms = [], - ds = [], - dys = [], - dxs = [], - path; + var xs = []; + var ys = []; + var n = pathCoordinates.length / 2; + var ms = []; + var ds = []; + var dys = []; + var dxs = []; // Populate x and y coordinates into separate arrays, for readability - - for (i = 0; i < n; i++) { + for (var i = 0; i < n; i++) { xs[i] = pathCoordinates[i * 2]; ys[i] = pathCoordinates[i * 2 + 1]; } // Calculate deltas and derivative - - for (i = 0; i < n - 1; i++) { - dys[i] = ys[i + 1] - ys[i]; - dxs[i] = xs[i + 1] - xs[i]; - ds[i] = dys[i] / dxs[i]; + for (var _i = 0; _i < n - 1; _i++) { + dys[_i] = ys[_i + 1] - ys[_i]; + dxs[_i] = xs[_i + 1] - xs[_i]; + ds[_i] = dys[_i] / dxs[_i]; } // Determine desired slope (m) at each point using Fritsch-Carlson method // See: http://math.stackexchange.com/questions/45218/implementation-of-monotone-cubic-interpolation - ms[0] = ds[0]; ms[n - 1] = ds[n - 2]; - for (i = 1; i < n - 1; i++) { - if (ds[i] === 0 || ds[i - 1] === 0 || ds[i - 1] > 0 !== ds[i] > 0) { - ms[i] = 0; + for (var _i2 = 1; _i2 < n - 1; _i2++) { + if (ds[_i2] === 0 || ds[_i2 - 1] === 0 || ds[_i2 - 1] > 0 !== ds[_i2] > 0) { + ms[_i2] = 0; } else { - ms[i] = 3 * (dxs[i - 1] + dxs[i]) / ((2 * dxs[i] + dxs[i - 1]) / ds[i - 1] + (dxs[i] + 2 * dxs[i - 1]) / ds[i]); + ms[_i2] = 3 * (dxs[_i2 - 1] + dxs[_i2]) / ((2 * dxs[_i2] + dxs[_i2 - 1]) / ds[_i2 - 1] + (dxs[_i2] + 2 * dxs[_i2 - 1]) / ds[_i2]); - if (!isFinite(ms[i])) { - ms[i] = 0; + if (!isFinite(ms[_i2])) { + ms[_i2] = 0; } } } // Now build a path from the slopes + var path = new SvgPath().move(xs[0], ys[0], false, valueData[0]); - path = new SvgPath().move(xs[0], ys[0], false, valueData[0]); - - for (i = 0; i < n - 1; i++) { + for (var _i3 = 0; _i3 < n - 1; _i3++) { path.curve( // First control point - xs[i] + dxs[i] / 3, ys[i] + ms[i] * dxs[i] / 3, + xs[_i3] + dxs[_i3] / 3, ys[_i3] + ms[_i3] * dxs[_i3] / 3, // Second control point - xs[i + 1] - dxs[i] / 3, ys[i + 1] - ms[i + 1] * dxs[i] / 3, + xs[_i3 + 1] - dxs[_i3] / 3, ys[_i3 + 1] - ms[_i3 + 1] * dxs[_i3] / 3, // End point - xs[i + 1], ys[i + 1], false, valueData[i + 1]); + xs[_i3 + 1], ys[_i3 + 1], false, valueData[_i3 + 1]); } return path; @@ -3279,6 +3309,8 @@ var LineChart = function (_BaseChart) { _createClass(LineChart, [{ key: 'createChart', value: function createChart(options) { + var _this2 = this; + var data = normalizeData(this.data, options.reverseData, true); // Create new svg object @@ -3289,7 +3321,8 @@ var LineChart = function (_BaseChart) { var labelGroup = this.svg.elem('g').addClass(options.classNames.labelGroup); var chartRect = createChartRect(this.svg, options, defaultOptions.padding); - var axisX, axisY; + var axisX = void 0; + var axisY = void 0; if (options.axisX.type === undefined) { axisX = new StepAxis(axisUnits.x, data.normalized.series, chartRect, extend({}, options.axisX, { @@ -3329,8 +3362,8 @@ var LineChart = function (_BaseChart) { // Use series class from series data or if not set generate one seriesElement.addClass([options.classNames.series, series.className || options.classNames.series + '-' + alphaNumerate(seriesIndex)].join(' ')); - var pathCoordinates = [], - pathData = []; + var pathCoordinates = []; + var pathData = []; data.normalized.series[seriesIndex].forEach(function (value, valueIndex) { var p = { @@ -3343,7 +3376,7 @@ var LineChart = function (_BaseChart) { valueIndex: valueIndex, meta: getMetaData(series, valueIndex) }); - }.bind(this)); + }); var seriesOptions = { lineSmooth: getSeriesOption(series, options, 'lineSmooth'), @@ -3353,7 +3386,13 @@ var LineChart = function (_BaseChart) { areaBase: getSeriesOption(series, options, 'areaBase') }; - var smoothing = typeof seriesOptions.lineSmooth === 'function' ? seriesOptions.lineSmooth : seriesOptions.lineSmooth ? monotoneCubic() : none(); + var smoothing = void 0; + if (typeof seriesOptions.lineSmooth === 'function') { + smoothing = seriesOptions.lineSmooth; + } else { + smoothing = seriesOptions.lineSmooth ? monotoneCubic() : none(); + } + // Interpolating path where pathData will be used to annotate each path element so we can trace back the original // index, value and meta data var path = smoothing(pathCoordinates, pathData); @@ -3374,7 +3413,7 @@ var LineChart = function (_BaseChart) { 'ct:meta': serialize(pathElement.data.meta) }); - this.eventEmitter.emit('draw', { + _this2.eventEmitter.emit('draw', { type: 'point', value: pathElement.data.value, index: pathElement.data.valueIndex, @@ -3388,7 +3427,7 @@ var LineChart = function (_BaseChart) { x: pathElement.x, y: pathElement.y }); - }.bind(this)); + }); } if (seriesOptions.showLine) { @@ -3396,11 +3435,12 @@ var LineChart = function (_BaseChart) { d: path.stringify() }, options.classNames.line, true); - this.eventEmitter.emit('draw', { + _this2.eventEmitter.emit('draw', { type: 'line', values: data.normalized.series[seriesIndex], path: path.clone(), chartRect: chartRect, + // TODO: Remove redundant index: seriesIndex, series: series, seriesIndex: seriesIndex, @@ -3414,53 +3454,58 @@ var LineChart = function (_BaseChart) { // Area currently only works with axes that support a range! if (seriesOptions.showArea && axisY.range) { - // If areaBase is outside the chart area (< min or > max) we need to set it respectively so that - // the area is not drawn outside the chart area. - var areaBase = Math.max(Math.min(seriesOptions.areaBase, axisY.range.max), axisY.range.min); + (function () { + // If areaBase is outside the chart area (< min or > max) we need to set it respectively so that + // the area is not drawn outside the chart area. + var areaBase = Math.max(Math.min(seriesOptions.areaBase, axisY.range.max), axisY.range.min); - // We project the areaBase value into screen coordinates - var areaBaseProjected = chartRect.y1 - axisY.projectValue(areaBase); + // We project the areaBase value into screen coordinates + var areaBaseProjected = chartRect.y1 - axisY.projectValue(areaBase); - // In order to form the area we'll first split the path by move commands so we can chunk it up into segments - path.splitByCommand('M').filter(function onlySolidSegments(pathSegment) { + // In order to form the area we'll first split the path by move commands so we can chunk it up into segments + path.splitByCommand('M') // We filter only "solid" segments that contain more than one point. Otherwise there's no need for an area - return pathSegment.pathElements.length > 1; - }).map(function convertToArea(solidPathSegments) { - // Receiving the filtered solid path segments we can now convert those segments into fill areas - var firstElement = solidPathSegments.pathElements[0]; - var lastElement = solidPathSegments.pathElements[solidPathSegments.pathElements.length - 1]; - - // Cloning the solid path segment with closing option and removing the first move command from the clone - // We then insert a new move that should start at the area base and draw a straight line up or down - // at the end of the path we add an additional straight line to the projected area base value - // As the closing option is set our path will be automatically closed - return solidPathSegments.clone(true).position(0).remove(1).move(firstElement.x, areaBaseProjected).line(firstElement.x, firstElement.y).position(solidPathSegments.pathElements.length + 1).line(lastElement.x, areaBaseProjected); - }).forEach(function createArea(areaPath) { - // For each of our newly created area paths, we'll now create path elements by stringifying our path objects - // and adding the created DOM elements to the correct series group - var area = seriesElement.elem('path', { - d: areaPath.stringify() - }, options.classNames.area, true); - - // Emit an event for each area that was drawn - this.eventEmitter.emit('draw', { - type: 'area', - values: data.normalized.series[seriesIndex], - path: areaPath.clone(), - series: series, - seriesIndex: seriesIndex, - axisX: axisX, - axisY: axisY, - chartRect: chartRect, - index: seriesIndex, - group: seriesElement, - element: area + .filter(function (pathSegment) { + return pathSegment.pathElements.length > 1; + }).map(function (solidPathSegments) { + // Receiving the filtered solid path segments we can now convert those segments into fill areas + var firstElement = solidPathSegments.pathElements[0]; + var lastElement = solidPathSegments.pathElements[solidPathSegments.pathElements.length - 1]; + + // Cloning the solid path segment with closing option and removing the first move command from the clone + // We then insert a new move that should start at the area base and draw a straight line up or down + // at the end of the path we add an additional straight line to the projected area base value + // As the closing option is set our path will be automatically closed + return solidPathSegments.clone(true).position(0).remove(1).move(firstElement.x, areaBaseProjected).line(firstElement.x, firstElement.y).position(solidPathSegments.pathElements.length + 1).line(lastElement.x, areaBaseProjected); + }).forEach(function (areaPath) { + // For each of our newly created area paths, we'll now create path elements by stringifying our path objects + // and adding the created DOM elements to the correct series group + var area = seriesElement.elem('path', { + d: areaPath.stringify() + }, options.classNames.area, true); + + // Emit an event for each area that was drawn + _this2.eventEmitter.emit('draw', { + type: 'area', + values: data.normalized.series[seriesIndex], + path: areaPath.clone(), + series: series, + seriesIndex: seriesIndex, + axisX: axisX, + axisY: axisY, + chartRect: chartRect, + // TODO: Remove redundant + index: seriesIndex, + group: seriesElement, + element: area + }); }); - }.bind(this)); + })(); } - }.bind(this)); + }); this.eventEmitter.emit('created', { + // TODO: Remove redundant bounds: axisY.bounds, chartRect: chartRect, axisX: axisX, @@ -3629,8 +3674,11 @@ var BarChart = function (_BaseChart) { _createClass(BarChart, [{ key: 'createChart', value: function createChart(options) { - var data; - var highLow; + var _arguments = arguments, + _this2 = this; + + var data = void 0; + var highLow = void 0; if (options.distributeSeries) { data = normalizeData(this.data, options.reverseData, options.horizontalBars ? 'x' : 'y'); @@ -3650,10 +3698,9 @@ var BarChart = function (_BaseChart) { var labelGroup = this.svg.elem('g').addClass(options.classNames.labelGroup); if (options.stackBars && data.normalized.series.length !== 0) { - // If stacked bars we need to calculate the high low from stacked values from each series - var serialSums = serialMap(data.normalized.series, function serialSums() { - return Array.prototype.slice.call(arguments).map(function (value) { + var serialSums = serialMap(data.normalized.series, function () { + return Array.from(_arguments).map(function (value) { return value; }).reduce(function (prev, curr) { return { @@ -3665,7 +3712,6 @@ var BarChart = function (_BaseChart) { highLow = getHighLow([serialSums], options, options.horizontalBars ? 'x' : 'y'); } else { - highLow = getHighLow(data.normalized.series, options, options.horizontalBars ? 'x' : 'y'); } @@ -3674,8 +3720,11 @@ var BarChart = function (_BaseChart) { highLow.low = +options.low || (options.low === 0 ? 0 : highLow.low); var chartRect = createChartRect(this.svg, options, defaultOptions$2.padding); - - var valueAxis, labelAxisTicks, labelAxis, axisX, axisY; + var valueAxis = void 0; + var labelAxisTicks = void 0; + var labelAxis = void 0; + var axisX = void 0; + var axisY = void 0; // We need to set step count based on some options combinations if (options.distributeSeries && options.stackBars) { @@ -3725,7 +3774,7 @@ var BarChart = function (_BaseChart) { referenceValue: 0 })); } else { - valueAxis = axisY = new options.axisY.type(axisUnits.units.y, data.normalized.series, chartRect, extend({}, options.axisY, { + valueAxis = axisY = new options.axisY.type(axisUnits.y, data.normalized.series, chartRect, extend({}, options.axisY, { highLow: highLow, referenceValue: 0 })); @@ -3749,9 +3798,7 @@ var BarChart = function (_BaseChart) { // Calculating bi-polar value of index for seriesOffset. For i = 0..4 biPol will be -1.5, -0.5, 0.5, 1.5 etc. var biPol = seriesIndex - (data.raw.series.length - 1) / 2; // Half of the period width between vertical grid lines used to position bars - var periodHalfLength; - // Current series SVG element - var seriesElement; + var periodHalfLength = void 0; // We need to set periodHalfLength based on some options combinations if (options.distributeSeries && !options.stackBars) { @@ -3768,7 +3815,7 @@ var BarChart = function (_BaseChart) { } // Adding the series group to the series element - seriesElement = seriesGroup.elem('g'); + var seriesElement = seriesGroup.elem('g'); // Write attributes to series group element. If series name or meta is undefined the attributes will not be written seriesElement.attr({ @@ -3780,8 +3827,7 @@ var BarChart = function (_BaseChart) { seriesElement.addClass([options.classNames.series, series.className || options.classNames.series + '-' + alphaNumerate(seriesIndex)].join(' ')); data.normalized.series[seriesIndex].forEach(function (value, valueIndex) { - var projected, bar, previousStack, labelAxisValueIndex; - + var labelAxisValueIndex = void 0; // We need to set labelAxisValueIndex based on some options combinations if (options.distributeSeries && !options.stackBars) { // If distributed series are enabled but stacked bars aren't, we can use the seriesIndex for later projection @@ -3796,6 +3842,7 @@ var BarChart = function (_BaseChart) { labelAxisValueIndex = valueIndex; } + var projected = void 0; // We need to transform coordinates differently based on the chart layout if (options.horizontalBars) { projected = { @@ -3823,7 +3870,7 @@ var BarChart = function (_BaseChart) { } // Enter value in stacked bar values used to remember previous screen value for stacking up bars - previousStack = stackedBarValues[valueIndex] || zeroPoint; + var previousStack = stackedBarValues[valueIndex] || zeroPoint; stackedBarValues[valueIndex] = previousStack - (zeroPoint - projected[labelAxis.counterUnits.pos]); // Skip if value is undefined @@ -3858,12 +3905,12 @@ var BarChart = function (_BaseChart) { var metaData = getMetaData(series, valueIndex); // Create bar element - bar = seriesElement.elem('line', positions, options.classNames.bar).attr({ + var bar = seriesElement.elem('line', positions, options.classNames.bar).attr({ 'ct:value': [value.x, value.y].filter(isNumeric).join(','), 'ct:meta': serialize(metaData) }); - this.eventEmitter.emit('draw', extend({ + _this2.eventEmitter.emit('draw', extend({ type: 'bar', value: value, index: valueIndex, @@ -3876,8 +3923,8 @@ var BarChart = function (_BaseChart) { group: seriesElement, element: bar }, positions)); - }.bind(this)); - }.bind(this)); + }); + }); this.eventEmitter.emit('created', { bounds: valueAxis.bounds, @@ -4046,25 +4093,22 @@ var PieChart = function (_BaseChart) { _createClass(PieChart, [{ key: 'createChart', value: function createChart(options) { + var _this2 = this; + var data = normalizeData(this.data); - var seriesGroups = [], - labelsGroup, - chartRect, - radius, - labelRadius, - totalDataSum, - startAngle = options.startAngle; + var seriesGroups = []; + var labelsGroup = void 0; + var labelRadius = void 0; + var startAngle = options.startAngle; // Create SVG.js draw this.svg = createSvg(this.container, options.width, options.height, options.donut ? options.classNames.chartDonut : options.classNames.chartPie); // Calculate charting rect - chartRect = createChartRect(this.svg, options, defaultOptions$3.padding); + var chartRect = createChartRect(this.svg, options, defaultOptions$3.padding); // Get biggest circle radius possible within chartRect - radius = Math.min(chartRect.width() / 2, chartRect.height() / 2); + var radius = Math.min(chartRect.width() / 2, chartRect.height() / 2); // Calculate total of all series to get reference value or use total reference from optional options - totalDataSum = options.total || data.normalized.series.reduce(function (previousValue, currentValue) { - return previousValue + currentValue; - }, 0); + var totalDataSum = options.total || data.normalized.series.reduce(sum, 0); var donutWidth = quantity(options.donutWidth); if (donutWidth.unit === '%') { @@ -4104,9 +4148,9 @@ var PieChart = function (_BaseChart) { // Creating the series groups data.raw.series.forEach(function (series, index) { - seriesGroups[index] = this.svg.elem('g', null, null); - }.bind(this)); - //if we need to show labels we create the label group now + return seriesGroups[index] = _this2.svg.elem('g', null, null); + }); + // if we need to show labels we create the label group now if (options.showLabel) { labelsGroup = this.svg.elem('g', null, null); } @@ -4115,7 +4159,9 @@ var PieChart = function (_BaseChart) { // initialize series groups data.raw.series.forEach(function (series, index) { // If current value is zero and we are ignoring empty values then skip to next value - if (data.normalized.series[index] === 0 && options.ignoreEmptyValues) return; + if (data.normalized.series[index] === 0 && options.ignoreEmptyValues) { + return; + } // If the series is an object and contains a name or meta data we add a custom attribute seriesGroups[index].attr({ @@ -4137,8 +4183,8 @@ var PieChart = function (_BaseChart) { endAngle = overlappigStartAngle + 359.99; } - var start = polarToCartesian(center.x, center.y, radius, overlappigStartAngle), - end = polarToCartesian(center.x, center.y, radius, endAngle); + var start = polarToCartesian(center.x, center.y, radius, overlappigStartAngle); + var end = polarToCartesian(center.x, center.y, radius, endAngle); // Create a new path element for the pie chart. If this isn't a donut chart we should close the path for a correct stroke var path = new SvgPath(!options.donut).move(end.x, end.y).arc(radius, radius, 0, endAngle - startAngle > 180, 0, start.x, start.y); @@ -4168,7 +4214,7 @@ var PieChart = function (_BaseChart) { } // Fire off draw event - this.eventEmitter.emit('draw', { + _this2.eventEmitter.emit('draw', { type: 'slice', value: data.normalized.series[index], totalDataSum: totalDataSum, @@ -4186,7 +4232,8 @@ var PieChart = function (_BaseChart) { // If we need to show labels we need to add the label for this slice now if (options.showLabel) { - var labelPosition; + var labelPosition = void 0; + if (data.raw.series.length === 1) { // If we have only 1 series, we can position the label in the center of the pie labelPosition = { @@ -4198,7 +4245,7 @@ var PieChart = function (_BaseChart) { labelPosition = polarToCartesian(center.x, center.y, labelRadius, startAngle + (endAngle - startAngle) / 2); } - var rawValue; + var rawValue = void 0; if (data.normalized.labels && !isFalseyButZero(data.normalized.labels[index])) { rawValue = data.normalized.labels[index]; } else { @@ -4215,7 +4262,7 @@ var PieChart = function (_BaseChart) { }, options.classNames.label).text('' + interpolatedValue); // Fire off draw event - this.eventEmitter.emit('draw', { + _this2.eventEmitter.emit('draw', { type: 'label', index: index, group: labelsGroup, @@ -4230,7 +4277,7 @@ var PieChart = function (_BaseChart) { // Set next startAngle to current endAngle. // (except for last slice) startAngle = endAngle; - }.bind(this)); + }); this.eventEmitter.emit('created', { chartRect: chartRect, @@ -4243,6 +4290,6 @@ var PieChart = function (_BaseChart) { return PieChart; }(BaseChart); -export { interpolation as Interpolation, EventEmitter, extend, optionsProvider, namespaces, precision, escapingMap, version, replaceAll, querySelector$1 as querySelector, safeHasProperty, isNumeric, isFalseyButZero, getNumberOrUndefined, ensureUnit, quantity, alphaNumerate, noop, times, sum, mapMultiply, mapAdd, serialMap, orderOfMagnitude, projectLength, roundWithPrecision, rho, polarToCartesian, serialize, deserialize, normalizeData, getMetaData, isDataHoleValue, reverseData, getDataArray, isMultiValue, getMultiValue, getSeriesOption, splitIntoSegments, getHighLow, getBounds, createSvg, normalizePadding, createChartRect, createGrid, createGridBackground, createLabel, BaseChart, LineChart, BarChart, PieChart, Axis, axisUnits, AutoScaleAxis, FixedScaleAxis, StepAxis, Svg, isSupported, easings, SvgList, SvgPath }; +export { interpolation as Interpolation, EventEmitter, extend, optionsProvider, namespaces, precision, escapingMap, version, replaceAll, querySelector$1 as querySelector, safeHasProperty, isNumeric, isFalseyButZero, getNumberOrUndefined, ensureUnit, quantity, alphaNumerate, noop, times, sum, serialMap, EPSILON, orderOfMagnitude, projectLength, roundWithPrecision, rho, polarToCartesian, serialize, deserialize, normalizeData, getMetaData, isDataHoleValue, reverseData, getDataArray, isMultiValue, getMultiValue, getSeriesOption, splitIntoSegments, getHighLow, getBounds, createSvg, normalizePadding, createChartRect, createGrid, createGridBackground, createLabel, BaseChart, LineChart, BarChart, PieChart, Axis, axisUnits, AutoScaleAxis, FixedScaleAxis, StepAxis, Svg, isSupported, easings, SvgList, SvgPath }; //# sourceMappingURL=chartist.esm.js.map \ No newline at end of file diff --git a/dist/chartist.esm.js.map b/dist/chartist.esm.js.map index b231d866..4bd851fb 100644 --- a/dist/chartist.esm.js.map +++ b/dist/chartist.esm.js.map @@ -1 +1 @@ -{"version":3,"sources":["../package.json!file:/home/gion/Code/chartist/tooling/system-loaders/package.json","../src/core/globals.js","../src/core/lang.js","../src/core/functional.js","../src/core/math.js","../src/core/extend.js","../src/core/data.js","../jspm_packages/npm/systemjs-plugin-babel@0.0.16/babel-helpers/classCallCheck.js","../jspm_packages/npm/systemjs-plugin-babel@0.0.16/babel-helpers/createClass.js","../src/svg/svg-list.js","../src/svg/svg.js","../src/core/creation.js","../src/core/options-provider.js","../src/event/event-emitter.js","../src/charts/base.js","../jspm_packages/npm/systemjs-plugin-babel@0.0.16/babel-helpers/possibleConstructorReturn.js","../jspm_packages/npm/systemjs-plugin-babel@0.0.16/babel-helpers/inherits.js","../src/axes/axis.js","../jspm_packages/npm/systemjs-plugin-babel@0.0.16/babel-helpers/get.js","../src/axes/auto-scale-axis.js","../src/axes/fixed-scale-axis.js","../src/axes/step-axis.js","../src/svg/svg-path.js","../src/interpolation/none.js","../src/interpolation/simple.js","../src/interpolation/step.js","../src/interpolation/cardinal.js","../src/interpolation/monotone-cubic.js","../src/charts/line.js","../src/charts/bar.js","../src/charts/pie.js"],"names":["version","namespaces","precision","escapingMap","replaceAll","str","subStr","newSubStr","replace","RegExp","querySelector","query","Node","document","safeHasProperty","object","property","hasOwnProperty","isNumeric","value","isFinite","isFalseyButZero","getNumberOrUndefined","undefined","ensureUnit","unit","quantity","input","match","exec","alphaNumerate","n","String","fromCharCode","noop","times","length","Array","apply","sum","previous","current","mapMultiply","factor","num","mapAdd","addend","serialMap","arr","cb","result","Math","max","map","e","forEach","index","args","orderOfMagnitude","floor","log","abs","LN10","projectLength","axisLength","bounds","range","roundWithPrecision","digits","pow","round","rho","gcd","p","q","f","x","x1","x2","divisor","polarToCartesian","centerX","centerY","radius","angleInDegrees","angleInRadians","PI","cos","sin","extend","target","i","source","sourceProp","arguments","prop","serialize","data","JSON","stringify","Object","keys","reduce","key","deserialize","parse","normalizeData","reverse","multi","labelCount","output","normalized","series","getDataArray","every","labels","slice","prototype","push","getMetaData","meta","isDataHoleValue","isNaN","reverseData","recursiveConvert","multiValue","y","isMultiValue","getMultiValue","dimension","getSeriesOption","options","name","seriesOptions","splitIntoSegments","pathCoordinates","valueData","defaultOptions","segments","hole","fillHoles","increasingX","getHighLow","toUpperCase","highLow","high","Number","MAX_VALUE","low","findHigh","findLow","recursiveHighLow","referenceValue","min","getBounds","scaleMinSpace","onlyInteger","optimizationCounter","newMin","newMax","valueRange","oom","step","ceil","numberOfSteps","scaleUp","smallestFactor","Error","EPSILON","safeIncrement","increment","values","instance","Constructor","TypeError","defineProperties","props","descriptor","enumerable","configurable","writable","defineProperty","protoProps","staticProps","SvgList","nodeList","list","svgElements","Svg","filter","prototypeProperty","indexOf","call","element","attributes","className","parent","insertFirst","Element","_node","createElementNS","svg","attr","ct","addClass","firstChild","insertBefore","appendChild","ns","getAttributeNS","getAttribute","namespacedAttribute","split","setAttributeNS","setAttribute","bind","parentNode","SVGElement","node","nodeName","selector","foundNode","foundNodes","querySelectorAll","content","container","createElement","innerHTML","xmlns","fnObj","elem","t","createTextNode","removeChild","newElement","replaceChild","trim","names","classes","concat","pos","self","join","removedClasses","getBoundingClientRect","height","width","animations","guided","eventEmitter","createAnimateForAttributes","attribute","createAnimate","animationDefinition","attributeProperties","animate","timeout","animationEasing","easing","easings","begin","dur","calcMode","keySplines","keyTimes","fill","from","beginElement","err","to","remove","addEventListener","handleBeginEvent","emit","handleEndEvent","isSupported","feature","implementation","hasFeature","createSvg","filterChartistSvgObjects","removePreviousElement","normalizePadding","padding","fallback","top","right","bottom","left","createChartRect","fallbackPadding","hasAxis","axisX","axisY","yAxisOffset","offset","xAxisOffset","normalizedPadding","chartPadding","chartRect","y1","y2","position","createGrid","axis","group","positionalData","units","counterUnits","gridElement","createGridBackground","gridGroup","gridBackground","createLabel","axisOffset","labelOffset","useForeignObject","labelElement","len","foreignObject","text","optionsProvider","responsiveOptions","baseOptions","currentOptions","mediaQueryListeners","updateCurrentOptions","mediaEvent","previousOptions","mql","window","matchMedia","matches","removeMediaQueryListeners","removeListener","addListener","getCurrentOptions","EventEmitter","handlers","event","handler","splice","starHandler","BaseChart","supportsForeignObject","supportsAnimations","resizeListener","update","__chartist__","detach","initializeTimeoutId","setTimeout","initialize","override","createChart","removeEventListener","clearTimeout","addEventHandler","removeEventHandler","plugins","plugin","ReferenceError","subClass","superClass","create","setPrototypeOf","__proto__","axisUnits","Axis","ticks","rectEnd","rectStart","gridOffset","rectOffset","labelGroup","chartOptions","axisOptions","projectedValues","projectValue","labelValues","labelInterpolationFnc","projectedValue","labelLength","showGrid","classNames","grid","dir","showLabel","label","get","receiver","Function","desc","getOwnPropertyDescriptor","getPrototypeOf","getter","AutoScaleAxis","axisUnit","FixedScaleAxis","sort","a","b","stepLength","StepAxis","calc","stretch","elementDescriptions","command","params","pathElements","relative","pathElement","toLowerCase","forEachParam","pathElementIndex","paramName","paramIndex","SvgPath","paths","close","joinedPath","path","j","count","rx","ry","xAr","lAf","sf","chunks","pop","elements","chunk","shift","description","spliceArgs","accuracyMultiplier","accuracy","transformFnc","transformed","c","cloneElements","none","currX","currY","currData","move","line","simple","d","prevX","prevY","prevData","curve","postpone","cardinal","tension","segment","z","iLen","monotoneCubic","xs","ys","ms","ds","dys","dxs","LineChart","chart","seriesGroup","type","fullWidth","createGridAndLabels","showGridBackground","raw","seriesIndex","seriesElement","pathData","valueIndex","smoothing","lineSmooth","showPoint","point","showLine","clone","showArea","areaBase","areaBaseProjected","splitByCommand","onlySolidSegments","pathSegment","convertToArea","solidPathSegments","firstElement","lastElement","createArea","areaPath","area","BarChart","distributeSeries","horizontalBars","stackBars","serialSums","prev","curr","valueAxis","labelAxisTicks","labelAxis","zeroPoint","stackedBarValues","biPol","periodHalfLength","projected","bar","previousStack","labelAxisValueIndex","seriesBarDistance","positions","stackMode","metaData","determineAnchorPosition","center","direction","toTheRight","PieChart","seriesGroups","labelsGroup","labelRadius","totalDataSum","startAngle","donut","chartDonut","chartPie","total","previousValue","currentValue","donutWidth","labelPosition","hasSingleValInSeries","val","ignoreEmptyValues","endAngle","overlappigStartAngle","start","end","arc","sliceDonut","slicePie","rawValue","interpolatedValue","labelDirection"],"mappings":"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","file":"chartist.esm.js"} \ No newline at end of file +{"version":3,"sources":["../package.json!file:/home/gion/Code/chartist/tooling/system-loaders/package.json","../src/core/globals.js","../src/core/lang.js","../jspm_packages/npm/systemjs-plugin-babel@0.0.16/babel-helpers/toConsumableArray.js","../src/core/functional.js","../src/core/math.js","../src/core/extend.js","../src/core/data.js","../jspm_packages/npm/systemjs-plugin-babel@0.0.16/babel-helpers/classCallCheck.js","../jspm_packages/npm/systemjs-plugin-babel@0.0.16/babel-helpers/createClass.js","../src/svg/svg-list.js","../src/svg/svg.js","../src/core/creation.js","../src/core/options-provider.js","../src/event/event-emitter.js","../src/charts/base.js","../jspm_packages/npm/systemjs-plugin-babel@0.0.16/babel-helpers/possibleConstructorReturn.js","../jspm_packages/npm/systemjs-plugin-babel@0.0.16/babel-helpers/inherits.js","../src/axes/axis.js","../jspm_packages/npm/systemjs-plugin-babel@0.0.16/babel-helpers/get.js","../src/axes/auto-scale-axis.js","../src/axes/fixed-scale-axis.js","../src/axes/step-axis.js","../src/svg/svg-path.js","../src/interpolation/none.js","../src/interpolation/simple.js","../src/interpolation/step.js","../src/interpolation/cardinal.js","../src/interpolation/monotone-cubic.js","../src/charts/line.js","../src/charts/bar.js","../src/charts/pie.js"],"names":["version","namespaces","precision","escapingMap","replaceAll","str","subStr","newSubStr","replace","RegExp","querySelector","query","Node","document","safeHasProperty","object","property","hasOwnProperty","isNumeric","value","isFinite","isFalseyButZero","getNumberOrUndefined","undefined","ensureUnit","unit","quantity","input","match","exec","alphaNumerate","n","String","fromCharCode","arr","Array","isArray","i","arr2","length","from","noop","times","sum","previous","current","serialMap","array","callback","Math","max","map","element","inner","index","EPSILON","orderOfMagnitude","floor","log","abs","LN10","projectLength","axisLength","bounds","range","roundWithPrecision","digits","pow","globalPrecision","round","rho","num","gcd","p","q","f","x","x1","x2","divisor","polarToCartesian","centerX","centerY","radius","angleInDegrees","angleInRadians","PI","cos","sin","extend","target","sources","source","prop","sourceProp","serialize","data","JSON","stringify","Object","keys","reduce","result","key","deserialize","parse","e","normalizeData","reverse","multi","labelCount","output","normalized","series","getDataArray","every","labels","slice","push","getMetaData","meta","isDataHoleValue","isNaN","reverseData","recursiveConvert","multiValue","y","isMultiValue","getMultiValue","dimension","getSeriesOption","options","name","seriesOptions","splitIntoSegments","pathCoordinates","valueData","defaultOptions","segments","hole","fillHoles","increasingX","getHighLow","toUpperCase","highLow","high","Number","MAX_VALUE","low","findHigh","findLow","recursiveHighLow","sourceData","referenceValue","min","getBounds","scaleMinSpace","onlyInteger","valueRange","oom","step","ceil","numberOfSteps","scaleUp","smallestFactor","optimizationCounter","Error","safeIncrement","increment","newMin","newMax","values","instance","Constructor","TypeError","defineProperties","props","descriptor","enumerable","configurable","writable","defineProperty","protoProps","staticProps","prototype","SvgList","nodeList","list","svgElements","Svg","filter","prototypeProperty","indexOf","forEach","args","apply","attributes","className","parent","insertFirst","Element","_node","createElementNS","svg","attr","ct","addClass","firstChild","insertBefore","appendChild","ns","getAttributeNS","getAttribute","namespacedAttribute","split","setAttributeNS","setAttribute","bind","parentNode","SVGElement","node","nodeName","selector","foundNode","foundNodes","querySelectorAll","content","container","createElement","innerHTML","xmlns","fnObj","elem","t","createTextNode","removeChild","newElement","replaceChild","trim","names","classes","concat","pos","self","join","removedClasses","getBoundingClientRect","height","width","animations","guided","eventEmitter","attribute","createAnimate","animationDefinition","createGuided","attributeProperties","animationEasing","timeout","easing","easings","begin","dur","calcMode","keySplines","keyTimes","fill","animate","beginElement","err","to","remove","addEventListener","emit","isSupported","feature","implementation","hasFeature","createSvg","normalizePadding","padding","fallback","top","right","bottom","left","createChartRect","fallbackPadding","hasAxis","axisX","axisY","yAxisOffset","offset","xAxisOffset","normalizedPadding","chartPadding","chartRect","y1","y2","position","createGrid","axis","group","positionalData","units","counterUnits","gridElement","createGridBackground","gridGroup","gridBackground","createLabel","axisOffset","labelOffset","useForeignObject","labelElement","len","stepLength","stepCounterLength","foreignObject","text","optionsProvider","responsiveOptions","baseOptions","currentOptions","mediaQueryListeners","updateCurrentOptions","mediaEvent","previousOptions","responsiveOption","mql","window","matchMedia","matches","removeMediaQueryListeners","removeListener","addListener","EventEmitter","handlers","event","handler","splice","starHandler","BaseChart","supportsForeignObject","supportsAnimations","resizeListener","update","__chartist__","detach","initializeTimeoutId","setTimeout","initialize","override","createChart","getCurrentOptions","removeEventListener","clearTimeout","addEventHandler","removeEventHandler","plugins","plugin","call","ReferenceError","subClass","superClass","create","setPrototypeOf","__proto__","axisUnits","Axis","ticks","rectEnd","rectStart","gridOffset","rectOffset","labelGroup","chartOptions","axisOptions","projectedValues","projectValue","labelValues","labelInterpolationFnc","projectedValue","labelLength","showGrid","classNames","grid","dir","showLabel","label","end","get","receiver","Function","desc","getOwnPropertyDescriptor","getPrototypeOf","getter","AutoScaleAxis","axisUnit","FixedScaleAxis","sort","a","b","StepAxis","calc","stretch","elementDescriptions","command","params","pathElements","relative","pathElement","toLowerCase","forEachParam","cb","pathElementIndex","paramName","paramIndex","SvgPath","paths","close","joinedPath","path","j","count","rx","ry","xAr","lAf","sf","chunks","pop","elements","chunk","shift","description","accuracyMultiplier","accuracy","transformFnc","transformed","clone","none","noneInterpolation","currX","currY","currData","move","line","simple","d","simpleInterpolation","prevX","prevY","prevData","curve","stepInterpolation","postpone","cardinal","tension","c","cardinalInterpolation","segment","z","iLen","monotoneCubic","monotoneCubicInterpolation","xs","ys","ms","ds","dys","dxs","LineChart","chart","seriesGroup","type","fullWidth","createGridAndLabels","showGridBackground","raw","seriesIndex","seriesElement","pathData","valueIndex","smoothing","lineSmooth","showPoint","point","showLine","showArea","areaBase","areaBaseProjected","splitByCommand","pathSegment","solidPathSegments","firstElement","lastElement","areaPath","area","BarChart","distributeSeries","horizontalBars","stackBars","serialSums","prev","curr","valueAxis","labelAxisTicks","labelAxis","zeroPoint","stackedBarValues","biPol","periodHalfLength","labelAxisValueIndex","projected","seriesBarDistance","previousStack","positions","stackMode","metaData","bar","determineAnchorPosition","center","direction","toTheRight","PieChart","seriesGroups","labelsGroup","labelRadius","startAngle","donut","chartDonut","chartPie","totalDataSum","total","donutWidth","labelPosition","hasSingleValInSeries","val","ignoreEmptyValues","endAngle","overlappigStartAngle","start","arc","sliceDonut","slicePie","rawValue","interpolatedValue","labelDirection"],"mappings":"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","file":"chartist.esm.js"} \ No newline at end of file diff --git a/dist/chartist.umd.js b/dist/chartist.umd.js index ea9f9ab1..66bdda63 100644 --- a/dist/chartist.umd.js +++ b/dist/chartist.umd.js @@ -1,9 +1,9 @@ /* Chartist.js 1.0.0 * Copyright © 2016 Gion Kunz * Free to use under either the WTFPL license or the MIT license. - * https://raw.githubusercontent.com/gionkunz/chartist-js/master/LICENSE-WTFPL - * https://raw.githubusercontent.com/gionkunz/chartist-js/master/LICENSE-MIT + * https://raw.githubusercontent.com/chartist-js/chartist/master/LICENSE-WTFPL + * https://raw.githubusercontent.com/chartist-js/chartist/master/LICENSE-MIT */ -!function(a,b){"object"==typeof exports&&"undefined"!=typeof module?b(exports):"function"==typeof define&&define.amd?define(["exports"],b):b(a.Chartist=a.Chartist||{})}(this,function(a){"use strict";function b(a,b,c){return a.replace(new RegExp(b,"g"),c)}function c(a){return a instanceof Node?a:document.querySelector(a)}function d(a,b){return null!==a&&"object"==typeof a&&a.hasOwnProperty(b)}function e(a){return null!==a&&isFinite(a)}function f(a){return!a&&0!==a}function g(a){return e(a)?+a:void 0}function h(a,b){return"number"==typeof a&&(a+=b),a}function i(a){if("string"==typeof a){var b=/^(\d+)\s*(.*)$/g.exec(a);return{value:+b[1],unit:b[2]||void 0}}return{value:a}}function j(a){return String.fromCharCode(97+a%26)}function k(a){return a}function l(a){return Array.apply(null,new Array(a))}function m(a,b){return a+(b?b:0)}function n(a){return function(b){return b*a}}function o(a){return function(b){return b+a}}function p(a,b){var c=[],d=Math.max.apply(null,a.map(function(a){return a.length}));return l(d).forEach(function(d,e){var f=a.map(function(a){return a[e]});c[e]=b.apply(null,f)}),c}function q(a){return Math.floor(Math.log(Math.abs(a))/Math.LN10)}function r(a,b,c){return b/c.range*a}function s(a,b){var c=Math.pow(10,b||c);return Math.round(a*c)/c}function t(a){function b(a,c){return a%c===0?c:b(c,a%c)}function c(a){return a*a+1}if(1===a)return a;var d,e=2,f=2;if(a%2===0)return 2;do e=c(e)%a,f=c(c(f))%a,d=b(Math.abs(e-f),a);while(1===d);return d}function u(a,b,c,d){var e=(d-90)*Math.PI/180;return{x:a+c*Math.cos(e),y:b+c*Math.sin(e)}}function v(a){var b,c,d;for(a=a||{},b=1;b=2&&a[g]<=a[g-2]&&(f=!0),f&&(e.push({pathCoordinates:[],valueData:[]}),f=!1),e[e.length-1].pathCoordinates.push(a[g],a[g+1]),e[e.length-1].valueData.push(b[g/2]));return e}function H(a,b,c){function d(a){if(void 0!==a)if(a instanceof Array)for(var b=0;be.high&&(e.high=h),g&&h0?e.low=0:(e.high=1,e.low=0)),e}function I(a,b,c,d){function e(a,b){return a===(a+=b)&&(a*=1+(b>0?n:-n)),a}var f,g,h,i=0,j={high:b.high,low:b.low};j.valueRange=j.high-j.low,j.oom=q(j.valueRange),j.step=Math.pow(10,j.oom),j.min=Math.floor(j.low/j.step)*j.step,j.max=Math.ceil(j.high/j.step)*j.step,j.range=j.max-j.min,j.numberOfSteps=Math.round(j.range/j.step);var k=r(a,j.step,j),l=k=c)j.step=1;else if(d&&m=c)j.step=m;else for(;;){if(l&&r(a,j.step,j)<=c)j.step*=2;else{if(l||!(r(a,j.step/2,j)>=c))break;if(j.step/=2,d&&j.step%1!==0){j.step*=2;break}}if(i++>1e3)throw new Error("Exceeded maximum number of iterations while optimizing scale step!")}var n=2.221e-16;for(j.step=Math.max(j.step,n),g=j.min,h=j.max;g+j.step<=j.low;)g=e(g,j.step);for(;h-j.step>=j.high;)h=e(h,-j.step);j.min=g,j.max=h,j.range=j.max-j.min;var o=[];for(f=j.min;f<=j.max;f=e(f,j.step)){var p=s(f);p!==o[o.length-1]&&o.push(f)}return j.values=o,j}function J(a){return document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#"+a,"1.1")}function K(a,b,c,d){var e;return b=b||"100%",c=c||"100%",Array.prototype.slice.call(a.querySelectorAll("svg")).filter(function(a){return a.getAttributeNS($.xmlns,"ct")}).forEach(function(b){a.removeChild(b)}),e=new ea("svg").attr({width:b,height:c}).addClass(d).attr({style:"width: "+b+"; height: "+c+";"}),a.appendChild(e._node),e}function L(a,b){return b=b||0,"number"==typeof a?{top:a,right:a,bottom:a,left:a}:{top:"number"==typeof a.top?a.top:b,right:"number"==typeof a.right?a.right:b,bottom:"number"==typeof a.bottom?a.bottom:b,left:"number"==typeof a.left?a.left:b}}function M(a,b,c){var d=!(!b.axisX&&!b.axisY),e=d?b.axisY.offset:0,f=d?b.axisX.offset:0,g=a.width()||i(b.width).value||0,h=a.height()||i(b.height).value||0,j=L(b.chartPadding,c);g=Math.max(g,e+j.left+j.right),h=Math.max(h,f+j.top+j.bottom);var k={padding:j,width:function(){return this.x2-this.x1},height:function(){return this.y1-this.y2}};return d?("start"===b.axisX.position?(k.y2=j.top+f,k.y1=Math.max(h-j.bottom,k.y2+1)):(k.y2=j.top,k.y1=Math.max(h-j.bottom-f,k.y2+1)),"start"===b.axisY.position?(k.x1=j.left+e,k.x2=Math.max(g-j.right,k.x1+1)):(k.x1=j.left,k.x2=Math.max(g-j.right-e,k.x1+1))):(k.x1=j.left,k.x2=Math.max(g-j.right,k.x1+1),k.y2=j.top,k.y1=Math.max(h-j.bottom,k.y2+1)),k}function N(a,b,c,d,e,f,g,h){var i={};i[c.units.pos+"1"]=a,i[c.units.pos+"2"]=a,i[c.counterUnits.pos+"1"]=d,i[c.counterUnits.pos+"2"]=d+e;var j=f.elem("line",i,g.join(" "));h.emit("draw",v({type:"grid",axis:c,index:b,group:f,element:j},i))}function O(a,b,c,d){var e=a.elem("rect",{x:b.x1,y:b.y2,width:b.width(),height:b.height()},c,!0);d.emit("draw",{type:"gridBackground",group:a,element:e})}function P(a,b,c,d,e,f,g,h,i,j,k){var l,m={};if(m[e.units.pos]=a+g[e.units.pos],m[e.counterUnits.pos]=g[e.counterUnits.pos],m[e.units.len]=b,m[e.counterUnits.len]=Math.max(0,f-10),j){var n=''+d[c]+"";l=h.foreignObject(n,v({style:"overflow: visible;"},m))}else l=h.elem("text",m,i.join(" ")).text(d[c]);k.emit("draw",v({type:"label",axis:e,index:c,group:h,element:l,text:d[c]},m))}function Q(a,b,c){function d(a){var d=f;if(f=v({},h),b)for(g=0;g1){var h=[];return g.forEach(function(a){h.push(b(a.pathCoordinates,a.valueData))}),sa.join(h)}if(e=g[0].pathCoordinates,f=g[0].valueData,e.length<=4)return T()(e,f);for(var i,j=(new sa).move(e[0],e[1],!1,f[0]),k=0,l=e.length;l-2*!i>k;k+=2){var m=[{x:+e[k-2],y:+e[k-1]},{x:+e[k],y:+e[k+1]},{x:+e[k+2],y:+e[k+3]},{x:+e[k+4],y:+e[k+5]}];i?k?l-4===k?m[3]={x:+e[0],y:+e[1]}:l-2===k&&(m[2]={x:+e[0],y:+e[1]},m[3]={x:+e[2],y:+e[3]}):m[0]={x:+e[l-2],y:+e[l-1]}:l-4===k?m[3]=m[2]:k||(m[0]={x:+e[k],y:+e[k+1]}),j.curve(c*(-m[0].x+6*m[1].x+m[2].x)/6+d*m[2].x,c*(-m[0].y+6*m[1].y+m[2].y)/6+d*m[2].y,c*(m[1].x+6*m[2].x-m[3].x)/6+d*m[2].x,c*(m[1].y+6*m[2].y-m[3].y)/6+d*m[2].y,m[2].x,m[2].y,!1,f[(k+2)/2])}return j}return T()([])}}function X(a){var b={fillHoles:!1};return a=v({},b,a),function b(c,d){var e=G(c,d,{fillHoles:a.fillHoles,increasingX:!0});if(e.length){if(e.length>1){var f=[];return e.forEach(function(a){f.push(b(a.pathCoordinates,a.valueData))}),sa.join(f)}if(c=e[0].pathCoordinates,d=e[0].valueData,c.length<=4)return T()(c,d);var g,h,i=[],j=[],k=c.length/2,l=[],m=[],n=[],o=[];for(g=0;g0!=m[g]>0?l[g]=0:(l[g]=3*(o[g-1]+o[g])/((2*o[g]+o[g-1])/m[g-1]+(o[g]+2*o[g-1])/m[g]),isFinite(l[g])||(l[g]=0));for(h=(new sa).move(i[0],j[0],!1,d[0]),g=0;ga.x;return d&&"explode"===c||!d&&"implode"===c?"start":d&&"implode"===c||!d&&"explode"===c?"end":"middle"}var Z="1.0.0",$={svg:"http://www.w3.org/2000/svg",xmlns:"http://www.w3.org/2000/xmlns/",xhtml:"http://www.w3.org/1999/xhtml",xlink:"http://www.w3.org/1999/xlink",ct:"http://gionkunz.github.com/chartist-js/ct"},_=8,aa={"&":"&","<":"<",">":">",'"':""","'":"'"},ba=function(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")},ca=function(){function a(a,b){for(var c=0;c1}).map(function(a){var b=a.pathElements[0],c=a.pathElements[a.pathElements.length-1];return a.clone(!0).position(0).remove(1).move(b.x,s).line(b.x,b.y).position(a.pathElements.length+1).line(c.x,s)}).forEach(function(e){var g=k.elem("path",{d:e.stringify()},a.classNames.area,!0);this.eventEmitter.emit("draw",{type:"area",values:b.normalized.series[h],path:e.clone(),series:f,seriesIndex:h,axisX:c,axisY:d,chartRect:i,index:h,group:k,element:g})}.bind(this))}}.bind(this)),this.eventEmitter.emit("created",{bounds:d.bounds,chartRect:i,axisX:c,axisY:d,svg:this.svg,options:a})}}]),b}(ha),wa={axisX:{offset:30,position:"end",labelOffset:{x:0,y:0},showLabel:!0,showGrid:!0,labelInterpolationFnc:k,scaleMinSpace:30,onlyInteger:!1},axisY:{offset:40,position:"start",labelOffset:{x:0,y:0},showLabel:!0,showGrid:!0,labelInterpolationFnc:k,scaleMinSpace:20,onlyInteger:!1},width:void 0,height:void 0,high:void 0,low:void 0,referenceValue:0,chartPadding:{top:15,right:15,bottom:5,left:10},seriesBarDistance:15,stackBars:!1,stackMode:"accumulate",horizontalBars:!1,distributeSeries:!1,reverseData:!1,showGridBackground:!1,classNames:{chart:"ct-chart-bar",horizontalBars:"ct-horizontal-bars",label:"ct-label",labelGroup:"ct-labels",series:"ct-series",bar:"ct-bar",grid:"ct-grid",gridGroup:"ct-grids",gridBackground:"ct-grid-background",vertical:"ct-vertical",horizontal:"ct-horizontal",start:"ct-start",end:"ct-end"}},xa=function(a){function b(a,c,d,e){return ba(this,b),ia(this,(b.__proto__||Object.getPrototypeOf(b)).call(this,a,c,wa,v({},wa,d),e))}return ja(b,a),ca(b,[{key:"createChart",value:function(a){var b,c;a.distributeSeries?(b=y(this.data,a.reverseData,a.horizontalBars?"x":"y"),b.normalized.series=b.normalized.series.map(function(a){return[a]})):b=y(this.data,a.reverseData,a.horizontalBars?"x":"y"),this.svg=K(this.container,a.width,a.height,a.classNames.chart+(a.horizontalBars?" "+a.classNames.horizontalBars:""));var d=this.svg.elem("g").addClass(a.classNames.gridGroup),f=this.svg.elem("g"),g=this.svg.elem("g").addClass(a.classNames.labelGroup);if(a.stackBars&&0!==b.normalized.series.length){var h=p(b.normalized.series,function(){return Array.prototype.slice.call(arguments).map(function(a){return a}).reduce(function(a,b){return{x:a.x+(b&&b.x)||0,y:a.y+(b&&b.y)||0}},{x:0,y:0})});c=H([h],a,a.horizontalBars?"x":"y")}else c=H(b.normalized.series,a,a.horizontalBars?"x":"y");c.high=+a.high||(0===a.high?0:c.high),c.low=+a.low||(0===a.low?0:c.low);var i,k,l,m,n,o=M(this.svg,a,wa.padding);k=a.distributeSeries&&a.stackBars?b.normalized.labels.slice(0,1):b.normalized.labels,a.horizontalBars?(i=m=void 0===a.axisX.type?new na(ka.x,b.normalized.series,o,v({},a.axisX,{ -highLow:c,referenceValue:0})):new a.axisX.type(ka.x,b.normalized.series,o,v({},a.axisX,{highLow:c,referenceValue:0})),l=n=void 0===a.axisY.type?new pa(ka.y,b.normalized.series,o,{ticks:k}):new a.axisY.type(ka.y,b.normalized.series,o,a.axisY)):(l=m=void 0===a.axisX.type?new pa(ka.x,b.normalized.series,o,{ticks:k}):new a.axisX.type(ka.x,b.normalized.series,o,a.axisX),i=n=void 0===a.axisY.type?new na(ka.y,b.normalized.series,o,v({},a.axisY,{highLow:c,referenceValue:0})):new a.axisY.type(ka.units.y,b.normalized.series,o,v({},a.axisY,{highLow:c,referenceValue:0})));var q=a.horizontalBars?o.x1+i.projectValue(0):o.y1-i.projectValue(0),r=[];l.createGridAndLabels(d,g,this.supportsForeignObject,a,this.eventEmitter),i.createGridAndLabels(d,g,this.supportsForeignObject,a,this.eventEmitter),a.showGridBackground&&O(d,o,a.classNames.gridBackground,this.eventEmitter),b.raw.series.forEach(function(c,d){var g,h,k=d-(b.raw.series.length-1)/2;g=a.distributeSeries&&!a.stackBars?l.axisLength/b.normalized.series.length/2:a.distributeSeries&&a.stackBars?l.axisLength/2:l.axisLength/b.normalized.series[d].length/2,h=f.elem("g"),h.attr({"ct:series-name":c.name,"ct:meta":w(c.meta)}),h.addClass([a.classNames.series,c.className||a.classNames.series+"-"+j(d)].join(" ")),b.normalized.series[d].forEach(function(f,j){var p,s,t,u;if(u=a.distributeSeries&&!a.stackBars?d:a.distributeSeries&&a.stackBars?0:j,p=a.horizontalBars?{x:o.x1+i.projectValue(f&&f.x?f.x:0,j,b.normalized.series[d]),y:o.y1-l.projectValue(f&&f.y?f.y:0,u,b.normalized.series[d])}:{x:o.x1+l.projectValue(f&&f.x?f.x:0,u,b.normalized.series[d]),y:o.y1-i.projectValue(f&&f.y?f.y:0,j,b.normalized.series[d])},l instanceof pa&&(l.options.stretch||(p[l.units.pos]+=g*(a.horizontalBars?-1:1)),p[l.units.pos]+=a.stackBars||a.distributeSeries?0:k*a.seriesBarDistance*(a.horizontalBars?-1:1)),t=r[j]||q,r[j]=t-(q-p[l.counterUnits.pos]),void 0!==f){var x={};x[l.units.pos+"1"]=p[l.units.pos],x[l.units.pos+"2"]=p[l.units.pos],!a.stackBars||"accumulate"!==a.stackMode&&a.stackMode?(x[l.counterUnits.pos+"1"]=q,x[l.counterUnits.pos+"2"]=p[l.counterUnits.pos]):(x[l.counterUnits.pos+"1"]=t,x[l.counterUnits.pos+"2"]=r[j]),x.x1=Math.min(Math.max(x.x1,o.x1),o.x2),x.x2=Math.min(Math.max(x.x2,o.x1),o.x2),x.y1=Math.min(Math.max(x.y1,o.y2),o.y1),x.y2=Math.min(Math.max(x.y2,o.y2),o.y1);var y=z(c,j);s=h.elem("line",x,a.classNames.bar).attr({"ct:value":[f.x,f.y].filter(e).join(","),"ct:meta":w(y)}),this.eventEmitter.emit("draw",v({type:"bar",value:f,index:j,meta:y,series:c,seriesIndex:d,axisX:m,axisY:n,chartRect:o,group:h,element:s},x))}}.bind(this))}.bind(this)),this.eventEmitter.emit("created",{bounds:i.bounds,chartRect:o,axisX:m,axisY:n,svg:this.svg,options:a})}}]),b}(ha),ya={width:void 0,height:void 0,chartPadding:5,classNames:{chartPie:"ct-chart-pie",chartDonut:"ct-chart-donut",series:"ct-series",slicePie:"ct-slice-pie",sliceDonut:"ct-slice-donut",label:"ct-label"},startAngle:0,total:void 0,donut:!1,donutWidth:60,showLabel:!0,labelOffset:0,labelPosition:"inside",labelInterpolationFnc:k,labelDirection:"neutral",reverseData:!1,ignoreEmptyValues:!1},za=function(a){function b(a,c,d,e){return ba(this,b),ia(this,(b.__proto__||Object.getPrototypeOf(b)).call(this,a,c,ya,v({},ya,d),e))}return ja(b,a),ca(b,[{key:"createChart",value:function(a){var b,c,d,e,g,h=y(this.data),k=[],l=a.startAngle;this.svg=K(this.container,a.width,a.height,a.donut?a.classNames.chartDonut:a.classNames.chartPie),c=M(this.svg,a,ya.padding),d=Math.min(c.width()/2,c.height()/2),g=a.total||h.normalized.series.reduce(function(a,b){return a+b},0);var m=i(a.donutWidth);"%"===m.unit&&(m.value*=d/100),d-=a.donut?m.value/2:0,e="outside"===a.labelPosition||a.donut?d:"center"===a.labelPosition?0:d/2,e+=a.labelOffset;var n={x:c.x1+c.width()/2,y:c.y2+c.height()/2},o=1===h.raw.series.filter(function(a){return a.hasOwnProperty("value")?0!==a.value:0!==a}).length;h.raw.series.forEach(function(a,b){k[b]=this.svg.elem("g",null,null)}.bind(this)),a.showLabel&&(b=this.svg.elem("g",null,null)),h.raw.series.forEach(function(c,i){if(0!==h.normalized.series[i]||!a.ignoreEmptyValues){k[i].attr({"ct:series-name":c.name}),k[i].addClass([a.classNames.series,c.className||a.classNames.series+"-"+j(i)].join(" "));var p=g>0?l+h.normalized.series[i]/g*360:0,q=Math.max(0,l-(0===i||o?0:.2));p-q>=359.99&&(p=q+359.99);var r=u(n.x,n.y,d,q),s=u(n.x,n.y,d,p),t=new sa(!a.donut).move(s.x,s.y).arc(d,d,0,p-l>180,0,r.x,r.y);a.donut||t.line(n.x,n.y);var v=k[i].elem("path",{d:t.stringify()},a.donut?a.classNames.sliceDonut:a.classNames.slicePie);if(v.attr({"ct:value":h.normalized.series[i],"ct:meta":w(c.meta)}),a.donut&&v.attr({style:"stroke-width: "+m.value+"px"}),this.eventEmitter.emit("draw",{type:"slice",value:h.normalized.series[i],totalDataSum:g,index:i,meta:c.meta,series:c,group:k[i],element:v,path:t.clone(),center:n,radius:d,startAngle:l,endAngle:p}),a.showLabel){var x;x=1===h.raw.series.length?{x:n.x,y:n.y}:u(n.x,n.y,e,l+(p-l)/2);var y;y=h.normalized.labels&&!f(h.normalized.labels[i])?h.normalized.labels[i]:h.normalized.series[i];var z=a.labelInterpolationFnc(y,i);if(z||0===z){var A=b.elem("text",{dx:x.x,dy:x.y,"text-anchor":Y(n,x,a.labelDirection)},a.classNames.label).text(""+z);this.eventEmitter.emit("draw",{type:"label",index:i,group:b,element:A,text:""+z,x:x.x,y:x.y})}}l=p}}.bind(this)),this.eventEmitter.emit("created",{chartRect:c,svg:this.svg,options:a})}}]),b}(ha);a.Interpolation=ta,a.EventEmitter=ga,a.extend=v,a.optionsProvider=Q,a.namespaces=$,a.precision=_,a.escapingMap=aa,a.version=Z,a.replaceAll=b,a.querySelector=c,a.safeHasProperty=d,a.isNumeric=e,a.isFalseyButZero=f,a.getNumberOrUndefined=g,a.ensureUnit=h,a.quantity=i,a.alphaNumerate=j,a.noop=k,a.times=l,a.sum=m,a.mapMultiply=n,a.mapAdd=o,a.serialMap=p,a.orderOfMagnitude=q,a.projectLength=r,a.roundWithPrecision=s,a.rho=t,a.polarToCartesian=u,a.serialize=w,a.deserialize=x,a.normalizeData=y,a.getMetaData=z,a.isDataHoleValue=A,a.reverseData=B,a.getDataArray=C,a.isMultiValue=D,a.getMultiValue=E,a.getSeriesOption=F,a.splitIntoSegments=G,a.getHighLow=H,a.getBounds=I,a.createSvg=K,a.normalizePadding=L,a.createChartRect=M,a.createGrid=N,a.createGridBackground=O,a.createLabel=P,a.BaseChart=ha,a.LineChart=va,a.BarChart=xa,a.PieChart=za,a.Axis=la,a.axisUnits=ka,a.AutoScaleAxis=na,a.FixedScaleAxis=oa,a.StepAxis=pa,a.Svg=ea,a.isSupported=J,a.easings=fa,a.SvgList=da,a.SvgPath=sa,Object.defineProperty(a,"__esModule",{value:!0})}); +!function(a,b){"object"==typeof exports&&"undefined"!=typeof module?b(exports):"function"==typeof define&&define.amd?define(["exports"],b):b(a.Chartist=a.Chartist||{})}(this,function(a){"use strict";function b(a,b,c){return a.replace(new RegExp(b,"g"),c)}function c(a){return a instanceof Node?a:document.querySelector(a)}function d(a,b){return null!==a&&"object"==typeof a&&a.hasOwnProperty(b)}function e(a){return null!==a&&isFinite(a)}function f(a){return!a&&0!==a}function g(a){return e(a)?+a:void 0}function h(a,b){return"number"==typeof a&&(a+=b),a}function i(a){if("string"==typeof a){var b=/^(\d+)\s*(.*)$/g.exec(a);return{value:+b[1],unit:b[2]||void 0}}return{value:a}}function j(a){return String.fromCharCode(97+a%26)}function k(a){return Math.floor(Math.log(Math.abs(a))/Math.LN10)}function l(a,b,c){return b/c.range*a}function m(a,b){var c=Math.pow(10,b||V);return Math.round(a*c)/c}function n(a){function b(a,c){return a%c===0?c:b(c,a%c)}function c(a){return a*a+1}if(1===a)return a;var d=2,e=2,f=void 0;if(a%2===0)return 2;do d=c(d)%a,e=c(c(e))%a,f=b(Math.abs(d-e),a);while(1===f);return f}function o(a,b,c,d){var e=(d-90)*Math.PI/180;return{x:a+c*Math.cos(e),y:b+c*Math.sin(e)}}function p(){var a=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};a=a||{};for(var b=arguments.length,c=Array(b>1?b-1:0),d=1;d1&&void 0!==arguments[1]?arguments[1]:"y";return g(x(a)?a[b]:a)}function z(a,b,c){if(a.name&&b.series&&b.series[a.name]){var d=b.series[a.name];return d.hasOwnProperty(c)?d[c]:b[c]}return b[c]}function A(a,b,c){var d={increasingX:!1,fillHoles:!1};c=p({},d,c);for(var e=[],f=!0,g=0;g=2&&a[g]<=a[g-2]&&(f=!0),f&&(e.push({pathCoordinates:[],valueData:[]}),f=!1),e[e.length-1].pathCoordinates.push(a[g],a[g+1]),e[e.length-1].valueData.push(b[g/2]));return e}function B(a,b,c){function d(a){if(void 0!==a)if(a instanceof Array)for(var b=0;be.high&&(e.high=h),g&&h0?e.low=0:(e.high=1,e.low=0)),e}function C(a,b,c,d){function e(a,b){return a===(a+=b)&&(a*=1+(b>0?aa:-aa)),a}var f={high:b.high,low:b.low};f.valueRange=f.high-f.low,f.oom=k(f.valueRange),f.step=Math.pow(10,f.oom),f.min=Math.floor(f.low/f.step)*f.step,f.max=Math.ceil(f.high/f.step)*f.step,f.range=f.max-f.min,f.numberOfSteps=Math.round(f.range/f.step);var g=l(a,f.step,f),h=g=c)f.step=1;else if(d&&i=c)f.step=i;else for(var j=0;;){if(h&&l(a,f.step,f)<=c)f.step*=2;else{if(h||!(l(a,f.step/2,f)>=c))break;if(f.step/=2,d&&f.step%1!==0){f.step*=2;break}}if(j++>1e3)throw new Error("Exceeded maximum number of iterations while optimizing scale step!")}f.step=Math.max(f.step,aa);for(var o=f.min,p=f.max;o+f.step<=f.low;)o=e(o,f.step);for(;p-f.step>=f.high;)p=e(p,-f.step);f.min=o,f.max=p,f.range=f.max-f.min;for(var q=[],r=f.min;r<=f.max;r=e(r,f.step)){var s=m(r);s!==q[q.length-1]&&q.push(s)}return f.values=q,f}function D(a){return document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#"+a,"1.1")}function E(a){var b=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"100%",c=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"100%",d=arguments[3];Array.from(a.querySelectorAll("svg")).filter(function(a){return a.getAttributeNS(U.xmlns,"ct")}).forEach(function(b){return a.removeChild(b)});var e=new ea("svg").attr({width:b,height:c}).addClass(d).attr({style:"width: "+b+"; height: "+c+";"});return a.appendChild(e._node),e}function F(a){var b=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;return"number"==typeof a?{top:a,right:a,bottom:a,left:a}:{top:"number"==typeof a.top?a.top:b,right:"number"==typeof a.right?a.right:b,bottom:"number"==typeof a.bottom?a.bottom:b,left:"number"==typeof a.left?a.left:b}}function G(a,b,c){var d=!(!b.axisX&&!b.axisY),e=d?b.axisY.offset:0,f=d?b.axisX.offset:0,g=a.width()||i(b.width).value||0,h=a.height()||i(b.height).value||0,j=F(b.chartPadding,c);g=Math.max(g,e+j.left+j.right),h=Math.max(h,f+j.top+j.bottom);var k={padding:j,width:function(){return this.x2-this.x1},height:function(){return this.y1-this.y2}};return d?("start"===b.axisX.position?(k.y2=j.top+f,k.y1=Math.max(h-j.bottom,k.y2+1)):(k.y2=j.top,k.y1=Math.max(h-j.bottom-f,k.y2+1)),"start"===b.axisY.position?(k.x1=j.left+e,k.x2=Math.max(g-j.right,k.x1+1)):(k.x1=j.left,k.x2=Math.max(g-j.right-e,k.x1+1))):(k.x1=j.left,k.x2=Math.max(g-j.right,k.x1+1),k.y2=j.top,k.y1=Math.max(h-j.bottom,k.y2+1)),k}function H(a,b,c,d,e,f,g,h){var i={};i[c.units.pos+"1"]=a,i[c.units.pos+"2"]=a,i[c.counterUnits.pos+"1"]=d,i[c.counterUnits.pos+"2"]=d+e;var j=f.elem("line",i,g.join(" "));h.emit("draw",p({type:"grid",axis:c,index:b,group:f,element:j},i))}function I(a,b,c,d){var e=a.elem("rect",{x:b.x1,y:b.y2,width:b.width(),height:b.height()},c,!0);d.emit("draw",{type:"gridBackground",group:a,element:e})}function J(a,b,c,d,e,f,g,h,i,j,k){var l=void 0,m={};if(m[e.units.pos]=a+g[e.units.pos],m[e.counterUnits.pos]=g[e.counterUnits.pos],m[e.units.len]=b,m[e.counterUnits.len]=Math.max(0,f-10),j){var n=Math.round(m[e.units.len]),o=Math.round(m[e.counterUnits.len]),q=('\n \n '+d[c]+"\n \n ").trim();l=h.foreignObject(q,p({style:"overflow: visible;"},m))}else l=h.elem("text",m,i.join(" ")).text(d[c]);k.emit("draw",p({type:"label",axis:e,index:c,group:h,element:l,text:d[c]},m))}function K(a,b,c){function d(a){var d=g;g=p({},f),b&&b.forEach(function(a){var b=window.matchMedia(a[0]);b.matches&&(g=p(g,a[1]))}),c&&a&&c.emit("optionsChanged",{previousOptions:d,currentOptions:g})}function e(){h.forEach(function(a){return a.removeListener(d)})}var f=p({},a),g=void 0,h=[];if(!window.matchMedia)throw"window.matchMedia not found! Make sure you're using a polyfill.";return b&&b.forEach(function(a){var b=window.matchMedia(a[0]);b.addListener(d),h.push(b)}),d(),{removeMediaQueryListeners:e,getCurrentOptions:function(){return p({},g)}}}function L(a,b,c,d,e,f){var g=p({command:e?a.toLowerCase():a.toUpperCase()},b,f?{data:f}:{});c.splice(d,0,g)}function M(a,b){a.forEach(function(c,d){qa[c.command.toLowerCase()].forEach(function(e,f){b(c,e,d,f,a)})})}function N(a){var b={fillHoles:!1};return a=p({},b,a),function(b,c){for(var d=new sa,e=!0,f=0;f1)return sa.join(g.map(function(a){return b(a.pathCoordinates,a.valueData)}));if(e=g[0].pathCoordinates,f=g[0].valueData,e.length<=4)return N()(e,f);for(var h=(new sa).move(e[0],e[1],!1,f[0]),i=void 0,j=0,k=e.length;k-2*!i>j;j+=2){var l=[{x:+e[j-2],y:+e[j-1]},{x:+e[j],y:+e[j+1]},{x:+e[j+2],y:+e[j+3]},{x:+e[j+4],y:+e[j+5]}];i?j?k-4===j?l[3]={x:+e[0],y:+e[1]}:k-2===j&&(l[2]={x:+e[0],y:+e[1]},l[3]={x:+e[2],y:+e[3]}):l[0]={x:+e[k-2],y:+e[k-1]}:k-4===j?l[3]=l[2]:j||(l[0]={x:+e[j],y:+e[j+1]}),h.curve(c*(-l[0].x+6*l[1].x+l[2].x)/6+d*l[2].x,c*(-l[0].y+6*l[1].y+l[2].y)/6+d*l[2].y,c*(l[1].x+6*l[2].x-l[3].x)/6+d*l[2].x,c*(l[1].y+6*l[2].y-l[3].y)/6+d*l[2].y,l[2].x,l[2].y,!1,f[(j+2)/2])}return h}return N()([])}}function R(a){var b={fillHoles:!1};return a=p({},b,a),function b(c,d){var e=A(c,d,{fillHoles:a.fillHoles,increasingX:!0});if(e.length){if(e.length>1)return sa.join(e.map(function(a){return b(a.pathCoordinates,a.valueData)}));if(c=e[0].pathCoordinates,d=e[0].valueData,c.length<=4)return N()(c,d);for(var f=[],g=[],h=c.length/2,i=[],j=[],k=[],l=[],m=0;m0!=j[o]>0?i[o]=0:(i[o]=3*(l[o-1]+l[o])/((2*l[o]+l[o-1])/j[o-1]+(l[o]+2*l[o-1])/j[o]),isFinite(i[o])||(i[o]=0));for(var p=(new sa).move(f[0],g[0],!1,d[0]),q=0;qa.x;return d&&"explode"===c||!d&&"implode"===c?"start":d&&"implode"===c||!d&&"explode"===c?"end":"middle"}var T="1.0.0",U={svg:"http://www.w3.org/2000/svg",xmlns:"http://www.w3.org/2000/xmlns/",xhtml:"http://www.w3.org/1999/xhtml",xlink:"http://www.w3.org/1999/xlink",ct:"http://gionkunz.github.com/chartist-js/ct"},V=8,W={"&":"&","<":"<",">":">",'"':""","'":"'"},X=function(a){if(Array.isArray(a)){for(var b=0,c=Array(a.length);b1}).map(function(a){var b=a.pathElements[0],c=a.pathElements[a.pathElements.length-1];return a.clone(!0).position(0).remove(1).move(b.x,f).line(b.x,b.y).position(a.pathElements.length+1).line(c.x,f)}).forEach(function(e){var f=l.elem("path",{d:e.stringify()},a.classNames.area,!0);b.eventEmitter.emit("draw",{type:"area",values:c.normalized.series[g],path:e.clone(),series:d,seriesIndex:g,axisX:i,axisY:k,chartRect:h,index:g,group:l,element:f})})}()}),this.eventEmitter.emit("created",{bounds:k.bounds,chartRect:h,axisX:i,axisY:k,svg:this.svg,options:a})}}]),b}(ha),wa={axisX:{offset:30,position:"end",labelOffset:{x:0,y:0},showLabel:!0,showGrid:!0,labelInterpolationFnc:Y,scaleMinSpace:30,onlyInteger:!1},axisY:{offset:40,position:"start",labelOffset:{x:0,y:0},showLabel:!0,showGrid:!0,labelInterpolationFnc:Y,scaleMinSpace:20,onlyInteger:!1},width:void 0,height:void 0,high:void 0,low:void 0,referenceValue:0,chartPadding:{top:15,right:15,bottom:5,left:10},seriesBarDistance:15,stackBars:!1,stackMode:"accumulate",horizontalBars:!1,distributeSeries:!1,reverseData:!1,showGridBackground:!1,classNames:{chart:"ct-chart-bar",horizontalBars:"ct-horizontal-bars",label:"ct-label",labelGroup:"ct-labels",series:"ct-series",bar:"ct-bar",grid:"ct-grid",gridGroup:"ct-grids",gridBackground:"ct-grid-background",vertical:"ct-vertical",horizontal:"ct-horizontal",start:"ct-start",end:"ct-end"}},xa=function(a){function b(a,c,d,e){return ba(this,b),ia(this,(b.__proto__||Object.getPrototypeOf(b)).call(this,a,c,wa,p({},wa,d),e))}return ja(b,a),ca(b,[{key:"createChart",value:function(a){var b=arguments,c=this,d=void 0,f=void 0;a.distributeSeries?(d=s(this.data,a.reverseData,a.horizontalBars?"x":"y"),d.normalized.series=d.normalized.series.map(function(a){return[a]})):d=s(this.data,a.reverseData,a.horizontalBars?"x":"y"),this.svg=E(this.container,a.width,a.height,a.classNames.chart+(a.horizontalBars?" "+a.classNames.horizontalBars:""));var g=this.svg.elem("g").addClass(a.classNames.gridGroup),h=this.svg.elem("g"),i=this.svg.elem("g").addClass(a.classNames.labelGroup);if(a.stackBars&&0!==d.normalized.series.length){var k=_(d.normalized.series,function(){return Array.from(b).map(function(a){ +return a}).reduce(function(a,b){return{x:a.x+(b&&b.x)||0,y:a.y+(b&&b.y)||0}},{x:0,y:0})});f=B([k],a,a.horizontalBars?"x":"y")}else f=B(d.normalized.series,a,a.horizontalBars?"x":"y");f.high=+a.high||(0===a.high?0:f.high),f.low=+a.low||(0===a.low?0:f.low);var l=G(this.svg,a,wa.padding),m=void 0,n=void 0,o=void 0,r=void 0,u=void 0;n=a.distributeSeries&&a.stackBars?d.normalized.labels.slice(0,1):d.normalized.labels,a.horizontalBars?(m=r=void 0===a.axisX.type?new na(ka.x,d.normalized.series,l,p({},a.axisX,{highLow:f,referenceValue:0})):new a.axisX.type(ka.x,d.normalized.series,l,p({},a.axisX,{highLow:f,referenceValue:0})),o=u=void 0===a.axisY.type?new pa(ka.y,d.normalized.series,l,{ticks:n}):new a.axisY.type(ka.y,d.normalized.series,l,a.axisY)):(o=r=void 0===a.axisX.type?new pa(ka.x,d.normalized.series,l,{ticks:n}):new a.axisX.type(ka.x,d.normalized.series,l,a.axisX),m=u=void 0===a.axisY.type?new na(ka.y,d.normalized.series,l,p({},a.axisY,{highLow:f,referenceValue:0})):new a.axisY.type(ka.y,d.normalized.series,l,p({},a.axisY,{highLow:f,referenceValue:0})));var v=a.horizontalBars?l.x1+m.projectValue(0):l.y1-m.projectValue(0),w=[];o.createGridAndLabels(g,i,this.supportsForeignObject,a,this.eventEmitter),m.createGridAndLabels(g,i,this.supportsForeignObject,a,this.eventEmitter),a.showGridBackground&&I(g,l,a.classNames.gridBackground,this.eventEmitter),d.raw.series.forEach(function(b,f){var g=f-(d.raw.series.length-1)/2,i=void 0;i=a.distributeSeries&&!a.stackBars?o.axisLength/d.normalized.series.length/2:a.distributeSeries&&a.stackBars?o.axisLength/2:o.axisLength/d.normalized.series[f].length/2;var k=h.elem("g");k.attr({"ct:series-name":b.name,"ct:meta":q(b.meta)}),k.addClass([a.classNames.series,b.className||a.classNames.series+"-"+j(f)].join(" ")),d.normalized.series[f].forEach(function(h,j){var n=void 0;n=a.distributeSeries&&!a.stackBars?f:a.distributeSeries&&a.stackBars?0:j;var s=void 0;s=a.horizontalBars?{x:l.x1+m.projectValue(h&&h.x?h.x:0,j,d.normalized.series[f]),y:l.y1-o.projectValue(h&&h.y?h.y:0,n,d.normalized.series[f])}:{x:l.x1+o.projectValue(h&&h.x?h.x:0,n,d.normalized.series[f]),y:l.y1-m.projectValue(h&&h.y?h.y:0,j,d.normalized.series[f])},o instanceof pa&&(o.options.stretch||(s[o.units.pos]+=i*(a.horizontalBars?-1:1)),s[o.units.pos]+=a.stackBars||a.distributeSeries?0:g*a.seriesBarDistance*(a.horizontalBars?-1:1));var x=w[j]||v;if(w[j]=x-(v-s[o.counterUnits.pos]),void 0!==h){var y={};y[o.units.pos+"1"]=s[o.units.pos],y[o.units.pos+"2"]=s[o.units.pos],!a.stackBars||"accumulate"!==a.stackMode&&a.stackMode?(y[o.counterUnits.pos+"1"]=v,y[o.counterUnits.pos+"2"]=s[o.counterUnits.pos]):(y[o.counterUnits.pos+"1"]=x,y[o.counterUnits.pos+"2"]=w[j]),y.x1=Math.min(Math.max(y.x1,l.x1),l.x2),y.x2=Math.min(Math.max(y.x2,l.x1),l.x2),y.y1=Math.min(Math.max(y.y1,l.y2),l.y1),y.y2=Math.min(Math.max(y.y2,l.y2),l.y1);var z=t(b,j),A=k.elem("line",y,a.classNames.bar).attr({"ct:value":[h.x,h.y].filter(e).join(","),"ct:meta":q(z)});c.eventEmitter.emit("draw",p({type:"bar",value:h,index:j,meta:z,series:b,seriesIndex:f,axisX:r,axisY:u,chartRect:l,group:k,element:A},y))}})}),this.eventEmitter.emit("created",{bounds:m.bounds,chartRect:l,axisX:r,axisY:u,svg:this.svg,options:a})}}]),b}(ha),ya={width:void 0,height:void 0,chartPadding:5,classNames:{chartPie:"ct-chart-pie",chartDonut:"ct-chart-donut",series:"ct-series",slicePie:"ct-slice-pie",sliceDonut:"ct-slice-donut",label:"ct-label"},startAngle:0,total:void 0,donut:!1,donutWidth:60,showLabel:!0,labelOffset:0,labelPosition:"inside",labelInterpolationFnc:Y,labelDirection:"neutral",reverseData:!1,ignoreEmptyValues:!1},za=function(a){function b(a,c,d,e){return ba(this,b),ia(this,(b.__proto__||Object.getPrototypeOf(b)).call(this,a,c,ya,p({},ya,d),e))}return ja(b,a),ca(b,[{key:"createChart",value:function(a){var b=this,c=s(this.data),d=[],e=void 0,g=void 0,h=a.startAngle;this.svg=E(this.container,a.width,a.height,a.donut?a.classNames.chartDonut:a.classNames.chartPie);var k=G(this.svg,a,ya.padding),l=Math.min(k.width()/2,k.height()/2),m=a.total||c.normalized.series.reduce($,0),n=i(a.donutWidth);"%"===n.unit&&(n.value*=l/100),l-=a.donut?n.value/2:0,g="outside"===a.labelPosition||a.donut?l:"center"===a.labelPosition?0:l/2,g+=a.labelOffset;var p={x:k.x1+k.width()/2,y:k.y2+k.height()/2},r=1===c.raw.series.filter(function(a){return a.hasOwnProperty("value")?0!==a.value:0!==a}).length;c.raw.series.forEach(function(a,c){return d[c]=b.svg.elem("g",null,null)}),a.showLabel&&(e=this.svg.elem("g",null,null)),c.raw.series.forEach(function(i,k){if(0!==c.normalized.series[k]||!a.ignoreEmptyValues){d[k].attr({"ct:series-name":i.name}),d[k].addClass([a.classNames.series,i.className||a.classNames.series+"-"+j(k)].join(" "));var s=m>0?h+c.normalized.series[k]/m*360:0,t=Math.max(0,h-(0===k||r?0:.2));s-t>=359.99&&(s=t+359.99);var u=o(p.x,p.y,l,t),v=o(p.x,p.y,l,s),w=new sa(!a.donut).move(v.x,v.y).arc(l,l,0,s-h>180,0,u.x,u.y);a.donut||w.line(p.x,p.y);var x=d[k].elem("path",{d:w.stringify()},a.donut?a.classNames.sliceDonut:a.classNames.slicePie);if(x.attr({"ct:value":c.normalized.series[k],"ct:meta":q(i.meta)}),a.donut&&x.attr({style:"stroke-width: "+n.value+"px"}),b.eventEmitter.emit("draw",{type:"slice",value:c.normalized.series[k],totalDataSum:m,index:k,meta:i.meta,series:i,group:d[k],element:x,path:w.clone(),center:p,radius:l,startAngle:h,endAngle:s}),a.showLabel){var y=void 0;y=1===c.raw.series.length?{x:p.x,y:p.y}:o(p.x,p.y,g,h+(s-h)/2);var z=void 0;z=c.normalized.labels&&!f(c.normalized.labels[k])?c.normalized.labels[k]:c.normalized.series[k];var A=a.labelInterpolationFnc(z,k);if(A||0===A){var B=e.elem("text",{dx:y.x,dy:y.y,"text-anchor":S(p,y,a.labelDirection)},a.classNames.label).text(""+A);b.eventEmitter.emit("draw",{type:"label",index:k,group:e,element:B,text:""+A,x:y.x,y:y.y})}}h=s}}),this.eventEmitter.emit("created",{chartRect:k,svg:this.svg,options:a})}}]),b}(ha);a.Interpolation=ta,a.EventEmitter=ga,a.extend=p,a.optionsProvider=K,a.namespaces=U,a.precision=V,a.escapingMap=W,a.version=T,a.replaceAll=b,a.querySelector=c,a.safeHasProperty=d,a.isNumeric=e,a.isFalseyButZero=f,a.getNumberOrUndefined=g,a.ensureUnit=h,a.quantity=i,a.alphaNumerate=j,a.noop=Y,a.times=Z,a.sum=$,a.serialMap=_,a.EPSILON=aa,a.orderOfMagnitude=k,a.projectLength=l,a.roundWithPrecision=m,a.rho=n,a.polarToCartesian=o,a.serialize=q,a.deserialize=r,a.normalizeData=s,a.getMetaData=t,a.isDataHoleValue=u,a.reverseData=v,a.getDataArray=w,a.isMultiValue=x,a.getMultiValue=y,a.getSeriesOption=z,a.splitIntoSegments=A,a.getHighLow=B,a.getBounds=C,a.createSvg=E,a.normalizePadding=F,a.createChartRect=G,a.createGrid=H,a.createGridBackground=I,a.createLabel=J,a.BaseChart=ha,a.LineChart=va,a.BarChart=xa,a.PieChart=za,a.Axis=la,a.axisUnits=ka,a.AutoScaleAxis=na,a.FixedScaleAxis=oa,a.StepAxis=pa,a.Svg=ea,a.isSupported=D,a.easings=fa,a.SvgList=da,a.SvgPath=sa,Object.defineProperty(a,"__esModule",{value:!0})}); //# sourceMappingURL=chartist.umd.js.map \ No newline at end of file diff --git a/dist/chartist.umd.js.map b/dist/chartist.umd.js.map index a26d78b8..317abd6d 100644 --- a/dist/chartist.umd.js.map +++ b/dist/chartist.umd.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/core/lang.js","../src/core/functional.js","../src/core/math.js","../src/core/extend.js","../src/core/data.js","../src/svg/svg.js","../src/core/creation.js","../src/core/options-provider.js","../src/svg/svg-path.js","../src/interpolation/none.js","../src/interpolation/simple.js","../src/interpolation/step.js","../src/interpolation/cardinal.js","../src/interpolation/monotone-cubic.js","../src/charts/pie.js","../package.json!file:/home/gion/Code/chartist/tooling/system-loaders/package.json","../src/core/globals.js","../jspm_packages/npm/systemjs-plugin-babel@0.0.16/babel-helpers/classCallCheck.js","../jspm_packages/npm/systemjs-plugin-babel@0.0.16/babel-helpers/createClass.js","../src/svg/svg-list.js","../src/event/event-emitter.js","../src/charts/base.js","../jspm_packages/npm/systemjs-plugin-babel@0.0.16/babel-helpers/possibleConstructorReturn.js","../jspm_packages/npm/systemjs-plugin-babel@0.0.16/babel-helpers/inherits.js","../src/axes/axis.js","../jspm_packages/npm/systemjs-plugin-babel@0.0.16/babel-helpers/get.js","../src/axes/auto-scale-axis.js","../src/axes/fixed-scale-axis.js","../src/axes/step-axis.js","../src/charts/line.js","../src/charts/bar.js"],"names":["replaceAll","str","subStr","newSubStr","replace","RegExp","querySelector","query","Node","document","safeHasProperty","object","property","hasOwnProperty","isNumeric","value","isFinite","isFalseyButZero","getNumberOrUndefined","undefined","ensureUnit","unit","quantity","input","match","exec","alphaNumerate","n","String","fromCharCode","noop","times","length","Array","apply","sum","previous","current","mapMultiply","factor","num","mapAdd","addend","serialMap","arr","cb","result","Math","max","map","e","forEach","index","args","orderOfMagnitude","floor","log","abs","LN10","projectLength","axisLength","bounds","range","roundWithPrecision","digits","precision","pow","round","rho","gcd","p","q","f","x","divisor","x1","x2","polarToCartesian","centerX","centerY","radius","angleInDegrees","angleInRadians","PI","cos","sin","extend","target","i","source","sourceProp","arguments","prop","serialize","data","JSON","stringify","Object","keys","escapingMap","reduce","key","deserialize","parse","normalizeData","reverse","multi","labelCount","output","normalized","series","getDataArray","every","labels","slice","prototype","push","getMetaData","meta","isDataHoleValue","isNaN","reverseData","recursiveConvert","multiValue","y","isMultiValue","getMultiValue","dimension","getSeriesOption","options","name","seriesOptions","splitIntoSegments","pathCoordinates","valueData","defaultOptions","segments","hole","fillHoles","increasingX","getHighLow","recursiveHighLow","findHigh","highLow","high","findLow","low","toUpperCase","Number","MAX_VALUE","referenceValue","min","getBounds","scaleMinSpace","onlyInteger","safeIncrement","increment","EPSILON","newMin","newMax","optimizationCounter","valueRange","oom","step","ceil","numberOfSteps","scaleUp","smallestFactor","Error","values","isSupported","feature","implementation","hasFeature","createSvg","container","width","height","className","svg","call","querySelectorAll","filter","getAttributeNS","namespaces","xmlns","removeChild","Svg","attr","addClass","appendChild","_node","normalizePadding","padding","fallback","top","right","bottom","left","createChartRect","fallbackPadding","hasAxis","axisX","axisY","yAxisOffset","offset","xAxisOffset","normalizedPadding","chartPadding","chartRect","this","y1","y2","position","createGrid","axis","group","classes","eventEmitter","positionalData","units","pos","counterUnits","gridElement","elem","join","emit","createGridBackground","gridGroup","gridBackground","createLabel","axisOffset","labelOffset","useForeignObject","labelElement","len","content","foreignObject","text","optionsProvider","responsiveOptions","updateCurrentOptions","mediaEvent","previousOptions","currentOptions","baseOptions","mql","window","matchMedia","matches","removeMediaQueryListeners","removeListener","mediaQueryListeners","addListener","element","command","params","pathElements","relative","pathElement","toLowerCase","splice","forEachParam","pathElementIndex","paramName","paramIndex","none","path","SvgPath","currX","currY","currData","move","line","simple","d","prevX","prevY","prevData","curve","postpone","cardinal","t","tension","c","paths","segment","z","iLen","monotoneCubic","xs","ys","ms","ds","dys","dxs","determineAnchorPosition","center","label","direction","toTheRight","version","_classCallCheck","instance","Constructor","TypeError","_createClass","defineProperties","props","descriptor","enumerable","configurable","writable","defineProperty","protoProps","staticProps","SvgList","nodeList","list","svgElements","prototypeProperty","indexOf","attributes","parent","insertFirst","Element","createElementNS","ct","firstChild","insertBefore","ns","getAttribute","namespacedAttribute","split","setAttributeNS","setAttribute","bind","parentNode","SVGElement","node","nodeName","selector","foundNode","foundNodes","createElement","innerHTML","fnObj","createTextNode","newElement","replaceChild","trim","names","concat","self","removedClasses","getBoundingClientRect","animations","guided","attribute","createAnimate","animationDefinition","animate","timeout","animationEasing","attributeProperties","easing","easings","begin","dur","calcMode","keySplines","keyTimes","fill","from","beginElement","err","to","remove","addEventListener","EventEmitter","handlers","event","handler","starHandler","BaseChart","supportsForeignObject","supportsAnimations","resizeListener","update","__chartist__","detach","initializeTimeoutId","setTimeout","initialize","override","createChart","getCurrentOptions","clearTimeout","removeEventListener","addEventHandler","removeEventHandler","plugins","plugin","_possibleConstructorReturn","ReferenceError","_inherits","subClass","superClass","create","setPrototypeOf","__proto__","axisUnits","Axis","ticks","rectEnd","rectStart","gridOffset","rectOffset","labelGroup","chartOptions","axisOptions","projectedValues","projectValue","labelValues","labelInterpolationFnc","projectedValue","labelLength","showGrid","classNames","grid","dir","showLabel","_get","get","receiver","Function","desc","getOwnPropertyDescriptor","getPrototypeOf","getter","AutoScaleAxis","_Axis","axisUnit","_this","FixedScaleAxis","sort","a","b","stepLength","StepAxis","calc","stretch","elementDescriptions","close","joinedPath","j","count","rx","ry","xAr","lAf","sf","chunks","pop","elements","chunk","shift","description","spliceArgs","accuracyMultiplier","accuracy","transformFnc","transformed","LineChart","_BaseChart","chart","seriesGroup","type","fullWidth","createGridAndLabels","showGridBackground","raw","seriesIndex","seriesElement","pathData","valueIndex","smoothing","lineSmooth","showPoint","point","showLine","clone","showArea","areaBase","areaBaseProjected","splitByCommand","pathSegment","solidPathSegments","firstElement","lastElement","areaPath","area","BarChart","distributeSeries","horizontalBars","stackBars","serialSums","prev","curr","valueAxis","labelAxisTicks","labelAxis","zeroPoint","stackedBarValues","periodHalfLength","biPol","projected","bar","previousStack","labelAxisValueIndex","seriesBarDistance","positions","stackMode","metaData","PieChart","labelsGroup","labelRadius","totalDataSum","seriesGroups","startAngle","donut","chartDonut","chartPie","total","previousValue","currentValue","donutWidth","labelPosition","hasSingleValInSeries","val","ignoreEmptyValues","endAngle","overlappigStartAngle","start","end","arc","sliceDonut","slicePie","rawValue","interpolatedValue","labelDirection"],"mappings":"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","file":"chartist.umd.js","sourcesContent":["/**\n * Replaces all occurrences of subStr in str with newSubStr and returns a new string.\n *\n * @param {String} str\n * @param {String} subStr\n * @param {String} newSubStr\n * @return {String}\n */\nexport function replaceAll(str, subStr, newSubStr) {\n return str.replace(new RegExp(subStr, 'g'), newSubStr);\n}\n\n/**\n * This is a wrapper around document.querySelector that will return the query if it's already of type Node\n *\n * @memberof Chartist.Core\n * @param {String|Node} query The query to use for selecting a Node or a DOM node that will be returned directly\n * @return {Node}\n */\nexport function querySelector(query) {\n return query instanceof Node ? query : document.querySelector(query);\n}\n\n/**\n * This function safely checks if an objects has an owned property.\n *\n * @param {Object} object The object where to check for a property\n * @param {string} property The property name\n * @returns {boolean} Returns true if the object owns the specified property\n */\nexport function safeHasProperty(object, property) {\n return object !== null &&\n typeof object === 'object' &&\n object.hasOwnProperty(property);\n}\n\n/**\n * Checks if a value can be safely coerced to a number. This includes all values except null which result in finite numbers when coerced. This excludes NaN, since it's not finite.\n *\n * @memberof Chartist.Core\n * @param value\n * @returns {Boolean}\n */\nexport function isNumeric(value) {\n return value === null ? false : isFinite(value);\n}\n\n/**\n * Returns true on all falsey values except the numeric value 0.\n *\n * @memberof Chartist.Core\n * @param value\n * @returns {boolean}\n */\nexport function isFalseyButZero(value) {\n return !value && value !== 0;\n}\n\n/**\n * Returns a number if the passed parameter is a valid number or the function will return undefined. On all other values than a valid number, this function will return undefined.\n *\n * @memberof Chartist.Core\n * @param value\n * @returns {*}\n */\nexport function getNumberOrUndefined(value) {\n return isNumeric(value) ? +value : undefined;\n}\n\n/**\n * Converts a number to a string with a unit. If a string is passed then this will be returned unmodified.\n *\n * @memberof Chartist.Core\n * @param {Number} value\n * @param {String} unit\n * @return {String} Returns the passed number value with unit.\n */\nexport function ensureUnit(value, unit) {\n if(typeof value === 'number') {\n value = value + unit;\n }\n\n return value;\n}\n\n/**\n * Converts a number or string to a quantity object.\n *\n * @memberof Chartist.Core\n * @param {String|Number} input\n * @return {Object} Returns an object containing the value as number and the unit as string.\n */\nexport function quantity(input) {\n if (typeof input === 'string') {\n var match = (/^(\\d+)\\s*(.*)$/g).exec(input);\n return {\n value : +match[1],\n unit: match[2] || undefined\n };\n }\n return { value: input };\n}\n\n/**\n * Generates a-z from a number 0 to 26\n *\n * @memberof Chartist.Core\n * @param {Number} n A number from 0 to 26 that will result in a letter a-z\n * @return {String} A character from a-z based on the input number n\n */\nexport function alphaNumerate(n) {\n // Limit to a-z\n return String.fromCharCode(97 + n % 26);\n}\n","/**\n * Helps to simplify functional style code\n *\n * @memberof Chartist.Core\n * @param {*} n This exact value will be returned by the noop function\n * @return {*} The same value that was provided to the n parameter\n */\nexport function noop(n) {\n return n;\n}\n\n/**\n * Functional style helper to produce array with given length initialized with undefined values\n *\n * @memberof Chartist.Core\n * @param length\n * @return {Array}\n */\nexport function times(length) {\n return Array.apply(null, new Array(length));\n}\n\n/**\n * Sum helper to be used in reduce functions\n *\n * @memberof Chartist.Core\n * @param previous\n * @param current\n * @return {*}\n */\nexport function sum(previous, current) {\n return previous + (current ? current : 0);\n}\n\n/**\n * Multiply helper to be used in `Array.map` for multiplying each value of an array with a factor.\n *\n * @memberof Chartist.Core\n * @param {Number} factor\n * @returns {Function} Function that can be used in `Array.map` to multiply each value in an array\n */\nexport function mapMultiply(factor) {\n return function(num) {\n return num * factor;\n };\n}\n\n/**\n * Add helper to be used in `Array.map` for adding a addend to each value of an array.\n *\n * @memberof Chartist.Core\n * @param {Number} addend\n * @returns {Function} Function that can be used in `Array.map` to add a addend to each value in an array\n */\nexport function mapAdd(addend) {\n return function(num) {\n return num + addend;\n };\n}\n\n/**\n * Map for multi dimensional arrays where their nested arrays will be mapped in serial. The output array will have the length of the largest nested array. The callback function is called with variable arguments where each argument is the nested array value (or undefined if there are no more values).\n *\n * @memberof Chartist.Core\n * @param arr\n * @param cb\n * @return {Array}\n */\nexport function serialMap(arr, cb) {\n var result = [],\n length = Math.max.apply(null, arr.map(function(e) {\n return e.length;\n }));\n\n times(length).forEach(function(e, index) {\n var args = arr.map(function(e) {\n return e[index];\n });\n\n result[index] = cb.apply(null, args);\n });\n\n return result;\n}\n","import {precision} from './globals';\n\n/**\n * Calculate the order of magnitude for the chart scale\n *\n * @memberof Chartist.Core\n * @param {Number} value The value Range of the chart\n * @return {Number} The order of magnitude\n */\nexport function orderOfMagnitude(value) {\n return Math.floor(Math.log(Math.abs(value)) / Math.LN10);\n}\n\n/**\n * Project a data length into screen coordinates (pixels)\n *\n * @memberof Chartist.Core\n * @param {Object} axisLength The svg element for the chart\n * @param {Number} length Single data value from a series array\n * @param {Object} bounds All the values to set the bounds of the chart\n * @return {Number} The projected data length in pixels\n */\nexport function projectLength(axisLength, length, bounds) {\n return length / bounds.range * axisLength;\n}\n\n/**\n * This helper function can be used to round values with certain precision level after decimal. This is used to prevent rounding errors near float point precision limit.\n *\n * @memberof Chartist.Core\n * @param {Number} value The value that should be rounded with precision\n * @param {Number} [digits] The number of digits after decimal used to do the rounding\n * @returns {number} Rounded value\n */\nexport function roundWithPrecision(value, digits) {\n var precision = Math.pow(10, digits || precision);\n return Math.round(value * precision) / precision;\n}\n\n/**\n * Pollard Rho Algorithm to find smallest factor of an integer value. There are more efficient algorithms for factorization, but this one is quite efficient and not so complex.\n *\n * @memberof Chartist.Core\n * @param {Number} num An integer number where the smallest factor should be searched for\n * @returns {Number} The smallest integer factor of the parameter num.\n */\nexport function rho(num) {\n if(num === 1) {\n return num;\n }\n\n function gcd(p, q) {\n if (p % q === 0) {\n return q;\n } else {\n return gcd(q, p % q);\n }\n }\n\n function f(x) {\n return x * x + 1;\n }\n\n var x1 = 2, x2 = 2, divisor;\n if (num % 2 === 0) {\n return 2;\n }\n\n do {\n x1 = f(x1) % num;\n x2 = f(f(x2)) % num;\n divisor = gcd(Math.abs(x1 - x2), num);\n } while (divisor === 1);\n\n return divisor;\n}\n\n/**\n * Calculate cartesian coordinates of polar coordinates\n *\n * @memberof Chartist.Core\n * @param {Number} centerX X-axis coordinates of center point of circle segment\n * @param {Number} centerY X-axis coordinates of center point of circle segment\n * @param {Number} radius Radius of circle segment\n * @param {Number} angleInDegrees Angle of circle segment in degrees\n * @return {{x:Number, y:Number}} Coordinates of point on circumference\n */\nexport function polarToCartesian(centerX, centerY, radius, angleInDegrees) {\n var angleInRadians = (angleInDegrees - 90) * Math.PI / 180.0;\n\n return {\n x: centerX + (radius * Math.cos(angleInRadians)),\n y: centerY + (radius * Math.sin(angleInRadians))\n };\n}\n","/**\n * Simple recursive object extend\n *\n * @memberof Chartist.Core\n * @param {Object} target Target object where the source will be merged into\n * @param {Object...} sources This object (objects) will be merged into target and then target is returned\n * @return {Object} An object that has the same reference as target but is extended and merged with the properties of source\n */\nexport function extend(target) {\n var i, source, sourceProp;\n target = target || {};\n\n for (i = 1; i < arguments.length; i++) {\n source = arguments[i];\n for (var prop in source) {\n sourceProp = source[prop];\n if (typeof sourceProp === 'object' && sourceProp !== null && !(sourceProp instanceof Array)) {\n target[prop] = extend(target[prop], sourceProp);\n } else {\n target[prop] = sourceProp;\n }\n }\n }\n\n return target;\n}\n","import {escapingMap} from './globals';\nimport {replaceAll, safeHasProperty, getNumberOrUndefined} from './lang';\nimport {times} from './functional';\nimport {extend} from './extend';\nimport {orderOfMagnitude, projectLength, roundWithPrecision, rho} from './math';\n\n/**\n * This function serializes arbitrary data to a string. In case of data that can't be easily converted to a string, this function will create a wrapper object and serialize the data using JSON.stringify. The outcoming string will always be escaped using Chartist.escapingMap.\n * If called with null or undefined the function will return immediately with null or undefined.\n *\n * @memberof Chartist.Core\n * @param {Number|String|Object} data\n * @return {String}\n */\nexport function serialize(data) {\n if(data === null || data === undefined) {\n return data;\n } else if(typeof data === 'number') {\n data = ''+data;\n } else if(typeof data === 'object') {\n data = JSON.stringify({data: data});\n }\n\n return Object.keys(escapingMap).reduce(function(result, key) {\n return replaceAll(result, key, escapingMap[key]);\n }, data);\n}\n\n/**\n * This function de-serializes a string previously serialized with Chartist.serialize. The string will always be unescaped using Chartist.escapingMap before it's returned. Based on the input value the return type can be Number, String or Object. JSON.parse is used with try / catch to see if the unescaped string can be parsed into an Object and this Object will be returned on success.\n *\n * @memberof Chartist.Core\n * @param {String} data\n * @return {String|Number|Object}\n */\nexport function deserialize(data) {\n if(typeof data !== 'string') {\n return data;\n }\n\n data = Object.keys(escapingMap).reduce(function(result, key) {\n return replaceAll(result, escapingMap[key], key);\n }, data);\n\n try {\n data = JSON.parse(data);\n data = data.data !== undefined ? data.data : data;\n } catch(e) {}\n\n return data;\n}\n\n/**\n * Ensures that the data object passed as second argument to the charts is present and correctly initialized.\n *\n * @param {Object} data The data object that is passed as second argument to the charts\n * @return {Object} The normalized data object\n */\nexport function normalizeData(data, reverse, multi) {\n var labelCount;\n var output = {\n raw: data,\n normalized: {}\n };\n\n // Check if we should generate some labels based on existing series data\n output.normalized.series = getDataArray({\n series: data.series || []\n }, reverse, multi);\n\n // If all elements of the normalized data array are arrays we're dealing with\n // multi series data and we need to find the largest series if they are un-even\n if (output.normalized.series.every(function(value) {\n return value instanceof Array;\n })) {\n // Getting the series with the the most elements\n labelCount = Math.max.apply(null, output.normalized.series.map(function(series) {\n return series.length;\n }));\n } else {\n // We're dealing with Pie data so we just take the normalized array length\n labelCount = output.normalized.series.length;\n }\n\n output.normalized.labels = (data.labels || []).slice();\n // Padding the labels to labelCount with empty strings\n Array.prototype.push.apply(\n output.normalized.labels,\n times(Math.max(0, labelCount - output.normalized.labels.length)).map(function() {\n return '';\n })\n );\n\n if(reverse) {\n reverseData(output.normalized);\n }\n\n return output;\n}\n\n/**\n * Get meta data of a specific value in a series.\n *\n * @param series\n * @param index\n * @returns {*}\n */\nexport function getMetaData(series, index) {\n var value = series.data ? series.data[index] : series[index];\n return value ? value.meta : undefined;\n}\n\n/**\n * Checks if a value is considered a hole in the data series.\n *\n * @param {*} value\n * @returns {boolean} True if the value is considered a data hole\n */\nexport function isDataHoleValue(value) {\n return value === null ||\n value === undefined ||\n (typeof value === 'number' && isNaN(value));\n}\n\n/**\n * Reverses the series, labels and series data arrays.\n *\n * @memberof Chartist.Core\n * @param data\n */\nexport function reverseData(data) {\n data.labels.reverse();\n data.series.reverse();\n for (var i = 0; i < data.series.length; i++) {\n if(typeof(data.series[i]) === 'object' && data.series[i].data !== undefined) {\n data.series[i].data.reverse();\n } else if(data.series[i] instanceof Array) {\n data.series[i].reverse();\n }\n }\n}\n\n/**\n * Convert data series into plain array\n *\n * @memberof Chartist.Core\n * @param {Object} data The series object that contains the data to be visualized in the chart\n * @param {Boolean} [reverse] If true the whole data is reversed by the getDataArray call. This will modify the data object passed as first parameter. The labels as well as the series order is reversed. The whole series data arrays are reversed too.\n * @param {Boolean} [multi] Create a multi dimensional array from a series data array where a value object with `x` and `y` values will be created.\n * @return {Array} A plain array that contains the data to be visualized in the chart\n */\nexport function getDataArray(data, reverse, multi) {\n // Recursively walks through nested arrays and convert string values to numbers and objects with value properties\n // to values. Check the tests in data core -> data normalization for a detailed specification of expected values\n function recursiveConvert(value) {\n if(safeHasProperty(value, 'value')) {\n // We are dealing with value object notation so we need to recurse on value property\n return recursiveConvert(value.value);\n } else if(safeHasProperty(value, 'data')) {\n // We are dealing with series object notation so we need to recurse on data property\n return recursiveConvert(value.data);\n } else if(value instanceof Array) {\n // Data is of type array so we need to recurse on the series\n return value.map(recursiveConvert);\n } else if(isDataHoleValue(value)) {\n // We're dealing with a hole in the data and therefore need to return undefined\n // We're also returning undefined for multi value output\n return undefined;\n } else {\n // We need to prepare multi value output (x and y data)\n if(multi) {\n var multiValue = {};\n\n // Single series value arrays are assumed to specify the Y-Axis value\n // For example: [1, 2] => [{x: undefined, y: 1}, {x: undefined, y: 2}]\n // If multi is a string then it's assumed that it specified which dimension should be filled as default\n if(typeof multi === 'string') {\n multiValue[multi] = getNumberOrUndefined(value);\n } else {\n multiValue.y = getNumberOrUndefined(value);\n }\n\n multiValue.x = value.hasOwnProperty('x') ? getNumberOrUndefined(value.x) : multiValue.x;\n multiValue.y = value.hasOwnProperty('y') ? getNumberOrUndefined(value.y) : multiValue.y;\n\n return multiValue;\n\n } else {\n // We can return simple data\n return getNumberOrUndefined(value);\n }\n }\n }\n\n return data.series.map(recursiveConvert);\n}\n\n/**\n * Checks if provided value object is multi value (contains x or y properties)\n *\n * @memberof Chartist.Core\n * @param value\n */\nexport function isMultiValue(value) {\n return typeof value === 'object' && ('x' in value || 'y' in value);\n}\n\n/**\n * Gets a value from a dimension `value.x` or `value.y` while returning value directly if it's a valid numeric value. If the value is not numeric and it's falsey this function will return `defaultValue`.\n *\n * @memberof Chartist.Core\n * @param value\n * @param dimension\n * @param defaultValue\n * @returns {*}\n */\nexport function getMultiValue(value, dimension) {\n if(isMultiValue(value)) {\n return getNumberOrUndefined(value[dimension || 'y']);\n } else {\n return getNumberOrUndefined(value);\n }\n}\n\n/**\n * Helper to read series specific options from options object. It automatically falls back to the global option if\n * there is no option in the series options.\n *\n * @param {Object} series Series object\n * @param {Object} options Chartist options object\n * @param {string} key The options key that should be used to obtain the options\n * @returns {*}\n */\nexport function getSeriesOption(series, options, key) {\n if(series.name && options.series && options.series[series.name]) {\n var seriesOptions = options.series[series.name];\n return seriesOptions.hasOwnProperty(key) ? seriesOptions[key] : options[key];\n } else {\n return options[key];\n }\n}\n\n/**\n * Splits a list of coordinates and associated values into segments. Each returned segment contains a pathCoordinates\n * valueData property describing the segment.\n *\n * With the default options, segments consist of contiguous sets of points that do not have an undefined value. Any\n * points with undefined values are discarded.\n *\n * **Options**\n * The following options are used to determine how segments are formed\n * ```javascript\n * var options = {\n * // If fillHoles is true, undefined values are simply discarded without creating a new segment. Assuming other options are default, this returns single segment.\n * fillHoles: false,\n * // If increasingX is true, the coordinates in all segments have strictly increasing x-values.\n * increasingX: false\n * };\n * ```\n *\n * @memberof Chartist.Core\n * @param {Array} pathCoordinates List of point coordinates to be split in the form [x1, y1, x2, y2 ... xn, yn]\n * @param {Array} valueData List of associated point values in the form [v1, v2 .. vn]\n * @param {Object} [options] Options set by user\n * @return {Array} List of segments, each containing a pathCoordinates and valueData property.\n */\nexport function splitIntoSegments(pathCoordinates, valueData, options) {\n var defaultOptions = {\n increasingX: false,\n fillHoles: false\n };\n\n options = extend({}, defaultOptions, options);\n\n var segments = [];\n var hole = true;\n\n for(var i = 0; i < pathCoordinates.length; i += 2) {\n // If this value is a \"hole\" we set the hole flag\n if(getMultiValue(valueData[i / 2].value) === undefined) {\n // if(valueData[i / 2].value === undefined) {\n if(!options.fillHoles) {\n hole = true;\n }\n } else {\n if(options.increasingX && i >= 2 && pathCoordinates[i] <= pathCoordinates[i-2]) {\n // X is not increasing, so we need to make sure we start a new segment\n hole = true;\n }\n\n\n // If it's a valid value we need to check if we're coming out of a hole and create a new empty segment\n if(hole) {\n segments.push({\n pathCoordinates: [],\n valueData: []\n });\n // As we have a valid value now, we are not in a \"hole\" anymore\n hole = false;\n }\n\n // Add to the segment pathCoordinates and valueData\n segments[segments.length - 1].pathCoordinates.push(pathCoordinates[i], pathCoordinates[i + 1]);\n segments[segments.length - 1].valueData.push(valueData[i / 2]);\n }\n }\n\n return segments;\n}\n\n/**\n * Get highest and lowest value of data array. This Array contains the data that will be visualized in the chart.\n *\n * @memberof Chartist.Core\n * @param {Array} data The array that contains the data to be visualized in the chart\n * @param {Object} options The Object that contains the chart options\n * @param {String} dimension Axis dimension 'x' or 'y' used to access the correct value and high / low configuration\n * @return {Object} An object that contains the highest and lowest value that will be visualized on the chart.\n */\nexport function getHighLow(data, options, dimension) {\n // TODO: Remove workaround for deprecated global high / low config. Axis high / low configuration is preferred\n options = extend({}, options, dimension ? options['axis' + dimension.toUpperCase()] : {});\n\n var highLow = {\n high: options.high === undefined ? -Number.MAX_VALUE : +options.high,\n low: options.low === undefined ? Number.MAX_VALUE : +options.low\n };\n var findHigh = options.high === undefined;\n var findLow = options.low === undefined;\n\n // Function to recursively walk through arrays and find highest and lowest number\n function recursiveHighLow(data) {\n if(data === undefined) {\n return undefined;\n } else if(data instanceof Array) {\n for (var i = 0; i < data.length; i++) {\n recursiveHighLow(data[i]);\n }\n } else {\n var value = dimension ? +data[dimension] : +data;\n\n if (findHigh && value > highLow.high) {\n highLow.high = value;\n }\n\n if (findLow && value < highLow.low) {\n highLow.low = value;\n }\n }\n }\n\n // Start to find highest and lowest number recursively\n if(findHigh || findLow) {\n recursiveHighLow(data);\n }\n\n // Overrides of high / low based on reference value, it will make sure that the invisible reference value is\n // used to generate the chart. This is useful when the chart always needs to contain the position of the\n // invisible reference value in the view i.e. for bipolar scales.\n if (options.referenceValue || options.referenceValue === 0) {\n highLow.high = Math.max(options.referenceValue, highLow.high);\n highLow.low = Math.min(options.referenceValue, highLow.low);\n }\n\n // If high and low are the same because of misconfiguration or flat data (only the same value) we need\n // to set the high or low to 0 depending on the polarity\n if (highLow.high <= highLow.low) {\n // If both values are 0 we set high to 1\n if (highLow.low === 0) {\n highLow.high = 1;\n } else if (highLow.low < 0) {\n // If we have the same negative value for the bounds we set bounds.high to 0\n highLow.high = 0;\n } else if (highLow.high > 0) {\n // If we have the same positive value for the bounds we set bounds.low to 0\n highLow.low = 0;\n } else {\n // If data array was empty, values are Number.MAX_VALUE and -Number.MAX_VALUE. Set bounds to prevent errors\n highLow.high = 1;\n highLow.low = 0;\n }\n }\n\n return highLow;\n}\n\n/**\n * Calculate and retrieve all the bounds for the chart and return them in one array\n *\n * @memberof Chartist.Core\n * @param {Number} axisLength The length of the Axis used for\n * @param {Object} highLow An object containing a high and low property indicating the value range of the chart.\n * @param {Number} scaleMinSpace The minimum projected length a step should result in\n * @param {Boolean} onlyInteger\n * @return {Object} All the values to set the bounds of the chart\n */\nexport function getBounds(axisLength, highLow, scaleMinSpace, onlyInteger) {\n var i,\n optimizationCounter = 0,\n newMin,\n newMax,\n bounds = {\n high: highLow.high,\n low: highLow.low\n };\n\n bounds.valueRange = bounds.high - bounds.low;\n bounds.oom = orderOfMagnitude(bounds.valueRange);\n bounds.step = Math.pow(10, bounds.oom);\n bounds.min = Math.floor(bounds.low / bounds.step) * bounds.step;\n bounds.max = Math.ceil(bounds.high / bounds.step) * bounds.step;\n bounds.range = bounds.max - bounds.min;\n bounds.numberOfSteps = Math.round(bounds.range / bounds.step);\n\n // Optimize scale step by checking if subdivision is possible based on horizontalGridMinSpace\n // If we are already below the scaleMinSpace value we will scale up\n var length = projectLength(axisLength, bounds.step, bounds);\n var scaleUp = length < scaleMinSpace;\n var smallestFactor = onlyInteger ? rho(bounds.range) : 0;\n\n // First check if we should only use integer steps and if step 1 is still larger than scaleMinSpace so we can use 1\n if(onlyInteger && projectLength(axisLength, 1, bounds) >= scaleMinSpace) {\n bounds.step = 1;\n } else if(onlyInteger && smallestFactor < bounds.step && projectLength(axisLength, smallestFactor, bounds) >= scaleMinSpace) {\n // If step 1 was too small, we can try the smallest factor of range\n // If the smallest factor is smaller than the current bounds.step and the projected length of smallest factor\n // is larger than the scaleMinSpace we should go for it.\n bounds.step = smallestFactor;\n } else {\n // Trying to divide or multiply by 2 and find the best step value\n while (true) {\n if (scaleUp && projectLength(axisLength, bounds.step, bounds) <= scaleMinSpace) {\n bounds.step *= 2;\n } else if (!scaleUp && projectLength(axisLength, bounds.step / 2, bounds) >= scaleMinSpace) {\n bounds.step /= 2;\n if(onlyInteger && bounds.step % 1 !== 0) {\n bounds.step *= 2;\n break;\n }\n } else {\n break;\n }\n\n if(optimizationCounter++ > 1000) {\n throw new Error('Exceeded maximum number of iterations while optimizing scale step!');\n }\n }\n }\n\n var EPSILON = 2.221E-16;\n bounds.step = Math.max(bounds.step, EPSILON);\n function safeIncrement(value, increment) {\n // If increment is too small use *= (1+EPSILON) as a simple nextafter\n if (value === (value += increment)) {\n value *= (1 + (increment > 0 ? EPSILON : -EPSILON));\n }\n return value;\n }\n\n // Narrow min and max based on new step\n newMin = bounds.min;\n newMax = bounds.max;\n while (newMin + bounds.step <= bounds.low) {\n newMin = safeIncrement(newMin, bounds.step);\n }\n while (newMax - bounds.step >= bounds.high) {\n newMax = safeIncrement(newMax, -bounds.step);\n }\n bounds.min = newMin;\n bounds.max = newMax;\n bounds.range = bounds.max - bounds.min;\n\n var values = [];\n for (i = bounds.min; i <= bounds.max; i = safeIncrement(i, bounds.step)) {\n var value = roundWithPrecision(i);\n if (value !== values[values.length - 1]) {\n values.push(i);\n }\n }\n bounds.values = values;\n return bounds;\n}\n","import {namespaces, ensureUnit, quantity, extend} from '../core/core';\nimport {SvgList} from './svg-list';\n\n/**\n * Svg creates a new SVG object wrapper with a starting element. You can use the wrapper to fluently create sub-elements and modify them.\n *\n * @memberof Svg\n * @constructor\n * @param {String|Element} name The name of the SVG element to create or an SVG dom element which should be wrapped into Svg\n * @param {Object} attributes An object with properties that will be added as attributes to the SVG element that is created. Attributes with undefined values will not be added.\n * @param {String} className This class or class list will be added to the SVG element\n * @param {Object} parent The parent SVG wrapper object where this newly created wrapper and it's element will be attached to as child\n * @param {Boolean} insertFirst If this param is set to true in conjunction with a parent element the newly created element will be added as first child element in the parent element\n */\nexport class Svg {\n\n constructor(name, attributes, className, parent, insertFirst) {\n // If Svg is getting called with an SVG element we just return the wrapper\n if(name instanceof Element) {\n this._node = name;\n } else {\n this._node = document.createElementNS(namespaces.svg, name);\n\n // If this is an SVG element created then custom namespace\n if(name === 'svg') {\n this.attr({\n 'xmlns:ct': namespaces.ct\n });\n }\n }\n\n if(attributes) {\n this.attr(attributes);\n }\n\n if(className) {\n this.addClass(className);\n }\n\n if(parent) {\n if (insertFirst && parent._node.firstChild) {\n parent._node.insertBefore(this._node, parent._node.firstChild);\n } else {\n parent._node.appendChild(this._node);\n }\n }\n }\n\n /**\n * Set attributes on the current SVG element of the wrapper you're currently working on.\n *\n * @memberof Svg\n * @param {Object|String} attributes An object with properties that will be added as attributes to the SVG element that is created. Attributes with undefined values will not be added. If this parameter is a String then the function is used as a getter and will return the attribute value.\n * @param {String} [ns] If specified, the attribute will be obtained using getAttributeNs. In order to write namepsaced attributes you can use the namespace:attribute notation within the attributes object.\n * @return {Object|String} The current wrapper object will be returned so it can be used for chaining or the attribute value if used as getter function.\n */\n attr(attributes, ns) {\n if(typeof attributes === 'string') {\n if(ns) {\n return this._node.getAttributeNS(ns, attributes);\n } else {\n return this._node.getAttribute(attributes);\n }\n }\n\n Object.keys(attributes).forEach(function(key) {\n // If the attribute value is undefined we can skip this one\n if(attributes[key] === undefined) {\n return;\n }\n\n if (key.indexOf(':') !== -1) {\n var namespacedAttribute = key.split(':');\n this._node.setAttributeNS(namespaces[namespacedAttribute[0]], key, attributes[key]);\n } else {\n this._node.setAttribute(key, attributes[key]);\n }\n }.bind(this));\n\n return this;\n }\n\n /**\n * Create a new SVG element whose wrapper object will be selected for further operations. This way you can also create nested groups easily.\n *\n * @memberof Svg\n * @param {String} name The name of the SVG element that should be created as child element of the currently selected element wrapper\n * @param {Object} [attributes] An object with properties that will be added as attributes to the SVG element that is created. Attributes with undefined values will not be added.\n * @param {String} [className] This class or class list will be added to the SVG element\n * @param {Boolean} [insertFirst] If this param is set to true in conjunction with a parent element the newly created element will be added as first child element in the parent element\n * @return {Svg} Returns a Svg wrapper object that can be used to modify the containing SVG data\n */\n elem(name, attributes, className, insertFirst) {\n return new Svg(name, attributes, className, this, insertFirst);\n }\n\n /**\n * Returns the parent Chartist.SVG wrapper object\n *\n * @memberof Svg\n * @return {Svg} Returns a Svg wrapper around the parent node of the current node. If the parent node is not existing or it's not an SVG node then this function will return null.\n */\n parent() {\n return this._node.parentNode instanceof SVGElement ? new Svg(this._node.parentNode) : null;\n }\n\n /**\n * This method returns a Svg wrapper around the root SVG element of the current tree.\n *\n * @memberof Svg\n * @return {Svg} The root SVG element wrapped in a Svg element\n */\n root() {\n var node = this._node;\n while(node.nodeName !== 'svg') {\n node = node.parentNode;\n }\n return new Svg(node);\n }\n\n /**\n * Find the first child SVG element of the current element that matches a CSS selector. The returned object is a Svg wrapper.\n *\n * @memberof Svg\n * @param {String} selector A CSS selector that is used to query for child SVG elements\n * @return {Svg} The SVG wrapper for the element found or null if no element was found\n */\n querySelector(selector) {\n var foundNode = this._node.querySelector(selector);\n return foundNode ? new Svg(foundNode) : null;\n }\n\n /**\n * Find the all child SVG elements of the current element that match a CSS selector. The returned object is a Svg.List wrapper.\n *\n * @memberof Svg\n * @param {String} selector A CSS selector that is used to query for child SVG elements\n * @return {SvgList} The SVG wrapper list for the element found or null if no element was found\n */\n querySelectorAll(selector) {\n var foundNodes = this._node.querySelectorAll(selector);\n return foundNodes.length ? new SvgList(foundNodes) : null;\n }\n\n /**\n * Returns the underlying SVG node for the current element.\n *\n * @memberof Svg\n * @returns {Node}\n */\n getNode() {\n return this._node;\n }\n\n /**\n * This method creates a foreignObject (see https://developer.mozilla.org/en-US/docs/Web/SVG/Element/foreignObject) that allows to embed HTML content into a SVG graphic. With the help of foreignObjects you can enable the usage of regular HTML elements inside of SVG where they are subject for SVG positioning and transformation but the Browser will use the HTML rendering capabilities for the containing DOM.\n *\n * @memberof Svg\n * @param {Node|String} content The DOM Node, or HTML string that will be converted to a DOM Node, that is then placed into and wrapped by the foreignObject\n * @param {String} [attributes] An object with properties that will be added as attributes to the foreignObject element that is created. Attributes with undefined values will not be added.\n * @param {String} [className] This class or class list will be added to the SVG element\n * @param {Boolean} [insertFirst] Specifies if the foreignObject should be inserted as first child\n * @return {Svg} New wrapper object that wraps the foreignObject element\n */\n foreignObject(content, attributes, className, insertFirst) {\n // If content is string then we convert it to DOM\n // TODO: Handle case where content is not a string nor a DOM Node\n if(typeof content === 'string') {\n var container = document.createElement('div');\n container.innerHTML = content;\n content = container.firstChild;\n }\n\n // Adding namespace to content element\n content.setAttribute('xmlns', namespaces.xmlns);\n\n // Creating the foreignObject without required extension attribute (as described here\n // http://www.w3.org/TR/SVG/extend.html#ForeignObjectElement)\n var fnObj = this.elem('foreignObject', attributes, className, insertFirst);\n\n // Add content to foreignObjectElement\n fnObj._node.appendChild(content);\n\n return fnObj;\n }\n\n /**\n * This method adds a new text element to the current Svg wrapper.\n *\n * @memberof Svg\n * @param {String} t The text that should be added to the text element that is created\n * @return {Svg} The same wrapper object that was used to add the newly created element\n */\n text(t) {\n this._node.appendChild(document.createTextNode(t));\n return this;\n }\n\n /**\n * This method will clear all child nodes of the current wrapper object.\n *\n * @memberof Svg\n * @return {Svg} The same wrapper object that got emptied\n */\n empty() {\n while (this._node.firstChild) {\n this._node.removeChild(this._node.firstChild);\n }\n\n return this;\n }\n\n /**\n * This method will cause the current wrapper to remove itself from its parent wrapper. Use this method if you'd like to get rid of an element in a given DOM structure.\n *\n * @memberof Svg\n * @return {Svg} The parent wrapper object of the element that got removed\n */\n remove() {\n this._node.parentNode.removeChild(this._node);\n return this.parent();\n }\n\n /**\n * This method will replace the element with a new element that can be created outside of the current DOM.\n *\n * @memberof Svg\n * @param {Svg} newElement The new Svg object that will be used to replace the current wrapper object\n * @return {Svg} The wrapper of the new element\n */\n replace(newElement) {\n this._node.parentNode.replaceChild(newElement._node, this._node);\n return newElement;\n }\n\n /**\n * This method will append an element to the current element as a child.\n *\n * @memberof Svg\n * @param {Svg} element The Svg element that should be added as a child\n * @param {Boolean} [insertFirst] Specifies if the element should be inserted as first child\n * @return {Svg} The wrapper of the appended object\n */\n append(element, insertFirst) {\n if(insertFirst && this._node.firstChild) {\n this._node.insertBefore(element._node, this._node.firstChild);\n } else {\n this._node.appendChild(element._node);\n }\n\n return this;\n }\n\n /**\n * Returns an array of class names that are attached to the current wrapper element. This method can not be chained further.\n *\n * @memberof Svg\n * @return {Array} A list of classes or an empty array if there are no classes on the current element\n */\n classes() {\n return this._node.getAttribute('class') ? this._node.getAttribute('class').trim().split(/\\s+/) : [];\n }\n\n /**\n * Adds one or a space separated list of classes to the current element and ensures the classes are only existing once.\n *\n * @memberof Svg\n * @param {String} names A white space separated list of class names\n * @return {Svg} The wrapper of the current element\n */\n addClass(names) {\n this._node.setAttribute('class',\n this.classes()\n .concat(names.trim().split(/\\s+/))\n .filter(function(elem, pos, self) {\n return self.indexOf(elem) === pos;\n }).join(' ')\n );\n\n return this;\n }\n\n /**\n * Removes one or a space separated list of classes from the current element.\n *\n * @memberof Svg\n * @param {String} names A white space separated list of class names\n * @return {Svg} The wrapper of the current element\n */\n removeClass(names) {\n var removedClasses = names.trim().split(/\\s+/);\n\n this._node.setAttribute('class', this.classes().filter(function(name) {\n return removedClasses.indexOf(name) === -1;\n }).join(' '));\n\n return this;\n }\n\n /**\n * Removes all classes from the current element.\n *\n * @memberof Svg\n * @return {Svg} The wrapper of the current element\n */\n removeAllClasses() {\n this._node.setAttribute('class', '');\n return this;\n }\n\n /**\n * Get element height using `getBoundingClientRect`\n *\n * @memberof Svg\n * @return {Number} The elements height in pixels\n */\n height() {\n return this._node.getBoundingClientRect().height;\n }\n\n /**\n * Get element width using `getBoundingClientRect`\n *\n * @memberof Chartist.Core\n * @return {Number} The elements width in pixels\n */\n width() {\n return this._node.getBoundingClientRect().width;\n }\n\n /**\n * The animate function lets you animate the current element with SMIL animations. You can add animations for multiple attributes at the same time by using an animation definition object. This object should contain SMIL animation attributes. Please refer to http://www.w3.org/TR/SVG/animate.html for a detailed specification about the available animation attributes. Additionally an easing property can be passed in the animation definition object. This can be a string with a name of an easing function in `Svg.Easing` or an array with four numbers specifying a cubic Bézier curve.\n * **An animations object could look like this:**\n * ```javascript\n * element.animate({\n * opacity: {\n * dur: 1000,\n * from: 0,\n * to: 1\n * },\n * x1: {\n * dur: '1000ms',\n * from: 100,\n * to: 200,\n * easing: 'easeOutQuart'\n * },\n * y1: {\n * dur: '2s',\n * from: 0,\n * to: 100\n * }\n * });\n * ```\n * **Automatic unit conversion**\n * For the `dur` and the `begin` animate attribute you can also omit a unit by passing a number. The number will automatically be converted to milli seconds.\n * **Guided mode**\n * The default behavior of SMIL animations with offset using the `begin` attribute is that the attribute will keep it's original value until the animation starts. Mostly this behavior is not desired as you'd like to have your element attributes already initialized with the animation `from` value even before the animation starts. Also if you don't specify `fill=\"freeze\"` on an animate element or if you delete the animation after it's done (which is done in guided mode) the attribute will switch back to the initial value. This behavior is also not desired when performing simple one-time animations. For one-time animations you'd want to trigger animations immediately instead of relative to the document begin time. That's why in guided mode Svg will also use the `begin` property to schedule a timeout and manually start the animation after the timeout. If you're using multiple SMIL definition objects for an attribute (in an array), guided mode will be disabled for this attribute, even if you explicitly enabled it.\n * If guided mode is enabled the following behavior is added:\n * - Before the animation starts (even when delayed with `begin`) the animated attribute will be set already to the `from` value of the animation\n * - `begin` is explicitly set to `indefinite` so it can be started manually without relying on document begin time (creation)\n * - The animate element will be forced to use `fill=\"freeze\"`\n * - The animation will be triggered with `beginElement()` in a timeout where `begin` of the definition object is interpreted in milli seconds. If no `begin` was specified the timeout is triggered immediately.\n * - After the animation the element attribute value will be set to the `to` value of the animation\n * - The animate element is deleted from the DOM\n *\n * @memberof Svg\n * @param {Object} animations An animations object where the property keys are the attributes you'd like to animate. The properties should be objects again that contain the SMIL animation attributes (usually begin, dur, from, and to). The property begin and dur is auto converted (see Automatic unit conversion). You can also schedule multiple animations for the same attribute by passing an Array of SMIL definition objects. Attributes that contain an array of SMIL definition objects will not be executed in guided mode.\n * @param {Boolean} guided Specify if guided mode should be activated for this animation (see Guided mode). If not otherwise specified, guided mode will be activated.\n * @param {Object} eventEmitter If specified, this event emitter will be notified when an animation starts or ends.\n * @return {Svg} The current element where the animation was added\n */\n animate(animations, guided, eventEmitter) {\n if(guided === undefined) {\n guided = true;\n }\n\n Object.keys(animations).forEach(function createAnimateForAttributes(attribute) {\n\n function createAnimate(animationDefinition, guided) {\n var attributeProperties = {},\n animate,\n timeout,\n animationEasing;\n\n // Check if an easing is specified in the definition object and delete it from the object as it will not\n // be part of the animate element attributes.\n if(animationDefinition.easing) {\n // If already an easing Bézier curve array we take it or we lookup a easing array in the Easing object\n animationEasing = animationDefinition.easing instanceof Array ?\n animationDefinition.easing :\n easings[animationDefinition.easing];\n delete animationDefinition.easing;\n }\n\n // If numeric dur or begin was provided we assume milli seconds\n animationDefinition.begin = ensureUnit(animationDefinition.begin, 'ms');\n animationDefinition.dur = ensureUnit(animationDefinition.dur, 'ms');\n\n if(animationEasing) {\n animationDefinition.calcMode = 'spline';\n animationDefinition.keySplines = animationEasing.join(' ');\n animationDefinition.keyTimes = '0;1';\n }\n\n // Adding \"fill: freeze\" if we are in guided mode and set initial attribute values\n if(guided) {\n animationDefinition.fill = 'freeze';\n // Animated property on our element should already be set to the animation from value in guided mode\n attributeProperties[attribute] = animationDefinition.from;\n this.attr(attributeProperties);\n\n // In guided mode we also set begin to indefinite so we can trigger the start manually and put the begin\n // which needs to be in ms aside\n timeout = quantity(animationDefinition.begin || 0).value;\n animationDefinition.begin = 'indefinite';\n }\n\n animate = this.elem('animate', extend({\n attributeName: attribute\n }, animationDefinition));\n\n if(guided) {\n // If guided we take the value that was put aside in timeout and trigger the animation manually with a timeout\n setTimeout(function() {\n // If beginElement fails we set the animated attribute to the end position and remove the animate element\n // This happens if the SMIL ElementTimeControl interface is not supported or any other problems occured in\n // the browser. (Currently FF 34 does not support animate elements in foreignObjects)\n try {\n animate._node.beginElement();\n } catch(err) {\n // Set animated attribute to current animated value\n attributeProperties[attribute] = animationDefinition.to;\n this.attr(attributeProperties);\n // Remove the animate element as it's no longer required\n animate.remove();\n }\n }.bind(this), timeout);\n }\n\n if(eventEmitter) {\n animate._node.addEventListener('beginEvent', function handleBeginEvent() {\n eventEmitter.emit('animationBegin', {\n element: this,\n animate: animate._node,\n params: animationDefinition\n });\n }.bind(this));\n }\n\n animate._node.addEventListener('endEvent', function handleEndEvent() {\n if(eventEmitter) {\n eventEmitter.emit('animationEnd', {\n element: this,\n animate: animate._node,\n params: animationDefinition\n });\n }\n\n if(guided) {\n // Set animated attribute to current animated value\n attributeProperties[attribute] = animationDefinition.to;\n this.attr(attributeProperties);\n // Remove the animate element as it's no longer required\n animate.remove();\n }\n }.bind(this));\n }\n\n // If current attribute is an array of definition objects we create an animate for each and disable guided mode\n if(animations[attribute] instanceof Array) {\n animations[attribute].forEach(function(animationDefinition) {\n createAnimate.bind(this)(animationDefinition, false);\n }.bind(this));\n } else {\n createAnimate.bind(this)(animations[attribute], guided);\n }\n\n }.bind(this));\n\n return this;\n }\n}\n\n/**\n * This method checks for support of a given SVG feature like Extensibility, SVG-animation or the like. Check http://www.w3.org/TR/SVG11/feature for a detailed list.\n *\n * @memberof Svg\n * @param {String} feature The SVG 1.1 feature that should be checked for support.\n * @return {Boolean} True of false if the feature is supported or not\n */\nexport function isSupported(feature) {\n return document.implementation.hasFeature('http://www.w3.org/TR/SVG11/feature#' + feature, '1.1');\n}\n\n/**\n * This Object contains some standard easing cubic bezier curves. Then can be used with their name in the `Svg.animate`. You can also extend the list and use your own name in the `animate` function. Click the show code button to see the available bezier functions.\n *\n * @memberof Svg\n */\nexport const easings = {\n easeInSine: [0.47, 0, 0.745, 0.715],\n easeOutSine: [0.39, 0.575, 0.565, 1],\n easeInOutSine: [0.445, 0.05, 0.55, 0.95],\n easeInQuad: [0.55, 0.085, 0.68, 0.53],\n easeOutQuad: [0.25, 0.46, 0.45, 0.94],\n easeInOutQuad: [0.455, 0.03, 0.515, 0.955],\n easeInCubic: [0.55, 0.055, 0.675, 0.19],\n easeOutCubic: [0.215, 0.61, 0.355, 1],\n easeInOutCubic: [0.645, 0.045, 0.355, 1],\n easeInQuart: [0.895, 0.03, 0.685, 0.22],\n easeOutQuart: [0.165, 0.84, 0.44, 1],\n easeInOutQuart: [0.77, 0, 0.175, 1],\n easeInQuint: [0.755, 0.05, 0.855, 0.06],\n easeOutQuint: [0.23, 1, 0.32, 1],\n easeInOutQuint: [0.86, 0, 0.07, 1],\n easeInExpo: [0.95, 0.05, 0.795, 0.035],\n easeOutExpo: [0.19, 1, 0.22, 1],\n easeInOutExpo: [1, 0, 0, 1],\n easeInCirc: [0.6, 0.04, 0.98, 0.335],\n easeOutCirc: [0.075, 0.82, 0.165, 1],\n easeInOutCirc: [0.785, 0.135, 0.15, 0.86],\n easeInBack: [0.6, -0.28, 0.735, 0.045],\n easeOutBack: [0.175, 0.885, 0.32, 1.275],\n easeInOutBack: [0.68, -0.55, 0.265, 1.55]\n};\n","import {namespaces} from './globals';\nimport {Svg} from '../svg/svg';\nimport {quantity} from './lang';\nimport {extend} from './extend';\n\n/**\n * Create or reinitialize the SVG element for the chart\n *\n * @memberof Chartist.Core\n * @param {Node} container The containing DOM Node object that will be used to plant the SVG element\n * @param {String} width Set the width of the SVG element. Default is 100%\n * @param {String} height Set the height of the SVG element. Default is 100%\n * @param {String} className Specify a class to be added to the SVG element\n * @return {Object} The created/reinitialized SVG element\n */\nexport function createSvg(container, width, height, className) {\n var svg;\n\n width = width || '100%';\n height = height || '100%';\n\n // Check if there is a previous SVG element in the container that contains the Chartist XML namespace and remove it\n // Since the DOM API does not support namespaces we need to manually search the returned list http://www.w3.org/TR/selectors-api/\n Array.prototype.slice.call(container.querySelectorAll('svg')).filter(function filterChartistSvgObjects(svg) {\n return svg.getAttributeNS(namespaces.xmlns, 'ct');\n }).forEach(function removePreviousElement(svg) {\n container.removeChild(svg);\n });\n\n // Create svg object with width and height or use 100% as default\n svg = new Svg('svg').attr({\n width: width,\n height: height\n }).addClass(className).attr({\n style: 'width: ' + width + '; height: ' + height + ';'\n });\n\n // Add the DOM node to our container\n container.appendChild(svg._node);\n\n return svg;\n}\n\n/**\n * Converts a number into a padding object.\n *\n * @memberof Chartist.Core\n * @param {Object|Number} padding\n * @param {Number} [fallback] This value is used to fill missing values if a incomplete padding object was passed\n * @returns {Object} Returns a padding object containing top, right, bottom, left properties filled with the padding number passed in as argument. If the argument is something else than a number (presumably already a correct padding object) then this argument is directly returned.\n */\nexport function normalizePadding(padding, fallback) {\n fallback = fallback || 0;\n\n return typeof padding === 'number' ? {\n top: padding,\n right: padding,\n bottom: padding,\n left: padding\n } : {\n top: typeof padding.top === 'number' ? padding.top : fallback,\n right: typeof padding.right === 'number' ? padding.right : fallback,\n bottom: typeof padding.bottom === 'number' ? padding.bottom : fallback,\n left: typeof padding.left === 'number' ? padding.left : fallback\n };\n}\n\n/**\n * Initialize chart drawing rectangle (area where chart is drawn) x1,y1 = bottom left / x2,y2 = top right\n *\n * @memberof Chartist.Core\n * @param {Object} svg The svg element for the chart\n * @param {Object} options The Object that contains all the optional values for the chart\n * @param {Number} [fallbackPadding] The fallback padding if partial padding objects are used\n * @return {Object} The chart rectangles coordinates inside the svg element plus the rectangles measurements\n */\nexport function createChartRect(svg, options, fallbackPadding) {\n var hasAxis = !!(options.axisX || options.axisY);\n var yAxisOffset = hasAxis ? options.axisY.offset : 0;\n var xAxisOffset = hasAxis ? options.axisX.offset : 0;\n // If width or height results in invalid value (including 0) we fallback to the unitless settings or even 0\n var width = svg.width() || quantity(options.width).value || 0;\n var height = svg.height() || quantity(options.height).value || 0;\n var normalizedPadding = normalizePadding(options.chartPadding, fallbackPadding);\n\n // If settings were to small to cope with offset (legacy) and padding, we'll adjust\n width = Math.max(width, yAxisOffset + normalizedPadding.left + normalizedPadding.right);\n height = Math.max(height, xAxisOffset + normalizedPadding.top + normalizedPadding.bottom);\n\n var chartRect = {\n padding: normalizedPadding,\n width: function () {\n return this.x2 - this.x1;\n },\n height: function () {\n return this.y1 - this.y2;\n }\n };\n\n if(hasAxis) {\n if (options.axisX.position === 'start') {\n chartRect.y2 = normalizedPadding.top + xAxisOffset;\n chartRect.y1 = Math.max(height - normalizedPadding.bottom, chartRect.y2 + 1);\n } else {\n chartRect.y2 = normalizedPadding.top;\n chartRect.y1 = Math.max(height - normalizedPadding.bottom - xAxisOffset, chartRect.y2 + 1);\n }\n\n if (options.axisY.position === 'start') {\n chartRect.x1 = normalizedPadding.left + yAxisOffset;\n chartRect.x2 = Math.max(width - normalizedPadding.right, chartRect.x1 + 1);\n } else {\n chartRect.x1 = normalizedPadding.left;\n chartRect.x2 = Math.max(width - normalizedPadding.right - yAxisOffset, chartRect.x1 + 1);\n }\n } else {\n chartRect.x1 = normalizedPadding.left;\n chartRect.x2 = Math.max(width - normalizedPadding.right, chartRect.x1 + 1);\n chartRect.y2 = normalizedPadding.top;\n chartRect.y1 = Math.max(height - normalizedPadding.bottom, chartRect.y2 + 1);\n }\n\n return chartRect;\n}\n\n/**\n * Creates a grid line based on a projected value.\n *\n * @memberof Chartist.Core\n * @param position\n * @param index\n * @param axis\n * @param offset\n * @param length\n * @param group\n * @param classes\n * @param eventEmitter\n */\nexport function createGrid(position, index, axis, offset, length, group, classes, eventEmitter) {\n var positionalData = {};\n positionalData[axis.units.pos + '1'] = position;\n positionalData[axis.units.pos + '2'] = position;\n positionalData[axis.counterUnits.pos + '1'] = offset;\n positionalData[axis.counterUnits.pos + '2'] = offset + length;\n\n var gridElement = group.elem('line', positionalData, classes.join(' '));\n\n // Event for grid draw\n eventEmitter.emit('draw',\n extend({\n type: 'grid',\n axis: axis,\n index: index,\n group: group,\n element: gridElement\n }, positionalData)\n );\n}\n\n/**\n * Creates a grid background rect and emits the draw event.\n *\n * @memberof Chartist.Core\n * @param gridGroup\n * @param chartRect\n * @param className\n * @param eventEmitter\n */\nexport function createGridBackground(gridGroup, chartRect, className, eventEmitter) {\n var gridBackground = gridGroup.elem('rect', {\n x: chartRect.x1,\n y: chartRect.y2,\n width: chartRect.width(),\n height: chartRect.height()\n }, className, true);\n\n // Event for grid background draw\n eventEmitter.emit('draw', {\n type: 'gridBackground',\n group: gridGroup,\n element: gridBackground\n });\n}\n\n/**\n * Creates a label based on a projected value and an axis.\n *\n * @memberof Chartist.Core\n * @param position\n * @param length\n * @param index\n * @param labels\n * @param axis\n * @param axisOffset\n * @param labelOffset\n * @param group\n * @param classes\n * @param useForeignObject\n * @param eventEmitter\n */\nexport function createLabel(position, length, index, labels, axis, axisOffset, labelOffset, group, classes, useForeignObject, eventEmitter) {\n var labelElement;\n var positionalData = {};\n\n positionalData[axis.units.pos] = position + labelOffset[axis.units.pos];\n positionalData[axis.counterUnits.pos] = labelOffset[axis.counterUnits.pos];\n positionalData[axis.units.len] = length;\n positionalData[axis.counterUnits.len] = Math.max(0, axisOffset - 10);\n\n if(useForeignObject) {\n // We need to set width and height explicitly to px as span will not expand with width and height being\n // 100% in all browsers\n var content = '' +\n labels[index] + '';\n\n labelElement = group.foreignObject(content, extend({\n style: 'overflow: visible;'\n }, positionalData));\n } else {\n labelElement = group.elem('text', positionalData, classes.join(' ')).text(labels[index]);\n }\n\n eventEmitter.emit('draw', extend({\n type: 'label',\n axis: axis,\n index: index,\n group: group,\n element: labelElement,\n text: labels[index]\n }, positionalData));\n}\n","import {extend} from './extend';\n\n/**\n * Provides options handling functionality with callback for options changes triggered by responsive options and media query matches\n *\n * @memberof Chartist.Core\n * @param {Object} options Options set by user\n * @param {Array} responsiveOptions Optional functions to add responsive behavior to chart\n * @param {Object} eventEmitter The event emitter that will be used to emit the options changed events\n * @return {Object} The consolidated options object from the defaults, base and matching responsive options\n */\nexport function optionsProvider(options, responsiveOptions, eventEmitter) {\n var baseOptions = extend({}, options),\n currentOptions,\n mediaQueryListeners = [],\n i;\n\n function updateCurrentOptions(mediaEvent) {\n var previousOptions = currentOptions;\n currentOptions = extend({}, baseOptions);\n\n if (responsiveOptions) {\n for (i = 0; i < responsiveOptions.length; i++) {\n var mql = window.matchMedia(responsiveOptions[i][0]);\n if (mql.matches) {\n currentOptions = extend(currentOptions, responsiveOptions[i][1]);\n }\n }\n }\n\n if(eventEmitter && mediaEvent) {\n eventEmitter.emit('optionsChanged', {\n previousOptions: previousOptions,\n currentOptions: currentOptions\n });\n }\n }\n\n function removeMediaQueryListeners() {\n mediaQueryListeners.forEach(function(mql) {\n mql.removeListener(updateCurrentOptions);\n });\n }\n\n if (!window.matchMedia) {\n throw 'window.matchMedia not found! Make sure you\\'re using a polyfill.';\n } else if (responsiveOptions) {\n\n for (i = 0; i < responsiveOptions.length; i++) {\n var mql = window.matchMedia(responsiveOptions[i][0]);\n mql.addListener(updateCurrentOptions);\n mediaQueryListeners.push(mql);\n }\n }\n // Execute initially without an event argument so we get the correct options\n updateCurrentOptions();\n\n return {\n removeMediaQueryListeners: removeMediaQueryListeners,\n getCurrentOptions: function getCurrentOptions() {\n return extend({}, currentOptions);\n }\n };\n}\n","import {extend} from '../core/core';\n\n/**\n * Contains the descriptors of supported element types in a SVG path. Currently only move, line and curve are supported.\n *\n * @memberof SvgPath\n * @type {Object}\n */\nconst elementDescriptions = {\n m: ['x', 'y'],\n l: ['x', 'y'],\n c: ['x1', 'y1', 'x2', 'y2', 'x', 'y'],\n a: ['rx', 'ry', 'xAr', 'lAf', 'sf', 'x', 'y']\n};\n\n/**\n * Default options for newly created SVG path objects.\n *\n * @memberof SvgPath\n * @type {Object}\n */\nconst defaultOptions = {\n // The accuracy in digit count after the decimal point. This will be used to round numbers in the SVG path. If this option is set to false then no rounding will be performed.\n accuracy: 3\n};\n\nfunction element(command, params, pathElements, pos, relative, data) {\n var pathElement = extend({\n command: relative ? command.toLowerCase() : command.toUpperCase()\n }, params, data ? { data: data } : {} );\n\n pathElements.splice(pos, 0, pathElement);\n}\n\nfunction forEachParam(pathElements, cb) {\n pathElements.forEach(function(pathElement, pathElementIndex) {\n elementDescriptions[pathElement.command.toLowerCase()].forEach(function(paramName, paramIndex) {\n cb(pathElement, paramName, pathElementIndex, paramIndex, pathElements);\n });\n });\n}\n\n/**\n * Used to construct a new path object.\n *\n * @memberof SvgPath\n * @param {Boolean} close If set to true then this path will be closed when stringified (with a Z at the end)\n * @param {Object} options Options object that overrides the default objects. See default options for more details.\n * @constructor\n */\nexport class SvgPath {\n /**\n * This static function on `SvgPath` is joining multiple paths together into one paths.\n *\n * @memberof SvgPath\n * @param {Array} paths A list of paths to be joined together. The order is important.\n * @param {boolean} [close] If the newly created path should be a closed path\n * @param {Object} [options] Path options for the newly created path.\n * @return {SvgPath}\n */\n static join(paths, close, options) {\n var joinedPath = new SvgPath(close, options);\n for(var i = 0; i < paths.length; i++) {\n var path = paths[i];\n for(var j = 0; j < path.pathElements.length; j++) {\n joinedPath.pathElements.push(path.pathElements[j]);\n }\n }\n return joinedPath;\n }\n\n constructor(close, options) {\n this.pathElements = [];\n this.pos = 0;\n this.close = close;\n this.options = extend({}, defaultOptions, options);\n }\n\n /**\n * Gets or sets the current position (cursor) inside of the path. You can move around the cursor freely but limited to 0 or the count of existing elements. All modifications with element functions will insert new elements at the position of this cursor.\n *\n * @memberof SvgPath\n * @param {Number} [pos] If a number is passed then the cursor is set to this position in the path element array.\n * @return {SvgPath|Number} If the position parameter was passed then the return value will be the path object for easy call chaining. If no position parameter was passed then the current position is returned.\n */\n position(pos) {\n if(pos !== undefined) {\n this.pos = Math.max(0, Math.min(this.pathElements.length, pos));\n return this;\n } else {\n return this.pos;\n }\n }\n\n /**\n * Removes elements from the path starting at the current position.\n *\n * @memberof SvgPath\n * @param {Number} count Number of path elements that should be removed from the current position.\n * @return {SvgPath} The current path object for easy call chaining.\n */\n remove(count) {\n this.pathElements.splice(this.pos, count);\n return this;\n }\n\n /**\n * Use this function to add a new move SVG path element.\n *\n * @memberof SvgPath\n * @param {Number} x The x coordinate for the move element.\n * @param {Number} y The y coordinate for the move element.\n * @param {Boolean} [relative] If set to true the move element will be created with relative coordinates (lowercase letter)\n * @param {*} [data] Any data that should be stored with the element object that will be accessible in pathElement\n * @return {SvgPath} The current path object for easy call chaining.\n */\n move(x, y, relative, data) {\n element('M', {\n x: +x,\n y: +y\n }, this.pathElements, this.pos++, relative, data);\n return this;\n }\n\n /**\n * Use this function to add a new line SVG path element.\n *\n * @memberof SvgPath\n * @param {Number} x The x coordinate for the line element.\n * @param {Number} y The y coordinate for the line element.\n * @param {Boolean} [relative] If set to true the line element will be created with relative coordinates (lowercase letter)\n * @param {*} [data] Any data that should be stored with the element object that will be accessible in pathElement\n * @return {SvgPath} The current path object for easy call chaining.\n */\n line(x, y, relative, data) {\n element('L', {\n x: +x,\n y: +y\n }, this.pathElements, this.pos++, relative, data);\n return this;\n }\n\n /**\n * Use this function to add a new curve SVG path element.\n *\n * @memberof SvgPath\n * @param {Number} x1 The x coordinate for the first control point of the bezier curve.\n * @param {Number} y1 The y coordinate for the first control point of the bezier curve.\n * @param {Number} x2 The x coordinate for the second control point of the bezier curve.\n * @param {Number} y2 The y coordinate for the second control point of the bezier curve.\n * @param {Number} x The x coordinate for the target point of the curve element.\n * @param {Number} y The y coordinate for the target point of the curve element.\n * @param {Boolean} [relative] If set to true the curve element will be created with relative coordinates (lowercase letter)\n * @param {*} [data] Any data that should be stored with the element object that will be accessible in pathElement\n * @return {SvgPath} The current path object for easy call chaining.\n */\n curve(x1, y1, x2, y2, x, y, relative, data) {\n element('C', {\n x1: +x1,\n y1: +y1,\n x2: +x2,\n y2: +y2,\n x: +x,\n y: +y\n }, this.pathElements, this.pos++, relative, data);\n return this;\n }\n\n /**\n * Use this function to add a new non-bezier curve SVG path element.\n *\n * @memberof SvgPath\n * @param {Number} rx The radius to be used for the x-axis of the arc.\n * @param {Number} ry The radius to be used for the y-axis of the arc.\n * @param {Number} xAr Defines the orientation of the arc\n * @param {Number} lAf Large arc flag\n * @param {Number} sf Sweep flag\n * @param {Number} x The x coordinate for the target point of the curve element.\n * @param {Number} y The y coordinate for the target point of the curve element.\n * @param {Boolean} [relative] If set to true the curve element will be created with relative coordinates (lowercase letter)\n * @param {*} [data] Any data that should be stored with the element object that will be accessible in pathElement\n * @return {SvgPath} The current path object for easy call chaining.\n */\n arc(rx, ry, xAr, lAf, sf, x, y, relative, data) {\n element('A', {\n rx: +rx,\n ry: +ry,\n xAr: +xAr,\n lAf: +lAf,\n sf: +sf,\n x: +x,\n y: +y\n }, this.pathElements, this.pos++, relative, data);\n return this;\n }\n\n /**\n * Parses an SVG path seen in the d attribute of path elements, and inserts the parsed elements into the existing path object at the current cursor position. Any closing path indicators (Z at the end of the path) will be ignored by the parser as this is provided by the close option in the options of the path object.\n *\n * @memberof SvgPath\n * @param {String} path Any SVG path that contains move (m), line (l) or curve (c) components.\n * @return {SvgPath} The current path object for easy call chaining.\n */\n parse(path) {\n // Parsing the SVG path string into an array of arrays [['M', '10', '10'], ['L', '100', '100']]\n var chunks = path.replace(/([A-Za-z])([0-9])/g, '$1 $2')\n .replace(/([0-9])([A-Za-z])/g, '$1 $2')\n .split(/[\\s,]+/)\n .reduce(function(result, element) {\n if(element.match(/[A-Za-z]/)) {\n result.push([]);\n }\n\n result[result.length - 1].push(element);\n return result;\n }, []);\n\n // If this is a closed path we remove the Z at the end because this is determined by the close option\n if(chunks[chunks.length - 1][0].toUpperCase() === 'Z') {\n chunks.pop();\n }\n\n // Using svgPathElementDescriptions to map raw path arrays into objects that contain the command and the parameters\n // For example {command: 'M', x: '10', y: '10'}\n var elements = chunks.map(function(chunk) {\n var command = chunk.shift(),\n description = elementDescriptions[command.toLowerCase()];\n\n return extend({\n command: command\n }, description.reduce(function(result, paramName, index) {\n result[paramName] = +chunk[index];\n return result;\n }, {}));\n });\n\n // Preparing a splice call with the elements array as var arg params and insert the parsed elements at the current position\n var spliceArgs = [this.pos, 0];\n Array.prototype.push.apply(spliceArgs, elements);\n Array.prototype.splice.apply(this.pathElements, spliceArgs);\n // Increase the internal position by the element count\n this.pos += elements.length;\n\n return this;\n }\n\n /**\n * This function renders to current SVG path object into a final SVG string that can be used in the d attribute of SVG path elements. It uses the accuracy option to round big decimals. If the close parameter was set in the constructor of this path object then a path closing Z will be appended to the output string.\n *\n * @memberof SvgPath\n * @return {String}\n */\n stringify() {\n var accuracyMultiplier = Math.pow(10, this.options.accuracy);\n\n return this.pathElements.reduce(function(path, pathElement) {\n var params = elementDescriptions[pathElement.command.toLowerCase()].map(function(paramName) {\n return this.options.accuracy ?\n (Math.round(pathElement[paramName] * accuracyMultiplier) / accuracyMultiplier) :\n pathElement[paramName];\n }.bind(this));\n\n return path + pathElement.command + params.join(',');\n }.bind(this), '') + (this.close ? 'Z' : '');\n }\n\n /**\n * Scales all elements in the current SVG path object. There is an individual parameter for each coordinate. Scaling will also be done for control points of curves, affecting the given coordinate.\n *\n * @memberof SvgPath\n * @param {Number} x The number which will be used to scale the x, x1 and x2 of all path elements.\n * @param {Number} y The number which will be used to scale the y, y1 and y2 of all path elements.\n * @return {SvgPath} The current path object for easy call chaining.\n */\n scale(x, y) {\n forEachParam(this.pathElements, function(pathElement, paramName) {\n pathElement[paramName] *= paramName[0] === 'x' ? x : y;\n });\n return this;\n }\n\n /**\n * Translates all elements in the current SVG path object. The translation is relative and there is an individual parameter for each coordinate. Translation will also be done for control points of curves, affecting the given coordinate.\n *\n * @memberof SvgPath\n * @param {Number} x The number which will be used to translate the x, x1 and x2 of all path elements.\n * @param {Number} y The number which will be used to translate the y, y1 and y2 of all path elements.\n * @return {SvgPath} The current path object for easy call chaining.\n */\n translate(x, y) {\n forEachParam(this.pathElements, function(pathElement, paramName) {\n pathElement[paramName] += paramName[0] === 'x' ? x : y;\n });\n return this;\n }\n\n /**\n * This function will run over all existing path elements and then loop over their attributes. The callback function will be called for every path element attribute that exists in the current path.\n * The method signature of the callback function looks like this:\n * ```javascript\n * function(pathElement, paramName, pathElementIndex, paramIndex, pathElements)\n * ```\n * If something else than undefined is returned by the callback function, this value will be used to replace the old value. This allows you to build custom transformations of path objects that can't be achieved using the basic transformation functions scale and translate.\n *\n * @memberof SvgPath\n * @param {Function} transformFnc The callback function for the transformation. Check the signature in the function description.\n * @return {SvgPath} The current path object for easy call chaining.\n */\n transform(transformFnc) {\n forEachParam(this.pathElements, function(pathElement, paramName, pathElementIndex, paramIndex, pathElements) {\n var transformed = transformFnc(pathElement, paramName, pathElementIndex, paramIndex, pathElements);\n if(transformed || transformed === 0) {\n pathElement[paramName] = transformed;\n }\n });\n return this;\n }\n\n /**\n * This function clones a whole path object with all its properties. This is a deep clone and path element objects will also be cloned.\n *\n * @memberof SvgPath\n * @param {Boolean} [close] Optional option to set the new cloned path to closed. If not specified or false, the original path close option will be used.\n * @return {SvgPath}\n */\n clone(close) {\n var c = new SvgPath(close || this.close);\n c.pos = this.pos;\n c.pathElements = this.pathElements.slice().map(function cloneElements(pathElement) {\n return extend({}, pathElement);\n });\n c.options = extend({}, this.options);\n return c;\n }\n\n /**\n * Split a Svg.Path object by a specific command in the path chain. The path chain will be split and an array of newly created paths objects will be returned. This is useful if you'd like to split an SVG path by it's move commands, for example, in order to isolate chunks of drawings.\n *\n * @memberof SvgPath\n * @param {String} command The command you'd like to use to split the path\n * @return {Array}\n */\n splitByCommand(command) {\n var split = [\n new SvgPath()\n ];\n\n this.pathElements.forEach(function(pathElement) {\n if(pathElement.command === command.toUpperCase() && split[split.length - 1].pathElements.length !== 0) {\n split.push(new SvgPath());\n }\n\n split[split.length - 1].pathElements.push(pathElement);\n });\n\n return split;\n }\n}\n","import {extend, getMultiValue} from '../core/core';\nimport {SvgPath} from '../svg/svg-path';\n\n/**\n * This interpolation function does not smooth the path and the result is only containing lines and no curves.\n *\n * @example\n * var chart = new Chartist.Line('.ct-chart', {\n * labels: [1, 2, 3, 4, 5],\n * series: [[1, 2, 8, 1, 7]]\n * }, {\n * lineSmooth: Chartist.Interpolation.none({\n * fillHoles: false\n * })\n * });\n *\n *\n * @memberof Chartist.Interpolation\n * @return {Function}\n */\nexport function none(options) {\n var defaultOptions = {\n fillHoles: false\n };\n options = extend({}, defaultOptions, options);\n return function none(pathCoordinates, valueData) {\n var path = new SvgPath();\n var hole = true;\n\n for(var i = 0; i < pathCoordinates.length; i += 2) {\n var currX = pathCoordinates[i];\n var currY = pathCoordinates[i + 1];\n var currData = valueData[i / 2];\n\n if(getMultiValue(currData.value) !== undefined) {\n\n if(hole) {\n path.move(currX, currY, false, currData);\n } else {\n path.line(currX, currY, false, currData);\n }\n\n hole = false;\n } else if(!options.fillHoles) {\n hole = true;\n }\n }\n\n return path;\n };\n}\n","import {extend} from '../core/core';\nimport {SvgPath} from '../svg/svg-path';\n\n/**\n * Simple smoothing creates horizontal handles that are positioned with a fraction of the length between two data points. You can use the divisor option to specify the amount of smoothing.\n *\n * Simple smoothing can be used instead of `Chartist.Smoothing.cardinal` if you'd like to get rid of the artifacts it produces sometimes. Simple smoothing produces less flowing lines but is accurate by hitting the points and it also doesn't swing below or above the given data point.\n *\n * All smoothing functions within Chartist are factory functions that accept an options parameter. The simple interpolation function accepts one configuration parameter `divisor`, between 1 and ∞, which controls the smoothing characteristics.\n *\n * @example\n * var chart = new Chartist.Line('.ct-chart', {\n * labels: [1, 2, 3, 4, 5],\n * series: [[1, 2, 8, 1, 7]]\n * }, {\n * lineSmooth: Chartist.Interpolation.simple({\n * divisor: 2,\n * fillHoles: false\n * })\n * });\n *\n *\n * @memberof Chartist.Interpolation\n * @param {Object} options The options of the simple interpolation factory function.\n * @return {Function}\n */\nexport function simple(options) {\n var defaultOptions = {\n divisor: 2,\n fillHoles: false\n };\n options = extend({}, defaultOptions, options);\n\n var d = 1 / Math.max(1, options.divisor);\n\n return function simple(pathCoordinates, valueData) {\n var path = new SvgPath();\n var prevX, prevY, prevData;\n\n for(var i = 0; i < pathCoordinates.length; i += 2) {\n var currX = pathCoordinates[i];\n var currY = pathCoordinates[i + 1];\n var length = (currX - prevX) * d;\n var currData = valueData[i / 2];\n\n if(currData.value !== undefined) {\n\n if(prevData === undefined) {\n path.move(currX, currY, false, currData);\n } else {\n path.curve(\n prevX + length,\n prevY,\n currX - length,\n currY,\n currX,\n currY,\n false,\n currData\n );\n }\n\n prevX = currX;\n prevY = currY;\n prevData = currData;\n } else if(!options.fillHoles) {\n prevX = currX = prevData = undefined;\n }\n }\n\n return path;\n };\n}\n","import {extend} from '../core/core';\nimport {SvgPath} from '../svg/svg-path';\n\n/**\n * Step interpolation will cause the line chart to move in steps rather than diagonal or smoothed lines. This interpolation will create additional points that will also be drawn when the `showPoint` option is enabled.\n *\n * All smoothing functions within Chartist are factory functions that accept an options parameter. The step interpolation function accepts one configuration parameter `postpone`, that can be `true` or `false`. The default value is `true` and will cause the step to occur where the value actually changes. If a different behaviour is needed where the step is shifted to the left and happens before the actual value, this option can be set to `false`.\n *\n * @example\n * var chart = new Chartist.Line('.ct-chart', {\n * labels: [1, 2, 3, 4, 5],\n * series: [[1, 2, 8, 1, 7]]\n * }, {\n * lineSmooth: Chartist.Interpolation.step({\n * postpone: true,\n * fillHoles: false\n * })\n * });\n *\n * @memberof Chartist.Interpolation\n * @param options\n * @returns {Function}\n */\nexport function step(options) {\n var defaultOptions = {\n postpone: true,\n fillHoles: false\n };\n\n options = extend({}, defaultOptions, options);\n\n return function step(pathCoordinates, valueData) {\n var path = new SvgPath();\n\n var prevX, prevY, prevData;\n\n for (var i = 0; i < pathCoordinates.length; i += 2) {\n var currX = pathCoordinates[i];\n var currY = pathCoordinates[i + 1];\n var currData = valueData[i / 2];\n\n // If the current point is also not a hole we can draw the step lines\n if(currData.value !== undefined) {\n if(prevData === undefined) {\n path.move(currX, currY, false, currData);\n } else {\n if(options.postpone) {\n // If postponed we should draw the step line with the value of the previous value\n path.line(currX, prevY, false, prevData);\n } else {\n // If not postponed we should draw the step line with the value of the current value\n path.line(prevX, currY, false, currData);\n }\n // Line to the actual point (this should only be a Y-Axis movement\n path.line(currX, currY, false, currData);\n }\n\n prevX = currX;\n prevY = currY;\n prevData = currData;\n } else if(!options.fillHoles) {\n prevX = prevY = prevData = undefined;\n }\n }\n\n return path;\n };\n}\n","import {extend, splitIntoSegments} from '../core/core';\nimport {SvgPath} from '../svg/svg-path';\nimport {none} from './none';\n\n/**\n * Cardinal / Catmull-Rome spline interpolation is the default smoothing function in Chartist. It produces nice results where the splines will always meet the points. It produces some artifacts though when data values are increased or decreased rapidly. The line may not follow a very accurate path and if the line should be accurate this smoothing function does not produce the best results.\n *\n * Cardinal splines can only be created if there are more than two data points. If this is not the case this smoothing will fallback to `Chartist.Smoothing.none`.\n *\n * All smoothing functions within Chartist are factory functions that accept an options parameter. The cardinal interpolation function accepts one configuration parameter `tension`, between 0 and 1, which controls the smoothing intensity.\n *\n * @example\n * var chart = new Chartist.Line('.ct-chart', {\n * labels: [1, 2, 3, 4, 5],\n * series: [[1, 2, 8, 1, 7]]\n * }, {\n * lineSmooth: Chartist.Interpolation.cardinal({\n * tension: 1,\n * fillHoles: false\n * })\n * });\n *\n * @memberof Chartist.Interpolation\n * @param {Object} options The options of the cardinal factory function.\n * @return {Function}\n */\nexport function cardinal(options) {\n var defaultOptions = {\n tension: 1,\n fillHoles: false\n };\n\n options = extend({}, defaultOptions, options);\n\n var t = Math.min(1, Math.max(0, options.tension)),\n c = 1 - t;\n\n return function cardinal(pathCoordinates, valueData) {\n // First we try to split the coordinates into segments\n // This is necessary to treat \"holes\" in line charts\n var segments = splitIntoSegments(pathCoordinates, valueData, {\n fillHoles: options.fillHoles\n });\n\n if(!segments.length) {\n // If there were no segments return 'none' interpolation\n return none()([]);\n } else if(segments.length > 1) {\n // If the split resulted in more that one segment we need to interpolate each segment individually and join them\n // afterwards together into a single path.\n var paths = [];\n // For each segment we will recurse the cardinal function\n segments.forEach(function(segment) {\n paths.push(cardinal(segment.pathCoordinates, segment.valueData));\n });\n // Join the segment path data into a single path and return\n return SvgPath.join(paths);\n } else {\n // If there was only one segment we can proceed regularly by using pathCoordinates and valueData from the first\n // segment\n pathCoordinates = segments[0].pathCoordinates;\n valueData = segments[0].valueData;\n\n // If less than two points we need to fallback to no smoothing\n if(pathCoordinates.length <= 4) {\n return none()(pathCoordinates, valueData);\n }\n\n var path = new SvgPath().move(pathCoordinates[0], pathCoordinates[1], false, valueData[0]),\n z;\n\n for (var i = 0, iLen = pathCoordinates.length; iLen - 2 * !z > i; i += 2) {\n var p = [\n {x: +pathCoordinates[i - 2], y: +pathCoordinates[i - 1]},\n {x: +pathCoordinates[i], y: +pathCoordinates[i + 1]},\n {x: +pathCoordinates[i + 2], y: +pathCoordinates[i + 3]},\n {x: +pathCoordinates[i + 4], y: +pathCoordinates[i + 5]}\n ];\n if (z) {\n if (!i) {\n p[0] = {x: +pathCoordinates[iLen - 2], y: +pathCoordinates[iLen - 1]};\n } else if (iLen - 4 === i) {\n p[3] = {x: +pathCoordinates[0], y: +pathCoordinates[1]};\n } else if (iLen - 2 === i) {\n p[2] = {x: +pathCoordinates[0], y: +pathCoordinates[1]};\n p[3] = {x: +pathCoordinates[2], y: +pathCoordinates[3]};\n }\n } else {\n if (iLen - 4 === i) {\n p[3] = p[2];\n } else if (!i) {\n p[0] = {x: +pathCoordinates[i], y: +pathCoordinates[i + 1]};\n }\n }\n\n path.curve(\n (t * (-p[0].x + 6 * p[1].x + p[2].x) / 6) + (c * p[2].x),\n (t * (-p[0].y + 6 * p[1].y + p[2].y) / 6) + (c * p[2].y),\n (t * (p[1].x + 6 * p[2].x - p[3].x) / 6) + (c * p[2].x),\n (t * (p[1].y + 6 * p[2].y - p[3].y) / 6) + (c * p[2].y),\n p[2].x,\n p[2].y,\n false,\n valueData[(i + 2) / 2]\n );\n }\n\n return path;\n }\n };\n}\n","import {extend, splitIntoSegments} from '../core/core';\nimport {SvgPath} from '../svg/svg-path';\nimport {none} from './none';\n\n/**\n * Monotone Cubic spline interpolation produces a smooth curve which preserves monotonicity. Unlike cardinal splines, the curve will not extend beyond the range of y-values of the original data points.\n *\n * Monotone Cubic splines can only be created if there are more than two data points. If this is not the case this smoothing will fallback to `Chartist.Smoothing.none`.\n *\n * The x-values of subsequent points must be increasing to fit a Monotone Cubic spline. If this condition is not met for a pair of adjacent points, then there will be a break in the curve between those data points.\n *\n * All smoothing functions within Chartist are factory functions that accept an options parameter.\n *\n * @example\n * var chart = new Chartist.Line('.ct-chart', {\n * labels: [1, 2, 3, 4, 5],\n * series: [[1, 2, 8, 1, 7]]\n * }, {\n * lineSmooth: Chartist.Interpolation.monotoneCubic({\n * fillHoles: false\n * })\n * });\n *\n * @memberof Chartist.Interpolation\n * @param {Object} [options] The options of the monotoneCubic factory function.\n * @return {Function}\n */\nexport function monotoneCubic(options) {\n var defaultOptions = {\n fillHoles: false\n };\n\n options = extend({}, defaultOptions, options);\n\n return function monotoneCubic(pathCoordinates, valueData) {\n // First we try to split the coordinates into segments\n // This is necessary to treat \"holes\" in line charts\n var segments = splitIntoSegments(pathCoordinates, valueData, {\n fillHoles: options.fillHoles,\n increasingX: true\n });\n\n if(!segments.length) {\n // If there were no segments return 'Chartist.Interpolation.none'\n return none()([]);\n } else if(segments.length > 1) {\n // If the split resulted in more that one segment we need to interpolate each segment individually and join them\n // afterwards together into a single path.\n var paths = [];\n // For each segment we will recurse the monotoneCubic fn function\n segments.forEach(function(segment) {\n paths.push(monotoneCubic(segment.pathCoordinates, segment.valueData));\n });\n // Join the segment path data into a single path and return\n return SvgPath.join(paths);\n } else {\n // If there was only one segment we can proceed regularly by using pathCoordinates and valueData from the first\n // segment\n pathCoordinates = segments[0].pathCoordinates;\n valueData = segments[0].valueData;\n\n // If less than three points we need to fallback to no smoothing\n if(pathCoordinates.length <= 4) {\n return none()(pathCoordinates, valueData);\n }\n\n var xs = [],\n ys = [],\n i,\n n = pathCoordinates.length / 2,\n ms = [],\n ds = [], dys = [], dxs = [],\n path;\n\n // Populate x and y coordinates into separate arrays, for readability\n\n for(i = 0; i < n; i++) {\n xs[i] = pathCoordinates[i * 2];\n ys[i] = pathCoordinates[i * 2 + 1];\n }\n\n // Calculate deltas and derivative\n\n for(i = 0; i < n - 1; i++) {\n dys[i] = ys[i + 1] - ys[i];\n dxs[i] = xs[i + 1] - xs[i];\n ds[i] = dys[i] / dxs[i];\n }\n\n // Determine desired slope (m) at each point using Fritsch-Carlson method\n // See: http://math.stackexchange.com/questions/45218/implementation-of-monotone-cubic-interpolation\n\n ms[0] = ds[0];\n ms[n - 1] = ds[n - 2];\n\n for(i = 1; i < n - 1; i++) {\n if(ds[i] === 0 || ds[i - 1] === 0 || (ds[i - 1] > 0) !== (ds[i] > 0)) {\n ms[i] = 0;\n } else {\n ms[i] = 3 * (dxs[i - 1] + dxs[i]) / (\n (2 * dxs[i] + dxs[i - 1]) / ds[i - 1] +\n (dxs[i] + 2 * dxs[i - 1]) / ds[i]);\n\n if(!isFinite(ms[i])) {\n ms[i] = 0;\n }\n }\n }\n\n // Now build a path from the slopes\n\n path = new SvgPath().move(xs[0], ys[0], false, valueData[0]);\n\n for(i = 0; i < n - 1; i++) {\n path.curve(\n // First control point\n xs[i] + dxs[i] / 3,\n ys[i] + ms[i] * dxs[i] / 3,\n // Second control point\n xs[i + 1] - dxs[i] / 3,\n ys[i + 1] - ms[i + 1] * dxs[i] / 3,\n // End point\n xs[i + 1],\n ys[i + 1],\n\n false,\n valueData[i + 1]\n );\n }\n\n return path;\n }\n };\n}\n","import {alphaNumerate, quantity, isFalseyButZero} from '../core/lang';\nimport {noop} from '../core/functional';\nimport {polarToCartesian} from '../core/math';\nimport {extend} from '../core/extend';\nimport {normalizeData, serialize} from '../core/data';\nimport {createSvg, createChartRect} from '../core/creation';\nimport {SvgPath} from '../svg/svg-path';\nimport {BaseChart} from './base';\n\n/**\n * Default options in line charts. Expand the code view to see a detailed list of options with comments.\n *\n * @memberof Chartist.Pie\n */\nconst defaultOptions = {\n // Specify a fixed width for the chart as a string (i.e. '100px' or '50%')\n width: undefined,\n // Specify a fixed height for the chart as a string (i.e. '100px' or '50%')\n height: undefined,\n // Padding of the chart drawing area to the container element and labels as a number or padding object {top: 5, right: 5, bottom: 5, left: 5}\n chartPadding: 5,\n // Override the class names that are used to generate the SVG structure of the chart\n classNames: {\n chartPie: 'ct-chart-pie',\n chartDonut: 'ct-chart-donut',\n series: 'ct-series',\n slicePie: 'ct-slice-pie',\n sliceDonut: 'ct-slice-donut',\n label: 'ct-label'\n },\n // The start angle of the pie chart in degrees where 0 points north. A higher value offsets the start angle clockwise.\n startAngle: 0,\n // An optional total you can specify. By specifying a total value, the sum of the values in the series must be this total in order to draw a full pie. You can use this parameter to draw only parts of a pie or gauge charts.\n total: undefined,\n // If specified the donut CSS classes will be used and strokes will be drawn instead of pie slices.\n donut: false,\n // Specify the donut stroke width, currently done in javascript for convenience. May move to CSS styles in the future.\n // This option can be set as number or string to specify a relative width (i.e. 100 or '30%').\n donutWidth: 60,\n // If a label should be shown or not\n showLabel: true,\n // Label position offset from the standard position which is half distance of the radius. This value can be either positive or negative. Positive values will position the label away from the center.\n labelOffset: 0,\n // This option can be set to 'inside', 'outside' or 'center'. Positioned with 'inside' the labels will be placed on half the distance of the radius to the border of the Pie by respecting the 'labelOffset'. The 'outside' option will place the labels at the border of the pie and 'center' will place the labels in the absolute center point of the chart. The 'center' option only makes sense in conjunction with the 'labelOffset' option.\n labelPosition: 'inside',\n // An interpolation function for the label value\n labelInterpolationFnc: noop,\n // Label direction can be 'neutral', 'explode' or 'implode'. The labels anchor will be positioned based on those settings as well as the fact if the labels are on the right or left side of the center of the chart. Usually explode is useful when labels are positioned far away from the center.\n labelDirection: 'neutral',\n // If true the whole data is reversed including labels, the series order as well as the whole series data arrays.\n reverseData: false,\n // If true empty values will be ignored to avoid drawing unncessary slices and labels\n ignoreEmptyValues: false\n};\n\n/**\n * Determines SVG anchor position based on direction and center parameter\n *\n * @param center\n * @param label\n * @param direction\n * @return {string}\n */\nexport function determineAnchorPosition(center, label, direction) {\n var toTheRight = label.x > center.x;\n\n if (toTheRight && direction === 'explode' ||\n !toTheRight && direction === 'implode') {\n return 'start';\n } else if (toTheRight && direction === 'implode' ||\n !toTheRight && direction === 'explode') {\n return 'end';\n } else {\n return 'middle';\n }\n}\n\nexport class PieChart extends BaseChart {\n /**\n * This method creates a new pie chart and returns an object that can be used to redraw the chart.\n *\n * @memberof Chartist.Pie\n * @param {String|Node} query A selector query string or directly a DOM element\n * @param {Object} data The data object in the pie chart needs to have a series property with a one dimensional data array. The values will be normalized against each other and don't necessarily need to be in percentage. The series property can also be an array of value objects that contain a value property and a className property to override the CSS class name for the series group.\n * @param {Object} [options] The options object with options that override the default options. Check the examples for a detailed list.\n * @param {Array} [responsiveOptions] Specify an array of responsive option arrays which are a media query and options object pair => [[mediaQueryString, optionsObject],[more...]]\n * @return {Object} An object with a version and an update method to manually redraw the chart\n *\n * @example\n * // Simple pie chart example with four series\n * new Chartist.Pie('.ct-chart', {\n * series: [10, 2, 4, 3]\n * });\n *\n * @example\n * // Drawing a donut chart\n * new Chartist.Pie('.ct-chart', {\n * series: [10, 2, 4, 3]\n * }, {\n * donut: true\n * });\n *\n * @example\n * // Using donut, startAngle and total to draw a gauge chart\n * new Chartist.Pie('.ct-chart', {\n * series: [20, 10, 30, 40]\n * }, {\n * donut: true,\n * donutWidth: 20,\n * startAngle: 270,\n * total: 200\n * });\n *\n * @example\n * // Drawing a pie chart with padding and labels that are outside the pie\n * new Chartist.Pie('.ct-chart', {\n * series: [20, 10, 30, 40]\n * }, {\n * chartPadding: 30,\n * labelOffset: 50,\n * labelDirection: 'explode'\n * });\n *\n * @example\n * // Overriding the class names for individual series as well as a name and meta data.\n * // The name will be written as ct:series-name attribute and the meta data will be serialized and written\n * // to a ct:meta attribute.\n * new Chartist.Pie('.ct-chart', {\n * series: [{\n * value: 20,\n * name: 'Series 1',\n * className: 'my-custom-class-one',\n * meta: 'Meta One'\n * }, {\n * value: 10,\n * name: 'Series 2',\n * className: 'my-custom-class-two',\n * meta: 'Meta Two'\n * }, {\n * value: 70,\n * name: 'Series 3',\n * className: 'my-custom-class-three',\n * meta: 'Meta Three'\n * }]\n * });\n */\n constructor(query, data, options, responsiveOptions) {\n super(query, data, defaultOptions, extend({}, defaultOptions, options), responsiveOptions);\n }\n\n /**\n * Creates the pie chart\n *\n * @param options\n */\n createChart(options) {\n var data = normalizeData(this.data);\n var seriesGroups = [],\n labelsGroup,\n chartRect,\n radius,\n labelRadius,\n totalDataSum,\n startAngle = options.startAngle;\n\n // Create SVG.js draw\n this.svg = createSvg(this.container, options.width, options.height, options.donut ? options.classNames.chartDonut : options.classNames.chartPie);\n // Calculate charting rect\n chartRect = createChartRect(this.svg, options, defaultOptions.padding);\n // Get biggest circle radius possible within chartRect\n radius = Math.min(chartRect.width() / 2, chartRect.height() / 2);\n // Calculate total of all series to get reference value or use total reference from optional options\n totalDataSum = options.total || data.normalized.series.reduce(function (previousValue, currentValue) {\n return previousValue + currentValue;\n }, 0);\n\n var donutWidth = quantity(options.donutWidth);\n if (donutWidth.unit === '%') {\n donutWidth.value *= radius / 100;\n }\n\n // If this is a donut chart we need to adjust our radius to enable strokes to be drawn inside\n // Unfortunately this is not possible with the current SVG Spec\n // See this proposal for more details: http://lists.w3.org/Archives/Public/www-svg/2003Oct/0000.html\n radius -= options.donut ? donutWidth.value / 2 : 0;\n\n // If labelPosition is set to `outside` or a donut chart is drawn then the label position is at the radius,\n // if regular pie chart it's half of the radius\n if (options.labelPosition === 'outside' || options.donut) {\n labelRadius = radius;\n } else if (options.labelPosition === 'center') {\n // If labelPosition is center we start with 0 and will later wait for the labelOffset\n labelRadius = 0;\n } else {\n // Default option is 'inside' where we use half the radius so the label will be placed in the center of the pie\n // slice\n labelRadius = radius / 2;\n }\n // Add the offset to the labelRadius where a negative offset means closed to the center of the chart\n labelRadius += options.labelOffset;\n\n // Calculate end angle based on total sum and current data value and offset with padding\n var center = {\n x: chartRect.x1 + chartRect.width() / 2,\n y: chartRect.y2 + chartRect.height() / 2\n };\n\n // Check if there is only one non-zero value in the series array.\n var hasSingleValInSeries = data.raw.series.filter(function (val) {\n return val.hasOwnProperty('value') ? val.value !== 0 : val !== 0;\n }).length === 1;\n\n // Creating the series groups\n data.raw.series.forEach(function (series, index) {\n seriesGroups[index] = this.svg.elem('g', null, null);\n }.bind(this));\n //if we need to show labels we create the label group now\n if (options.showLabel) {\n labelsGroup = this.svg.elem('g', null, null);\n }\n\n // Draw the series\n // initialize series groups\n data.raw.series.forEach(function (series, index) {\n // If current value is zero and we are ignoring empty values then skip to next value\n if (data.normalized.series[index] === 0 && options.ignoreEmptyValues) return;\n\n // If the series is an object and contains a name or meta data we add a custom attribute\n seriesGroups[index].attr({\n 'ct:series-name': series.name\n });\n\n // Use series class from series data or if not set generate one\n seriesGroups[index].addClass([\n options.classNames.series,\n (series.className || options.classNames.series + '-' + alphaNumerate(index))\n ].join(' '));\n\n // If the whole dataset is 0 endAngle should be zero. Can't divide by 0.\n var endAngle = (totalDataSum > 0 ? startAngle + data.normalized.series[index] / totalDataSum * 360 : 0);\n\n // Use slight offset so there are no transparent hairline issues\n var overlappigStartAngle = Math.max(0, startAngle - (index === 0 || hasSingleValInSeries ? 0 : 0.2));\n\n // If we need to draw the arc for all 360 degrees we need to add a hack where we close the circle\n // with Z and use 359.99 degrees\n if (endAngle - overlappigStartAngle >= 359.99) {\n endAngle = overlappigStartAngle + 359.99;\n }\n\n var start = polarToCartesian(center.x, center.y, radius, overlappigStartAngle),\n end = polarToCartesian(center.x, center.y, radius, endAngle);\n\n // Create a new path element for the pie chart. If this isn't a donut chart we should close the path for a correct stroke\n var path = new SvgPath(!options.donut)\n .move(end.x, end.y)\n .arc(radius, radius, 0, endAngle - startAngle > 180, 0, start.x, start.y);\n\n // If regular pie chart (no donut) we add a line to the center of the circle for completing the pie\n if (!options.donut) {\n path.line(center.x, center.y);\n }\n\n // Create the SVG path\n // If this is a donut chart we add the donut class, otherwise just a regular slice\n var pathElement = seriesGroups[index].elem('path', {\n d: path.stringify()\n }, options.donut ? options.classNames.sliceDonut : options.classNames.slicePie);\n\n // Adding the pie series value to the path\n pathElement.attr({\n 'ct:value': data.normalized.series[index],\n 'ct:meta': serialize(series.meta)\n });\n\n // If this is a donut, we add the stroke-width as style attribute\n if (options.donut) {\n pathElement.attr({\n 'style': 'stroke-width: ' + donutWidth.value + 'px'\n });\n }\n\n // Fire off draw event\n this.eventEmitter.emit('draw', {\n type: 'slice',\n value: data.normalized.series[index],\n totalDataSum: totalDataSum,\n index: index,\n meta: series.meta,\n series: series,\n group: seriesGroups[index],\n element: pathElement,\n path: path.clone(),\n center: center,\n radius: radius,\n startAngle: startAngle,\n endAngle: endAngle\n });\n\n // If we need to show labels we need to add the label for this slice now\n if (options.showLabel) {\n var labelPosition;\n if (data.raw.series.length === 1) {\n // If we have only 1 series, we can position the label in the center of the pie\n labelPosition = {\n x: center.x,\n y: center.y\n };\n } else {\n // Position at the labelRadius distance from center and between start and end angle\n labelPosition = polarToCartesian(\n center.x,\n center.y,\n labelRadius,\n startAngle + (endAngle - startAngle) / 2\n );\n }\n\n var rawValue;\n if (data.normalized.labels && !isFalseyButZero(data.normalized.labels[index])) {\n rawValue = data.normalized.labels[index];\n } else {\n rawValue = data.normalized.series[index];\n }\n\n var interpolatedValue = options.labelInterpolationFnc(rawValue, index);\n\n if (interpolatedValue || interpolatedValue === 0) {\n var labelElement = labelsGroup.elem('text', {\n dx: labelPosition.x,\n dy: labelPosition.y,\n 'text-anchor': determineAnchorPosition(center, labelPosition, options.labelDirection)\n }, options.classNames.label).text('' + interpolatedValue);\n\n // Fire off draw event\n this.eventEmitter.emit('draw', {\n type: 'label',\n index: index,\n group: labelsGroup,\n element: labelElement,\n text: '' + interpolatedValue,\n x: labelPosition.x,\n y: labelPosition.y\n });\n }\n }\n\n // Set next startAngle to current endAngle.\n // (except for last slice)\n startAngle = endAngle;\n }.bind(this));\n\n this.eventEmitter.emit('created', {\n chartRect: chartRect,\n svg: this.svg,\n options: options\n });\n }\n}\n","","export {version} from 'package.json!version';\n\n/**\n * This object contains all namespaces used within Chartist.\n *\n * @type {{svg: string, xmlns: string, xhtml: string, xlink: string, ct: string}}\n */\nexport let namespaces = {\n svg: 'http://www.w3.org/2000/svg',\n xmlns: 'http://www.w3.org/2000/xmlns/',\n xhtml: 'http://www.w3.org/1999/xhtml',\n xlink: 'http://www.w3.org/1999/xlink',\n ct: 'http://gionkunz.github.com/chartist-js/ct'\n};\n\n/**\n * Precision level used internally in Chartist for rounding. If you require more decimal places you can increase this number.\n *\n * @type {number}\n */\nexport let precision = 8;\n\n/**\n * A map with characters to escape for strings to be safely used as attribute values.\n *\n * @type {Object}\n */\nexport let escapingMap = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n '\\'': '''\n};\n","export default (function (instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n});","export default (function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);\n if (staticProps) defineProperties(Constructor, staticProps);\n return Constructor;\n };\n})();","import {Svg} from './svg';\n\n/**\n * This helper class is to wrap multiple `Svg` elements into a list where you can call the `Svg` functions on all elements in the list with one call. This is helpful when you'd like to perform calls with `Svg` on multiple elements.\n * An instance of this class is also returned by `Svg.querySelectorAll`.\n *\n * @memberof Svg\n * @param {Array|NodeList} nodeList An Array of SVG DOM nodes or a SVG DOM NodeList (as returned by document.querySelectorAll)\n * @constructor\n */\nexport class SvgList {\n constructor(nodeList) {\n var list = this;\n\n this.svgElements = [];\n for(var i = 0; i < nodeList.length; i++) {\n this.svgElements.push(new Svg(nodeList[i]));\n }\n\n // Add delegation methods for Svg\n Object.keys(Svg.prototype).filter(function(prototypeProperty) {\n return ['constructor',\n 'parent',\n 'querySelector',\n 'querySelectorAll',\n 'replace',\n 'append',\n 'classes',\n 'height',\n 'width'].indexOf(prototypeProperty) === -1;\n }).forEach(function(prototypeProperty) {\n list[prototypeProperty] = function() {\n var args = Array.prototype.slice.call(arguments, 0);\n list.svgElements.forEach(function(element) {\n Svg.prototype[prototypeProperty].apply(element, args);\n });\n return list;\n };\n });\n }\n}\n","export class EventEmitter {\n constructor() {\n this.handlers = [];\n }\n\n /**\n * Add an event handler for a specific event\n *\n * @memberof Chartist.Event\n * @param {String} event The event name\n * @param {Function} handler A event handler function\n */\n addEventHandler(event, handler) {\n this.handlers[event] = this.handlers[event] || [];\n this.handlers[event].push(handler);\n }\n\n /**\n * Remove an event handler of a specific event name or remove all event handlers for a specific event.\n *\n * @memberof Chartist.Event\n * @param {String} event The event name where a specific or all handlers should be removed\n * @param {Function} [handler] An optional event handler function. If specified only this specific handler will be removed and otherwise all handlers are removed.\n */\n removeEventHandler(event, handler) {\n // Only do something if there are event handlers with this name existing\n if(this.handlers[event]) {\n // If handler is set we will look for a specific handler and only remove this\n if(handler) {\n this.handlers[event].splice(this.handlers[event].indexOf(handler), 1);\n if(this.handlers[event].length === 0) {\n delete this.handlers[event];\n }\n } else {\n // If no handler is specified we remove all handlers for this event\n delete this.handlers[event];\n }\n }\n }\n\n /**\n * Use this function to emit an event. All handlers that are listening for this event will be triggered with the data parameter.\n *\n * @memberof Chartist.Event\n * @param {String} event The event name that should be triggered\n * @param {*} data Arbitrary data that will be passed to the event handler callback functions\n */\n emit(event, data) {\n // Only do something if there are event handlers with this name existing\n if(this.handlers[event]) {\n this.handlers[event].forEach(function(handler) {\n handler(data);\n });\n }\n\n // Emit event to star event handlers\n if(this.handlers['*']) {\n this.handlers['*'].forEach(function(starHandler) {\n starHandler(event, data);\n });\n }\n }\n}\n","import {querySelector, extend, optionsProvider} from '../core/core';\nimport {EventEmitter} from '../event/event-emitter';\nimport {isSupported} from '../svg/svg';\n\nexport class BaseChart {\n /**\n * Constructor of chart base class.\n *\n * @param query\n * @param data\n * @param defaultOptions\n * @param options\n * @param responsiveOptions\n * @constructor\n */\n constructor(query, data, defaultOptions, options, responsiveOptions) {\n this.container = querySelector(query);\n this.data = data || {};\n this.data.labels = this.data.labels || [];\n this.data.series = this.data.series || [];\n this.defaultOptions = defaultOptions;\n this.options = options;\n this.responsiveOptions = responsiveOptions;\n this.eventEmitter = new EventEmitter();\n this.supportsForeignObject = isSupported('Extensibility');\n this.supportsAnimations = isSupported('AnimationEventsAttribute');\n this.resizeListener = function resizeListener(){\n this.update();\n }.bind(this);\n \n if(this.container) {\n // If chartist was already initialized in this container we are detaching all event listeners first\n if(this.container.__chartist__) {\n this.container.__chartist__.detach();\n }\n \n this.container.__chartist__ = this;\n }\n \n // Using event loop for first draw to make it possible to register event listeners in the same call stack where\n // the chart was created.\n this.initializeTimeoutId = setTimeout(this.initialize.bind(this), 0);\n }\n\n createChart() {\n throw new Error('Base chart type can\\'t be instantiated!');\n }\n\n // TODO: Currently we need to re-draw the chart on window resize. This is usually very bad and will affect performance.\n // This is done because we can't work with relative coordinates when drawing the chart because SVG Path does not\n // work with relative positions yet. We need to check if we can do a viewBox hack to switch to percentage.\n // See http://mozilla.6506.n7.nabble.com/Specyfing-paths-with-percentages-unit-td247474.html\n // Update: can be done using the above method tested here: http://codepen.io/gionkunz/pen/KDvLj\n // The problem is with the label offsets that can't be converted into percentage and affecting the chart container\n /**\n * Updates the chart which currently does a full reconstruction of the SVG DOM\n *\n * @param {Object} [data] Optional data you'd like to set for the chart before it will update. If not specified the update method will use the data that is already configured with the chart.\n * @param {Object} [options] Optional options you'd like to add to the previous options for the chart before it will update. If not specified the update method will use the options that have been already configured with the chart.\n * @param {Boolean} [override] If set to true, the passed options will be used to extend the options that have been configured already. Otherwise the chart default options will be used as the base\n * @memberof Chartist.Base\n */\n update(data, options, override) {\n if(data) {\n this.data = data || {};\n this.data.labels = this.data.labels || [];\n this.data.series = this.data.series || [];\n // Event for data transformation that allows to manipulate the data before it gets rendered in the charts\n this.eventEmitter.emit('data', {\n type: 'update',\n data: this.data\n });\n }\n\n if(options) {\n this.options = extend({}, override ? this.options : this.defaultOptions, options);\n\n // If chartist was not initialized yet, we just set the options and leave the rest to the initialization\n // Otherwise we re-create the optionsProvider at this point\n if(!this.initializeTimeoutId) {\n this.optionsProvider.removeMediaQueryListeners();\n this.optionsProvider = optionsProvider(this.options, this.responsiveOptions, this.eventEmitter);\n }\n }\n\n // Only re-created the chart if it has been initialized yet\n if(!this.initializeTimeoutId) {\n this.createChart(this.optionsProvider.getCurrentOptions());\n }\n\n // Return a reference to the chart object to chain up calls\n return this;\n }\n\n /**\n * This method can be called on the API object of each chart and will un-register all event listeners that were added to other components. This currently includes a window.resize listener as well as media query listeners if any responsive options have been provided. Use this function if you need to destroy and recreate Chartist charts dynamically.\n *\n * @memberof Chartist.Base\n */\n detach() {\n // Only detach if initialization already occurred on this chart. If this chart still hasn't initialized (therefore\n // the initializationTimeoutId is still a valid timeout reference, we will clear the timeout\n if(!this.initializeTimeoutId) {\n window.removeEventListener('resize', this.resizeListener);\n this.optionsProvider.removeMediaQueryListeners();\n } else {\n window.clearTimeout(this.initializeTimeoutId);\n }\n\n return this;\n }\n\n /**\n * Use this function to register event handlers. The handler callbacks are synchronous and will run in the main thread rather than the event loop.\n *\n * @memberof Chartist.Base\n * @param {String} event Name of the event. Check the examples for supported events.\n * @param {Function} handler The handler function that will be called when an event with the given name was emitted. This function will receive a data argument which contains event data. See the example for more details.\n */\n on(event, handler) {\n this.eventEmitter.addEventHandler(event, handler);\n return this;\n }\n\n /**\n * Use this function to un-register event handlers. If the handler function parameter is omitted all handlers for the given event will be un-registered.\n *\n * @memberof Chartist.Base\n * @param {String} event Name of the event for which a handler should be removed\n * @param {Function} [handler] The handler function that that was previously used to register a new event handler. This handler will be removed from the event handler list. If this parameter is omitted then all event handlers for the given event are removed from the list.\n */\n off(event, handler) {\n this.eventEmitter.removeEventHandler(event, handler);\n return this;\n }\n\n initialize() {\n // Add window resize listener that re-creates the chart\n window.addEventListener('resize', this.resizeListener);\n\n // Obtain current options based on matching media queries (if responsive options are given)\n // This will also register a listener that is re-creating the chart based on media changes\n this.optionsProvider = optionsProvider(this.options, this.responsiveOptions, this.eventEmitter);\n // Register options change listener that will trigger a chart update\n this.eventEmitter.addEventHandler('optionsChanged', function() {\n this.update();\n }.bind(this));\n\n // Before the first chart creation we need to register us with all plugins that are configured\n // Initialize all relevant plugins with our chart object and the plugin options specified in the config\n if(this.options.plugins) {\n this.options.plugins.forEach(function(plugin) {\n if(plugin instanceof Array) {\n plugin[0](this, plugin[1]);\n } else {\n plugin(this);\n }\n }.bind(this));\n }\n\n // Event for data transformation that allows to manipulate the data before it gets rendered in the charts\n this.eventEmitter.emit('data', {\n type: 'initial',\n data: this.data\n });\n\n // Create the first chart\n this.createChart(this.optionsProvider.getCurrentOptions());\n\n // As chart is initialized from the event loop now we can reset our timeout reference\n // This is important if the chart gets initialized on the same element twice\n this.initializeTimeoutId = undefined;\n }\n}\n","export default (function (self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self;\n});","export default (function (subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n});","import {isFalseyButZero} from '../core/lang';\nimport {createGrid, createLabel} from '../core/creation';\n\nexport const axisUnits = {\n x: {\n pos: 'x',\n len: 'width',\n dir: 'horizontal',\n rectStart: 'x1',\n rectEnd: 'x2',\n rectOffset: 'y2'\n },\n y: {\n pos: 'y',\n len: 'height',\n dir: 'vertical',\n rectStart: 'y2',\n rectEnd: 'y1',\n rectOffset: 'x1'\n }\n};\n\nexport class Axis {\n initialize(units, chartRect, ticks, options) {\n this.units = units;\n this.counterUnits = units === axisUnits.x ? axisUnits.y : axisUnits.x;\n this.options = options;\n this.chartRect = chartRect;\n this.axisLength = chartRect[this.units.rectEnd] - chartRect[this.units.rectStart];\n this.gridOffset = chartRect[this.units.rectOffset];\n this.ticks = ticks;\n }\n\n projectValue(value, index, data) {\n throw new Error('Base axis can\\'t be instantiated!');\n }\n\n createGridAndLabels(gridGroup, labelGroup, useForeignObject, chartOptions, eventEmitter) {\n var axisOptions = chartOptions['axis' + this.units.pos.toUpperCase()];\n var projectedValues = this.ticks.map(this.projectValue.bind(this));\n var labelValues = this.ticks.map(axisOptions.labelInterpolationFnc);\n\n projectedValues.forEach(function(projectedValue, index) {\n var labelOffset = {\n x: 0,\n y: 0\n };\n\n // TODO: Find better solution for solving this problem\n // Calculate how much space we have available for the label\n var labelLength;\n if(projectedValues[index + 1]) {\n // If we still have one label ahead, we can calculate the distance to the next tick / label\n labelLength = projectedValues[index + 1] - projectedValue;\n } else {\n // If we don't have a label ahead and we have only two labels in total, we just take the remaining distance to\n // on the whole axis length. We limit that to a minimum of 30 pixel, so that labels close to the border will\n // still be visible inside of the chart padding.\n labelLength = Math.max(this.axisLength - projectedValue, 30);\n }\n\n // Skip grid lines and labels where interpolated label values are falsey (execpt for 0)\n if(isFalseyButZero(labelValues[index]) && labelValues[index] !== '') {\n return;\n }\n\n // Transform to global coordinates using the chartRect\n // We also need to set the label offset for the createLabel function\n if(this.units.pos === 'x') {\n projectedValue = this.chartRect.x1 + projectedValue;\n labelOffset.x = chartOptions.axisX.labelOffset.x;\n\n // If the labels should be positioned in start position (top side for vertical axis) we need to set a\n // different offset as for positioned with end (bottom)\n if(chartOptions.axisX.position === 'start') {\n labelOffset.y = this.chartRect.padding.top + chartOptions.axisX.labelOffset.y + (useForeignObject ? 5 : 20);\n } else {\n labelOffset.y = this.chartRect.y1 + chartOptions.axisX.labelOffset.y + (useForeignObject ? 5 : 20);\n }\n } else {\n projectedValue = this.chartRect.y1 - projectedValue;\n labelOffset.y = chartOptions.axisY.labelOffset.y - (useForeignObject ? labelLength : 0);\n\n // If the labels should be positioned in start position (left side for horizontal axis) we need to set a\n // different offset as for positioned with end (right side)\n if(chartOptions.axisY.position === 'start') {\n labelOffset.x = useForeignObject ? this.chartRect.padding.left + chartOptions.axisY.labelOffset.x : this.chartRect.x1 - 10;\n } else {\n labelOffset.x = this.chartRect.x2 + chartOptions.axisY.labelOffset.x + 10;\n }\n }\n\n if(axisOptions.showGrid) {\n createGrid(projectedValue, index, this, this.gridOffset, this.chartRect[this.counterUnits.len](), gridGroup, [\n chartOptions.classNames.grid,\n chartOptions.classNames[this.units.dir]\n ], eventEmitter);\n }\n\n if(axisOptions.showLabel) {\n createLabel(projectedValue, labelLength, index, labelValues, this, axisOptions.offset, labelOffset, labelGroup, [\n chartOptions.classNames.label,\n chartOptions.classNames[this.units.dir],\n (axisOptions.position === 'start' ? chartOptions.classNames[axisOptions.position] : chartOptions.classNames['end'])\n ], useForeignObject, eventEmitter);\n }\n }.bind(this));\n }\n}\n","export default (function get(object, property, receiver) {\n if (object === null) object = Function.prototype;\n var desc = Object.getOwnPropertyDescriptor(object, property);\n\n if (desc === undefined) {\n var parent = Object.getPrototypeOf(object);\n\n if (parent === null) {\n return undefined;\n } else {\n return get(parent, property, receiver);\n }\n } else if (\"value\" in desc) {\n return desc.value;\n } else {\n var getter = desc.get;\n\n if (getter === undefined) {\n return undefined;\n }\n\n return getter.call(receiver);\n }\n});","import {getBounds, getHighLow, getMultiValue} from '../core/data';\nimport {Axis} from './axis';\n\nexport class AutoScaleAxis extends Axis {\n constructor(axisUnit, data, chartRect, options) {\n super();\n // Usually we calculate highLow based on the data but this can be overriden by a highLow object in the options\n var highLow = options.highLow || getHighLow(data, options, axisUnit.pos);\n this.bounds = getBounds(chartRect[axisUnit.rectEnd] - chartRect[axisUnit.rectStart], highLow, options.scaleMinSpace || 20, options.onlyInteger);\n this.range = {\n min: this.bounds.min,\n max: this.bounds.max\n };\n\n super.initialize(axisUnit, chartRect, this.bounds.values, options);\n }\n\n projectValue(value) {\n return this.axisLength * (+getMultiValue(value, this.units.pos) - this.bounds.min) / this.bounds.range;\n }\n}\n","import {getMultiValue, getHighLow} from '../core/data';\nimport {times} from '../core/functional';\nimport {Axis} from './axis';\n\nexport class FixedScaleAxis extends Axis {\n constructor(axisUnit, data, chartRect, options) {\n super();\n\n var highLow = options.highLow || getHighLow(data, options, axisUnit.pos);\n this.divisor = options.divisor || 1;\n this.ticks = options.ticks || times(this.divisor).map(function(value, index) {\n return highLow.low + (highLow.high - highLow.low) / this.divisor * index;\n }.bind(this));\n this.ticks.sort(function(a, b) {\n return a - b;\n });\n this.range = {\n min: highLow.low,\n max: highLow.high\n };\n\n super.initialize(axisUnit, chartRect, this.ticks, options);\n\n this.stepLength = this.axisLength / this.divisor;\n }\n\n projectValue(value) {\n return this.axisLength * (+getMultiValue(value, this.units.pos) - this.range.min) / (this.range.max - this.range.min);\n }\n}\n","import {Axis} from './axis';\n\nexport class StepAxis extends Axis {\n constructor(axisUnit, data, chartRect, options) {\n super();\n super.initialize(axisUnit, chartRect, options.ticks, options);\n\n var calc = Math.max(1, options.ticks.length - (options.stretch ? 1 : 0));\n this.stepLength = this.axisLength / calc;\n }\n\n projectValue(value, index) {\n return this.stepLength * index;\n }\n}\n","import {isNumeric, alphaNumerate} from '../core/lang';\nimport {noop} from '../core/functional';\nimport {extend} from '../core/extend';\nimport {normalizeData, serialize, getMetaData, getSeriesOption} from '../core/data';\nimport {createSvg, createChartRect, createGridBackground} from '../core/creation';\nimport {StepAxis, AutoScaleAxis, axisUnits} from '../axes/axes';\nimport {BaseChart} from './base';\nimport {monotoneCubic, none} from '../interpolation/interpolation';\n\n/**\n * Default options in line charts. Expand the code view to see a detailed list of options with comments.\n *\n * @memberof Chartist.Line\n */\nconst defaultOptions = {\n // Options for X-Axis\n axisX: {\n // The offset of the labels to the chart area\n offset: 30,\n // Position where labels are placed. Can be set to `start` or `end` where `start` is equivalent to left or top on vertical axis and `end` is equivalent to right or bottom on horizontal axis.\n position: 'end',\n // Allows you to correct label positioning on this axis by positive or negative x and y offset.\n labelOffset: {\n x: 0,\n y: 0\n },\n // If labels should be shown or not\n showLabel: true,\n // If the axis grid should be drawn or not\n showGrid: true,\n // Interpolation function that allows you to intercept the value from the axis label\n labelInterpolationFnc: noop,\n // Set the axis type to be used to project values on this axis. If not defined, Chartist.StepAxis will be used for the X-Axis, where the ticks option will be set to the labels in the data and the stretch option will be set to the global fullWidth option. This type can be changed to any axis constructor available (e.g. Chartist.FixedScaleAxis), where all axis options should be present here.\n type: undefined\n },\n // Options for Y-Axis\n axisY: {\n // The offset of the labels to the chart area\n offset: 40,\n // Position where labels are placed. Can be set to `start` or `end` where `start` is equivalent to left or top on vertical axis and `end` is equivalent to right or bottom on horizontal axis.\n position: 'start',\n // Allows you to correct label positioning on this axis by positive or negative x and y offset.\n labelOffset: {\n x: 0,\n y: 0\n },\n // If labels should be shown or not\n showLabel: true,\n // If the axis grid should be drawn or not\n showGrid: true,\n // Interpolation function that allows you to intercept the value from the axis label\n labelInterpolationFnc: noop,\n // Set the axis type to be used to project values on this axis. If not defined, Chartist.AutoScaleAxis will be used for the Y-Axis, where the high and low options will be set to the global high and low options. This type can be changed to any axis constructor available (e.g. Chartist.FixedScaleAxis), where all axis options should be present here.\n type: undefined,\n // This value specifies the minimum height in pixel of the scale steps\n scaleMinSpace: 20,\n // Use only integer values (whole numbers) for the scale steps\n onlyInteger: false\n },\n // Specify a fixed width for the chart as a string (i.e. '100px' or '50%')\n width: undefined,\n // Specify a fixed height for the chart as a string (i.e. '100px' or '50%')\n height: undefined,\n // If the line should be drawn or not\n showLine: true,\n // If dots should be drawn or not\n showPoint: true,\n // If the line chart should draw an area\n showArea: false,\n // The base for the area chart that will be used to close the area shape (is normally 0)\n areaBase: 0,\n // Specify if the lines should be smoothed. This value can be true or false where true will result in smoothing using the default smoothing interpolation function Chartist.Interpolation.cardinal and false results in Chartist.Interpolation.none. You can also choose other smoothing / interpolation functions available in the Chartist.Interpolation module, or write your own interpolation function. Check the examples for a brief description.\n lineSmooth: true,\n // If the line chart should add a background fill to the .ct-grids group.\n showGridBackground: false,\n // Overriding the natural low of the chart allows you to zoom in or limit the charts lowest displayed value\n low: undefined,\n // Overriding the natural high of the chart allows you to zoom in or limit the charts highest displayed value\n high: undefined,\n // Padding of the chart drawing area to the container element and labels as a number or padding object {top: 5, right: 5, bottom: 5, left: 5}\n chartPadding: {\n top: 15,\n right: 15,\n bottom: 5,\n left: 10\n },\n // When set to true, the last grid line on the x-axis is not drawn and the chart elements will expand to the full available width of the chart. For the last label to be drawn correctly you might need to add chart padding or offset the last label with a draw event handler.\n fullWidth: false,\n // If true the whole data is reversed including labels, the series order as well as the whole series data arrays.\n reverseData: false,\n // Override the class names that get used to generate the SVG structure of the chart\n classNames: {\n chart: 'ct-chart-line',\n label: 'ct-label',\n labelGroup: 'ct-labels',\n series: 'ct-series',\n line: 'ct-line',\n point: 'ct-point',\n area: 'ct-area',\n grid: 'ct-grid',\n gridGroup: 'ct-grids',\n gridBackground: 'ct-grid-background',\n vertical: 'ct-vertical',\n horizontal: 'ct-horizontal',\n start: 'ct-start',\n end: 'ct-end'\n }\n};\n\nexport class LineChart extends BaseChart {\n /**\n * This method creates a new line chart.\n *\n * @memberof Chartist.Line\n * @param {String|Node} query A selector query string or directly a DOM element\n * @param {Object} data The data object that needs to consist of a labels and a series array\n * @param {Object} [options] The options object with options that override the default options. Check the examples for a detailed list.\n * @param {Array} [responsiveOptions] Specify an array of responsive option arrays which are a media query and options object pair => [[mediaQueryString, optionsObject],[more...]]\n * @return {Object} An object which exposes the API for the created chart\n *\n * @example\n * // Create a simple line chart\n * var data = {\n * // A labels array that can contain any sort of values\n * labels: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri'],\n * // Our series array that contains series objects or in this case series data arrays\n * series: [\n * [5, 2, 4, 2, 0]\n * ]\n * };\n *\n * // As options we currently only set a static size of 300x200 px\n * var options = {\n * width: '300px',\n * height: '200px'\n * };\n *\n * // In the global name space Chartist we call the Line function to initialize a line chart. As a first parameter we pass in a selector where we would like to get our chart created. Second parameter is the actual data object and as a third parameter we pass in our options\n * new Chartist.Line('.ct-chart', data, options);\n *\n * @example\n * // Use specific interpolation function with configuration from the Chartist.Interpolation module\n *\n * var chart = new Chartist.Line('.ct-chart', {\n * labels: [1, 2, 3, 4, 5],\n * series: [\n * [1, 1, 8, 1, 7]\n * ]\n * }, {\n * lineSmooth: Chartist.Interpolation.cardinal({\n * tension: 0.2\n * })\n * });\n *\n * @example\n * // Create a line chart with responsive options\n *\n * var data = {\n * // A labels array that can contain any sort of values\n * labels: ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'],\n * // Our series array that contains series objects or in this case series data arrays\n * series: [\n * [5, 2, 4, 2, 0]\n * ]\n * };\n *\n * // In addition to the regular options we specify responsive option overrides that will override the default configutation based on the matching media queries.\n * var responsiveOptions = [\n * ['screen and (min-width: 641px) and (max-width: 1024px)', {\n * showPoint: false,\n * axisX: {\n * labelInterpolationFnc: function(value) {\n * // Will return Mon, Tue, Wed etc. on medium screens\n * return value.slice(0, 3);\n * }\n * }\n * }],\n * ['screen and (max-width: 640px)', {\n * showLine: false,\n * axisX: {\n * labelInterpolationFnc: function(value) {\n * // Will return M, T, W etc. on small screens\n * return value[0];\n * }\n * }\n * }]\n * ];\n *\n * new Chartist.Line('.ct-chart', data, null, responsiveOptions);\n *\n */\n constructor(query, data, options, responsiveOptions) {\n super(query, data, defaultOptions, extend({}, defaultOptions, options), responsiveOptions);\n }\n\n /**\n * Creates a new chart\n *\n */\n createChart(options) {\n var data = normalizeData(this.data, options.reverseData, true);\n\n // Create new svg object\n this.svg = createSvg(this.container, options.width, options.height, options.classNames.chart);\n // Create groups for labels, grid and series\n var gridGroup = this.svg.elem('g').addClass(options.classNames.gridGroup);\n var seriesGroup = this.svg.elem('g');\n var labelGroup = this.svg.elem('g').addClass(options.classNames.labelGroup);\n\n var chartRect = createChartRect(this.svg, options, defaultOptions.padding);\n var axisX, axisY;\n\n if(options.axisX.type === undefined) {\n axisX = new StepAxis(axisUnits.x, data.normalized.series, chartRect, extend({}, options.axisX, {\n ticks: data.normalized.labels,\n stretch: options.fullWidth\n }));\n } else {\n axisX = new options.axisX.type(axisUnits.x, data.normalized.series, chartRect, options.axisX);\n }\n\n if(options.axisY.type === undefined) {\n axisY = new AutoScaleAxis(axisUnits.y, data.normalized.series, chartRect, extend({}, options.axisY, {\n high: isNumeric(options.high) ? options.high : options.axisY.high,\n low: isNumeric(options.low) ? options.low : options.axisY.low\n }));\n } else {\n axisY = new options.axisY.type(axisUnits.y, data.normalized.series, chartRect, options.axisY);\n }\n\n axisX.createGridAndLabels(gridGroup, labelGroup, this.supportsForeignObject, options, this.eventEmitter);\n axisY.createGridAndLabels(gridGroup, labelGroup, this.supportsForeignObject, options, this.eventEmitter);\n\n if (options.showGridBackground) {\n createGridBackground(gridGroup, chartRect, options.classNames.gridBackground, this.eventEmitter);\n }\n\n // Draw the series\n data.raw.series.forEach(function(series, seriesIndex) {\n var seriesElement = seriesGroup.elem('g');\n\n // Write attributes to series group element. If series name or meta is undefined the attributes will not be written\n seriesElement.attr({\n 'ct:series-name': series.name,\n 'ct:meta': serialize(series.meta)\n });\n\n // Use series class from series data or if not set generate one\n seriesElement.addClass([\n options.classNames.series,\n (series.className || options.classNames.series + '-' + alphaNumerate(seriesIndex))\n ].join(' '));\n\n var pathCoordinates = [],\n pathData = [];\n\n data.normalized.series[seriesIndex].forEach(function(value, valueIndex) {\n var p = {\n x: chartRect.x1 + axisX.projectValue(value, valueIndex, data.normalized.series[seriesIndex]),\n y: chartRect.y1 - axisY.projectValue(value, valueIndex, data.normalized.series[seriesIndex])\n };\n pathCoordinates.push(p.x, p.y);\n pathData.push({\n value: value,\n valueIndex: valueIndex,\n meta: getMetaData(series, valueIndex)\n });\n }.bind(this));\n\n var seriesOptions = {\n lineSmooth: getSeriesOption(series, options, 'lineSmooth'),\n showPoint: getSeriesOption(series, options, 'showPoint'),\n showLine: getSeriesOption(series, options, 'showLine'),\n showArea: getSeriesOption(series, options, 'showArea'),\n areaBase: getSeriesOption(series, options, 'areaBase')\n };\n\n var smoothing = typeof seriesOptions.lineSmooth === 'function' ?\n seriesOptions.lineSmooth : (seriesOptions.lineSmooth ? monotoneCubic() : none());\n // Interpolating path where pathData will be used to annotate each path element so we can trace back the original\n // index, value and meta data\n var path = smoothing(pathCoordinates, pathData);\n\n // If we should show points we need to create them now to avoid secondary loop\n // Points are drawn from the pathElements returned by the interpolation function\n // Small offset for Firefox to render squares correctly\n if (seriesOptions.showPoint) {\n\n path.pathElements.forEach(function(pathElement) {\n var point = seriesElement.elem('line', {\n x1: pathElement.x,\n y1: pathElement.y,\n x2: pathElement.x + 0.01,\n y2: pathElement.y\n }, options.classNames.point).attr({\n 'ct:value': [pathElement.data.value.x, pathElement.data.value.y].filter(isNumeric).join(','),\n 'ct:meta': serialize(pathElement.data.meta)\n });\n\n this.eventEmitter.emit('draw', {\n type: 'point',\n value: pathElement.data.value,\n index: pathElement.data.valueIndex,\n meta: pathElement.data.meta,\n series: series,\n seriesIndex: seriesIndex,\n axisX: axisX,\n axisY: axisY,\n group: seriesElement,\n element: point,\n x: pathElement.x,\n y: pathElement.y\n });\n }.bind(this));\n }\n\n if(seriesOptions.showLine) {\n var line = seriesElement.elem('path', {\n d: path.stringify()\n }, options.classNames.line, true);\n\n this.eventEmitter.emit('draw', {\n type: 'line',\n values: data.normalized.series[seriesIndex],\n path: path.clone(),\n chartRect: chartRect,\n index: seriesIndex,\n series: series,\n seriesIndex: seriesIndex,\n seriesMeta: series.meta,\n axisX: axisX,\n axisY: axisY,\n group: seriesElement,\n element: line\n });\n }\n\n // Area currently only works with axes that support a range!\n if(seriesOptions.showArea && axisY.range) {\n // If areaBase is outside the chart area (< min or > max) we need to set it respectively so that\n // the area is not drawn outside the chart area.\n var areaBase = Math.max(Math.min(seriesOptions.areaBase, axisY.range.max), axisY.range.min);\n\n // We project the areaBase value into screen coordinates\n var areaBaseProjected = chartRect.y1 - axisY.projectValue(areaBase);\n\n // In order to form the area we'll first split the path by move commands so we can chunk it up into segments\n path.splitByCommand('M').filter(function onlySolidSegments(pathSegment) {\n // We filter only \"solid\" segments that contain more than one point. Otherwise there's no need for an area\n return pathSegment.pathElements.length > 1;\n }).map(function convertToArea(solidPathSegments) {\n // Receiving the filtered solid path segments we can now convert those segments into fill areas\n var firstElement = solidPathSegments.pathElements[0];\n var lastElement = solidPathSegments.pathElements[solidPathSegments.pathElements.length - 1];\n\n // Cloning the solid path segment with closing option and removing the first move command from the clone\n // We then insert a new move that should start at the area base and draw a straight line up or down\n // at the end of the path we add an additional straight line to the projected area base value\n // As the closing option is set our path will be automatically closed\n return solidPathSegments.clone(true)\n .position(0)\n .remove(1)\n .move(firstElement.x, areaBaseProjected)\n .line(firstElement.x, firstElement.y)\n .position(solidPathSegments.pathElements.length + 1)\n .line(lastElement.x, areaBaseProjected);\n\n }).forEach(function createArea(areaPath) {\n // For each of our newly created area paths, we'll now create path elements by stringifying our path objects\n // and adding the created DOM elements to the correct series group\n var area = seriesElement.elem('path', {\n d: areaPath.stringify()\n }, options.classNames.area, true);\n\n // Emit an event for each area that was drawn\n this.eventEmitter.emit('draw', {\n type: 'area',\n values: data.normalized.series[seriesIndex],\n path: areaPath.clone(),\n series: series,\n seriesIndex: seriesIndex,\n axisX: axisX,\n axisY: axisY,\n chartRect: chartRect,\n index: seriesIndex,\n group: seriesElement,\n element: area\n });\n }.bind(this));\n }\n }.bind(this));\n\n this.eventEmitter.emit('created', {\n bounds: axisY.bounds,\n chartRect: chartRect,\n axisX: axisX,\n axisY: axisY,\n svg: this.svg,\n options: options\n });\n }\n}\n","import {isNumeric, alphaNumerate} from '../core/lang';\nimport {noop, serialMap} from '../core/functional';\nimport {extend} from '../core/extend';\nimport {normalizeData, serialize, getMetaData, getHighLow} from '../core/data';\nimport {createSvg, createChartRect, createGridBackground} from '../core/creation';\nimport {AutoScaleAxis, StepAxis, axisUnits} from '../axes/axes';\nimport {BaseChart} from './base';\n\n/**\n * Default options in bar charts. Expand the code view to see a detailed list of options with comments.\n *\n * @memberof Chartist.Bar\n */\nconst defaultOptions = {\n // Options for X-Axis\n axisX: {\n // The offset of the chart drawing area to the border of the container\n offset: 30,\n // Position where labels are placed. Can be set to `start` or `end` where `start` is equivalent to left or top on vertical axis and `end` is equivalent to right or bottom on horizontal axis.\n position: 'end',\n // Allows you to correct label positioning on this axis by positive or negative x and y offset.\n labelOffset: {\n x: 0,\n y: 0\n },\n // If labels should be shown or not\n showLabel: true,\n // If the axis grid should be drawn or not\n showGrid: true,\n // Interpolation function that allows you to intercept the value from the axis label\n labelInterpolationFnc: noop,\n // This value specifies the minimum width in pixel of the scale steps\n scaleMinSpace: 30,\n // Use only integer values (whole numbers) for the scale steps\n onlyInteger: false\n },\n // Options for Y-Axis\n axisY: {\n // The offset of the chart drawing area to the border of the container\n offset: 40,\n // Position where labels are placed. Can be set to `start` or `end` where `start` is equivalent to left or top on vertical axis and `end` is equivalent to right or bottom on horizontal axis.\n position: 'start',\n // Allows you to correct label positioning on this axis by positive or negative x and y offset.\n labelOffset: {\n x: 0,\n y: 0\n },\n // If labels should be shown or not\n showLabel: true,\n // If the axis grid should be drawn or not\n showGrid: true,\n // Interpolation function that allows you to intercept the value from the axis label\n labelInterpolationFnc: noop,\n // This value specifies the minimum height in pixel of the scale steps\n scaleMinSpace: 20,\n // Use only integer values (whole numbers) for the scale steps\n onlyInteger: false\n },\n // Specify a fixed width for the chart as a string (i.e. '100px' or '50%')\n width: undefined,\n // Specify a fixed height for the chart as a string (i.e. '100px' or '50%')\n height: undefined,\n // Overriding the natural high of the chart allows you to zoom in or limit the charts highest displayed value\n high: undefined,\n // Overriding the natural low of the chart allows you to zoom in or limit the charts lowest displayed value\n low: undefined,\n // Unless low/high are explicitly set, bar chart will be centered at zero by default. Set referenceValue to null to auto scale.\n referenceValue: 0,\n // Padding of the chart drawing area to the container element and labels as a number or padding object {top: 5, right: 5, bottom: 5, left: 5}\n chartPadding: {\n top: 15,\n right: 15,\n bottom: 5,\n left: 10\n },\n // Specify the distance in pixel of bars in a group\n seriesBarDistance: 15,\n // If set to true this property will cause the series bars to be stacked. Check the `stackMode` option for further stacking options.\n stackBars: false,\n // If set to 'overlap' this property will force the stacked bars to draw from the zero line.\n // If set to 'accumulate' this property will form a total for each series point. This will also influence the y-axis and the overall bounds of the chart. In stacked mode the seriesBarDistance property will have no effect.\n stackMode: 'accumulate',\n // Inverts the axes of the bar chart in order to draw a horizontal bar chart. Be aware that you also need to invert your axis settings as the Y Axis will now display the labels and the X Axis the values.\n horizontalBars: false,\n // If set to true then each bar will represent a series and the data array is expected to be a one dimensional array of data values rather than a series array of series. This is useful if the bar chart should represent a profile rather than some data over time.\n distributeSeries: false,\n // If true the whole data is reversed including labels, the series order as well as the whole series data arrays.\n reverseData: false,\n // If the bar chart should add a background fill to the .ct-grids group.\n showGridBackground: false,\n // Override the class names that get used to generate the SVG structure of the chart\n classNames: {\n chart: 'ct-chart-bar',\n horizontalBars: 'ct-horizontal-bars',\n label: 'ct-label',\n labelGroup: 'ct-labels',\n series: 'ct-series',\n bar: 'ct-bar',\n grid: 'ct-grid',\n gridGroup: 'ct-grids',\n gridBackground: 'ct-grid-background',\n vertical: 'ct-vertical',\n horizontal: 'ct-horizontal',\n start: 'ct-start',\n end: 'ct-end'\n }\n};\n\nexport class BarChart extends BaseChart {\n /**\n * This method creates a new bar chart and returns API object that you can use for later changes.\n *\n * @memberof Chartist.Bar\n * @param {String|Node} query A selector query string or directly a DOM element\n * @param {Object} data The data object that needs to consist of a labels and a series array\n * @param {Object} [options] The options object with options that override the default options. Check the examples for a detailed list.\n * @param {Array} [responsiveOptions] Specify an array of responsive option arrays which are a media query and options object pair => [[mediaQueryString, optionsObject],[more...]]\n * @return {Object} An object which exposes the API for the created chart\n *\n * @example\n * // Create a simple bar chart\n * var data = {\n * labels: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri'],\n * series: [\n * [5, 2, 4, 2, 0]\n * ]\n * };\n *\n * // In the global name space Chartist we call the Bar function to initialize a bar chart. As a first parameter we pass in a selector where we would like to get our chart created and as a second parameter we pass our data object.\n * new Chartist.Bar('.ct-chart', data);\n *\n * @example\n * // This example creates a bipolar grouped bar chart where the boundaries are limitted to -10 and 10\n * new Chartist.Bar('.ct-chart', {\n * labels: [1, 2, 3, 4, 5, 6, 7],\n * series: [\n * [1, 3, 2, -5, -3, 1, -6],\n * [-5, -2, -4, -1, 2, -3, 1]\n * ]\n * }, {\n * seriesBarDistance: 12,\n * low: -10,\n * high: 10\n * });\n *\n */\n constructor(query, data, options, responsiveOptions) {\n super(query, data, defaultOptions, extend({}, defaultOptions, options), responsiveOptions);\n }\n\n /**\n * Creates a new chart\n *\n */\n createChart(options) {\n var data;\n var highLow;\n\n if(options.distributeSeries) {\n data = normalizeData(this.data, options.reverseData, options.horizontalBars ? 'x' : 'y');\n data.normalized.series = data.normalized.series.map(function(value) {\n return [value];\n });\n } else {\n data = normalizeData(this.data, options.reverseData, options.horizontalBars ? 'x' : 'y');\n }\n\n // Create new svg element\n this.svg = createSvg(\n this.container,\n options.width,\n options.height,\n options.classNames.chart + (options.horizontalBars ? ' ' + options.classNames.horizontalBars : '')\n );\n\n // Drawing groups in correct order\n var gridGroup = this.svg.elem('g').addClass(options.classNames.gridGroup);\n var seriesGroup = this.svg.elem('g');\n var labelGroup = this.svg.elem('g').addClass(options.classNames.labelGroup);\n\n if(options.stackBars && data.normalized.series.length !== 0) {\n\n // If stacked bars we need to calculate the high low from stacked values from each series\n var serialSums = serialMap(data.normalized.series, function serialSums() {\n return Array.prototype.slice.call(arguments).map(function(value) {\n return value;\n }).reduce(function(prev, curr) {\n return {\n x: prev.x + (curr && curr.x) || 0,\n y: prev.y + (curr && curr.y) || 0\n };\n }, {x: 0, y: 0});\n });\n\n highLow = getHighLow([serialSums], options, options.horizontalBars ? 'x' : 'y');\n\n } else {\n\n highLow = getHighLow(data.normalized.series, options, options.horizontalBars ? 'x' : 'y');\n }\n\n // Overrides of high / low from settings\n highLow.high = +options.high || (options.high === 0 ? 0 : highLow.high);\n highLow.low = +options.low || (options.low === 0 ? 0 : highLow.low);\n\n var chartRect = createChartRect(this.svg, options, defaultOptions.padding);\n\n var valueAxis,\n labelAxisTicks,\n labelAxis,\n axisX,\n axisY;\n\n // We need to set step count based on some options combinations\n if(options.distributeSeries && options.stackBars) {\n // If distributed series are enabled and bars need to be stacked, we'll only have one bar and therefore should\n // use only the first label for the step axis\n labelAxisTicks = data.normalized.labels.slice(0, 1);\n } else {\n // If distributed series are enabled but stacked bars aren't, we should use the series labels\n // If we are drawing a regular bar chart with two dimensional series data, we just use the labels array\n // as the bars are normalized\n labelAxisTicks = data.normalized.labels;\n }\n\n // Set labelAxis and valueAxis based on the horizontalBars setting. This setting will flip the axes if necessary.\n if(options.horizontalBars) {\n if(options.axisX.type === undefined) {\n valueAxis = axisX = new AutoScaleAxis(axisUnits.x, data.normalized.series, chartRect, extend({}, options.axisX, {\n highLow: highLow,\n referenceValue: 0\n }));\n } else {\n valueAxis = axisX = new options.axisX.type(axisUnits.x, data.normalized.series, chartRect, extend({}, options.axisX, {\n highLow: highLow,\n referenceValue: 0\n }));\n }\n\n if(options.axisY.type === undefined) {\n labelAxis = axisY = new StepAxis(axisUnits.y, data.normalized.series, chartRect, {\n ticks: labelAxisTicks\n });\n } else {\n labelAxis = axisY = new options.axisY.type(axisUnits.y, data.normalized.series, chartRect, options.axisY);\n }\n } else {\n if(options.axisX.type === undefined) {\n labelAxis = axisX = new StepAxis(axisUnits.x, data.normalized.series, chartRect, {\n ticks: labelAxisTicks\n });\n } else {\n labelAxis = axisX = new options.axisX.type(axisUnits.x, data.normalized.series, chartRect, options.axisX);\n }\n\n if(options.axisY.type === undefined) {\n valueAxis = axisY = new AutoScaleAxis(axisUnits.y, data.normalized.series, chartRect, extend({}, options.axisY, {\n highLow: highLow,\n referenceValue: 0\n }));\n } else {\n valueAxis = axisY = new options.axisY.type(axisUnits.units.y, data.normalized.series, chartRect, extend({}, options.axisY, {\n highLow: highLow,\n referenceValue: 0\n }));\n }\n }\n\n // Projected 0 point\n var zeroPoint = options.horizontalBars ? (chartRect.x1 + valueAxis.projectValue(0)) : (chartRect.y1 - valueAxis.projectValue(0));\n // Used to track the screen coordinates of stacked bars\n var stackedBarValues = [];\n\n labelAxis.createGridAndLabels(gridGroup, labelGroup, this.supportsForeignObject, options, this.eventEmitter);\n valueAxis.createGridAndLabels(gridGroup, labelGroup, this.supportsForeignObject, options, this.eventEmitter);\n\n if (options.showGridBackground) {\n createGridBackground(gridGroup, chartRect, options.classNames.gridBackground, this.eventEmitter);\n }\n\n // Draw the series\n data.raw.series.forEach(function(series, seriesIndex) {\n // Calculating bi-polar value of index for seriesOffset. For i = 0..4 biPol will be -1.5, -0.5, 0.5, 1.5 etc.\n var biPol = seriesIndex - (data.raw.series.length - 1) / 2;\n // Half of the period width between vertical grid lines used to position bars\n var periodHalfLength;\n // Current series SVG element\n var seriesElement;\n\n // We need to set periodHalfLength based on some options combinations\n if(options.distributeSeries && !options.stackBars) {\n // If distributed series are enabled but stacked bars aren't, we need to use the length of the normaizedData array\n // which is the series count and divide by 2\n periodHalfLength = labelAxis.axisLength / data.normalized.series.length / 2;\n } else if(options.distributeSeries && options.stackBars) {\n // If distributed series and stacked bars are enabled we'll only get one bar so we should just divide the axis\n // length by 2\n periodHalfLength = labelAxis.axisLength / 2;\n } else {\n // On regular bar charts we should just use the series length\n periodHalfLength = labelAxis.axisLength / data.normalized.series[seriesIndex].length / 2;\n }\n\n // Adding the series group to the series element\n seriesElement = seriesGroup.elem('g');\n\n // Write attributes to series group element. If series name or meta is undefined the attributes will not be written\n seriesElement.attr({\n 'ct:series-name': series.name,\n 'ct:meta': serialize(series.meta)\n });\n\n // Use series class from series data or if not set generate one\n seriesElement.addClass([\n options.classNames.series,\n (series.className || options.classNames.series + '-' + alphaNumerate(seriesIndex))\n ].join(' '));\n\n data.normalized.series[seriesIndex].forEach(function(value, valueIndex) {\n var projected,\n bar,\n previousStack,\n labelAxisValueIndex;\n\n // We need to set labelAxisValueIndex based on some options combinations\n if(options.distributeSeries && !options.stackBars) {\n // If distributed series are enabled but stacked bars aren't, we can use the seriesIndex for later projection\n // on the step axis for label positioning\n labelAxisValueIndex = seriesIndex;\n } else if(options.distributeSeries && options.stackBars) {\n // If distributed series and stacked bars are enabled, we will only get one bar and therefore always use\n // 0 for projection on the label step axis\n labelAxisValueIndex = 0;\n } else {\n // On regular bar charts we just use the value index to project on the label step axis\n labelAxisValueIndex = valueIndex;\n }\n\n // We need to transform coordinates differently based on the chart layout\n if(options.horizontalBars) {\n projected = {\n x: chartRect.x1 + valueAxis.projectValue(value && value.x ? value.x : 0, valueIndex, data.normalized.series[seriesIndex]),\n y: chartRect.y1 - labelAxis.projectValue(value && value.y ? value.y : 0, labelAxisValueIndex, data.normalized.series[seriesIndex])\n };\n } else {\n projected = {\n x: chartRect.x1 + labelAxis.projectValue(value && value.x ? value.x : 0, labelAxisValueIndex, data.normalized.series[seriesIndex]),\n y: chartRect.y1 - valueAxis.projectValue(value && value.y ? value.y : 0, valueIndex, data.normalized.series[seriesIndex])\n }\n }\n\n // If the label axis is a step based axis we will offset the bar into the middle of between two steps using\n // the periodHalfLength value. Also we do arrange the different series so that they align up to each other using\n // the seriesBarDistance. If we don't have a step axis, the bar positions can be chosen freely so we should not\n // add any automated positioning.\n if(labelAxis instanceof StepAxis) {\n // Offset to center bar between grid lines, but only if the step axis is not stretched\n if(!labelAxis.options.stretch) {\n projected[labelAxis.units.pos] += periodHalfLength * (options.horizontalBars ? -1 : 1);\n }\n // Using bi-polar offset for multiple series if no stacked bars or series distribution is used\n projected[labelAxis.units.pos] += (options.stackBars || options.distributeSeries) ? 0 : biPol * options.seriesBarDistance * (options.horizontalBars ? -1 : 1);\n }\n\n // Enter value in stacked bar values used to remember previous screen value for stacking up bars\n previousStack = stackedBarValues[valueIndex] || zeroPoint;\n stackedBarValues[valueIndex] = previousStack - (zeroPoint - projected[labelAxis.counterUnits.pos]);\n\n // Skip if value is undefined\n if(value === undefined) {\n return;\n }\n\n var positions = {};\n positions[labelAxis.units.pos + '1'] = projected[labelAxis.units.pos];\n positions[labelAxis.units.pos + '2'] = projected[labelAxis.units.pos];\n\n if(options.stackBars && (options.stackMode === 'accumulate' || !options.stackMode)) {\n // Stack mode: accumulate (default)\n // If bars are stacked we use the stackedBarValues reference and otherwise base all bars off the zero line\n // We want backwards compatibility, so the expected fallback without the 'stackMode' option\n // to be the original behaviour (accumulate)\n positions[labelAxis.counterUnits.pos + '1'] = previousStack;\n positions[labelAxis.counterUnits.pos + '2'] = stackedBarValues[valueIndex];\n } else {\n // Draw from the zero line normally\n // This is also the same code for Stack mode: overlap\n positions[labelAxis.counterUnits.pos + '1'] = zeroPoint;\n positions[labelAxis.counterUnits.pos + '2'] = projected[labelAxis.counterUnits.pos];\n }\n\n // Limit x and y so that they are within the chart rect\n positions.x1 = Math.min(Math.max(positions.x1, chartRect.x1), chartRect.x2);\n positions.x2 = Math.min(Math.max(positions.x2, chartRect.x1), chartRect.x2);\n positions.y1 = Math.min(Math.max(positions.y1, chartRect.y2), chartRect.y1);\n positions.y2 = Math.min(Math.max(positions.y2, chartRect.y2), chartRect.y1);\n\n var metaData = getMetaData(series, valueIndex);\n\n // Create bar element\n bar = seriesElement.elem('line', positions, options.classNames.bar).attr({\n 'ct:value': [value.x, value.y].filter(isNumeric).join(','),\n 'ct:meta': serialize(metaData)\n });\n\n this.eventEmitter.emit('draw', extend({\n type: 'bar',\n value: value,\n index: valueIndex,\n meta: metaData,\n series: series,\n seriesIndex: seriesIndex,\n axisX: axisX,\n axisY: axisY,\n chartRect: chartRect,\n group: seriesElement,\n element: bar\n }, positions));\n }.bind(this));\n }.bind(this));\n\n this.eventEmitter.emit('created', {\n bounds: valueAxis.bounds,\n chartRect: chartRect,\n axisX: axisX,\n axisY: axisY,\n svg: this.svg,\n options: options\n });\n }\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../src/core/lang.js","../src/core/math.js","../src/core/extend.js","../src/core/data.js","../src/svg/svg.js","../src/core/creation.js","../src/core/options-provider.js","../src/svg/svg-path.js","../src/interpolation/none.js","../src/interpolation/simple.js","../src/interpolation/step.js","../src/interpolation/cardinal.js","../src/interpolation/monotone-cubic.js","../src/charts/pie.js","../package.json!file:/home/gion/Code/chartist/tooling/system-loaders/package.json","../src/core/globals.js","../jspm_packages/npm/systemjs-plugin-babel@0.0.16/babel-helpers/toConsumableArray.js","../src/core/functional.js","../jspm_packages/npm/systemjs-plugin-babel@0.0.16/babel-helpers/classCallCheck.js","../jspm_packages/npm/systemjs-plugin-babel@0.0.16/babel-helpers/createClass.js","../src/svg/svg-list.js","../src/event/event-emitter.js","../src/charts/base.js","../jspm_packages/npm/systemjs-plugin-babel@0.0.16/babel-helpers/possibleConstructorReturn.js","../jspm_packages/npm/systemjs-plugin-babel@0.0.16/babel-helpers/inherits.js","../src/axes/axis.js","../jspm_packages/npm/systemjs-plugin-babel@0.0.16/babel-helpers/get.js","../src/axes/auto-scale-axis.js","../src/axes/fixed-scale-axis.js","../src/axes/step-axis.js","../src/charts/line.js","../src/charts/bar.js"],"names":["replaceAll","str","subStr","newSubStr","replace","RegExp","querySelector","query","Node","document","safeHasProperty","object","property","hasOwnProperty","isNumeric","value","isFinite","isFalseyButZero","getNumberOrUndefined","undefined","ensureUnit","unit","quantity","input","match","exec","alphaNumerate","n","String","fromCharCode","orderOfMagnitude","Math","floor","log","abs","LN10","projectLength","axisLength","length","bounds","range","roundWithPrecision","digits","precision","pow","globalPrecision","round","rho","num","gcd","p","q","f","x","x1","x2","divisor","polarToCartesian","centerX","centerY","radius","angleInDegrees","angleInRadians","PI","cos","sin","extend","target","arguments","sources","Array","_len","_key","i","source","prop","sourceProp","serialize","data","JSON","stringify","Object","keys","escapingMap","reduce","result","key","deserialize","parse","e","normalizeData","reverse","multi","labelCount","output","normalized","series","getDataArray","every","max","apply","_toConsumableArray","map","labels","slice","push","_output$normalized$la","times","getMetaData","index","meta","isDataHoleValue","isNaN","reverseData","_step","Symbol","iterator","_iteratorNormalCompletion","_iterator","next","done","recursiveConvert","multiValue","y","isMultiValue","getMultiValue","dimension","getSeriesOption","options","name","seriesOptions","splitIntoSegments","pathCoordinates","valueData","defaultOptions","segments","hole","fillHoles","increasingX","getHighLow","recursiveHighLow","sourceData","findHigh","highLow","high","findLow","low","toUpperCase","Number","MAX_VALUE","referenceValue","min","getBounds","scaleMinSpace","onlyInteger","safeIncrement","increment","EPSILON","valueRange","oom","step","ceil","numberOfSteps","scaleUp","smallestFactor","optimizationCounter","Error","newMin","newMax","values","isSupported","feature","implementation","hasFeature","createSvg","container","width","height","className","from","querySelectorAll","filter","svg","getAttributeNS","namespaces","xmlns","forEach","removeChild","Svg","attr","addClass","appendChild","_node","normalizePadding","padding","fallback","top","right","bottom","left","createChartRect","fallbackPadding","hasAxis","axisX","axisY","yAxisOffset","offset","xAxisOffset","normalizedPadding","chartPadding","chartRect","this","y1","y2","position","createGrid","axis","group","classes","eventEmitter","positionalData","units","pos","counterUnits","gridElement","elem","join","emit","createGridBackground","gridGroup","gridBackground","createLabel","axisOffset","labelOffset","useForeignObject","labelElement","len","stepLength","stepCounterLength","content","trim","foreignObject","text","optionsProvider","responsiveOptions","updateCurrentOptions","mediaEvent","previousOptions","currentOptions","baseOptions","responsiveOption","mql","window","matchMedia","matches","removeMediaQueryListeners","removeListener","mediaQueryListeners","addListener","element","command","params","pathElements","relative","pathElement","toLowerCase","splice","forEachParam","cb","pathElementIndex","paramName","paramIndex","none","path","SvgPath","currX","currY","currData","move","line","simple","d","prevX","prevY","prevData","curve","postpone","cardinal","t","tension","c","cardinalInterpolation","segment","z","iLen","monotoneCubic","monotoneCubicInterpolation","xs","ys","ms","ds","dys","dxs","determineAnchorPosition","center","label","direction","toTheRight","version","arr","isArray","arr2","noop","sum","previous","current","serialMap","array","callback","inner","_classCallCheck","instance","Constructor","TypeError","_createClass","defineProperties","props","descriptor","enumerable","configurable","writable","defineProperty","protoProps","staticProps","prototype","SvgList","nodeList","list","svgElements","prototypeProperty","indexOf","args","_arguments","attributes","parent","insertFirst","Element","createElementNS","ct","firstChild","insertBefore","ns","getAttribute","namespacedAttribute","split","setAttributeNS","setAttribute","bind","parentNode","SVGElement","node","nodeName","selector","foundNode","foundNodes","createElement","innerHTML","fnObj","createTextNode","newElement","replaceChild","names","concat","self","removedClasses","getBoundingClientRect","animations","guided","attribute","createAnimate","animationDefinition","createGuided","attributeProperties","animationEasing","timeout","easing","easings","begin","dur","calcMode","keySplines","keyTimes","fill","animate","_this","beginElement","err","to","remove","addEventListener","EventEmitter","handlers","event","handler","starHandler","BaseChart","supportsForeignObject","supportsAnimations","resizeListener","update","__chartist__","detach","initializeTimeoutId","setTimeout","initialize","override","createChart","getCurrentOptions","clearTimeout","removeEventListener","addEventHandler","removeEventHandler","_this2","plugins","plugin","_possibleConstructorReturn","call","ReferenceError","_inherits","subClass","superClass","create","setPrototypeOf","__proto__","axisUnits","Axis","ticks","rectEnd","rectStart","gridOffset","rectOffset","labelGroup","chartOptions","axisOptions","projectedValues","projectValue","labelValues","labelInterpolationFnc","projectedValue","labelLength","showGrid","classNames","grid","dir","showLabel","end","_get","get","receiver","Function","desc","getOwnPropertyDescriptor","getPrototypeOf","getter","AutoScaleAxis","_Axis","axisUnit","FixedScaleAxis","sort","a","b","StepAxis","calc","stretch","elementDescriptions","close","paths","joinedPath","j","count","rx","ry","xAr","lAf","sf","chunks","pop","elements","chunk","shift","description","_pathElements","accuracyMultiplier","accuracy","transformFnc","transformed","clone","LineChart","_BaseChart","chart","seriesGroup","type","fullWidth","createGridAndLabels","showGridBackground","raw","seriesIndex","seriesElement","pathData","valueIndex","smoothing","lineSmooth","showPoint","point","showLine","showArea","areaBase","areaBaseProjected","splitByCommand","pathSegment","solidPathSegments","firstElement","lastElement","areaPath","area","BarChart","distributeSeries","horizontalBars","stackBars","serialSums","prev","curr","valueAxis","labelAxisTicks","labelAxis","zeroPoint","stackedBarValues","biPol","periodHalfLength","labelAxisValueIndex","projected","seriesBarDistance","previousStack","positions","stackMode","metaData","bar","PieChart","seriesGroups","labelsGroup","labelRadius","startAngle","donut","chartDonut","chartPie","totalDataSum","total","donutWidth","labelPosition","hasSingleValInSeries","val","ignoreEmptyValues","endAngle","overlappigStartAngle","start","arc","sliceDonut","slicePie","rawValue","interpolatedValue","labelDirection"],"mappings":"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","file":"chartist.umd.js","sourcesContent":["/**\n * Replaces all occurrences of subStr in str with newSubStr and returns a new string.\n *\n * @param {String} str\n * @param {String} subStr\n * @param {String} newSubStr\n * @return {String}\n */\nexport function replaceAll(str, subStr, newSubStr) {\n return str.replace(new RegExp(subStr, 'g'), newSubStr);\n}\n\n/**\n * This is a wrapper around document.querySelector that will return the query if it's already of type Node\n *\n * @memberof Chartist.Core\n * @param {String|Node} query The query to use for selecting a Node or a DOM node that will be returned directly\n * @return {Node}\n */\nexport function querySelector(query) {\n return query instanceof Node ? query : document.querySelector(query);\n}\n\n/**\n * This function safely checks if an objects has an owned property.\n *\n * @param {Object} object The object where to check for a property\n * @param {string} property The property name\n * @returns {boolean} Returns true if the object owns the specified property\n */\nexport function safeHasProperty(object, property) {\n return object !== null &&\n typeof object === 'object' &&\n object.hasOwnProperty(property);\n}\n\n/**\n * Checks if a value can be safely coerced to a number. This includes all values except null which result in finite numbers when coerced. This excludes NaN, since it's not finite.\n *\n * @memberof Chartist.Core\n * @param value\n * @returns {Boolean}\n */\nexport function isNumeric(value) {\n return value === null ? false : isFinite(value);\n}\n\n/**\n * Returns true on all falsey values except the numeric value 0.\n *\n * @memberof Chartist.Core\n * @param value\n * @returns {boolean}\n */\nexport function isFalseyButZero(value) {\n return !value && value !== 0;\n}\n\n/**\n * Returns a number if the passed parameter is a valid number or the function will return undefined. On all other values than a valid number, this function will return undefined.\n *\n * @memberof Chartist.Core\n * @param value\n * @returns {*}\n */\nexport function getNumberOrUndefined(value) {\n return isNumeric(value) ? +value : undefined;\n}\n\n/**\n * Converts a number to a string with a unit. If a string is passed then this will be returned unmodified.\n *\n * @memberof Chartist.Core\n * @param {Number} value\n * @param {String} unit\n * @return {String} Returns the passed number value with unit.\n */\nexport function ensureUnit(value, unit) {\n if(typeof value === 'number') {\n value = value + unit;\n }\n\n return value;\n}\n\n/**\n * Converts a number or string to a quantity object.\n *\n * @memberof Chartist.Core\n * @param {String|Number} input\n * @return {Object} Returns an object containing the value as number and the unit as string.\n */\nexport function quantity(input) {\n if(typeof input === 'string') {\n const match = (/^(\\d+)\\s*(.*)$/g).exec(input);\n return {\n value: +match[1],\n unit: match[2] || undefined\n };\n }\n\n return {\n value: input\n };\n}\n\n/**\n * Generates a-z from a number 0 to 26\n *\n * @memberof Chartist.Core\n * @param {Number} n A number from 0 to 26 that will result in a letter a-z\n * @return {String} A character from a-z based on the input number n\n */\nexport function alphaNumerate(n) {\n // Limit to a-z\n return String.fromCharCode(97 + n % 26);\n}\n","import {precision as globalPrecision} from './globals';\n\nexport const EPSILON = 2.221E-16;\n\n/**\n * Calculate the order of magnitude for the chart scale\n *\n * @memberof Chartist.Core\n * @param {Number} value The value Range of the chart\n * @return {Number} The order of magnitude\n */\nexport function orderOfMagnitude(value) {\n return Math.floor(Math.log(Math.abs(value)) / Math.LN10);\n}\n\n/**\n * Project a data length into screen coordinates (pixels)\n *\n * @memberof Chartist.Core\n * @param {Object} axisLength The svg element for the chart\n * @param {Number} length Single data value from a series array\n * @param {Object} bounds All the values to set the bounds of the chart\n * @return {Number} The projected data length in pixels\n */\nexport function projectLength(axisLength, length, bounds) {\n return length / bounds.range * axisLength;\n}\n\n/**\n * This helper function can be used to round values with certain precision level after decimal. This is used to prevent rounding errors near float point precision limit.\n *\n * @memberof Chartist.Core\n * @param {Number} value The value that should be rounded with precision\n * @param {Number} [digits] The number of digits after decimal used to do the rounding\n * @returns {number} Rounded value\n */\nexport function roundWithPrecision(value, digits) {\n const precision = Math.pow(10, digits || globalPrecision);\n return Math.round(value * precision) / precision;\n}\n\n/**\n * Pollard Rho Algorithm to find smallest factor of an integer value. There are more efficient algorithms for factorization, but this one is quite efficient and not so complex.\n *\n * @memberof Chartist.Core\n * @param {Number} num An integer number where the smallest factor should be searched for\n * @returns {Number} The smallest integer factor of the parameter num.\n */\nexport function rho(num) {\n if(num === 1) {\n return num;\n }\n\n function gcd(p, q) {\n if(p % q === 0) {\n return q;\n } else {\n return gcd(q, p % q);\n }\n }\n\n function f(x) {\n return x * x + 1;\n }\n\n let x1 = 2;\n let x2 = 2;\n let divisor;\n if(num % 2 === 0) {\n return 2;\n }\n\n do {\n x1 = f(x1) % num;\n x2 = f(f(x2)) % num;\n divisor = gcd(Math.abs(x1 - x2), num);\n } while(divisor === 1);\n\n return divisor;\n}\n\n/**\n * Calculate cartesian coordinates of polar coordinates\n *\n * @memberof Chartist.Core\n * @param {Number} centerX X-axis coordinates of center point of circle segment\n * @param {Number} centerY X-axis coordinates of center point of circle segment\n * @param {Number} radius Radius of circle segment\n * @param {Number} angleInDegrees Angle of circle segment in degrees\n * @return {{x:Number, y:Number}} Coordinates of point on circumference\n */\nexport function polarToCartesian(centerX, centerY, radius, angleInDegrees) {\n const angleInRadians = (angleInDegrees - 90) * Math.PI / 180.0;\n\n return {\n x: centerX + (radius * Math.cos(angleInRadians)),\n y: centerY + (radius * Math.sin(angleInRadians))\n };\n}\n","/**\n * Simple recursive object extend\n *\n * @memberof Chartist.Core\n * @param {Object} target Target object where the source will be merged into\n * @param {Object...} sources This object (objects) will be merged into target and then target is returned\n * @return {Object} An object that has the same reference as target but is extended and merged with the properties of source\n */\nexport function extend(target = {}, ...sources) {\n target = target || {};\n\n for(let i = 0; i < sources.length; i++) {\n const source = sources[i];\n for(let prop in source) {\n const sourceProp = source[prop];\n if(typeof sourceProp === 'object' && sourceProp !== null && !(sourceProp instanceof Array)) {\n target[prop] = extend(target[prop], sourceProp);\n } else {\n target[prop] = sourceProp;\n }\n }\n }\n\n return target;\n}\n","import {escapingMap} from './globals';\nimport {replaceAll, safeHasProperty, getNumberOrUndefined} from './lang';\nimport {times} from './functional';\nimport {extend} from './extend';\nimport {orderOfMagnitude, projectLength, roundWithPrecision, rho, EPSILON} from './math';\n\n/**\n * This function serializes arbitrary data to a string. In case of data that can't be easily converted to a string, this function will create a wrapper object and serialize the data using JSON.stringify. The outcoming string will always be escaped using Chartist.escapingMap.\n * If called with null or undefined the function will return immediately with null or undefined.\n *\n * @memberof Chartist.Core\n * @param {Number|String|Object} data\n * @return {String}\n */\nexport function serialize(data) {\n if(data === null || data === undefined) {\n return data;\n } else if(typeof data === 'number') {\n data = '' + data;\n } else if(typeof data === 'object') {\n data = JSON.stringify({data: data});\n }\n\n return Object.keys(escapingMap)\n .reduce((result, key) => replaceAll(result, key, escapingMap[key]), data);\n}\n\n/**\n * This function de-serializes a string previously serialized with Chartist.serialize. The string will always be unescaped using Chartist.escapingMap before it's returned. Based on the input value the return type can be Number, String or Object. JSON.parse is used with try / catch to see if the unescaped string can be parsed into an Object and this Object will be returned on success.\n *\n * @memberof Chartist.Core\n * @param {String} data\n * @return {String|Number|Object}\n */\nexport function deserialize(data) {\n if(typeof data !== 'string') {\n return data;\n }\n\n data = Object.keys(escapingMap)\n .reduce((result, key) => replaceAll(result, escapingMap[key], key), data);\n\n try {\n data = JSON.parse(data);\n data = data.data !== undefined ? data.data : data;\n } catch(e) {\n }\n\n return data;\n}\n\n/**\n * Ensures that the data object passed as second argument to the charts is present and correctly initialized.\n *\n * @param {Object} data The data object that is passed as second argument to the charts\n * @return {Object} The normalized data object\n */\nexport function normalizeData(data, reverse, multi) {\n let labelCount;\n const output = {\n raw: data,\n normalized: {}\n };\n\n // Check if we should generate some labels based on existing series data\n output.normalized.series = getDataArray({\n series: data.series || []\n }, reverse, multi);\n\n // If all elements of the normalized data array are arrays we're dealing with\n // multi series data and we need to find the largest series if they are un-even\n if(output.normalized.series.every((value) => value instanceof Array)) {\n // Getting the series with the the most elements\n labelCount = Math.max(...output.normalized.series.map((series) => series.length));\n } else {\n // We're dealing with Pie data so we just take the normalized array length\n labelCount = output.normalized.series.length;\n }\n\n output.normalized.labels = (data.labels || []).slice();\n // Padding the labels to labelCount with empty strings\n output.normalized.labels\n .push(...times(Math.max(0, labelCount - output.normalized.labels.length))\n .map(() => ''));\n\n if(reverse) {\n reverseData(output.normalized);\n }\n\n return output;\n}\n\n/**\n * Get meta data of a specific value in a series.\n *\n * @param series\n * @param index\n * @returns {*}\n */\nexport function getMetaData(series, index) {\n const value = series.data ? series.data[index] : series[index];\n return value ? value.meta : undefined;\n}\n\n/**\n * Checks if a value is considered a hole in the data series.\n *\n * @param {*} value\n * @returns {boolean} True if the value is considered a data hole\n */\nexport function isDataHoleValue(value) {\n return value === null ||\n value === undefined ||\n (typeof value === 'number' && isNaN(value));\n}\n\n/**\n * Reverses the series, labels and series data arrays.\n *\n * @memberof Chartist.Core\n * @param data\n */\nexport function reverseData(data) {\n data.labels.reverse();\n data.series.reverse();\n for(let series of data.series) {\n if(typeof(series) === 'object' && series.data !== undefined) {\n series.data.reverse();\n } else if(series instanceof Array) {\n series.reverse();\n }\n }\n}\n\n/**\n * Convert data series into plain array\n *\n * @memberof Chartist.Core\n * @param {Object} data The series object that contains the data to be visualized in the chart\n * @param {Boolean} [reverse] If true the whole data is reversed by the getDataArray call. This will modify the data object passed as first parameter. The labels as well as the series order is reversed. The whole series data arrays are reversed too.\n * @param {Boolean} [multi] Create a multi dimensional array from a series data array where a value object with `x` and `y` values will be created.\n * @return {Array} A plain array that contains the data to be visualized in the chart\n */\nexport function getDataArray(data, reverse, multi) {\n // Recursively walks through nested arrays and convert string values to numbers and objects with value properties\n // to values. Check the tests in data core -> data normalization for a detailed specification of expected values\n function recursiveConvert(value) {\n if(safeHasProperty(value, 'value')) {\n // We are dealing with value object notation so we need to recurse on value property\n return recursiveConvert(value.value);\n } else if(safeHasProperty(value, 'data')) {\n // We are dealing with series object notation so we need to recurse on data property\n return recursiveConvert(value.data);\n } else if(value instanceof Array) {\n // Data is of type array so we need to recurse on the series\n return value.map(recursiveConvert);\n } else if(isDataHoleValue(value)) {\n // We're dealing with a hole in the data and therefore need to return undefined\n // We're also returning undefined for multi value output\n return undefined;\n } else {\n // We need to prepare multi value output (x and y data)\n if(multi) {\n const multiValue = {};\n\n // Single series value arrays are assumed to specify the Y-Axis value\n // For example: [1, 2] => [{x: undefined, y: 1}, {x: undefined, y: 2}]\n // If multi is a string then it's assumed that it specified which dimension should be filled as default\n if(typeof multi === 'string') {\n multiValue[multi] = getNumberOrUndefined(value);\n } else {\n multiValue.y = getNumberOrUndefined(value);\n }\n\n multiValue.x = value.hasOwnProperty('x') ? getNumberOrUndefined(value.x) : multiValue.x;\n multiValue.y = value.hasOwnProperty('y') ? getNumberOrUndefined(value.y) : multiValue.y;\n\n return multiValue;\n\n } else {\n // We can return simple data\n return getNumberOrUndefined(value);\n }\n }\n }\n\n return data.series.map(recursiveConvert);\n}\n\n/**\n * Checks if provided value object is multi value (contains x or y properties)\n *\n * @memberof Chartist.Core\n * @param value\n */\nexport function isMultiValue(value) {\n return typeof value === 'object' &&\n (value.hasOwnProperty('x') || value.hasOwnProperty('y'));\n}\n\n/**\n * Gets a value from a dimension `value.x` or `value.y` while returning value directly if it's a valid numeric value. If the value is not numeric and it's falsey this function will return `defaultValue`.\n *\n * @memberof Chartist.Core\n * @param value\n * @param dimension\n * @returns {*}\n */\nexport function getMultiValue(value, dimension = 'y') {\n if(isMultiValue(value)) {\n return getNumberOrUndefined(value[dimension]);\n } else {\n return getNumberOrUndefined(value);\n }\n}\n\n/**\n * Helper to read series specific options from options object. It automatically falls back to the global option if\n * there is no option in the series options.\n *\n * @param {Object} series Series object\n * @param {Object} options Chartist options object\n * @param {string} key The options key that should be used to obtain the options\n * @returns {*}\n */\nexport function getSeriesOption(series, options, key) {\n if(series.name && options.series && options.series[series.name]) {\n const seriesOptions = options.series[series.name];\n return seriesOptions.hasOwnProperty(key) ? seriesOptions[key] : options[key];\n } else {\n return options[key];\n }\n}\n\n/**\n * Splits a list of coordinates and associated values into segments. Each returned segment contains a pathCoordinates\n * valueData property describing the segment.\n *\n * With the default options, segments consist of contiguous sets of points that do not have an undefined value. Any\n * points with undefined values are discarded.\n *\n * **Options**\n * The following options are used to determine how segments are formed\n * ```javascript\n * var options = {\n * // If fillHoles is true, undefined values are simply discarded without creating a new segment. Assuming other options are default, this returns single segment.\n * fillHoles: false,\n * // If increasingX is true, the coordinates in all segments have strictly increasing x-values.\n * increasingX: false\n * };\n * ```\n *\n * @memberof Chartist.Core\n * @param {Array} pathCoordinates List of point coordinates to be split in the form [x1, y1, x2, y2 ... xn, yn]\n * @param {Array} valueData List of associated point values in the form [v1, v2 .. vn]\n * @param {Object} [options] Options set by user\n * @return {Array} List of segments, each containing a pathCoordinates and valueData property.\n */\nexport function splitIntoSegments(pathCoordinates, valueData, options) {\n const defaultOptions = {\n increasingX: false,\n fillHoles: false\n };\n\n options = extend({}, defaultOptions, options);\n\n const segments = [];\n let hole = true;\n\n for(let i = 0; i < pathCoordinates.length; i += 2) {\n // If this value is a \"hole\" we set the hole flag\n if(getMultiValue(valueData[i / 2].value) === undefined) {\n // if(valueData[i / 2].value === undefined) {\n if(!options.fillHoles) {\n hole = true;\n }\n } else {\n if(options.increasingX && i >= 2 && pathCoordinates[i] <= pathCoordinates[i - 2]) {\n // X is not increasing, so we need to make sure we start a new segment\n hole = true;\n }\n\n\n // If it's a valid value we need to check if we're coming out of a hole and create a new empty segment\n if(hole) {\n segments.push({\n pathCoordinates: [],\n valueData: []\n });\n // As we have a valid value now, we are not in a \"hole\" anymore\n hole = false;\n }\n\n // Add to the segment pathCoordinates and valueData\n segments[segments.length - 1].pathCoordinates.push(pathCoordinates[i], pathCoordinates[i + 1]);\n segments[segments.length - 1].valueData.push(valueData[i / 2]);\n }\n }\n\n return segments;\n}\n\n/**\n * Get highest and lowest value of data array. This Array contains the data that will be visualized in the chart.\n *\n * @memberof Chartist.Core\n * @param {Array} data The array that contains the data to be visualized in the chart\n * @param {Object} options The Object that contains the chart options\n * @param {String} dimension Axis dimension 'x' or 'y' used to access the correct value and high / low configuration\n * @return {Object} An object that contains the highest and lowest value that will be visualized on the chart.\n */\nexport function getHighLow(data, options, dimension) {\n // TODO: Remove workaround for deprecated global high / low config. Axis high / low configuration is preferred\n options = extend({}, options, dimension ? options['axis' + dimension.toUpperCase()] : {});\n\n const highLow = {\n high: options.high === undefined ? -Number.MAX_VALUE : +options.high,\n low: options.low === undefined ? Number.MAX_VALUE : +options.low\n };\n const findHigh = options.high === undefined;\n const findLow = options.low === undefined;\n\n // Function to recursively walk through arrays and find highest and lowest number\n function recursiveHighLow(sourceData) {\n if(sourceData === undefined) {\n return undefined;\n } else if(sourceData instanceof Array) {\n for(let i = 0; i < sourceData.length; i++) {\n recursiveHighLow(sourceData[i]);\n }\n } else {\n const value = dimension ? +sourceData[dimension] : +sourceData;\n\n if(findHigh && value > highLow.high) {\n highLow.high = value;\n }\n\n if(findLow && value < highLow.low) {\n highLow.low = value;\n }\n }\n }\n\n // Start to find highest and lowest number recursively\n if(findHigh || findLow) {\n recursiveHighLow(data);\n }\n\n // Overrides of high / low based on reference value, it will make sure that the invisible reference value is\n // used to generate the chart. This is useful when the chart always needs to contain the position of the\n // invisible reference value in the view i.e. for bipolar scales.\n if(options.referenceValue || options.referenceValue === 0) {\n highLow.high = Math.max(options.referenceValue, highLow.high);\n highLow.low = Math.min(options.referenceValue, highLow.low);\n }\n\n // If high and low are the same because of misconfiguration or flat data (only the same value) we need\n // to set the high or low to 0 depending on the polarity\n if(highLow.high <= highLow.low) {\n // If both values are 0 we set high to 1\n if(highLow.low === 0) {\n highLow.high = 1;\n } else if(highLow.low < 0) {\n // If we have the same negative value for the bounds we set bounds.high to 0\n highLow.high = 0;\n } else if(highLow.high > 0) {\n // If we have the same positive value for the bounds we set bounds.low to 0\n highLow.low = 0;\n } else {\n // If data array was empty, values are Number.MAX_VALUE and -Number.MAX_VALUE. Set bounds to prevent errors\n highLow.high = 1;\n highLow.low = 0;\n }\n }\n\n return highLow;\n}\n\n/**\n * Calculate and retrieve all the bounds for the chart and return them in one array\n *\n * @memberof Chartist.Core\n * @param {Number} axisLength The length of the Axis used for\n * @param {Object} highLow An object containing a high and low property indicating the value range of the chart.\n * @param {Number} scaleMinSpace The minimum projected length a step should result in\n * @param {Boolean} onlyInteger\n * @return {Object} All the values to set the bounds of the chart\n */\nexport function getBounds(axisLength, highLow, scaleMinSpace, onlyInteger) {\n const bounds = {\n high: highLow.high,\n low: highLow.low\n };\n\n bounds.valueRange = bounds.high - bounds.low;\n bounds.oom = orderOfMagnitude(bounds.valueRange);\n bounds.step = Math.pow(10, bounds.oom);\n bounds.min = Math.floor(bounds.low / bounds.step) * bounds.step;\n bounds.max = Math.ceil(bounds.high / bounds.step) * bounds.step;\n bounds.range = bounds.max - bounds.min;\n bounds.numberOfSteps = Math.round(bounds.range / bounds.step);\n\n // Optimize scale step by checking if subdivision is possible based on horizontalGridMinSpace\n // If we are already below the scaleMinSpace value we will scale up\n const length = projectLength(axisLength, bounds.step, bounds);\n const scaleUp = length < scaleMinSpace;\n const smallestFactor = onlyInteger ? rho(bounds.range) : 0;\n\n // First check if we should only use integer steps and if step 1 is still larger than scaleMinSpace so we can use 1\n if(onlyInteger && projectLength(axisLength, 1, bounds) >= scaleMinSpace) {\n bounds.step = 1;\n } else if(onlyInteger && smallestFactor < bounds.step && projectLength(axisLength, smallestFactor, bounds) >= scaleMinSpace) {\n // If step 1 was too small, we can try the smallest factor of range\n // If the smallest factor is smaller than the current bounds.step and the projected length of smallest factor\n // is larger than the scaleMinSpace we should go for it.\n bounds.step = smallestFactor;\n } else {\n // Trying to divide or multiply by 2 and find the best step value\n let optimizationCounter = 0;\n while(true) {\n if(scaleUp && projectLength(axisLength, bounds.step, bounds) <= scaleMinSpace) {\n bounds.step *= 2;\n } else if(!scaleUp && projectLength(axisLength, bounds.step / 2, bounds) >= scaleMinSpace) {\n bounds.step /= 2;\n if(onlyInteger && bounds.step % 1 !== 0) {\n bounds.step *= 2;\n break;\n }\n } else {\n break;\n }\n\n if(optimizationCounter++ > 1000) {\n throw new Error('Exceeded maximum number of iterations while optimizing scale step!');\n }\n }\n }\n\n bounds.step = Math.max(bounds.step, EPSILON);\n function safeIncrement(value, increment) {\n // If increment is too small use *= (1+EPSILON) as a simple nextafter\n if(value === (value += increment)) {\n value *= (1 + (increment > 0 ? EPSILON : -EPSILON));\n }\n return value;\n }\n\n // Narrow min and max based on new step\n let newMin = bounds.min;\n let newMax = bounds.max;\n while(newMin + bounds.step <= bounds.low) {\n newMin = safeIncrement(newMin, bounds.step);\n }\n while(newMax - bounds.step >= bounds.high) {\n newMax = safeIncrement(newMax, -bounds.step);\n }\n bounds.min = newMin;\n bounds.max = newMax;\n bounds.range = bounds.max - bounds.min;\n\n const values = [];\n for(let i = bounds.min; i <= bounds.max; i = safeIncrement(i, bounds.step)) {\n const value = roundWithPrecision(i);\n if(value !== values[values.length - 1]) {\n values.push(value);\n }\n }\n bounds.values = values;\n\n return bounds;\n}\n","import {namespaces, ensureUnit, quantity, extend} from '../core/core';\nimport {SvgList} from './svg-list';\n\n/**\n * Svg creates a new SVG object wrapper with a starting element. You can use the wrapper to fluently create sub-elements and modify them.\n *\n * @memberof Svg\n * @constructor\n * @param {String|Element} name The name of the SVG element to create or an SVG dom element which should be wrapped into Svg\n * @param {Object} attributes An object with properties that will be added as attributes to the SVG element that is created. Attributes with undefined values will not be added.\n * @param {String} className This class or class list will be added to the SVG element\n * @param {Object} parent The parent SVG wrapper object where this newly created wrapper and it's element will be attached to as child\n * @param {Boolean} insertFirst If this param is set to true in conjunction with a parent element the newly created element will be added as first child element in the parent element\n */\nexport class Svg {\n\n constructor(name, attributes, className, parent, insertFirst) {\n // If Svg is getting called with an SVG element we just return the wrapper\n if(name instanceof Element) {\n this._node = name;\n } else {\n this._node = document.createElementNS(namespaces.svg, name);\n\n // If this is an SVG element created then custom namespace\n if(name === 'svg') {\n this.attr({\n 'xmlns:ct': namespaces.ct\n });\n }\n }\n\n if(attributes) {\n this.attr(attributes);\n }\n\n if(className) {\n this.addClass(className);\n }\n\n if(parent) {\n if(insertFirst && parent._node.firstChild) {\n parent._node.insertBefore(this._node, parent._node.firstChild);\n } else {\n parent._node.appendChild(this._node);\n }\n }\n }\n\n /**\n * Set attributes on the current SVG element of the wrapper you're currently working on.\n *\n * @memberof Svg\n * @param {Object|String} attributes An object with properties that will be added as attributes to the SVG element that is created. Attributes with undefined values will not be added. If this parameter is a String then the function is used as a getter and will return the attribute value.\n * @param {String} [ns] If specified, the attribute will be obtained using getAttributeNs. In order to write namepsaced attributes you can use the namespace:attribute notation within the attributes object.\n * @return {Object|String} The current wrapper object will be returned so it can be used for chaining or the attribute value if used as getter function.\n */\n attr(attributes, ns) {\n if(typeof attributes === 'string') {\n if(ns) {\n return this._node.getAttributeNS(ns, attributes);\n } else {\n return this._node.getAttribute(attributes);\n }\n }\n\n Object.keys(attributes).forEach(function(key) {\n // If the attribute value is undefined we can skip this one\n if(attributes[key] === undefined) {\n return;\n }\n\n if(key.indexOf(':') !== -1) {\n const namespacedAttribute = key.split(':');\n this._node.setAttributeNS(namespaces[namespacedAttribute[0]], key, attributes[key]);\n } else {\n this._node.setAttribute(key, attributes[key]);\n }\n }.bind(this));\n\n return this;\n }\n\n /**\n * Create a new SVG element whose wrapper object will be selected for further operations. This way you can also create nested groups easily.\n *\n * @memberof Svg\n * @param {String} name The name of the SVG element that should be created as child element of the currently selected element wrapper\n * @param {Object} [attributes] An object with properties that will be added as attributes to the SVG element that is created. Attributes with undefined values will not be added.\n * @param {String} [className] This class or class list will be added to the SVG element\n * @param {Boolean} [insertFirst] If this param is set to true in conjunction with a parent element the newly created element will be added as first child element in the parent element\n * @return {Svg} Returns a Svg wrapper object that can be used to modify the containing SVG data\n */\n elem(name, attributes, className, insertFirst) {\n return new Svg(name, attributes, className, this, insertFirst);\n }\n\n /**\n * Returns the parent Chartist.SVG wrapper object\n *\n * @memberof Svg\n * @return {Svg} Returns a Svg wrapper around the parent node of the current node. If the parent node is not existing or it's not an SVG node then this function will return null.\n */\n parent() {\n return this._node.parentNode instanceof SVGElement ? new Svg(this._node.parentNode) : null;\n }\n\n /**\n * This method returns a Svg wrapper around the root SVG element of the current tree.\n *\n * @memberof Svg\n * @return {Svg} The root SVG element wrapped in a Svg element\n */\n root() {\n let node = this._node;\n while(node.nodeName !== 'svg') {\n node = node.parentNode;\n }\n return new Svg(node);\n }\n\n /**\n * Find the first child SVG element of the current element that matches a CSS selector. The returned object is a Svg wrapper.\n *\n * @memberof Svg\n * @param {String} selector A CSS selector that is used to query for child SVG elements\n * @return {Svg} The SVG wrapper for the element found or null if no element was found\n */\n querySelector(selector) {\n const foundNode = this._node.querySelector(selector);\n return foundNode ? new Svg(foundNode) : null;\n }\n\n /**\n * Find the all child SVG elements of the current element that match a CSS selector. The returned object is a Svg.List wrapper.\n *\n * @memberof Svg\n * @param {String} selector A CSS selector that is used to query for child SVG elements\n * @return {SvgList} The SVG wrapper list for the element found or null if no element was found\n */\n querySelectorAll(selector) {\n const foundNodes = this._node.querySelectorAll(selector);\n return foundNodes.length ? new SvgList(foundNodes) : null;\n }\n\n /**\n * Returns the underlying SVG node for the current element.\n *\n * @memberof Svg\n * @returns {Node}\n */\n getNode() {\n return this._node;\n }\n\n /**\n * This method creates a foreignObject (see https://developer.mozilla.org/en-US/docs/Web/SVG/Element/foreignObject) that allows to embed HTML content into a SVG graphic. With the help of foreignObjects you can enable the usage of regular HTML elements inside of SVG where they are subject for SVG positioning and transformation but the Browser will use the HTML rendering capabilities for the containing DOM.\n *\n * @memberof Svg\n * @param {Node|String} content The DOM Node, or HTML string that will be converted to a DOM Node, that is then placed into and wrapped by the foreignObject\n * @param {String} [attributes] An object with properties that will be added as attributes to the foreignObject element that is created. Attributes with undefined values will not be added.\n * @param {String} [className] This class or class list will be added to the SVG element\n * @param {Boolean} [insertFirst] Specifies if the foreignObject should be inserted as first child\n * @return {Svg} New wrapper object that wraps the foreignObject element\n */\n foreignObject(content, attributes, className, insertFirst) {\n // If content is string then we convert it to DOM\n // TODO: Handle case where content is not a string nor a DOM Node\n if(typeof content === 'string') {\n const container = document.createElement('div');\n container.innerHTML = content;\n content = container.firstChild;\n }\n\n // Adding namespace to content element\n content.setAttribute('xmlns', namespaces.xmlns);\n\n // Creating the foreignObject without required extension attribute (as described here\n // http://www.w3.org/TR/SVG/extend.html#ForeignObjectElement)\n const fnObj = this.elem('foreignObject', attributes, className, insertFirst);\n\n // Add content to foreignObjectElement\n fnObj._node.appendChild(content);\n\n return fnObj;\n }\n\n /**\n * This method adds a new text element to the current Svg wrapper.\n *\n * @memberof Svg\n * @param {String} t The text that should be added to the text element that is created\n * @return {Svg} The same wrapper object that was used to add the newly created element\n */\n text(t) {\n this._node.appendChild(document.createTextNode(t));\n return this;\n }\n\n /**\n * This method will clear all child nodes of the current wrapper object.\n *\n * @memberof Svg\n * @return {Svg} The same wrapper object that got emptied\n */\n empty() {\n while(this._node.firstChild) {\n this._node.removeChild(this._node.firstChild);\n }\n\n return this;\n }\n\n /**\n * This method will cause the current wrapper to remove itself from its parent wrapper. Use this method if you'd like to get rid of an element in a given DOM structure.\n *\n * @memberof Svg\n * @return {Svg} The parent wrapper object of the element that got removed\n */\n remove() {\n this._node.parentNode.removeChild(this._node);\n return this.parent();\n }\n\n /**\n * This method will replace the element with a new element that can be created outside of the current DOM.\n *\n * @memberof Svg\n * @param {Svg} newElement The new Svg object that will be used to replace the current wrapper object\n * @return {Svg} The wrapper of the new element\n */\n replace(newElement) {\n this._node.parentNode.replaceChild(newElement._node, this._node);\n return newElement;\n }\n\n /**\n * This method will append an element to the current element as a child.\n *\n * @memberof Svg\n * @param {Svg} element The Svg element that should be added as a child\n * @param {Boolean} [insertFirst] Specifies if the element should be inserted as first child\n * @return {Svg} The wrapper of the appended object\n */\n append(element, insertFirst) {\n if(insertFirst && this._node.firstChild) {\n this._node.insertBefore(element._node, this._node.firstChild);\n } else {\n this._node.appendChild(element._node);\n }\n\n return this;\n }\n\n /**\n * Returns an array of class names that are attached to the current wrapper element. This method can not be chained further.\n *\n * @memberof Svg\n * @return {Array} A list of classes or an empty array if there are no classes on the current element\n */\n classes() {\n return this._node.getAttribute('class') ? this._node.getAttribute('class').trim().split(/\\s+/) : [];\n }\n\n /**\n * Adds one or a space separated list of classes to the current element and ensures the classes are only existing once.\n *\n * @memberof Svg\n * @param {String} names A white space separated list of class names\n * @return {Svg} The wrapper of the current element\n */\n addClass(names) {\n this._node.setAttribute('class',\n this.classes()\n .concat(names.trim().split(/\\s+/))\n .filter(function(elem, pos, self) {\n return self.indexOf(elem) === pos;\n }).join(' ')\n );\n\n return this;\n }\n\n /**\n * Removes one or a space separated list of classes from the current element.\n *\n * @memberof Svg\n * @param {String} names A white space separated list of class names\n * @return {Svg} The wrapper of the current element\n */\n removeClass(names) {\n const removedClasses = names.trim().split(/\\s+/);\n\n this._node.setAttribute('class',\n this.classes().filter((name) => removedClasses.indexOf(name) === -1).join(' '));\n\n return this;\n }\n\n /**\n * Removes all classes from the current element.\n *\n * @memberof Svg\n * @return {Svg} The wrapper of the current element\n */\n removeAllClasses() {\n this._node.setAttribute('class', '');\n return this;\n }\n\n /**\n * Get element height using `getBoundingClientRect`\n *\n * @memberof Svg\n * @return {Number} The elements height in pixels\n */\n height() {\n return this._node.getBoundingClientRect().height;\n }\n\n /**\n * Get element width using `getBoundingClientRect`\n *\n * @memberof Chartist.Core\n * @return {Number} The elements width in pixels\n */\n width() {\n return this._node.getBoundingClientRect().width;\n }\n\n /**\n * The animate function lets you animate the current element with SMIL animations. You can add animations for multiple attributes at the same time by using an animation definition object. This object should contain SMIL animation attributes. Please refer to http://www.w3.org/TR/SVG/animate.html for a detailed specification about the available animation attributes. Additionally an easing property can be passed in the animation definition object. This can be a string with a name of an easing function in `Svg.Easing` or an array with four numbers specifying a cubic Bézier curve.\n * **An animations object could look like this:**\n * ```javascript\n * element.animate({\n * opacity: {\n * dur: 1000,\n * from: 0,\n * to: 1\n * },\n * x1: {\n * dur: '1000ms',\n * from: 100,\n * to: 200,\n * easing: 'easeOutQuart'\n * },\n * y1: {\n * dur: '2s',\n * from: 0,\n * to: 100\n * }\n * });\n * ```\n * **Automatic unit conversion**\n * For the `dur` and the `begin` animate attribute you can also omit a unit by passing a number. The number will automatically be converted to milli seconds.\n * **Guided mode**\n * The default behavior of SMIL animations with offset using the `begin` attribute is that the attribute will keep it's original value until the animation starts. Mostly this behavior is not desired as you'd like to have your element attributes already initialized with the animation `from` value even before the animation starts. Also if you don't specify `fill=\"freeze\"` on an animate element or if you delete the animation after it's done (which is done in guided mode) the attribute will switch back to the initial value. This behavior is also not desired when performing simple one-time animations. For one-time animations you'd want to trigger animations immediately instead of relative to the document begin time. That's why in guided mode Svg will also use the `begin` property to schedule a timeout and manually start the animation after the timeout. If you're using multiple SMIL definition objects for an attribute (in an array), guided mode will be disabled for this attribute, even if you explicitly enabled it.\n * If guided mode is enabled the following behavior is added:\n * - Before the animation starts (even when delayed with `begin`) the animated attribute will be set already to the `from` value of the animation\n * - `begin` is explicitly set to `indefinite` so it can be started manually without relying on document begin time (creation)\n * - The animate element will be forced to use `fill=\"freeze\"`\n * - The animation will be triggered with `beginElement()` in a timeout where `begin` of the definition object is interpreted in milli seconds. If no `begin` was specified the timeout is triggered immediately.\n * - After the animation the element attribute value will be set to the `to` value of the animation\n * - The animate element is deleted from the DOM\n *\n * @memberof Svg\n * @param {Object} animations An animations object where the property keys are the attributes you'd like to animate. The properties should be objects again that contain the SMIL animation attributes (usually begin, dur, from, and to). The property begin and dur is auto converted (see Automatic unit conversion). You can also schedule multiple animations for the same attribute by passing an Array of SMIL definition objects. Attributes that contain an array of SMIL definition objects will not be executed in guided mode.\n * @param {Boolean} guided Specify if guided mode should be activated for this animation (see Guided mode). If not otherwise specified, guided mode will be activated.\n * @param {Object} eventEmitter If specified, this event emitter will be notified when an animation starts or ends.\n * @return {Svg} The current element where the animation was added\n */\n animate(animations, guided, eventEmitter) {\n if(guided === undefined) {\n guided = true;\n }\n\n Object.keys(animations).forEach((attribute) => {\n\n const createAnimate = (animationDefinition, createGuided) => {\n const attributeProperties = {};\n let animationEasing;\n let timeout;\n\n // Check if an easing is specified in the definition object and delete it from the object as it will not\n // be part of the animate element attributes.\n if(animationDefinition.easing) {\n // If already an easing Bézier curve array we take it or we lookup a easing array in the Easing object\n animationEasing = animationDefinition.easing instanceof Array ?\n animationDefinition.easing :\n easings[animationDefinition.easing];\n delete animationDefinition.easing;\n }\n\n // If numeric dur or begin was provided we assume milli seconds\n animationDefinition.begin = ensureUnit(animationDefinition.begin, 'ms');\n animationDefinition.dur = ensureUnit(animationDefinition.dur, 'ms');\n\n if(animationEasing) {\n animationDefinition.calcMode = 'spline';\n animationDefinition.keySplines = animationEasing.join(' ');\n animationDefinition.keyTimes = '0;1';\n }\n\n // Adding \"fill: freeze\" if we are in guided mode and set initial attribute values\n if(createGuided) {\n animationDefinition.fill = 'freeze';\n // Animated property on our element should already be set to the animation from value in guided mode\n attributeProperties[attribute] = animationDefinition.from;\n this.attr(attributeProperties);\n\n // In guided mode we also set begin to indefinite so we can trigger the start manually and put the begin\n // which needs to be in ms aside\n timeout = quantity(animationDefinition.begin || 0).value;\n animationDefinition.begin = 'indefinite';\n }\n\n const animate = this.elem('animate', extend({\n attributeName: attribute\n }, animationDefinition));\n\n if(createGuided) {\n // If guided we take the value that was put aside in timeout and trigger the animation manually with a timeout\n setTimeout(() => {\n // If beginElement fails we set the animated attribute to the end position and remove the animate element\n // This happens if the SMIL ElementTimeControl interface is not supported or any other problems occurred in\n // the browser. (Currently FF 34 does not support animate elements in foreignObjects)\n try {\n animate._node.beginElement();\n } catch(err) {\n // Set animated attribute to current animated value\n attributeProperties[attribute] = animationDefinition.to;\n this.attr(attributeProperties);\n // Remove the animate element as it's no longer required\n animate.remove();\n }\n }, timeout);\n }\n\n if(eventEmitter) {\n animate._node.addEventListener('beginEvent', () =>\n eventEmitter.emit('animationBegin', {\n element: this,\n animate: animate._node,\n params: animationDefinition\n })\n );\n }\n\n animate._node.addEventListener('endEvent', () => {\n if(eventEmitter) {\n eventEmitter.emit('animationEnd', {\n element: this,\n animate: animate._node,\n params: animationDefinition\n });\n }\n\n if(createGuided) {\n // Set animated attribute to current animated value\n attributeProperties[attribute] = animationDefinition.to;\n this.attr(attributeProperties);\n // Remove the animate element as it's no longer required\n animate.remove();\n }\n });\n };\n\n // If current attribute is an array of definition objects we create an animate for each and disable guided mode\n if(animations[attribute] instanceof Array) {\n animations[attribute]\n .forEach((animationDefinition) => createAnimate(animationDefinition, false));\n } else {\n createAnimate(animations[attribute], guided);\n }\n });\n\n return this;\n }\n}\n\n/**\n * This method checks for support of a given SVG feature like Extensibility, SVG-animation or the like. Check http://www.w3.org/TR/SVG11/feature for a detailed list.\n *\n * @memberof Svg\n * @param {String} feature The SVG 1.1 feature that should be checked for support.\n * @return {Boolean} True of false if the feature is supported or not\n */\nexport function isSupported(feature) {\n return document.implementation.hasFeature('http://www.w3.org/TR/SVG11/feature#' + feature, '1.1');\n}\n\n/**\n * This Object contains some standard easing cubic bezier curves. Then can be used with their name in the `Svg.animate`. You can also extend the list and use your own name in the `animate` function. Click the show code button to see the available bezier functions.\n *\n * @memberof Svg\n */\nexport const easings = {\n easeInSine: [0.47, 0, 0.745, 0.715],\n easeOutSine: [0.39, 0.575, 0.565, 1],\n easeInOutSine: [0.445, 0.05, 0.55, 0.95],\n easeInQuad: [0.55, 0.085, 0.68, 0.53],\n easeOutQuad: [0.25, 0.46, 0.45, 0.94],\n easeInOutQuad: [0.455, 0.03, 0.515, 0.955],\n easeInCubic: [0.55, 0.055, 0.675, 0.19],\n easeOutCubic: [0.215, 0.61, 0.355, 1],\n easeInOutCubic: [0.645, 0.045, 0.355, 1],\n easeInQuart: [0.895, 0.03, 0.685, 0.22],\n easeOutQuart: [0.165, 0.84, 0.44, 1],\n easeInOutQuart: [0.77, 0, 0.175, 1],\n easeInQuint: [0.755, 0.05, 0.855, 0.06],\n easeOutQuint: [0.23, 1, 0.32, 1],\n easeInOutQuint: [0.86, 0, 0.07, 1],\n easeInExpo: [0.95, 0.05, 0.795, 0.035],\n easeOutExpo: [0.19, 1, 0.22, 1],\n easeInOutExpo: [1, 0, 0, 1],\n easeInCirc: [0.6, 0.04, 0.98, 0.335],\n easeOutCirc: [0.075, 0.82, 0.165, 1],\n easeInOutCirc: [0.785, 0.135, 0.15, 0.86],\n easeInBack: [0.6, -0.28, 0.735, 0.045],\n easeOutBack: [0.175, 0.885, 0.32, 1.275],\n easeInOutBack: [0.68, -0.55, 0.265, 1.55]\n};\n","import {namespaces} from './globals';\nimport {Svg} from '../svg/svg';\nimport {quantity} from './lang';\nimport {extend} from './extend';\n\n/**\n * Create or reinitialize the SVG element for the chart\n *\n * @memberof Chartist.Core\n * @param {Node} container The containing DOM Node object that will be used to plant the SVG element\n * @param {String} width Set the width of the SVG element. Default is 100%\n * @param {String} height Set the height of the SVG element. Default is 100%\n * @param {String} className Specify a class to be added to the SVG element\n * @return {Object} The created/reinitialized SVG element\n */\nexport function createSvg(container, width = '100%', height = '100%', className) {\n // Check if there is a previous SVG element in the container that contains the Chartist XML namespace and remove it\n // Since the DOM API does not support namespaces we need to manually search the returned list http://www.w3.org/TR/selectors-api/\n Array.from(container.querySelectorAll('svg'))\n .filter((svg) => svg.getAttributeNS(namespaces.xmlns, 'ct'))\n .forEach((svg) => container.removeChild(svg));\n\n // Create svg object with width and height or use 100% as default\n const svg = new Svg('svg').attr({\n width,\n height\n }).addClass(className).attr({\n // TODO: Check better solution (browser support) and remove inline styles due to CSP\n style: `width: ${width}; height: ${height};`\n });\n\n // Add the DOM node to our container\n container.appendChild(svg._node);\n\n return svg;\n}\n\n/**\n * Converts a number into a padding object.\n *\n * @memberof Chartist.Core\n * @param {Object|Number} padding\n * @param {Number} [fallback] This value is used to fill missing values if a incomplete padding object was passed\n * @returns {Object} Returns a padding object containing top, right, bottom, left properties filled with the padding number passed in as argument. If the argument is something else than a number (presumably already a correct padding object) then this argument is directly returned.\n */\nexport function normalizePadding(padding, fallback = 0) {\n return typeof padding === 'number' ? {\n top: padding,\n right: padding,\n bottom: padding,\n left: padding\n } : {\n top: typeof padding.top === 'number' ? padding.top : fallback,\n right: typeof padding.right === 'number' ? padding.right : fallback,\n bottom: typeof padding.bottom === 'number' ? padding.bottom : fallback,\n left: typeof padding.left === 'number' ? padding.left : fallback\n };\n}\n\n/**\n * Initialize chart drawing rectangle (area where chart is drawn) x1,y1 = bottom left / x2,y2 = top right\n *\n * @memberof Chartist.Core\n * @param {Object} svg The svg element for the chart\n * @param {Object} options The Object that contains all the optional values for the chart\n * @param {Number} [fallbackPadding] The fallback padding if partial padding objects are used\n * @return {Object} The chart rectangles coordinates inside the svg element plus the rectangles measurements\n */\nexport function createChartRect(svg, options, fallbackPadding) {\n const hasAxis = !!(options.axisX || options.axisY);\n const yAxisOffset = hasAxis ? options.axisY.offset : 0;\n const xAxisOffset = hasAxis ? options.axisX.offset : 0;\n // If width or height results in invalid value (including 0) we fallback to the unitless settings or even 0\n let width = svg.width() || quantity(options.width).value || 0;\n let height = svg.height() || quantity(options.height).value || 0;\n const normalizedPadding = normalizePadding(options.chartPadding, fallbackPadding);\n\n // If settings were to small to cope with offset (legacy) and padding, we'll adjust\n width = Math.max(width, yAxisOffset + normalizedPadding.left + normalizedPadding.right);\n height = Math.max(height, xAxisOffset + normalizedPadding.top + normalizedPadding.bottom);\n\n const chartRect = {\n padding: normalizedPadding,\n width: function() {\n return this.x2 - this.x1;\n },\n height: function() {\n return this.y1 - this.y2;\n }\n };\n\n if(hasAxis) {\n if(options.axisX.position === 'start') {\n chartRect.y2 = normalizedPadding.top + xAxisOffset;\n chartRect.y1 = Math.max(height - normalizedPadding.bottom, chartRect.y2 + 1);\n } else {\n chartRect.y2 = normalizedPadding.top;\n chartRect.y1 = Math.max(height - normalizedPadding.bottom - xAxisOffset, chartRect.y2 + 1);\n }\n\n if(options.axisY.position === 'start') {\n chartRect.x1 = normalizedPadding.left + yAxisOffset;\n chartRect.x2 = Math.max(width - normalizedPadding.right, chartRect.x1 + 1);\n } else {\n chartRect.x1 = normalizedPadding.left;\n chartRect.x2 = Math.max(width - normalizedPadding.right - yAxisOffset, chartRect.x1 + 1);\n }\n } else {\n chartRect.x1 = normalizedPadding.left;\n chartRect.x2 = Math.max(width - normalizedPadding.right, chartRect.x1 + 1);\n chartRect.y2 = normalizedPadding.top;\n chartRect.y1 = Math.max(height - normalizedPadding.bottom, chartRect.y2 + 1);\n }\n\n return chartRect;\n}\n\n/**\n * Creates a grid line based on a projected value.\n *\n * @memberof Chartist.Core\n * @param position\n * @param index\n * @param axis\n * @param offset\n * @param length\n * @param group\n * @param classes\n * @param eventEmitter\n */\nexport function createGrid(position, index, axis, offset, length, group, classes, eventEmitter) {\n const positionalData = {};\n positionalData[`${axis.units.pos}1`] = position;\n positionalData[`${axis.units.pos}2`] = position;\n positionalData[`${axis.counterUnits.pos}1`] = offset;\n positionalData[`${axis.counterUnits.pos}2`] = offset + length;\n\n const gridElement = group.elem('line', positionalData, classes.join(' '));\n\n // Event for grid draw\n eventEmitter.emit('draw',\n extend({\n type: 'grid',\n axis,\n index,\n group,\n element: gridElement\n }, positionalData)\n );\n}\n\n/**\n * Creates a grid background rect and emits the draw event.\n *\n * @memberof Chartist.Core\n * @param gridGroup\n * @param chartRect\n * @param className\n * @param eventEmitter\n */\nexport function createGridBackground(gridGroup, chartRect, className, eventEmitter) {\n const gridBackground = gridGroup.elem('rect', {\n x: chartRect.x1,\n y: chartRect.y2,\n width: chartRect.width(),\n height: chartRect.height()\n }, className, true);\n\n // Event for grid background draw\n eventEmitter.emit('draw', {\n type: 'gridBackground',\n group: gridGroup,\n element: gridBackground\n });\n}\n\n/**\n * Creates a label based on a projected value and an axis.\n *\n * @memberof Chartist.Core\n * @param position\n * @param length\n * @param index\n * @param labels\n * @param axis\n * @param axisOffset\n * @param labelOffset\n * @param group\n * @param classes\n * @param useForeignObject\n * @param eventEmitter\n */\nexport function createLabel(position, length, index, labels, axis, axisOffset, labelOffset, group, classes, useForeignObject, eventEmitter) {\n let labelElement;\n const positionalData = {};\n\n positionalData[axis.units.pos] = position + labelOffset[axis.units.pos];\n positionalData[axis.counterUnits.pos] = labelOffset[axis.counterUnits.pos];\n positionalData[axis.units.len] = length;\n positionalData[axis.counterUnits.len] = Math.max(0, axisOffset - 10);\n\n if(useForeignObject) {\n // We need to set width and height explicitly to px as span will not expand with width and height being\n // 100% in all browsers\n const stepLength = Math.round(positionalData[axis.units.len]);\n const stepCounterLength = Math.round(positionalData[axis.counterUnits.len]);\n const content = `\n \n ${labels[index]}\n \n `.trim();\n\n labelElement = group.foreignObject(content, extend({\n style: 'overflow: visible;'\n }, positionalData));\n } else {\n labelElement = group.elem('text', positionalData, classes.join(' ')).text(labels[index]);\n }\n\n eventEmitter.emit('draw', extend({\n type: 'label',\n axis,\n index,\n group,\n element: labelElement,\n text: labels[index]\n }, positionalData));\n}\n","import {extend} from './extend';\n\n/**\n * Provides options handling functionality with callback for options changes triggered by responsive options and media query matches\n *\n * @memberof Chartist.Core\n * @param {Object} options Options set by user\n * @param {Array} responsiveOptions Optional functions to add responsive behavior to chart\n * @param {Object} eventEmitter The event emitter that will be used to emit the options changed events\n * @return {Object} The consolidated options object from the defaults, base and matching responsive options\n */\nexport function optionsProvider(options, responsiveOptions, eventEmitter) {\n const baseOptions = extend({}, options);\n let currentOptions;\n const mediaQueryListeners = [];\n\n function updateCurrentOptions(mediaEvent) {\n const previousOptions = currentOptions;\n currentOptions = extend({}, baseOptions);\n\n if(responsiveOptions) {\n responsiveOptions.forEach((responsiveOption) => {\n const mql = window.matchMedia(responsiveOption[0]);\n if(mql.matches) {\n currentOptions = extend(currentOptions, responsiveOption[1]);\n }\n });\n }\n\n if(eventEmitter && mediaEvent) {\n eventEmitter.emit('optionsChanged', {\n previousOptions,\n currentOptions\n });\n }\n }\n\n function removeMediaQueryListeners() {\n mediaQueryListeners.forEach((mql) => mql.removeListener(updateCurrentOptions));\n }\n\n if(!window.matchMedia) {\n throw 'window.matchMedia not found! Make sure you\\'re using a polyfill.';\n } else if(responsiveOptions) {\n responsiveOptions.forEach((responsiveOption) => {\n const mql = window.matchMedia(responsiveOption[0]);\n mql.addListener(updateCurrentOptions);\n mediaQueryListeners.push(mql);\n });\n }\n // Execute initially without an event argument so we get the correct options\n updateCurrentOptions();\n\n return {\n removeMediaQueryListeners,\n getCurrentOptions() {\n return extend({}, currentOptions);\n }\n };\n}\n","import {extend} from '../core/core';\n\n/**\n * Contains the descriptors of supported element types in a SVG path. Currently only move, line and curve are supported.\n *\n * @memberof SvgPath\n * @type {Object}\n */\nconst elementDescriptions = {\n m: ['x', 'y'],\n l: ['x', 'y'],\n c: ['x1', 'y1', 'x2', 'y2', 'x', 'y'],\n a: ['rx', 'ry', 'xAr', 'lAf', 'sf', 'x', 'y']\n};\n\n/**\n * Default options for newly created SVG path objects.\n *\n * @memberof SvgPath\n * @type {Object}\n */\nconst defaultOptions = {\n // The accuracy in digit count after the decimal point. This will be used to round numbers in the SVG path. If this option is set to false then no rounding will be performed.\n accuracy: 3\n};\n\nfunction element(command, params, pathElements, pos, relative, data) {\n const pathElement = extend({\n command: relative ? command.toLowerCase() : command.toUpperCase()\n }, params, data ? {data: data} : {});\n\n pathElements.splice(pos, 0, pathElement);\n}\n\nfunction forEachParam(pathElements, cb) {\n pathElements.forEach((pathElement, pathElementIndex) => {\n elementDescriptions[pathElement.command.toLowerCase()].forEach((paramName, paramIndex) => {\n cb(pathElement, paramName, pathElementIndex, paramIndex, pathElements);\n });\n });\n}\n\n/**\n * Used to construct a new path object.\n *\n * @memberof SvgPath\n * @param {Boolean} close If set to true then this path will be closed when stringified (with a Z at the end)\n * @param {Object} options Options object that overrides the default objects. See default options for more details.\n * @constructor\n */\nexport class SvgPath {\n /**\n * This static function on `SvgPath` is joining multiple paths together into one paths.\n *\n * @memberof SvgPath\n * @param {Array} paths A list of paths to be joined together. The order is important.\n * @param {boolean} [close] If the newly created path should be a closed path\n * @param {Object} [options] Path options for the newly created path.\n * @return {SvgPath}\n */\n static join(paths, close, options) {\n const joinedPath = new SvgPath(close, options);\n for(let i = 0; i < paths.length; i++) {\n const path = paths[i];\n for(let j = 0; j < path.pathElements.length; j++) {\n joinedPath.pathElements.push(path.pathElements[j]);\n }\n }\n return joinedPath;\n }\n\n constructor(close, options) {\n this.pathElements = [];\n this.pos = 0;\n this.close = close;\n this.options = extend({}, defaultOptions, options);\n }\n\n /**\n * Gets or sets the current position (cursor) inside of the path. You can move around the cursor freely but limited to 0 or the count of existing elements. All modifications with element functions will insert new elements at the position of this cursor.\n *\n * @memberof SvgPath\n * @param {Number} [pos] If a number is passed then the cursor is set to this position in the path element array.\n * @return {SvgPath|Number} If the position parameter was passed then the return value will be the path object for easy call chaining. If no position parameter was passed then the current position is returned.\n */\n position(pos) {\n if(pos !== undefined) {\n this.pos = Math.max(0, Math.min(this.pathElements.length, pos));\n return this;\n } else {\n return this.pos;\n }\n }\n\n /**\n * Removes elements from the path starting at the current position.\n *\n * @memberof SvgPath\n * @param {Number} count Number of path elements that should be removed from the current position.\n * @return {SvgPath} The current path object for easy call chaining.\n */\n remove(count) {\n this.pathElements.splice(this.pos, count);\n return this;\n }\n\n /**\n * Use this function to add a new move SVG path element.\n *\n * @memberof SvgPath\n * @param {Number} x The x coordinate for the move element.\n * @param {Number} y The y coordinate for the move element.\n * @param {Boolean} [relative] If set to true the move element will be created with relative coordinates (lowercase letter)\n * @param {*} [data] Any data that should be stored with the element object that will be accessible in pathElement\n * @return {SvgPath} The current path object for easy call chaining.\n */\n move(x, y, relative, data) {\n element('M', {\n x: +x,\n y: +y\n }, this.pathElements, this.pos++, relative, data);\n return this;\n }\n\n /**\n * Use this function to add a new line SVG path element.\n *\n * @memberof SvgPath\n * @param {Number} x The x coordinate for the line element.\n * @param {Number} y The y coordinate for the line element.\n * @param {Boolean} [relative] If set to true the line element will be created with relative coordinates (lowercase letter)\n * @param {*} [data] Any data that should be stored with the element object that will be accessible in pathElement\n * @return {SvgPath} The current path object for easy call chaining.\n */\n line(x, y, relative, data) {\n element('L', {\n x: +x,\n y: +y\n }, this.pathElements, this.pos++, relative, data);\n return this;\n }\n\n /**\n * Use this function to add a new curve SVG path element.\n *\n * @memberof SvgPath\n * @param {Number} x1 The x coordinate for the first control point of the bezier curve.\n * @param {Number} y1 The y coordinate for the first control point of the bezier curve.\n * @param {Number} x2 The x coordinate for the second control point of the bezier curve.\n * @param {Number} y2 The y coordinate for the second control point of the bezier curve.\n * @param {Number} x The x coordinate for the target point of the curve element.\n * @param {Number} y The y coordinate for the target point of the curve element.\n * @param {Boolean} [relative] If set to true the curve element will be created with relative coordinates (lowercase letter)\n * @param {*} [data] Any data that should be stored with the element object that will be accessible in pathElement\n * @return {SvgPath} The current path object for easy call chaining.\n */\n curve(x1, y1, x2, y2, x, y, relative, data) {\n element('C', {\n x1: +x1,\n y1: +y1,\n x2: +x2,\n y2: +y2,\n x: +x,\n y: +y\n }, this.pathElements, this.pos++, relative, data);\n return this;\n }\n\n /**\n * Use this function to add a new non-bezier curve SVG path element.\n *\n * @memberof SvgPath\n * @param {Number} rx The radius to be used for the x-axis of the arc.\n * @param {Number} ry The radius to be used for the y-axis of the arc.\n * @param {Number} xAr Defines the orientation of the arc\n * @param {Number} lAf Large arc flag\n * @param {Number} sf Sweep flag\n * @param {Number} x The x coordinate for the target point of the curve element.\n * @param {Number} y The y coordinate for the target point of the curve element.\n * @param {Boolean} [relative] If set to true the curve element will be created with relative coordinates (lowercase letter)\n * @param {*} [data] Any data that should be stored with the element object that will be accessible in pathElement\n * @return {SvgPath} The current path object for easy call chaining.\n */\n arc(rx, ry, xAr, lAf, sf, x, y, relative, data) {\n element('A', {\n rx: +rx,\n ry: +ry,\n xAr: +xAr,\n lAf: +lAf,\n sf: +sf,\n x: +x,\n y: +y\n }, this.pathElements, this.pos++, relative, data);\n return this;\n }\n\n /**\n * Parses an SVG path seen in the d attribute of path elements, and inserts the parsed elements into the existing path object at the current cursor position. Any closing path indicators (Z at the end of the path) will be ignored by the parser as this is provided by the close option in the options of the path object.\n *\n * @memberof SvgPath\n * @param {String} path Any SVG path that contains move (m), line (l) or curve (c) components.\n * @return {SvgPath} The current path object for easy call chaining.\n */\n parse(path) {\n // Parsing the SVG path string into an array of arrays [['M', '10', '10'], ['L', '100', '100']]\n const chunks = path.replace(/([A-Za-z])([0-9])/g, '$1 $2')\n .replace(/([0-9])([A-Za-z])/g, '$1 $2')\n .split(/[\\s,]+/)\n .reduce((result, pathElement) => {\n if(pathElement.match(/[A-Za-z]/)) {\n result.push([]);\n }\n\n result[result.length - 1].push(pathElement);\n return result;\n }, []);\n\n // If this is a closed path we remove the Z at the end because this is determined by the close option\n if(chunks[chunks.length - 1][0].toUpperCase() === 'Z') {\n chunks.pop();\n }\n\n // Using svgPathElementDescriptions to map raw path arrays into objects that contain the command and the parameters\n // For example {command: 'M', x: '10', y: '10'}\n const elements = chunks.map((chunk) => {\n const command = chunk.shift();\n const description = elementDescriptions[command.toLowerCase()];\n\n return extend({\n command: command\n }, description.reduce((result, paramName, index) => {\n result[paramName] = +chunk[index];\n return result;\n }, {}));\n });\n\n // Preparing a splice call with the elements array as var arg params and insert the parsed elements at the current position\n this.pathElements.splice(this.pos, 0, ...elements);\n // Increase the internal position by the element count\n this.pos += elements.length;\n\n return this;\n }\n\n /**\n * This function renders to current SVG path object into a final SVG string that can be used in the d attribute of SVG path elements. It uses the accuracy option to round big decimals. If the close parameter was set in the constructor of this path object then a path closing Z will be appended to the output string.\n *\n * @memberof SvgPath\n * @return {String}\n */\n stringify() {\n const accuracyMultiplier = Math.pow(10, this.options.accuracy);\n\n return this.pathElements.reduce((path, pathElement) => {\n const params = elementDescriptions[pathElement.command.toLowerCase()].map((paramName) =>\n this.options.accuracy ?\n (Math.round(pathElement[paramName] * accuracyMultiplier) / accuracyMultiplier) :\n pathElement[paramName]\n );\n\n return path + pathElement.command + params.join(',');\n }, '') + (this.close ? 'Z' : '');\n }\n\n /**\n * Scales all elements in the current SVG path object. There is an individual parameter for each coordinate. Scaling will also be done for control points of curves, affecting the given coordinate.\n *\n * @memberof SvgPath\n * @param {Number} x The number which will be used to scale the x, x1 and x2 of all path elements.\n * @param {Number} y The number which will be used to scale the y, y1 and y2 of all path elements.\n * @return {SvgPath} The current path object for easy call chaining.\n */\n scale(x, y) {\n forEachParam(this.pathElements, (pathElement, paramName) =>\n pathElement[paramName] *= paramName[0] === 'x' ? x : y\n );\n return this;\n }\n\n /**\n * Translates all elements in the current SVG path object. The translation is relative and there is an individual parameter for each coordinate. Translation will also be done for control points of curves, affecting the given coordinate.\n *\n * @memberof SvgPath\n * @param {Number} x The number which will be used to translate the x, x1 and x2 of all path elements.\n * @param {Number} y The number which will be used to translate the y, y1 and y2 of all path elements.\n * @return {SvgPath} The current path object for easy call chaining.\n */\n translate(x, y) {\n forEachParam(this.pathElements, (pathElement, paramName) =>\n pathElement[paramName] += paramName[0] === 'x' ? x : y\n );\n return this;\n }\n\n /**\n * This function will run over all existing path elements and then loop over their attributes. The callback function will be called for every path element attribute that exists in the current path.\n * The method signature of the callback function looks like this:\n * ```javascript\n * function(pathElement, paramName, pathElementIndex, paramIndex, pathElements)\n * ```\n * If something else than undefined is returned by the callback function, this value will be used to replace the old value. This allows you to build custom transformations of path objects that can't be achieved using the basic transformation functions scale and translate.\n *\n * @memberof SvgPath\n * @param {Function} transformFnc The callback function for the transformation. Check the signature in the function description.\n * @return {SvgPath} The current path object for easy call chaining.\n */\n transform(transformFnc) {\n forEachParam(this.pathElements, (pathElement, paramName, pathElementIndex, paramIndex, pathElements) => {\n const transformed = transformFnc(pathElement, paramName, pathElementIndex, paramIndex, pathElements);\n if(transformed || transformed === 0) {\n pathElement[paramName] = transformed;\n }\n });\n return this;\n }\n\n /**\n * This function clones a whole path object with all its properties. This is a deep clone and path element objects will also be cloned.\n *\n * @memberof SvgPath\n * @param {Boolean} [close] Optional option to set the new cloned path to closed. If not specified or false, the original path close option will be used.\n * @return {SvgPath}\n */\n clone(close) {\n const clone = new SvgPath(close || this.close);\n clone.pos = this.pos;\n clone.pathElements = this.pathElements.slice().map((pathElement) => extend({}, pathElement));\n clone.options = extend({}, this.options);\n return clone;\n }\n\n /**\n * Split a Svg.Path object by a specific command in the path chain. The path chain will be split and an array of newly created paths objects will be returned. This is useful if you'd like to split an SVG path by it's move commands, for example, in order to isolate chunks of drawings.\n *\n * @memberof SvgPath\n * @param {String} command The command you'd like to use to split the path\n * @return {Array}\n */\n splitByCommand(command) {\n const split = [\n new SvgPath()\n ];\n\n this.pathElements.forEach((pathElement) => {\n if(pathElement.command === command.toUpperCase() && split[split.length - 1].pathElements.length !== 0) {\n split.push(new SvgPath());\n }\n\n split[split.length - 1].pathElements.push(pathElement);\n });\n\n return split;\n }\n}\n","import {extend, getMultiValue} from '../core/core';\nimport {SvgPath} from '../svg/svg-path';\n\n/**\n * This interpolation function does not smooth the path and the result is only containing lines and no curves.\n *\n * @example\n * var chart = new Chartist.Line('.ct-chart', {\n * labels: [1, 2, 3, 4, 5],\n * series: [[1, 2, 8, 1, 7]]\n * }, {\n * lineSmooth: Chartist.Interpolation.none({\n * fillHoles: false\n * })\n * });\n *\n *\n * @memberof Chartist.Interpolation\n * @return {Function}\n */\nexport function none(options) {\n const defaultOptions = {\n fillHoles: false\n };\n\n options = extend({}, defaultOptions, options);\n\n return function noneInterpolation(pathCoordinates, valueData) {\n const path = new SvgPath();\n let hole = true;\n\n for(let i = 0; i < pathCoordinates.length; i += 2) {\n const currX = pathCoordinates[i];\n const currY = pathCoordinates[i + 1];\n const currData = valueData[i / 2];\n\n if(getMultiValue(currData.value) !== undefined) {\n\n if(hole) {\n path.move(currX, currY, false, currData);\n } else {\n path.line(currX, currY, false, currData);\n }\n\n hole = false;\n } else if(!options.fillHoles) {\n hole = true;\n }\n }\n\n return path;\n };\n}\n","import {extend} from '../core/core';\nimport {SvgPath} from '../svg/svg-path';\n\n/**\n * Simple smoothing creates horizontal handles that are positioned with a fraction of the length between two data points. You can use the divisor option to specify the amount of smoothing.\n *\n * Simple smoothing can be used instead of `Chartist.Smoothing.cardinal` if you'd like to get rid of the artifacts it produces sometimes. Simple smoothing produces less flowing lines but is accurate by hitting the points and it also doesn't swing below or above the given data point.\n *\n * All smoothing functions within Chartist are factory functions that accept an options parameter. The simple interpolation function accepts one configuration parameter `divisor`, between 1 and ∞, which controls the smoothing characteristics.\n *\n * @example\n * var chart = new Chartist.Line('.ct-chart', {\n * labels: [1, 2, 3, 4, 5],\n * series: [[1, 2, 8, 1, 7]]\n * }, {\n * lineSmooth: Chartist.Interpolation.simple({\n * divisor: 2,\n * fillHoles: false\n * })\n * });\n *\n *\n * @memberof Chartist.Interpolation\n * @param {Object} options The options of the simple interpolation factory function.\n * @return {Function}\n */\nexport function simple(options) {\n const defaultOptions = {\n divisor: 2,\n fillHoles: false\n };\n\n options = extend({}, defaultOptions, options);\n\n const d = 1 / Math.max(1, options.divisor);\n\n return function simpleInterpolation(pathCoordinates, valueData) {\n const path = new SvgPath();\n let prevX;\n let prevY;\n let prevData;\n\n for(let i = 0; i < pathCoordinates.length; i += 2) {\n const currX = pathCoordinates[i];\n const currY = pathCoordinates[i + 1];\n const length = (currX - prevX) * d;\n const currData = valueData[i / 2];\n\n if(currData.value !== undefined) {\n\n if(prevData === undefined) {\n path.move(currX, currY, false, currData);\n } else {\n path.curve(\n prevX + length,\n prevY,\n currX - length,\n currY,\n currX,\n currY,\n false,\n currData\n );\n }\n\n prevX = currX;\n prevY = currY;\n prevData = currData;\n } else if(!options.fillHoles) {\n prevX = prevY = prevData = undefined;\n }\n }\n\n return path;\n };\n}\n","import {extend} from '../core/core';\nimport {SvgPath} from '../svg/svg-path';\n\n/**\n * Step interpolation will cause the line chart to move in steps rather than diagonal or smoothed lines. This interpolation will create additional points that will also be drawn when the `showPoint` option is enabled.\n *\n * All smoothing functions within Chartist are factory functions that accept an options parameter. The step interpolation function accepts one configuration parameter `postpone`, that can be `true` or `false`. The default value is `true` and will cause the step to occur where the value actually changes. If a different behaviour is needed where the step is shifted to the left and happens before the actual value, this option can be set to `false`.\n *\n * @example\n * var chart = new Chartist.Line('.ct-chart', {\n * labels: [1, 2, 3, 4, 5],\n * series: [[1, 2, 8, 1, 7]]\n * }, {\n * lineSmooth: Chartist.Interpolation.step({\n * postpone: true,\n * fillHoles: false\n * })\n * });\n *\n * @memberof Chartist.Interpolation\n * @param options\n * @returns {Function}\n */\nexport function step(options) {\n const defaultOptions = {\n postpone: true,\n fillHoles: false\n };\n\n options = extend({}, defaultOptions, options);\n\n return function stepInterpolation(pathCoordinates, valueData) {\n const path = new SvgPath();\n\n let prevX;\n let prevY;\n let prevData;\n\n for(let i = 0; i < pathCoordinates.length; i += 2) {\n const currX = pathCoordinates[i];\n const currY = pathCoordinates[i + 1];\n const currData = valueData[i / 2];\n\n // If the current point is also not a hole we can draw the step lines\n if(currData.value !== undefined) {\n if(prevData === undefined) {\n path.move(currX, currY, false, currData);\n } else {\n if(options.postpone) {\n // If postponed we should draw the step line with the value of the previous value\n path.line(currX, prevY, false, prevData);\n } else {\n // If not postponed we should draw the step line with the value of the current value\n path.line(prevX, currY, false, currData);\n }\n // Line to the actual point (this should only be a Y-Axis movement\n path.line(currX, currY, false, currData);\n }\n\n prevX = currX;\n prevY = currY;\n prevData = currData;\n } else if(!options.fillHoles) {\n prevX = prevY = prevData = undefined;\n }\n }\n\n return path;\n };\n}\n","import {extend, splitIntoSegments} from '../core/core';\nimport {SvgPath} from '../svg/svg-path';\nimport {none} from './none';\n\n/**\n * Cardinal / Catmull-Rome spline interpolation is the default smoothing function in Chartist. It produces nice results where the splines will always meet the points. It produces some artifacts though when data values are increased or decreased rapidly. The line may not follow a very accurate path and if the line should be accurate this smoothing function does not produce the best results.\n *\n * Cardinal splines can only be created if there are more than two data points. If this is not the case this smoothing will fallback to `Chartist.Smoothing.none`.\n *\n * All smoothing functions within Chartist are factory functions that accept an options parameter. The cardinal interpolation function accepts one configuration parameter `tension`, between 0 and 1, which controls the smoothing intensity.\n *\n * @example\n * var chart = new Chartist.Line('.ct-chart', {\n * labels: [1, 2, 3, 4, 5],\n * series: [[1, 2, 8, 1, 7]]\n * }, {\n * lineSmooth: Chartist.Interpolation.cardinal({\n * tension: 1,\n * fillHoles: false\n * })\n * });\n *\n * @memberof Chartist.Interpolation\n * @param {Object} options The options of the cardinal factory function.\n * @return {Function}\n */\nexport function cardinal(options) {\n const defaultOptions = {\n tension: 1,\n fillHoles: false\n };\n\n options = extend({}, defaultOptions, options);\n\n const t = Math.min(1, Math.max(0, options.tension));\n const c = 1 - t;\n\n return function cardinalInterpolation(pathCoordinates, valueData) {\n // First we try to split the coordinates into segments\n // This is necessary to treat \"holes\" in line charts\n const segments = splitIntoSegments(pathCoordinates, valueData, {\n fillHoles: options.fillHoles\n });\n\n if(!segments.length) {\n // If there were no segments return 'none' interpolation\n return none()([]);\n } else if(segments.length > 1) {\n // If the split resulted in more that one segment we need to interpolate each segment individually and join them\n // afterwards together into a single path.\n // For each segment we will recurse the cardinal function\n // Join the segment path data into a single path and return\n return SvgPath.join(\n segments.map((segment) => cardinalInterpolation(segment.pathCoordinates, segment.valueData))\n );\n } else {\n // If there was only one segment we can proceed regularly by using pathCoordinates and valueData from the first\n // segment\n pathCoordinates = segments[0].pathCoordinates;\n valueData = segments[0].valueData;\n\n // If less than two points we need to fallback to no smoothing\n if(pathCoordinates.length <= 4) {\n return none()(pathCoordinates, valueData);\n }\n\n const path = new SvgPath().move(pathCoordinates[0], pathCoordinates[1], false, valueData[0]);\n let z;\n\n for(let i = 0, iLen = pathCoordinates.length; iLen - 2 * !z > i; i += 2) {\n const p = [\n {x: +pathCoordinates[i - 2], y: +pathCoordinates[i - 1]},\n {x: +pathCoordinates[i], y: +pathCoordinates[i + 1]},\n {x: +pathCoordinates[i + 2], y: +pathCoordinates[i + 3]},\n {x: +pathCoordinates[i + 4], y: +pathCoordinates[i + 5]}\n ];\n\n if(z) {\n if(!i) {\n p[0] = {x: +pathCoordinates[iLen - 2], y: +pathCoordinates[iLen - 1]};\n } else if(iLen - 4 === i) {\n p[3] = {x: +pathCoordinates[0], y: +pathCoordinates[1]};\n } else if(iLen - 2 === i) {\n p[2] = {x: +pathCoordinates[0], y: +pathCoordinates[1]};\n p[3] = {x: +pathCoordinates[2], y: +pathCoordinates[3]};\n }\n } else {\n if(iLen - 4 === i) {\n p[3] = p[2];\n } else if(!i) {\n p[0] = {x: +pathCoordinates[i], y: +pathCoordinates[i + 1]};\n }\n }\n\n path.curve(\n (t * (-p[0].x + 6 * p[1].x + p[2].x) / 6) + (c * p[2].x),\n (t * (-p[0].y + 6 * p[1].y + p[2].y) / 6) + (c * p[2].y),\n (t * (p[1].x + 6 * p[2].x - p[3].x) / 6) + (c * p[2].x),\n (t * (p[1].y + 6 * p[2].y - p[3].y) / 6) + (c * p[2].y),\n p[2].x,\n p[2].y,\n false,\n valueData[(i + 2) / 2]\n );\n }\n\n return path;\n }\n };\n}\n","import {extend, splitIntoSegments} from '../core/core';\nimport {SvgPath} from '../svg/svg-path';\nimport {none} from './none';\n\n/**\n * Monotone Cubic spline interpolation produces a smooth curve which preserves monotonicity. Unlike cardinal splines, the curve will not extend beyond the range of y-values of the original data points.\n *\n * Monotone Cubic splines can only be created if there are more than two data points. If this is not the case this smoothing will fallback to `Chartist.Smoothing.none`.\n *\n * The x-values of subsequent points must be increasing to fit a Monotone Cubic spline. If this condition is not met for a pair of adjacent points, then there will be a break in the curve between those data points.\n *\n * All smoothing functions within Chartist are factory functions that accept an options parameter.\n *\n * @example\n * var chart = new Chartist.Line('.ct-chart', {\n * labels: [1, 2, 3, 4, 5],\n * series: [[1, 2, 8, 1, 7]]\n * }, {\n * lineSmooth: Chartist.Interpolation.monotoneCubic({\n * fillHoles: false\n * })\n * });\n *\n * @memberof Chartist.Interpolation\n * @param {Object} [options] The options of the monotoneCubic factory function.\n * @return {Function}\n */\nexport function monotoneCubic(options) {\n const defaultOptions = {\n fillHoles: false\n };\n\n options = extend({}, defaultOptions, options);\n\n return function monotoneCubicInterpolation(pathCoordinates, valueData) {\n // First we try to split the coordinates into segments\n // This is necessary to treat \"holes\" in line charts\n const segments = splitIntoSegments(pathCoordinates, valueData, {\n fillHoles: options.fillHoles,\n increasingX: true\n });\n\n if(!segments.length) {\n // If there were no segments return 'Chartist.Interpolation.none'\n return none()([]);\n } else if(segments.length > 1) {\n // If the split resulted in more that one segment we need to interpolate each segment individually and join them\n // afterwards together into a single path.\n // For each segment we will recurse the monotoneCubic fn function\n // Join the segment path data into a single path and return\n return SvgPath.join(\n segments.map((segment) => monotoneCubicInterpolation(segment.pathCoordinates, segment.valueData))\n );\n } else {\n // If there was only one segment we can proceed regularly by using pathCoordinates and valueData from the first\n // segment\n pathCoordinates = segments[0].pathCoordinates;\n valueData = segments[0].valueData;\n\n // If less than three points we need to fallback to no smoothing\n if(pathCoordinates.length <= 4) {\n return none()(pathCoordinates, valueData);\n }\n\n const xs = [];\n const ys = [];\n const n = pathCoordinates.length / 2;\n const ms = [];\n const ds = [];\n const dys = [];\n const dxs = [];\n\n // Populate x and y coordinates into separate arrays, for readability\n for(let i = 0; i < n; i++) {\n xs[i] = pathCoordinates[i * 2];\n ys[i] = pathCoordinates[i * 2 + 1];\n }\n\n // Calculate deltas and derivative\n for(let i = 0; i < n - 1; i++) {\n dys[i] = ys[i + 1] - ys[i];\n dxs[i] = xs[i + 1] - xs[i];\n ds[i] = dys[i] / dxs[i];\n }\n\n // Determine desired slope (m) at each point using Fritsch-Carlson method\n // See: http://math.stackexchange.com/questions/45218/implementation-of-monotone-cubic-interpolation\n ms[0] = ds[0];\n ms[n - 1] = ds[n - 2];\n\n for(let i = 1; i < n - 1; i++) {\n if(ds[i] === 0 || ds[i - 1] === 0 || (ds[i - 1] > 0) !== (ds[i] > 0)) {\n ms[i] = 0;\n } else {\n ms[i] = 3 * (dxs[i - 1] + dxs[i]) / (\n (2 * dxs[i] + dxs[i - 1]) / ds[i - 1] +\n (dxs[i] + 2 * dxs[i - 1]) / ds[i]);\n\n if(!isFinite(ms[i])) {\n ms[i] = 0;\n }\n }\n }\n\n // Now build a path from the slopes\n const path = new SvgPath().move(xs[0], ys[0], false, valueData[0]);\n\n for(let i = 0; i < n - 1; i++) {\n path.curve(\n // First control point\n xs[i] + dxs[i] / 3,\n ys[i] + ms[i] * dxs[i] / 3,\n // Second control point\n xs[i + 1] - dxs[i] / 3,\n ys[i + 1] - ms[i + 1] * dxs[i] / 3,\n // End point\n xs[i + 1],\n ys[i + 1],\n\n false,\n valueData[i + 1]\n );\n }\n\n return path;\n }\n };\n}\n","import {alphaNumerate, quantity, isFalseyButZero} from '../core/lang';\nimport {noop, sum} from '../core/functional';\nimport {polarToCartesian} from '../core/math';\nimport {extend} from '../core/extend';\nimport {normalizeData, serialize} from '../core/data';\nimport {createSvg, createChartRect} from '../core/creation';\nimport {SvgPath} from '../svg/svg-path';\nimport {BaseChart} from './base';\n\n/**\n * Default options in line charts. Expand the code view to see a detailed list of options with comments.\n *\n * @memberof Chartist.Pie\n */\nconst defaultOptions = {\n // Specify a fixed width for the chart as a string (i.e. '100px' or '50%')\n width: undefined,\n // Specify a fixed height for the chart as a string (i.e. '100px' or '50%')\n height: undefined,\n // Padding of the chart drawing area to the container element and labels as a number or padding object {top: 5, right: 5, bottom: 5, left: 5}\n chartPadding: 5,\n // Override the class names that are used to generate the SVG structure of the chart\n classNames: {\n chartPie: 'ct-chart-pie',\n chartDonut: 'ct-chart-donut',\n series: 'ct-series',\n slicePie: 'ct-slice-pie',\n sliceDonut: 'ct-slice-donut',\n label: 'ct-label'\n },\n // The start angle of the pie chart in degrees where 0 points north. A higher value offsets the start angle clockwise.\n startAngle: 0,\n // An optional total you can specify. By specifying a total value, the sum of the values in the series must be this total in order to draw a full pie. You can use this parameter to draw only parts of a pie or gauge charts.\n total: undefined,\n // If specified the donut CSS classes will be used and strokes will be drawn instead of pie slices.\n donut: false,\n // Specify the donut stroke width, currently done in javascript for convenience. May move to CSS styles in the future.\n // This option can be set as number or string to specify a relative width (i.e. 100 or '30%').\n donutWidth: 60,\n // If a label should be shown or not\n showLabel: true,\n // Label position offset from the standard position which is half distance of the radius. This value can be either positive or negative. Positive values will position the label away from the center.\n labelOffset: 0,\n // This option can be set to 'inside', 'outside' or 'center'. Positioned with 'inside' the labels will be placed on half the distance of the radius to the border of the Pie by respecting the 'labelOffset'. The 'outside' option will place the labels at the border of the pie and 'center' will place the labels in the absolute center point of the chart. The 'center' option only makes sense in conjunction with the 'labelOffset' option.\n labelPosition: 'inside',\n // An interpolation function for the label value\n labelInterpolationFnc: noop,\n // Label direction can be 'neutral', 'explode' or 'implode'. The labels anchor will be positioned based on those settings as well as the fact if the labels are on the right or left side of the center of the chart. Usually explode is useful when labels are positioned far away from the center.\n labelDirection: 'neutral',\n // If true the whole data is reversed including labels, the series order as well as the whole series data arrays.\n reverseData: false,\n // If true empty values will be ignored to avoid drawing unncessary slices and labels\n ignoreEmptyValues: false\n};\n\n/**\n * Determines SVG anchor position based on direction and center parameter\n *\n * @param center\n * @param label\n * @param direction\n * @return {string}\n */\nexport function determineAnchorPosition(center, label, direction) {\n const toTheRight = label.x > center.x;\n\n if(toTheRight && direction === 'explode' ||\n !toTheRight && direction === 'implode') {\n return 'start';\n } else if(toTheRight && direction === 'implode' ||\n !toTheRight && direction === 'explode') {\n return 'end';\n } else {\n return 'middle';\n }\n}\n\nexport class PieChart extends BaseChart {\n /**\n * This method creates a new pie chart and returns an object that can be used to redraw the chart.\n *\n * @memberof Chartist.Pie\n * @param {String|Node} query A selector query string or directly a DOM element\n * @param {Object} data The data object in the pie chart needs to have a series property with a one dimensional data array. The values will be normalized against each other and don't necessarily need to be in percentage. The series property can also be an array of value objects that contain a value property and a className property to override the CSS class name for the series group.\n * @param {Object} [options] The options object with options that override the default options. Check the examples for a detailed list.\n * @param {Array} [responsiveOptions] Specify an array of responsive option arrays which are a media query and options object pair => [[mediaQueryString, optionsObject],[more...]]\n * @return {Object} An object with a version and an update method to manually redraw the chart\n *\n * @example\n * // Simple pie chart example with four series\n * new Chartist.Pie('.ct-chart', {\n * series: [10, 2, 4, 3]\n * });\n *\n * @example\n * // Drawing a donut chart\n * new Chartist.Pie('.ct-chart', {\n * series: [10, 2, 4, 3]\n * }, {\n * donut: true\n * });\n *\n * @example\n * // Using donut, startAngle and total to draw a gauge chart\n * new Chartist.Pie('.ct-chart', {\n * series: [20, 10, 30, 40]\n * }, {\n * donut: true,\n * donutWidth: 20,\n * startAngle: 270,\n * total: 200\n * });\n *\n * @example\n * // Drawing a pie chart with padding and labels that are outside the pie\n * new Chartist.Pie('.ct-chart', {\n * series: [20, 10, 30, 40]\n * }, {\n * chartPadding: 30,\n * labelOffset: 50,\n * labelDirection: 'explode'\n * });\n *\n * @example\n * // Overriding the class names for individual series as well as a name and meta data.\n * // The name will be written as ct:series-name attribute and the meta data will be serialized and written\n * // to a ct:meta attribute.\n * new Chartist.Pie('.ct-chart', {\n * series: [{\n * value: 20,\n * name: 'Series 1',\n * className: 'my-custom-class-one',\n * meta: 'Meta One'\n * }, {\n * value: 10,\n * name: 'Series 2',\n * className: 'my-custom-class-two',\n * meta: 'Meta Two'\n * }, {\n * value: 70,\n * name: 'Series 3',\n * className: 'my-custom-class-three',\n * meta: 'Meta Three'\n * }]\n * });\n */\n constructor(query, data, options, responsiveOptions) {\n super(query, data, defaultOptions, extend({}, defaultOptions, options), responsiveOptions);\n }\n\n /**\n * Creates the pie chart\n *\n * @param options\n */\n createChart(options) {\n const data = normalizeData(this.data);\n const seriesGroups = [];\n let labelsGroup;\n let labelRadius;\n let startAngle = options.startAngle;\n\n // Create SVG.js draw\n this.svg = createSvg(this.container, options.width, options.height, options.donut ? options.classNames.chartDonut : options.classNames.chartPie);\n // Calculate charting rect\n const chartRect = createChartRect(this.svg, options, defaultOptions.padding);\n // Get biggest circle radius possible within chartRect\n let radius = Math.min(chartRect.width() / 2, chartRect.height() / 2);\n // Calculate total of all series to get reference value or use total reference from optional options\n const totalDataSum = options.total ||\n data.normalized.series.reduce(sum, 0);\n\n const donutWidth = quantity(options.donutWidth);\n if(donutWidth.unit === '%') {\n donutWidth.value *= radius / 100;\n }\n\n // If this is a donut chart we need to adjust our radius to enable strokes to be drawn inside\n // Unfortunately this is not possible with the current SVG Spec\n // See this proposal for more details: http://lists.w3.org/Archives/Public/www-svg/2003Oct/0000.html\n radius -= options.donut ? donutWidth.value / 2 : 0;\n\n // If labelPosition is set to `outside` or a donut chart is drawn then the label position is at the radius,\n // if regular pie chart it's half of the radius\n if(options.labelPosition === 'outside' || options.donut) {\n labelRadius = radius;\n } else if(options.labelPosition === 'center') {\n // If labelPosition is center we start with 0 and will later wait for the labelOffset\n labelRadius = 0;\n } else {\n // Default option is 'inside' where we use half the radius so the label will be placed in the center of the pie\n // slice\n labelRadius = radius / 2;\n }\n // Add the offset to the labelRadius where a negative offset means closed to the center of the chart\n labelRadius += options.labelOffset;\n\n // Calculate end angle based on total sum and current data value and offset with padding\n const center = {\n x: chartRect.x1 + chartRect.width() / 2,\n y: chartRect.y2 + chartRect.height() / 2\n };\n\n // Check if there is only one non-zero value in the series array.\n const hasSingleValInSeries = data.raw.series\n .filter((val) => val.hasOwnProperty('value') ? val.value !== 0 : val !== 0)\n .length === 1;\n\n // Creating the series groups\n data.raw.series\n .forEach((series, index) => seriesGroups[index] = this.svg.elem('g', null, null));\n // if we need to show labels we create the label group now\n if(options.showLabel) {\n labelsGroup = this.svg.elem('g', null, null);\n }\n\n // Draw the series\n // initialize series groups\n data.raw.series.forEach((series, index) => {\n // If current value is zero and we are ignoring empty values then skip to next value\n if(data.normalized.series[index] === 0 && options.ignoreEmptyValues) {\n return;\n }\n\n // If the series is an object and contains a name or meta data we add a custom attribute\n seriesGroups[index].attr({\n 'ct:series-name': series.name\n });\n\n // Use series class from series data or if not set generate one\n seriesGroups[index].addClass([\n options.classNames.series,\n series.className || `${options.classNames.series}-${alphaNumerate(index)}`\n ].join(' '));\n\n // If the whole dataset is 0 endAngle should be zero. Can't divide by 0.\n let endAngle = (totalDataSum > 0 ? startAngle + data.normalized.series[index] / totalDataSum * 360 : 0);\n\n // Use slight offset so there are no transparent hairline issues\n const overlappigStartAngle = Math.max(0, startAngle - (index === 0 || hasSingleValInSeries ? 0 : 0.2));\n\n // If we need to draw the arc for all 360 degrees we need to add a hack where we close the circle\n // with Z and use 359.99 degrees\n if(endAngle - overlappigStartAngle >= 359.99) {\n endAngle = overlappigStartAngle + 359.99;\n }\n\n const start = polarToCartesian(center.x, center.y, radius, overlappigStartAngle);\n const end = polarToCartesian(center.x, center.y, radius, endAngle);\n\n // Create a new path element for the pie chart. If this isn't a donut chart we should close the path for a correct stroke\n const path = new SvgPath(!options.donut)\n .move(end.x, end.y)\n .arc(radius, radius, 0, endAngle - startAngle > 180, 0, start.x, start.y);\n\n // If regular pie chart (no donut) we add a line to the center of the circle for completing the pie\n if(!options.donut) {\n path.line(center.x, center.y);\n }\n\n // Create the SVG path\n // If this is a donut chart we add the donut class, otherwise just a regular slice\n const pathElement = seriesGroups[index].elem('path', {\n d: path.stringify()\n }, options.donut ? options.classNames.sliceDonut : options.classNames.slicePie);\n\n // Adding the pie series value to the path\n pathElement.attr({\n 'ct:value': data.normalized.series[index],\n 'ct:meta': serialize(series.meta)\n });\n\n // If this is a donut, we add the stroke-width as style attribute\n if(options.donut) {\n pathElement.attr({\n 'style': 'stroke-width: ' + donutWidth.value + 'px'\n });\n }\n\n // Fire off draw event\n this.eventEmitter.emit('draw', {\n type: 'slice',\n value: data.normalized.series[index],\n totalDataSum: totalDataSum,\n index: index,\n meta: series.meta,\n series: series,\n group: seriesGroups[index],\n element: pathElement,\n path: path.clone(),\n center: center,\n radius: radius,\n startAngle: startAngle,\n endAngle: endAngle\n });\n\n // If we need to show labels we need to add the label for this slice now\n if(options.showLabel) {\n let labelPosition;\n\n if(data.raw.series.length === 1) {\n // If we have only 1 series, we can position the label in the center of the pie\n labelPosition = {\n x: center.x,\n y: center.y\n };\n } else {\n // Position at the labelRadius distance from center and between start and end angle\n labelPosition = polarToCartesian(\n center.x,\n center.y,\n labelRadius,\n startAngle + (endAngle - startAngle) / 2\n );\n }\n\n let rawValue;\n if(data.normalized.labels && !isFalseyButZero(data.normalized.labels[index])) {\n rawValue = data.normalized.labels[index];\n } else {\n rawValue = data.normalized.series[index];\n }\n\n const interpolatedValue = options.labelInterpolationFnc(rawValue, index);\n\n if(interpolatedValue || interpolatedValue === 0) {\n const labelElement = labelsGroup.elem('text', {\n dx: labelPosition.x,\n dy: labelPosition.y,\n 'text-anchor': determineAnchorPosition(center, labelPosition, options.labelDirection)\n }, options.classNames.label).text('' + interpolatedValue);\n\n // Fire off draw event\n this.eventEmitter.emit('draw', {\n type: 'label',\n index,\n group: labelsGroup,\n element: labelElement,\n text: '' + interpolatedValue,\n x: labelPosition.x,\n y: labelPosition.y\n });\n }\n }\n\n // Set next startAngle to current endAngle.\n // (except for last slice)\n startAngle = endAngle;\n });\n\n this.eventEmitter.emit('created', {\n chartRect,\n svg: this.svg,\n options\n });\n }\n}\n","","export {version} from 'package.json!version';\n\n/**\n * This object contains all namespaces used within Chartist.\n *\n * @type {{svg: string, xmlns: string, xhtml: string, xlink: string, ct: string}}\n */\nexport let namespaces = {\n svg: 'http://www.w3.org/2000/svg',\n xmlns: 'http://www.w3.org/2000/xmlns/',\n xhtml: 'http://www.w3.org/1999/xhtml',\n xlink: 'http://www.w3.org/1999/xlink',\n ct: 'http://gionkunz.github.com/chartist-js/ct'\n};\n\n/**\n * Precision level used internally in Chartist for rounding. If you require more decimal places you can increase this number.\n *\n * @type {number}\n */\nexport let precision = 8;\n\n/**\n * A map with characters to escape for strings to be safely used as attribute values.\n *\n * @type {Object}\n */\nexport let escapingMap = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n '\\'': '''\n};\n","export default (function (arr) {\n if (Array.isArray(arr)) {\n for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];\n\n return arr2;\n } else {\n return Array.from(arr);\n }\n});","/**\n * Helps to simplify functional style code\n *\n * @memberof Chartist.Core\n * @param {*} n This exact value will be returned by the noop function\n * @return {*} The same value that was provided to the n parameter\n */\nexport const noop = (n) => n;\n\n/**\n * Functional style helper to produce array with given length initialized with undefined values\n *\n * @memberof Chartist.Core\n * @param length\n * @return {Array}\n */\nexport const times = (length) => Array.from({length});\n\n/**\n * Sum helper to be used in reduce functions\n *\n * @memberof Chartist.Core\n * @param previous\n * @param current\n * @return {*}\n */\nexport const sum = (previous, current) => previous + (current ? current : 0);\n\n/**\n * Map for multi dimensional arrays where their nested arrays will be mapped in serial. The output array will have the length of the largest nested array. The callback function is called with variable arguments where each argument is the nested array value (or undefined if there are no more values).\n *\n * For example:\n * @example\n * ```javascript\n * const data = [[1, 2], [3], []];\n * serialMap(data, cb);\n *\n * // where cb will be called 2 times\n * // 1. call arguments: (1, 3, undefined)\n * // 2. call arguments: (2, undefined, undefined)\n * ```\n *\n * @memberof Chartist.Core\n * @param array\n * @param callback\n * @return {Array}\n */\nexport const serialMap = (array, callback) =>\n times(Math.max(...array.map((element) => element.length)))\n .map((inner, index) => callback(...array.map((element) => element[index])));\n","export default (function (instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n});","export default (function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);\n if (staticProps) defineProperties(Constructor, staticProps);\n return Constructor;\n };\n})();","import {Svg} from './svg';\n\n/**\n * This helper class is to wrap multiple `Svg` elements into a list where you can call the `Svg` functions on all elements in the list with one call. This is helpful when you'd like to perform calls with `Svg` on multiple elements.\n * An instance of this class is also returned by `Svg.querySelectorAll`.\n *\n * @memberof Svg\n * @param {Array|NodeList} nodeList An Array of SVG DOM nodes or a SVG DOM NodeList (as returned by document.querySelectorAll)\n * @constructor\n */\nexport class SvgList {\n constructor(nodeList) {\n const list = this;\n\n this.svgElements = [];\n for(let i = 0; i < nodeList.length; i++) {\n this.svgElements.push(new Svg(nodeList[i]));\n }\n\n // Add delegation methods for Svg\n Object.keys(Svg.prototype).filter((prototypeProperty) => [\n 'constructor',\n 'parent',\n 'querySelector',\n 'querySelectorAll',\n 'replace',\n 'append',\n 'classes',\n 'height',\n 'width'\n ].indexOf(prototypeProperty) === -1)\n .forEach((prototypeProperty) => {\n list[prototypeProperty] = () => {\n const args = Array.from(arguments);\n list.svgElements.forEach((element) =>\n Svg.prototype[prototypeProperty].apply(element, args));\n return list;\n };\n });\n }\n}\n","export class EventEmitter {\n constructor() {\n this.handlers = [];\n }\n\n /**\n * Add an event handler for a specific event\n *\n * @memberof Chartist.Event\n * @param {String} event The event name\n * @param {Function} handler A event handler function\n */\n addEventHandler(event, handler) {\n this.handlers[event] = this.handlers[event] || [];\n this.handlers[event].push(handler);\n }\n\n /**\n * Remove an event handler of a specific event name or remove all event handlers for a specific event.\n *\n * @memberof Chartist.Event\n * @param {String} event The event name where a specific or all handlers should be removed\n * @param {Function} [handler] An optional event handler function. If specified only this specific handler will be removed and otherwise all handlers are removed.\n */\n removeEventHandler(event, handler) {\n // Only do something if there are event handlers with this name existing\n if(this.handlers[event]) {\n // If handler is set we will look for a specific handler and only remove this\n if(handler) {\n this.handlers[event].splice(this.handlers[event].indexOf(handler), 1);\n if(this.handlers[event].length === 0) {\n delete this.handlers[event];\n }\n } else {\n // If no handler is specified we remove all handlers for this event\n delete this.handlers[event];\n }\n }\n }\n\n /**\n * Use this function to emit an event. All handlers that are listening for this event will be triggered with the data parameter.\n *\n * @memberof Chartist.Event\n * @param {String} event The event name that should be triggered\n * @param {*} data Arbitrary data that will be passed to the event handler callback functions\n */\n emit(event, data) {\n // Only do something if there are event handlers with this name existing\n if(this.handlers[event]) {\n this.handlers[event].forEach((handler) => handler(data));\n }\n\n // Emit event to star event handlers\n if(this.handlers['*']) {\n this.handlers['*'].forEach((starHandler) => starHandler(event, data));\n }\n }\n}\n","import {querySelector, extend, optionsProvider} from '../core/core';\nimport {EventEmitter} from '../event/event-emitter';\nimport {isSupported} from '../svg/svg';\n\nexport class BaseChart {\n /**\n * Constructor of chart base class.\n *\n * @param query\n * @param data\n * @param defaultOptions\n * @param options\n * @param responsiveOptions\n * @constructor\n */\n constructor(query, data, defaultOptions, options, responsiveOptions) {\n this.container = querySelector(query);\n this.data = data || {};\n this.data.labels = this.data.labels || [];\n this.data.series = this.data.series || [];\n this.defaultOptions = defaultOptions;\n this.options = options;\n this.responsiveOptions = responsiveOptions;\n this.eventEmitter = new EventEmitter();\n this.supportsForeignObject = isSupported('Extensibility');\n this.supportsAnimations = isSupported('AnimationEventsAttribute');\n this.resizeListener = () => this.update();\n\n if(this.container) {\n // If chartist was already initialized in this container we are detaching all event listeners first\n if(this.container.__chartist__) {\n this.container.__chartist__.detach();\n }\n\n this.container.__chartist__ = this;\n }\n\n // Using event loop for first draw to make it possible to register event listeners in the same call stack where\n // the chart was created.\n this.initializeTimeoutId = setTimeout(() => this.initialize(), 0);\n }\n\n createChart() {\n throw new Error('Base chart type can\\'t be instantiated!');\n }\n\n // TODO: Currently we need to re-draw the chart on window resize. This is usually very bad and will affect performance.\n // This is done because we can't work with relative coordinates when drawing the chart because SVG Path does not\n // work with relative positions yet. We need to check if we can do a viewBox hack to switch to percentage.\n // See http://mozilla.6506.n7.nabble.com/Specyfing-paths-with-percentages-unit-td247474.html\n // Update: can be done using the above method tested here: http://codepen.io/gionkunz/pen/KDvLj\n // The problem is with the label offsets that can't be converted into percentage and affecting the chart container\n /**\n * Updates the chart which currently does a full reconstruction of the SVG DOM\n *\n * @param {Object} [data] Optional data you'd like to set for the chart before it will update. If not specified the update method will use the data that is already configured with the chart.\n * @param {Object} [options] Optional options you'd like to add to the previous options for the chart before it will update. If not specified the update method will use the options that have been already configured with the chart.\n * @param {Boolean} [override] If set to true, the passed options will be used to extend the options that have been configured already. Otherwise the chart default options will be used as the base\n * @memberof Chartist.Base\n */\n update(data, options, override) {\n if(data) {\n this.data = data || {};\n this.data.labels = this.data.labels || [];\n this.data.series = this.data.series || [];\n // Event for data transformation that allows to manipulate the data before it gets rendered in the charts\n this.eventEmitter.emit('data', {\n type: 'update',\n data: this.data\n });\n }\n\n if(options) {\n this.options = extend({}, override ? this.options : this.defaultOptions, options);\n\n // If chartist was not initialized yet, we just set the options and leave the rest to the initialization\n // Otherwise we re-create the optionsProvider at this point\n if(!this.initializeTimeoutId) {\n this.optionsProvider.removeMediaQueryListeners();\n this.optionsProvider = optionsProvider(this.options, this.responsiveOptions, this.eventEmitter);\n }\n }\n\n // Only re-created the chart if it has been initialized yet\n if(!this.initializeTimeoutId) {\n this.createChart(this.optionsProvider.getCurrentOptions());\n }\n\n // Return a reference to the chart object to chain up calls\n return this;\n }\n\n /**\n * This method can be called on the API object of each chart and will un-register all event listeners that were added to other components. This currently includes a window.resize listener as well as media query listeners if any responsive options have been provided. Use this function if you need to destroy and recreate Chartist charts dynamically.\n *\n * @memberof Chartist.Base\n */\n detach() {\n // Only detach if initialization already occurred on this chart. If this chart still hasn't initialized (therefore\n // the initializationTimeoutId is still a valid timeout reference, we will clear the timeout\n if(!this.initializeTimeoutId) {\n window.removeEventListener('resize', this.resizeListener);\n this.optionsProvider.removeMediaQueryListeners();\n } else {\n window.clearTimeout(this.initializeTimeoutId);\n }\n\n return this;\n }\n\n /**\n * Use this function to register event handlers. The handler callbacks are synchronous and will run in the main thread rather than the event loop.\n *\n * @memberof Chartist.Base\n * @param {String} event Name of the event. Check the examples for supported events.\n * @param {Function} handler The handler function that will be called when an event with the given name was emitted. This function will receive a data argument which contains event data. See the example for more details.\n */\n on(event, handler) {\n this.eventEmitter.addEventHandler(event, handler);\n return this;\n }\n\n /**\n * Use this function to un-register event handlers. If the handler function parameter is omitted all handlers for the given event will be un-registered.\n *\n * @memberof Chartist.Base\n * @param {String} event Name of the event for which a handler should be removed\n * @param {Function} [handler] The handler function that that was previously used to register a new event handler. This handler will be removed from the event handler list. If this parameter is omitted then all event handlers for the given event are removed from the list.\n */\n off(event, handler) {\n this.eventEmitter.removeEventHandler(event, handler);\n return this;\n }\n\n initialize() {\n // Add window resize listener that re-creates the chart\n window.addEventListener('resize', this.resizeListener);\n\n // Obtain current options based on matching media queries (if responsive options are given)\n // This will also register a listener that is re-creating the chart based on media changes\n this.optionsProvider = optionsProvider(this.options, this.responsiveOptions, this.eventEmitter);\n // Register options change listener that will trigger a chart update\n this.eventEmitter.addEventHandler('optionsChanged', () => this.update());\n\n // Before the first chart creation we need to register us with all plugins that are configured\n // Initialize all relevant plugins with our chart object and the plugin options specified in the config\n if(this.options.plugins) {\n this.options.plugins.forEach((plugin) => {\n if(plugin instanceof Array) {\n plugin[0](this, plugin[1]);\n } else {\n plugin(this);\n }\n });\n }\n\n // Event for data transformation that allows to manipulate the data before it gets rendered in the charts\n this.eventEmitter.emit('data', {\n type: 'initial',\n data: this.data\n });\n\n // Create the first chart\n this.createChart(this.optionsProvider.getCurrentOptions());\n\n // As chart is initialized from the event loop now we can reset our timeout reference\n // This is important if the chart gets initialized on the same element twice\n this.initializeTimeoutId = undefined;\n }\n}\n","export default (function (self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self;\n});","export default (function (subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n});","import {isFalseyButZero} from '../core/lang';\nimport {createGrid, createLabel} from '../core/creation';\n\nexport const axisUnits = {\n x: {\n pos: 'x',\n len: 'width',\n dir: 'horizontal',\n rectStart: 'x1',\n rectEnd: 'x2',\n rectOffset: 'y2'\n },\n y: {\n pos: 'y',\n len: 'height',\n dir: 'vertical',\n rectStart: 'y2',\n rectEnd: 'y1',\n rectOffset: 'x1'\n }\n};\n\nexport class Axis {\n initialize(units, chartRect, ticks, options) {\n this.units = units;\n this.counterUnits = units === axisUnits.x ? axisUnits.y : axisUnits.x;\n this.options = options;\n this.chartRect = chartRect;\n this.axisLength = chartRect[this.units.rectEnd] - chartRect[this.units.rectStart];\n this.gridOffset = chartRect[this.units.rectOffset];\n this.ticks = ticks;\n }\n\n projectValue(value, index, data) {\n throw new Error('Base axis can\\'t be instantiated!');\n }\n\n createGridAndLabels(gridGroup, labelGroup, useForeignObject, chartOptions, eventEmitter) {\n const axisOptions = chartOptions['axis' + this.units.pos.toUpperCase()];\n const projectedValues = this.ticks.map(this.projectValue.bind(this));\n const labelValues = this.ticks.map(axisOptions.labelInterpolationFnc);\n\n projectedValues.forEach((projectedValue, index) => {\n const labelOffset = {\n x: 0,\n y: 0\n };\n\n // TODO: Find better solution for solving this problem\n // Calculate how much space we have available for the label\n let labelLength;\n if(projectedValues[index + 1]) {\n // If we still have one label ahead, we can calculate the distance to the next tick / label\n labelLength = projectedValues[index + 1] - projectedValue;\n } else {\n // If we don't have a label ahead and we have only two labels in total, we just take the remaining distance to\n // on the whole axis length. We limit that to a minimum of 30 pixel, so that labels close to the border will\n // still be visible inside of the chart padding.\n labelLength = Math.max(this.axisLength - projectedValue, 30);\n }\n\n // Skip grid lines and labels where interpolated label values are falsey (except for 0)\n if(isFalseyButZero(labelValues[index]) && labelValues[index] !== '') {\n return;\n }\n\n // Transform to global coordinates using the chartRect\n // We also need to set the label offset for the createLabel function\n if(this.units.pos === 'x') {\n projectedValue = this.chartRect.x1 + projectedValue;\n labelOffset.x = chartOptions.axisX.labelOffset.x;\n\n // If the labels should be positioned in start position (top side for vertical axis) we need to set a\n // different offset as for positioned with end (bottom)\n if(chartOptions.axisX.position === 'start') {\n labelOffset.y = this.chartRect.padding.top +\n chartOptions.axisX.labelOffset.y +\n (useForeignObject ? 5 : 20);\n } else {\n labelOffset.y = this.chartRect.y1 +\n chartOptions.axisX.labelOffset.y +\n (useForeignObject ? 5 : 20);\n }\n } else {\n projectedValue = this.chartRect.y1 - projectedValue;\n labelOffset.y = chartOptions.axisY.labelOffset.y - (useForeignObject ? labelLength : 0);\n\n // If the labels should be positioned in start position (left side for horizontal axis) we need to set a\n // different offset as for positioned with end (right side)\n if(chartOptions.axisY.position === 'start') {\n labelOffset.x = useForeignObject ?\n this.chartRect.padding.left + chartOptions.axisY.labelOffset.x :\n this.chartRect.x1 - 10;\n } else {\n labelOffset.x = this.chartRect.x2 + chartOptions.axisY.labelOffset.x + 10;\n }\n }\n\n if(axisOptions.showGrid) {\n createGrid(projectedValue, index, this, this.gridOffset, this.chartRect[this.counterUnits.len](), gridGroup, [\n chartOptions.classNames.grid,\n chartOptions.classNames[this.units.dir]\n ], eventEmitter);\n }\n\n if(axisOptions.showLabel) {\n createLabel(projectedValue, labelLength, index, labelValues, this, axisOptions.offset, labelOffset, labelGroup, [\n chartOptions.classNames.label,\n chartOptions.classNames[this.units.dir],\n (axisOptions.position === 'start' ? chartOptions.classNames[axisOptions.position] : chartOptions.classNames.end)\n ], useForeignObject, eventEmitter);\n }\n });\n }\n}\n","export default (function get(object, property, receiver) {\n if (object === null) object = Function.prototype;\n var desc = Object.getOwnPropertyDescriptor(object, property);\n\n if (desc === undefined) {\n var parent = Object.getPrototypeOf(object);\n\n if (parent === null) {\n return undefined;\n } else {\n return get(parent, property, receiver);\n }\n } else if (\"value\" in desc) {\n return desc.value;\n } else {\n var getter = desc.get;\n\n if (getter === undefined) {\n return undefined;\n }\n\n return getter.call(receiver);\n }\n});","import {getBounds, getHighLow, getMultiValue} from '../core/data';\nimport {Axis} from './axis';\n\nexport class AutoScaleAxis extends Axis {\n constructor(axisUnit, data, chartRect, options) {\n super();\n // Usually we calculate highLow based on the data but this can be overriden by a highLow object in the options\n const highLow = options.highLow || getHighLow(data, options, axisUnit.pos);\n this.bounds = getBounds(chartRect[axisUnit.rectEnd] - chartRect[axisUnit.rectStart], highLow, options.scaleMinSpace || 20, options.onlyInteger);\n this.range = {\n min: this.bounds.min,\n max: this.bounds.max\n };\n\n super.initialize(axisUnit, chartRect, this.bounds.values, options);\n }\n\n projectValue(value) {\n return this.axisLength * (+getMultiValue(value, this.units.pos) - this.bounds.min) / this.bounds.range;\n }\n}\n","import {getMultiValue, getHighLow} from '../core/data';\nimport {times} from '../core/functional';\nimport {Axis} from './axis';\n\nexport class FixedScaleAxis extends Axis {\n constructor(axisUnit, data, chartRect, options) {\n super();\n\n const highLow = options.highLow || getHighLow(data, options, axisUnit.pos);\n this.divisor = options.divisor || 1;\n this.ticks = options.ticks ||\n times(this.divisor).map(\n (value, index) => highLow.low + (highLow.high - highLow.low) / this.divisor * index\n );\n this.ticks.sort((a, b) => a - b);\n this.range = {\n min: highLow.low,\n max: highLow.high\n };\n\n super.initialize(axisUnit, chartRect, this.ticks, options);\n\n this.stepLength = this.axisLength / this.divisor;\n }\n\n projectValue(value) {\n return this.axisLength * (+getMultiValue(value, this.units.pos) - this.range.min) /\n (this.range.max - this.range.min);\n }\n}\n","import {Axis} from './axis';\n\nexport class StepAxis extends Axis {\n constructor(axisUnit, data, chartRect, options) {\n super();\n super.initialize(axisUnit, chartRect, options.ticks, options);\n\n const calc = Math.max(1, options.ticks.length - (options.stretch ? 1 : 0));\n this.stepLength = this.axisLength / calc;\n }\n\n projectValue(value, index) {\n return this.stepLength * index;\n }\n}\n","import {isNumeric, alphaNumerate} from '../core/lang';\nimport {noop} from '../core/functional';\nimport {extend} from '../core/extend';\nimport {normalizeData, serialize, getMetaData, getSeriesOption} from '../core/data';\nimport {createSvg, createChartRect, createGridBackground} from '../core/creation';\nimport {StepAxis, AutoScaleAxis, axisUnits} from '../axes/axes';\nimport {BaseChart} from './base';\nimport {monotoneCubic, none} from '../interpolation/interpolation';\n\n/**\n * Default options in line charts. Expand the code view to see a detailed list of options with comments.\n *\n * @memberof Chartist.Line\n */\nconst defaultOptions = {\n // Options for X-Axis\n axisX: {\n // The offset of the labels to the chart area\n offset: 30,\n // Position where labels are placed. Can be set to `start` or `end` where `start` is equivalent to left or top on vertical axis and `end` is equivalent to right or bottom on horizontal axis.\n position: 'end',\n // Allows you to correct label positioning on this axis by positive or negative x and y offset.\n labelOffset: {\n x: 0,\n y: 0\n },\n // If labels should be shown or not\n showLabel: true,\n // If the axis grid should be drawn or not\n showGrid: true,\n // Interpolation function that allows you to intercept the value from the axis label\n labelInterpolationFnc: noop,\n // Set the axis type to be used to project values on this axis. If not defined, Chartist.StepAxis will be used for the X-Axis, where the ticks option will be set to the labels in the data and the stretch option will be set to the global fullWidth option. This type can be changed to any axis constructor available (e.g. Chartist.FixedScaleAxis), where all axis options should be present here.\n type: undefined\n },\n // Options for Y-Axis\n axisY: {\n // The offset of the labels to the chart area\n offset: 40,\n // Position where labels are placed. Can be set to `start` or `end` where `start` is equivalent to left or top on vertical axis and `end` is equivalent to right or bottom on horizontal axis.\n position: 'start',\n // Allows you to correct label positioning on this axis by positive or negative x and y offset.\n labelOffset: {\n x: 0,\n y: 0\n },\n // If labels should be shown or not\n showLabel: true,\n // If the axis grid should be drawn or not\n showGrid: true,\n // Interpolation function that allows you to intercept the value from the axis label\n labelInterpolationFnc: noop,\n // Set the axis type to be used to project values on this axis. If not defined, Chartist.AutoScaleAxis will be used for the Y-Axis, where the high and low options will be set to the global high and low options. This type can be changed to any axis constructor available (e.g. Chartist.FixedScaleAxis), where all axis options should be present here.\n type: undefined,\n // This value specifies the minimum height in pixel of the scale steps\n scaleMinSpace: 20,\n // Use only integer values (whole numbers) for the scale steps\n onlyInteger: false\n },\n // Specify a fixed width for the chart as a string (i.e. '100px' or '50%')\n width: undefined,\n // Specify a fixed height for the chart as a string (i.e. '100px' or '50%')\n height: undefined,\n // If the line should be drawn or not\n showLine: true,\n // If dots should be drawn or not\n showPoint: true,\n // If the line chart should draw an area\n showArea: false,\n // The base for the area chart that will be used to close the area shape (is normally 0)\n areaBase: 0,\n // Specify if the lines should be smoothed. This value can be true or false where true will result in smoothing using the default smoothing interpolation function Chartist.Interpolation.cardinal and false results in Chartist.Interpolation.none. You can also choose other smoothing / interpolation functions available in the Chartist.Interpolation module, or write your own interpolation function. Check the examples for a brief description.\n lineSmooth: true,\n // If the line chart should add a background fill to the .ct-grids group.\n showGridBackground: false,\n // Overriding the natural low of the chart allows you to zoom in or limit the charts lowest displayed value\n low: undefined,\n // Overriding the natural high of the chart allows you to zoom in or limit the charts highest displayed value\n high: undefined,\n // Padding of the chart drawing area to the container element and labels as a number or padding object {top: 5, right: 5, bottom: 5, left: 5}\n chartPadding: {\n top: 15,\n right: 15,\n bottom: 5,\n left: 10\n },\n // When set to true, the last grid line on the x-axis is not drawn and the chart elements will expand to the full available width of the chart. For the last label to be drawn correctly you might need to add chart padding or offset the last label with a draw event handler.\n fullWidth: false,\n // If true the whole data is reversed including labels, the series order as well as the whole series data arrays.\n reverseData: false,\n // Override the class names that get used to generate the SVG structure of the chart\n classNames: {\n chart: 'ct-chart-line',\n label: 'ct-label',\n labelGroup: 'ct-labels',\n series: 'ct-series',\n line: 'ct-line',\n point: 'ct-point',\n area: 'ct-area',\n grid: 'ct-grid',\n gridGroup: 'ct-grids',\n gridBackground: 'ct-grid-background',\n vertical: 'ct-vertical',\n horizontal: 'ct-horizontal',\n start: 'ct-start',\n end: 'ct-end'\n }\n};\n\nexport class LineChart extends BaseChart {\n /**\n * This method creates a new line chart.\n *\n * @memberof Chartist.Line\n * @param {String|Node} query A selector query string or directly a DOM element\n * @param {Object} data The data object that needs to consist of a labels and a series array\n * @param {Object} [options] The options object with options that override the default options. Check the examples for a detailed list.\n * @param {Array} [responsiveOptions] Specify an array of responsive option arrays which are a media query and options object pair => [[mediaQueryString, optionsObject],[more...]]\n * @return {Object} An object which exposes the API for the created chart\n *\n * @example\n * // Create a simple line chart\n * var data = {\n * // A labels array that can contain any sort of values\n * labels: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri'],\n * // Our series array that contains series objects or in this case series data arrays\n * series: [\n * [5, 2, 4, 2, 0]\n * ]\n * };\n *\n * // As options we currently only set a static size of 300x200 px\n * var options = {\n * width: '300px',\n * height: '200px'\n * };\n *\n * // In the global name space Chartist we call the Line function to initialize a line chart. As a first parameter we pass in a selector where we would like to get our chart created. Second parameter is the actual data object and as a third parameter we pass in our options\n * new Chartist.Line('.ct-chart', data, options);\n *\n * @example\n * // Use specific interpolation function with configuration from the Chartist.Interpolation module\n *\n * var chart = new Chartist.Line('.ct-chart', {\n * labels: [1, 2, 3, 4, 5],\n * series: [\n * [1, 1, 8, 1, 7]\n * ]\n * }, {\n * lineSmooth: Chartist.Interpolation.cardinal({\n * tension: 0.2\n * })\n * });\n *\n * @example\n * // Create a line chart with responsive options\n *\n * var data = {\n * // A labels array that can contain any sort of values\n * labels: ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'],\n * // Our series array that contains series objects or in this case series data arrays\n * series: [\n * [5, 2, 4, 2, 0]\n * ]\n * };\n *\n * // In addition to the regular options we specify responsive option overrides that will override the default configutation based on the matching media queries.\n * var responsiveOptions = [\n * ['screen and (min-width: 641px) and (max-width: 1024px)', {\n * showPoint: false,\n * axisX: {\n * labelInterpolationFnc: function(value) {\n * // Will return Mon, Tue, Wed etc. on medium screens\n * return value.slice(0, 3);\n * }\n * }\n * }],\n * ['screen and (max-width: 640px)', {\n * showLine: false,\n * axisX: {\n * labelInterpolationFnc: function(value) {\n * // Will return M, T, W etc. on small screens\n * return value[0];\n * }\n * }\n * }]\n * ];\n *\n * new Chartist.Line('.ct-chart', data, null, responsiveOptions);\n *\n */\n constructor(query, data, options, responsiveOptions) {\n super(query, data, defaultOptions, extend({}, defaultOptions, options), responsiveOptions);\n }\n\n /**\n * Creates a new chart\n *\n */\n createChart(options) {\n const data = normalizeData(this.data, options.reverseData, true);\n\n // Create new svg object\n this.svg = createSvg(this.container, options.width, options.height, options.classNames.chart);\n // Create groups for labels, grid and series\n const gridGroup = this.svg.elem('g').addClass(options.classNames.gridGroup);\n const seriesGroup = this.svg.elem('g');\n const labelGroup = this.svg.elem('g').addClass(options.classNames.labelGroup);\n\n const chartRect = createChartRect(this.svg, options, defaultOptions.padding);\n let axisX;\n let axisY;\n\n if(options.axisX.type === undefined) {\n axisX = new StepAxis(axisUnits.x, data.normalized.series, chartRect, extend({}, options.axisX, {\n ticks: data.normalized.labels,\n stretch: options.fullWidth\n }));\n } else {\n axisX = new options.axisX.type(axisUnits.x, data.normalized.series, chartRect, options.axisX);\n }\n\n if(options.axisY.type === undefined) {\n axisY = new AutoScaleAxis(axisUnits.y, data.normalized.series, chartRect, extend({}, options.axisY, {\n high: isNumeric(options.high) ? options.high : options.axisY.high,\n low: isNumeric(options.low) ? options.low : options.axisY.low\n }));\n } else {\n axisY = new options.axisY.type(axisUnits.y, data.normalized.series, chartRect, options.axisY);\n }\n\n axisX.createGridAndLabels(gridGroup, labelGroup, this.supportsForeignObject, options, this.eventEmitter);\n axisY.createGridAndLabels(gridGroup, labelGroup, this.supportsForeignObject, options, this.eventEmitter);\n\n if(options.showGridBackground) {\n createGridBackground(gridGroup, chartRect, options.classNames.gridBackground, this.eventEmitter);\n }\n\n // Draw the series\n data.raw.series.forEach((series, seriesIndex) => {\n const seriesElement = seriesGroup.elem('g');\n\n // Write attributes to series group element. If series name or meta is undefined the attributes will not be written\n seriesElement.attr({\n 'ct:series-name': series.name,\n 'ct:meta': serialize(series.meta)\n });\n\n // Use series class from series data or if not set generate one\n seriesElement.addClass([\n options.classNames.series,\n series.className || `${options.classNames.series}-${alphaNumerate(seriesIndex)}`\n ].join(' '));\n\n const pathCoordinates = [];\n const pathData = [];\n\n data.normalized.series[seriesIndex].forEach((value, valueIndex) => {\n const p = {\n x: chartRect.x1 + axisX.projectValue(value, valueIndex, data.normalized.series[seriesIndex]),\n y: chartRect.y1 - axisY.projectValue(value, valueIndex, data.normalized.series[seriesIndex])\n };\n pathCoordinates.push(p.x, p.y);\n pathData.push({\n value,\n valueIndex,\n meta: getMetaData(series, valueIndex)\n });\n });\n\n const seriesOptions = {\n lineSmooth: getSeriesOption(series, options, 'lineSmooth'),\n showPoint: getSeriesOption(series, options, 'showPoint'),\n showLine: getSeriesOption(series, options, 'showLine'),\n showArea: getSeriesOption(series, options, 'showArea'),\n areaBase: getSeriesOption(series, options, 'areaBase')\n };\n\n let smoothing;\n if(typeof seriesOptions.lineSmooth === 'function') {\n smoothing = seriesOptions.lineSmooth;\n } else {\n smoothing = seriesOptions.lineSmooth ? monotoneCubic() : none();\n }\n\n // Interpolating path where pathData will be used to annotate each path element so we can trace back the original\n // index, value and meta data\n const path = smoothing(pathCoordinates, pathData);\n\n // If we should show points we need to create them now to avoid secondary loop\n // Points are drawn from the pathElements returned by the interpolation function\n // Small offset for Firefox to render squares correctly\n if(seriesOptions.showPoint) {\n\n path.pathElements.forEach((pathElement) => {\n const point = seriesElement.elem('line', {\n x1: pathElement.x,\n y1: pathElement.y,\n x2: pathElement.x + 0.01,\n y2: pathElement.y\n }, options.classNames.point).attr({\n 'ct:value': [pathElement.data.value.x, pathElement.data.value.y].filter(isNumeric).join(','),\n 'ct:meta': serialize(pathElement.data.meta)\n });\n\n this.eventEmitter.emit('draw', {\n type: 'point',\n value: pathElement.data.value,\n index: pathElement.data.valueIndex,\n meta: pathElement.data.meta,\n series,\n seriesIndex,\n axisX,\n axisY,\n group: seriesElement,\n element: point,\n x: pathElement.x,\n y: pathElement.y\n });\n });\n }\n\n if(seriesOptions.showLine) {\n const line = seriesElement.elem('path', {\n d: path.stringify()\n }, options.classNames.line, true);\n\n this.eventEmitter.emit('draw', {\n type: 'line',\n values: data.normalized.series[seriesIndex],\n path: path.clone(),\n chartRect,\n // TODO: Remove redundant\n index: seriesIndex,\n series,\n seriesIndex,\n seriesMeta: series.meta,\n axisX,\n axisY,\n group: seriesElement,\n element: line\n });\n }\n\n // Area currently only works with axes that support a range!\n if(seriesOptions.showArea && axisY.range) {\n // If areaBase is outside the chart area (< min or > max) we need to set it respectively so that\n // the area is not drawn outside the chart area.\n const areaBase = Math.max(Math.min(seriesOptions.areaBase, axisY.range.max), axisY.range.min);\n\n // We project the areaBase value into screen coordinates\n const areaBaseProjected = chartRect.y1 - axisY.projectValue(areaBase);\n\n // In order to form the area we'll first split the path by move commands so we can chunk it up into segments\n path.splitByCommand('M')\n // We filter only \"solid\" segments that contain more than one point. Otherwise there's no need for an area\n .filter((pathSegment) => pathSegment.pathElements.length > 1)\n .map((solidPathSegments) => {\n // Receiving the filtered solid path segments we can now convert those segments into fill areas\n const firstElement = solidPathSegments.pathElements[0];\n const lastElement = solidPathSegments.pathElements[solidPathSegments.pathElements.length - 1];\n\n // Cloning the solid path segment with closing option and removing the first move command from the clone\n // We then insert a new move that should start at the area base and draw a straight line up or down\n // at the end of the path we add an additional straight line to the projected area base value\n // As the closing option is set our path will be automatically closed\n return solidPathSegments.clone(true)\n .position(0)\n .remove(1)\n .move(firstElement.x, areaBaseProjected)\n .line(firstElement.x, firstElement.y)\n .position(solidPathSegments.pathElements.length + 1)\n .line(lastElement.x, areaBaseProjected);\n\n })\n .forEach((areaPath) => {\n // For each of our newly created area paths, we'll now create path elements by stringifying our path objects\n // and adding the created DOM elements to the correct series group\n const area = seriesElement.elem('path', {\n d: areaPath.stringify()\n }, options.classNames.area, true);\n\n // Emit an event for each area that was drawn\n this.eventEmitter.emit('draw', {\n type: 'area',\n values: data.normalized.series[seriesIndex],\n path: areaPath.clone(),\n series,\n seriesIndex,\n axisX,\n axisY,\n chartRect,\n // TODO: Remove redundant\n index: seriesIndex,\n group: seriesElement,\n element: area\n });\n });\n }\n });\n\n this.eventEmitter.emit('created', {\n // TODO: Remove redundant\n bounds: axisY.bounds,\n chartRect,\n axisX,\n axisY,\n svg: this.svg,\n options\n });\n }\n}\n","import {isNumeric, alphaNumerate} from '../core/lang';\nimport {noop, serialMap} from '../core/functional';\nimport {extend} from '../core/extend';\nimport {normalizeData, serialize, getMetaData, getHighLow} from '../core/data';\nimport {createSvg, createChartRect, createGridBackground} from '../core/creation';\nimport {AutoScaleAxis, StepAxis, axisUnits} from '../axes/axes';\nimport {BaseChart} from './base';\n\n/**\n * Default options in bar charts. Expand the code view to see a detailed list of options with comments.\n *\n * @memberof Chartist.Bar\n */\nconst defaultOptions = {\n // Options for X-Axis\n axisX: {\n // The offset of the chart drawing area to the border of the container\n offset: 30,\n // Position where labels are placed. Can be set to `start` or `end` where `start` is equivalent to left or top on vertical axis and `end` is equivalent to right or bottom on horizontal axis.\n position: 'end',\n // Allows you to correct label positioning on this axis by positive or negative x and y offset.\n labelOffset: {\n x: 0,\n y: 0\n },\n // If labels should be shown or not\n showLabel: true,\n // If the axis grid should be drawn or not\n showGrid: true,\n // Interpolation function that allows you to intercept the value from the axis label\n labelInterpolationFnc: noop,\n // This value specifies the minimum width in pixel of the scale steps\n scaleMinSpace: 30,\n // Use only integer values (whole numbers) for the scale steps\n onlyInteger: false\n },\n // Options for Y-Axis\n axisY: {\n // The offset of the chart drawing area to the border of the container\n offset: 40,\n // Position where labels are placed. Can be set to `start` or `end` where `start` is equivalent to left or top on vertical axis and `end` is equivalent to right or bottom on horizontal axis.\n position: 'start',\n // Allows you to correct label positioning on this axis by positive or negative x and y offset.\n labelOffset: {\n x: 0,\n y: 0\n },\n // If labels should be shown or not\n showLabel: true,\n // If the axis grid should be drawn or not\n showGrid: true,\n // Interpolation function that allows you to intercept the value from the axis label\n labelInterpolationFnc: noop,\n // This value specifies the minimum height in pixel of the scale steps\n scaleMinSpace: 20,\n // Use only integer values (whole numbers) for the scale steps\n onlyInteger: false\n },\n // Specify a fixed width for the chart as a string (i.e. '100px' or '50%')\n width: undefined,\n // Specify a fixed height for the chart as a string (i.e. '100px' or '50%')\n height: undefined,\n // Overriding the natural high of the chart allows you to zoom in or limit the charts highest displayed value\n high: undefined,\n // Overriding the natural low of the chart allows you to zoom in or limit the charts lowest displayed value\n low: undefined,\n // Unless low/high are explicitly set, bar chart will be centered at zero by default. Set referenceValue to null to auto scale.\n referenceValue: 0,\n // Padding of the chart drawing area to the container element and labels as a number or padding object {top: 5, right: 5, bottom: 5, left: 5}\n chartPadding: {\n top: 15,\n right: 15,\n bottom: 5,\n left: 10\n },\n // Specify the distance in pixel of bars in a group\n seriesBarDistance: 15,\n // If set to true this property will cause the series bars to be stacked. Check the `stackMode` option for further stacking options.\n stackBars: false,\n // If set to 'overlap' this property will force the stacked bars to draw from the zero line.\n // If set to 'accumulate' this property will form a total for each series point. This will also influence the y-axis and the overall bounds of the chart. In stacked mode the seriesBarDistance property will have no effect.\n stackMode: 'accumulate',\n // Inverts the axes of the bar chart in order to draw a horizontal bar chart. Be aware that you also need to invert your axis settings as the Y Axis will now display the labels and the X Axis the values.\n horizontalBars: false,\n // If set to true then each bar will represent a series and the data array is expected to be a one dimensional array of data values rather than a series array of series. This is useful if the bar chart should represent a profile rather than some data over time.\n distributeSeries: false,\n // If true the whole data is reversed including labels, the series order as well as the whole series data arrays.\n reverseData: false,\n // If the bar chart should add a background fill to the .ct-grids group.\n showGridBackground: false,\n // Override the class names that get used to generate the SVG structure of the chart\n classNames: {\n chart: 'ct-chart-bar',\n horizontalBars: 'ct-horizontal-bars',\n label: 'ct-label',\n labelGroup: 'ct-labels',\n series: 'ct-series',\n bar: 'ct-bar',\n grid: 'ct-grid',\n gridGroup: 'ct-grids',\n gridBackground: 'ct-grid-background',\n vertical: 'ct-vertical',\n horizontal: 'ct-horizontal',\n start: 'ct-start',\n end: 'ct-end'\n }\n};\n\nexport class BarChart extends BaseChart {\n /**\n * This method creates a new bar chart and returns API object that you can use for later changes.\n *\n * @memberof Chartist.Bar\n * @param {String|Node} query A selector query string or directly a DOM element\n * @param {Object} data The data object that needs to consist of a labels and a series array\n * @param {Object} [options] The options object with options that override the default options. Check the examples for a detailed list.\n * @param {Array} [responsiveOptions] Specify an array of responsive option arrays which are a media query and options object pair => [[mediaQueryString, optionsObject],[more...]]\n * @return {Object} An object which exposes the API for the created chart\n *\n * @example\n * // Create a simple bar chart\n * var data = {\n * labels: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri'],\n * series: [\n * [5, 2, 4, 2, 0]\n * ]\n * };\n *\n * // In the global name space Chartist we call the Bar function to initialize a bar chart. As a first parameter we pass in a selector where we would like to get our chart created and as a second parameter we pass our data object.\n * new Chartist.Bar('.ct-chart', data);\n *\n * @example\n * // This example creates a bipolar grouped bar chart where the boundaries are limitted to -10 and 10\n * new Chartist.Bar('.ct-chart', {\n * labels: [1, 2, 3, 4, 5, 6, 7],\n * series: [\n * [1, 3, 2, -5, -3, 1, -6],\n * [-5, -2, -4, -1, 2, -3, 1]\n * ]\n * }, {\n * seriesBarDistance: 12,\n * low: -10,\n * high: 10\n * });\n *\n */\n constructor(query, data, options, responsiveOptions) {\n super(query, data, defaultOptions, extend({}, defaultOptions, options), responsiveOptions);\n }\n\n /**\n * Creates a new chart\n *\n */\n createChart(options) {\n let data;\n let highLow;\n\n if(options.distributeSeries) {\n data = normalizeData(this.data, options.reverseData, options.horizontalBars ? 'x' : 'y');\n data.normalized.series = data.normalized.series.map((value) => [value]);\n } else {\n data = normalizeData(this.data, options.reverseData, options.horizontalBars ? 'x' : 'y');\n }\n\n // Create new svg element\n this.svg = createSvg(\n this.container,\n options.width,\n options.height,\n options.classNames.chart + (options.horizontalBars ? ' ' + options.classNames.horizontalBars : '')\n );\n\n // Drawing groups in correct order\n const gridGroup = this.svg.elem('g').addClass(options.classNames.gridGroup);\n const seriesGroup = this.svg.elem('g');\n const labelGroup = this.svg.elem('g').addClass(options.classNames.labelGroup);\n\n if(options.stackBars && data.normalized.series.length !== 0) {\n // If stacked bars we need to calculate the high low from stacked values from each series\n const serialSums = serialMap(data.normalized.series, () =>\n Array.from(arguments)\n .map((value) => value)\n .reduce((prev, curr) => {\n return {\n x: prev.x + (curr && curr.x) || 0,\n y: prev.y + (curr && curr.y) || 0\n };\n }, {x: 0, y: 0})\n );\n\n highLow = getHighLow([serialSums], options, options.horizontalBars ? 'x' : 'y');\n\n } else {\n highLow = getHighLow(data.normalized.series, options, options.horizontalBars ? 'x' : 'y');\n }\n\n // Overrides of high / low from settings\n highLow.high = +options.high || (options.high === 0 ? 0 : highLow.high);\n highLow.low = +options.low || (options.low === 0 ? 0 : highLow.low);\n\n const chartRect = createChartRect(this.svg, options, defaultOptions.padding);\n let valueAxis;\n let labelAxisTicks;\n let labelAxis;\n let axisX;\n let axisY;\n\n // We need to set step count based on some options combinations\n if(options.distributeSeries && options.stackBars) {\n // If distributed series are enabled and bars need to be stacked, we'll only have one bar and therefore should\n // use only the first label for the step axis\n labelAxisTicks = data.normalized.labels.slice(0, 1);\n } else {\n // If distributed series are enabled but stacked bars aren't, we should use the series labels\n // If we are drawing a regular bar chart with two dimensional series data, we just use the labels array\n // as the bars are normalized\n labelAxisTicks = data.normalized.labels;\n }\n\n // Set labelAxis and valueAxis based on the horizontalBars setting. This setting will flip the axes if necessary.\n if(options.horizontalBars) {\n if(options.axisX.type === undefined) {\n valueAxis = axisX = new AutoScaleAxis(axisUnits.x, data.normalized.series, chartRect, extend({}, options.axisX, {\n highLow: highLow,\n referenceValue: 0\n }));\n } else {\n valueAxis = axisX = new options.axisX.type(axisUnits.x, data.normalized.series, chartRect, extend({}, options.axisX, {\n highLow: highLow,\n referenceValue: 0\n }));\n }\n\n if(options.axisY.type === undefined) {\n labelAxis = axisY = new StepAxis(axisUnits.y, data.normalized.series, chartRect, {\n ticks: labelAxisTicks\n });\n } else {\n labelAxis = axisY = new options.axisY.type(axisUnits.y, data.normalized.series, chartRect, options.axisY);\n }\n } else {\n if(options.axisX.type === undefined) {\n labelAxis = axisX = new StepAxis(axisUnits.x, data.normalized.series, chartRect, {\n ticks: labelAxisTicks\n });\n } else {\n labelAxis = axisX = new options.axisX.type(axisUnits.x, data.normalized.series, chartRect, options.axisX);\n }\n\n if(options.axisY.type === undefined) {\n valueAxis = axisY = new AutoScaleAxis(axisUnits.y, data.normalized.series, chartRect, extend({}, options.axisY, {\n highLow: highLow,\n referenceValue: 0\n }));\n } else {\n valueAxis = axisY = new options.axisY.type(axisUnits.y, data.normalized.series, chartRect, extend({}, options.axisY, {\n highLow: highLow,\n referenceValue: 0\n }));\n }\n }\n\n // Projected 0 point\n const zeroPoint = options.horizontalBars ?\n (chartRect.x1 + valueAxis.projectValue(0)) :\n (chartRect.y1 - valueAxis.projectValue(0));\n // Used to track the screen coordinates of stacked bars\n const stackedBarValues = [];\n\n labelAxis.createGridAndLabels(gridGroup, labelGroup, this.supportsForeignObject, options, this.eventEmitter);\n valueAxis.createGridAndLabels(gridGroup, labelGroup, this.supportsForeignObject, options, this.eventEmitter);\n\n if(options.showGridBackground) {\n createGridBackground(gridGroup, chartRect, options.classNames.gridBackground, this.eventEmitter);\n }\n\n // Draw the series\n data.raw.series.forEach((series, seriesIndex) => {\n // Calculating bi-polar value of index for seriesOffset. For i = 0..4 biPol will be -1.5, -0.5, 0.5, 1.5 etc.\n const biPol = seriesIndex - (data.raw.series.length - 1) / 2;\n // Half of the period width between vertical grid lines used to position bars\n let periodHalfLength;\n\n // We need to set periodHalfLength based on some options combinations\n if(options.distributeSeries && !options.stackBars) {\n // If distributed series are enabled but stacked bars aren't, we need to use the length of the normaizedData array\n // which is the series count and divide by 2\n periodHalfLength = labelAxis.axisLength / data.normalized.series.length / 2;\n } else if(options.distributeSeries && options.stackBars) {\n // If distributed series and stacked bars are enabled we'll only get one bar so we should just divide the axis\n // length by 2\n periodHalfLength = labelAxis.axisLength / 2;\n } else {\n // On regular bar charts we should just use the series length\n periodHalfLength = labelAxis.axisLength / data.normalized.series[seriesIndex].length / 2;\n }\n\n // Adding the series group to the series element\n const seriesElement = seriesGroup.elem('g');\n\n // Write attributes to series group element. If series name or meta is undefined the attributes will not be written\n seriesElement.attr({\n 'ct:series-name': series.name,\n 'ct:meta': serialize(series.meta)\n });\n\n // Use series class from series data or if not set generate one\n seriesElement.addClass([\n options.classNames.series,\n series.className || `${options.classNames.series}-${alphaNumerate(seriesIndex)}`\n ].join(' '));\n\n data.normalized.series[seriesIndex].forEach((value, valueIndex) => {\n let labelAxisValueIndex;\n // We need to set labelAxisValueIndex based on some options combinations\n if(options.distributeSeries && !options.stackBars) {\n // If distributed series are enabled but stacked bars aren't, we can use the seriesIndex for later projection\n // on the step axis for label positioning\n labelAxisValueIndex = seriesIndex;\n } else if(options.distributeSeries && options.stackBars) {\n // If distributed series and stacked bars are enabled, we will only get one bar and therefore always use\n // 0 for projection on the label step axis\n labelAxisValueIndex = 0;\n } else {\n // On regular bar charts we just use the value index to project on the label step axis\n labelAxisValueIndex = valueIndex;\n }\n\n let projected;\n // We need to transform coordinates differently based on the chart layout\n if(options.horizontalBars) {\n projected = {\n x: chartRect.x1 + valueAxis.projectValue(value && value.x ? value.x : 0, valueIndex, data.normalized.series[seriesIndex]),\n y: chartRect.y1 - labelAxis.projectValue(value && value.y ? value.y : 0, labelAxisValueIndex, data.normalized.series[seriesIndex])\n };\n } else {\n projected = {\n x: chartRect.x1 + labelAxis.projectValue(value && value.x ? value.x : 0, labelAxisValueIndex, data.normalized.series[seriesIndex]),\n y: chartRect.y1 - valueAxis.projectValue(value && value.y ? value.y : 0, valueIndex, data.normalized.series[seriesIndex])\n }\n }\n\n // If the label axis is a step based axis we will offset the bar into the middle of between two steps using\n // the periodHalfLength value. Also we do arrange the different series so that they align up to each other using\n // the seriesBarDistance. If we don't have a step axis, the bar positions can be chosen freely so we should not\n // add any automated positioning.\n if(labelAxis instanceof StepAxis) {\n // Offset to center bar between grid lines, but only if the step axis is not stretched\n if(!labelAxis.options.stretch) {\n projected[labelAxis.units.pos] += periodHalfLength * (options.horizontalBars ? -1 : 1);\n }\n // Using bi-polar offset for multiple series if no stacked bars or series distribution is used\n projected[labelAxis.units.pos] += (options.stackBars || options.distributeSeries) ? 0 : biPol * options.seriesBarDistance * (options.horizontalBars ? -1 : 1);\n }\n\n // Enter value in stacked bar values used to remember previous screen value for stacking up bars\n const previousStack = stackedBarValues[valueIndex] || zeroPoint;\n stackedBarValues[valueIndex] = previousStack - (zeroPoint - projected[labelAxis.counterUnits.pos]);\n\n // Skip if value is undefined\n if(value === undefined) {\n return;\n }\n\n const positions = {};\n positions[`${labelAxis.units.pos}1`] = projected[labelAxis.units.pos];\n positions[`${labelAxis.units.pos}2`] = projected[labelAxis.units.pos];\n\n if(options.stackBars && (options.stackMode === 'accumulate' || !options.stackMode)) {\n // Stack mode: accumulate (default)\n // If bars are stacked we use the stackedBarValues reference and otherwise base all bars off the zero line\n // We want backwards compatibility, so the expected fallback without the 'stackMode' option\n // to be the original behaviour (accumulate)\n positions[`${labelAxis.counterUnits.pos}1`] = previousStack;\n positions[`${labelAxis.counterUnits.pos}2`] = stackedBarValues[valueIndex];\n } else {\n // Draw from the zero line normally\n // This is also the same code for Stack mode: overlap\n positions[`${labelAxis.counterUnits.pos}1`] = zeroPoint;\n positions[`${labelAxis.counterUnits.pos}2`] = projected[labelAxis.counterUnits.pos];\n }\n\n // Limit x and y so that they are within the chart rect\n positions.x1 = Math.min(Math.max(positions.x1, chartRect.x1), chartRect.x2);\n positions.x2 = Math.min(Math.max(positions.x2, chartRect.x1), chartRect.x2);\n positions.y1 = Math.min(Math.max(positions.y1, chartRect.y2), chartRect.y1);\n positions.y2 = Math.min(Math.max(positions.y2, chartRect.y2), chartRect.y1);\n\n const metaData = getMetaData(series, valueIndex);\n\n // Create bar element\n const bar = seriesElement.elem('line', positions, options.classNames.bar).attr({\n 'ct:value': [value.x, value.y].filter(isNumeric).join(','),\n 'ct:meta': serialize(metaData)\n });\n\n this.eventEmitter.emit('draw', extend({\n type: 'bar',\n value,\n index: valueIndex,\n meta: metaData,\n series,\n seriesIndex,\n axisX,\n axisY,\n chartRect,\n group: seriesElement,\n element: bar\n }, positions));\n });\n });\n\n this.eventEmitter.emit('created', {\n bounds: valueAxis.bounds,\n chartRect,\n axisX,\n axisY,\n svg: this.svg,\n options\n });\n }\n}\n"]} \ No newline at end of file diff --git a/package.json b/package.json index 55df6472..9d8a8dcb 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,15 @@ ], "dependencies": {}, "devDependencies": { + "autoprefixer": "^6.5.1", + "babel-eslint": "^7.1.0", "browser-sync": "^2.17.5", + "chokidar": "^1.6.1", + "cssnano": "^3.7.7", + "debounce": "^1.0.0", + "eslint": "^3.8.1", + "fs-promise": "^0.5.0", + "interpolate": "^0.1.0", "jasmine-core": "^2.5.2", "jspm": "beta", "karma": "^1.3.0", @@ -49,12 +57,6 @@ "karma-jspm": "^2.2.0", "karma-nyan-reporter": "^0.2.4", "karma-phantomjs-launcher": "^1.0.2", - "autoprefixer": "^6.5.1", - "chokidar": "^1.6.1", - "cssnano": "^3.7.7", - "debounce": "^1.0.0", - "fs-promise": "^0.5.0", - "interpolate": "^0.1.0", "node-sass": "^3.10.1", "postcss": "^5.2.5" }, @@ -77,12 +79,13 @@ "test-watch": "./node_modules/.bin/karma start karma.watch.config.js", "styles-watch": "./tooling/node/styles-watch.js", "server": "./node_modules/.bin/browser-sync start --config 'bs-config.js'", - "build": "yarn run build-styles && yarn run build-umd && yarn run build-esm", + "lint": "./node_modules/.bin/eslint src", + "build": "yarn run lint && yarn run build-styles && yarn run test && yarn run build-umd && yarn run build-esm", "build-umd": "./node_modules/.bin/jspm build chartist dist/chartist.umd.js --format umd --global-name Chartist --minify --source-map-contents && ./tooling/node/banner.js dist/chartist.umd.js dist/chartist.umd.js", "build-esm": "./node_modules/.bin/jspm build chartist dist/chartist.esm.js --format esm && ./tooling/node/banner.js dist/chartist.esm.js dist/chartist.esm.js", "build-styles": "./tooling/node/styles.js src/styles/chartist.scss dist" }, "config": { - "banner": "/* Chartist.js {pkg.version}\n * Copyright © {year} Gion Kunz\n * Free to use under either the WTFPL license or the MIT license.\n * https://raw.githubusercontent.com/gionkunz/chartist-js/master/LICENSE-WTFPL\n * https://raw.githubusercontent.com/gionkunz/chartist-js/master/LICENSE-MIT\n */\n" + "banner": "/* Chartist.js {pkg.version}\n * Copyright © {year} Gion Kunz\n * Free to use under either the WTFPL license or the MIT license.\n * https://raw.githubusercontent.com/chartist-js/chartist/master/LICENSE-WTFPL\n * https://raw.githubusercontent.com/chartist-js/chartist/master/LICENSE-MIT\n */\n" } } diff --git a/src/axes/axis.js b/src/axes/axis.js index 09119ca2..c08cef1b 100644 --- a/src/axes/axis.js +++ b/src/axes/axis.js @@ -107,7 +107,7 @@ export class Axis { createLabel(projectedValue, labelLength, index, labelValues, this, axisOptions.offset, labelOffset, labelGroup, [ chartOptions.classNames.label, chartOptions.classNames[this.units.dir], - (axisOptions.position === 'start' ? chartOptions.classNames[axisOptions.position] : chartOptions.classNames['end']) + (axisOptions.position === 'start' ? chartOptions.classNames[axisOptions.position] : chartOptions.classNames.end) ], useForeignObject, eventEmitter); } }); diff --git a/src/axes/axis.spec.js b/src/axes/axis.spec.js index fd3b579c..bf60703a 100644 --- a/src/axes/axis.spec.js +++ b/src/axes/axis.spec.js @@ -57,7 +57,7 @@ describe('Axis', () => { chartOptions.axisX.labelInterpolationFnc = (value, index) => index === 0 ? null : value; - var axis = new Axis(); + const axis = new Axis(); axis.initialize(axisUnits.x, chartRect, ticks, null); axis.projectValue = (value) => value; @@ -70,7 +70,7 @@ describe('Axis', () => { chartOptions.axisX.labelInterpolationFnc = (value, index) => index === 0 ? undefined : value; - var axis = new Axis(); + const axis = new Axis(); axis.initialize(axisUnits.x, chartRect, ticks, null); axis.projectValue = (value) => value; @@ -83,7 +83,7 @@ describe('Axis', () => { chartOptions.axisX.labelInterpolationFnc = (value, index) => index === 0 ? '' : value; - var axis = new Axis(); + const axis = new Axis(); axis.initialize(axisUnits.x, chartRect, ticks, null); axis.projectValue = (value) => value; diff --git a/src/charts/bar.js b/src/charts/bar.js index 2525abc1..23940417 100644 --- a/src/charts/bar.js +++ b/src/charts/bar.js @@ -178,7 +178,7 @@ export class BarChart extends BaseChart { if(options.stackBars && data.normalized.series.length !== 0) { // If stacked bars we need to calculate the high low from stacked values from each series - var serialSums = serialMap(data.normalized.series, () => + const serialSums = serialMap(data.normalized.series, () => Array.from(arguments) .map((value) => value) .reduce((prev, curr) => { @@ -271,7 +271,7 @@ export class BarChart extends BaseChart { labelAxis.createGridAndLabels(gridGroup, labelGroup, this.supportsForeignObject, options, this.eventEmitter); valueAxis.createGridAndLabels(gridGroup, labelGroup, this.supportsForeignObject, options, this.eventEmitter); - if (options.showGridBackground) { + if(options.showGridBackground) { createGridBackground(gridGroup, chartRect, options.classNames.gridBackground, this.eventEmitter); } diff --git a/src/charts/bar.spec.js b/src/charts/bar.spec.js index 133c8459..4dd54581 100644 --- a/src/charts/bar.spec.js +++ b/src/charts/bar.spec.js @@ -30,11 +30,11 @@ describe('BarChart', () => { beforeEach(() => { data = { series: [[ - { x: 1, y: 1 }, - { x: 3, y: 5 } + {x: 1, y: 1}, + {x: 3, y: 5} ]] }; - options = { + options = { axisX: { type: AutoScaleAxis, onlyInteger: true @@ -250,7 +250,7 @@ describe('BarChart', () => { it('should generate labels and render empty grid with only series in data', (done) => { data = { - series: [ + series: [ [1, 2, 3, 4], [2, 3, 4], [3, 4] diff --git a/src/charts/line.js b/src/charts/line.js index caf498ff..ee9f0fef 100644 --- a/src/charts/line.js +++ b/src/charts/line.js @@ -211,7 +211,7 @@ export class LineChart extends BaseChart { let axisX; let axisY; - if (options.axisX.type === undefined) { + if(options.axisX.type === undefined) { axisX = new StepAxis(axisUnits.x, data.normalized.series, chartRect, extend({}, options.axisX, { ticks: data.normalized.labels, stretch: options.fullWidth @@ -220,7 +220,7 @@ export class LineChart extends BaseChart { axisX = new options.axisX.type(axisUnits.x, data.normalized.series, chartRect, options.axisX); } - if (options.axisY.type === undefined) { + if(options.axisY.type === undefined) { axisY = new AutoScaleAxis(axisUnits.y, data.normalized.series, chartRect, extend({}, options.axisY, { high: isNumeric(options.high) ? options.high : options.axisY.high, low: isNumeric(options.low) ? options.low : options.axisY.low @@ -232,7 +232,7 @@ export class LineChart extends BaseChart { axisX.createGridAndLabels(gridGroup, labelGroup, this.supportsForeignObject, options, this.eventEmitter); axisY.createGridAndLabels(gridGroup, labelGroup, this.supportsForeignObject, options, this.eventEmitter); - if (options.showGridBackground) { + if(options.showGridBackground) { createGridBackground(gridGroup, chartRect, options.classNames.gridBackground, this.eventEmitter); } @@ -276,8 +276,13 @@ export class LineChart extends BaseChart { areaBase: getSeriesOption(series, options, 'areaBase') }; - const smoothing = typeof seriesOptions.lineSmooth === 'function' ? - seriesOptions.lineSmooth : (seriesOptions.lineSmooth ? monotoneCubic() : none()); + let smoothing; + if(typeof seriesOptions.lineSmooth === 'function') { + smoothing = seriesOptions.lineSmooth; + } else { + smoothing = seriesOptions.lineSmooth ? monotoneCubic() : none(); + } + // Interpolating path where pathData will be used to annotate each path element so we can trace back the original // index, value and meta data const path = smoothing(pathCoordinates, pathData); @@ -285,7 +290,7 @@ export class LineChart extends BaseChart { // If we should show points we need to create them now to avoid secondary loop // Points are drawn from the pathElements returned by the interpolation function // Small offset for Firefox to render squares correctly - if (seriesOptions.showPoint) { + if(seriesOptions.showPoint) { path.pathElements.forEach((pathElement) => { const point = seriesElement.elem('line', { @@ -315,7 +320,7 @@ export class LineChart extends BaseChart { }); } - if (seriesOptions.showLine) { + if(seriesOptions.showLine) { const line = seriesElement.elem('path', { d: path.stringify() }, options.classNames.line, true); @@ -338,7 +343,7 @@ export class LineChart extends BaseChart { } // Area currently only works with axes that support a range! - if (seriesOptions.showArea && axisY.range) { + if(seriesOptions.showArea && axisY.range) { // If areaBase is outside the chart area (< min or > max) we need to set it respectively so that // the area is not drawn outside the chart area. const areaBase = Math.max(Math.min(seriesOptions.areaBase, axisY.range.max), axisY.range.min); @@ -348,7 +353,7 @@ export class LineChart extends BaseChart { // In order to form the area we'll first split the path by move commands so we can chunk it up into segments path.splitByCommand('M') - // We filter only "solid" segments that contain more than one point. Otherwise there's no need for an area + // We filter only "solid" segments that contain more than one point. Otherwise there's no need for an area .filter((pathSegment) => pathSegment.pathElements.length > 1) .map((solidPathSegments) => { // Receiving the filtered solid path segments we can now convert those segments into fill areas @@ -393,7 +398,7 @@ export class LineChart extends BaseChart { }); } }); - + this.eventEmitter.emit('created', { // TODO: Remove redundant bounds: axisY.bounds, diff --git a/src/charts/line.spec.js b/src/charts/line.spec.js index 00435294..871416b7 100644 --- a/src/charts/line.spec.js +++ b/src/charts/line.spec.js @@ -31,11 +31,11 @@ describe('LineChart', () => { beforeEach(() => { data = { series: [[ - { x: 1, y: 1 }, - { x: 3, y: 5 } + {x: 1, y: 1}, + {x: 3, y: 5} ]] }; - options = { + options = { axisX: { type: AutoScaleAxis, onlyInteger: true @@ -83,11 +83,11 @@ describe('LineChart', () => { beforeEach(() => { data = { series: [[ - { x: 1, y: 1 }, - { x: 3, y: 5 } + {x: 1, y: 1}, + {x: 3, y: 5} ]] }; - options = {}; + options = {}; }); it('should have ct-start class if position start', (done) => { @@ -274,7 +274,7 @@ describe('LineChart', () => { const chart = createChart(); chart.on('draw', (context) => { - if (context.type === 'line') { + if(context.type === 'line') { expect(context.path.pathElements.map((pathElement) => { return { command: pathElement.command, @@ -306,7 +306,7 @@ describe('LineChart', () => { const chart = createChart(); chart.on('draw', (context) => { - if (context.type === 'line') { + if(context.type === 'line') { expect(context.path.pathElements.map((pathElement) => { return { command: pathElement.command, @@ -340,7 +340,7 @@ describe('LineChart', () => { const chart = createChart(); chart.on('draw', (context) => { - if (context.type === 'line') { + if(context.type === 'line') { expect(context.path.pathElements.map((pathElement) => { return { command: pathElement.command, @@ -374,7 +374,7 @@ describe('LineChart', () => { const chart = createChart(); chart.on('draw', (context) => { - if (context.type === 'line') { + if(context.type === 'line') { expect(context.path.pathElements.map((pathElement) => { return { command: pathElement.command, @@ -406,7 +406,7 @@ describe('LineChart', () => { const chart = createChart(); chart.on('draw', (context) => { - if (context.type === 'line') { + if(context.type === 'line') { expect(context.path.pathElements.map((pathElement) => { return { command: pathElement.command, @@ -435,7 +435,7 @@ describe('LineChart', () => { [NaN, 15, 0, null, 2, 3, 4, undefined, {value: 1, meta: 'meta data'}, null] ] }; - options ={ + options = { lineSmooth: Interpolation.step({ postpone: false }) @@ -443,7 +443,7 @@ describe('LineChart', () => { const chart = createChart(); chart.on('draw', (context) => { - if (context.type === 'line') { + if(context.type === 'line') { expect(context.path.pathElements.map((pathElement) => { return { command: pathElement.command, @@ -509,7 +509,7 @@ describe('LineChart', () => { it('should generate labels and render empty grid with only series in data', (done) => { data = { - series: [ + series: [ [1, 2, 3, 4], [2, 3, 4], [3, 4] @@ -528,7 +528,7 @@ describe('LineChart', () => { it('should render empty grid with no data and specified high low', (done) => { data = null; - options ={ + options = { width: 400, height: 300, high: 100, diff --git a/src/charts/pie.js b/src/charts/pie.js index ee0089e5..820dcec9 100644 --- a/src/charts/pie.js +++ b/src/charts/pie.js @@ -64,10 +64,10 @@ const defaultOptions = { export function determineAnchorPosition(center, label, direction) { const toTheRight = label.x > center.x; - if (toTheRight && direction === 'explode' || + if(toTheRight && direction === 'explode' || !toTheRight && direction === 'implode') { return 'start'; - } else if (toTheRight && direction === 'implode' || + } else if(toTheRight && direction === 'implode' || !toTheRight && direction === 'explode') { return 'end'; } else { @@ -171,7 +171,7 @@ export class PieChart extends BaseChart { data.normalized.series.reduce(sum, 0); const donutWidth = quantity(options.donutWidth); - if (donutWidth.unit === '%') { + if(donutWidth.unit === '%') { donutWidth.value *= radius / 100; } @@ -182,9 +182,9 @@ export class PieChart extends BaseChart { // If labelPosition is set to `outside` or a donut chart is drawn then the label position is at the radius, // if regular pie chart it's half of the radius - if (options.labelPosition === 'outside' || options.donut) { + if(options.labelPosition === 'outside' || options.donut) { labelRadius = radius; - } else if (options.labelPosition === 'center') { + } else if(options.labelPosition === 'center') { // If labelPosition is center we start with 0 and will later wait for the labelOffset labelRadius = 0; } else { @@ -203,14 +203,14 @@ export class PieChart extends BaseChart { // Check if there is only one non-zero value in the series array. const hasSingleValInSeries = data.raw.series - .filter((val) => val.hasOwnProperty('value') ? val.value !== 0 : val !== 0) - .length === 1; + .filter((val) => val.hasOwnProperty('value') ? val.value !== 0 : val !== 0) + .length === 1; // Creating the series groups data.raw.series .forEach((series, index) => seriesGroups[index] = this.svg.elem('g', null, null)); - //if we need to show labels we create the label group now - if (options.showLabel) { + // if we need to show labels we create the label group now + if(options.showLabel) { labelsGroup = this.svg.elem('g', null, null); } @@ -218,7 +218,9 @@ export class PieChart extends BaseChart { // initialize series groups data.raw.series.forEach((series, index) => { // If current value is zero and we are ignoring empty values then skip to next value - if (data.normalized.series[index] === 0 && options.ignoreEmptyValues) return; + if(data.normalized.series[index] === 0 && options.ignoreEmptyValues) { + return; + } // If the series is an object and contains a name or meta data we add a custom attribute seriesGroups[index].attr({ @@ -239,7 +241,7 @@ export class PieChart extends BaseChart { // If we need to draw the arc for all 360 degrees we need to add a hack where we close the circle // with Z and use 359.99 degrees - if (endAngle - overlappigStartAngle >= 359.99) { + if(endAngle - overlappigStartAngle >= 359.99) { endAngle = overlappigStartAngle + 359.99; } @@ -252,7 +254,7 @@ export class PieChart extends BaseChart { .arc(radius, radius, 0, endAngle - startAngle > 180, 0, start.x, start.y); // If regular pie chart (no donut) we add a line to the center of the circle for completing the pie - if (!options.donut) { + if(!options.donut) { path.line(center.x, center.y); } @@ -269,7 +271,7 @@ export class PieChart extends BaseChart { }); // If this is a donut, we add the stroke-width as style attribute - if (options.donut) { + if(options.donut) { pathElement.attr({ 'style': 'stroke-width: ' + donutWidth.value + 'px' }); @@ -293,10 +295,10 @@ export class PieChart extends BaseChart { }); // If we need to show labels we need to add the label for this slice now - if (options.showLabel) { + if(options.showLabel) { let labelPosition; - if (data.raw.series.length === 1) { + if(data.raw.series.length === 1) { // If we have only 1 series, we can position the label in the center of the pie labelPosition = { x: center.x, @@ -313,7 +315,7 @@ export class PieChart extends BaseChart { } let rawValue; - if (data.normalized.labels && !isFalseyButZero(data.normalized.labels[index])) { + if(data.normalized.labels && !isFalseyButZero(data.normalized.labels[index])) { rawValue = data.normalized.labels[index]; } else { rawValue = data.normalized.series[index]; @@ -321,8 +323,8 @@ export class PieChart extends BaseChart { const interpolatedValue = options.labelInterpolationFnc(rawValue, index); - if (interpolatedValue || interpolatedValue === 0) { - var labelElement = labelsGroup.elem('text', { + if(interpolatedValue || interpolatedValue === 0) { + const labelElement = labelsGroup.elem('text', { dx: labelPosition.x, dy: labelPosition.y, 'text-anchor': determineAnchorPosition(center, labelPosition, options.labelDirection) diff --git a/src/charts/pie.spec.js b/src/charts/pie.spec.js index c0a7e2ba..309a9f39 100644 --- a/src/charts/pie.spec.js +++ b/src/charts/pie.spec.js @@ -285,7 +285,7 @@ describe('PieChart', () => { data = { series: [1, 2, 0, 4] }; - options = { + options = { width: 100, height: 100, ignoreEmptyValues: false diff --git a/src/core/creation.js b/src/core/creation.js index 623f2fe6..88ba77c3 100644 --- a/src/core/creation.js +++ b/src/core/creation.js @@ -89,8 +89,8 @@ export function createChartRect(svg, options, fallbackPadding) { } }; - if (hasAxis) { - if (options.axisX.position === 'start') { + if(hasAxis) { + if(options.axisX.position === 'start') { chartRect.y2 = normalizedPadding.top + xAxisOffset; chartRect.y1 = Math.max(height - normalizedPadding.bottom, chartRect.y2 + 1); } else { @@ -98,7 +98,7 @@ export function createChartRect(svg, options, fallbackPadding) { chartRect.y1 = Math.max(height - normalizedPadding.bottom - xAxisOffset, chartRect.y2 + 1); } - if (options.axisY.position === 'start') { + if(options.axisY.position === 'start') { chartRect.x1 = normalizedPadding.left + yAxisOffset; chartRect.x2 = Math.max(width - normalizedPadding.right, chartRect.x1 + 1); } else { @@ -199,14 +199,14 @@ export function createLabel(position, length, index, labels, axis, axisOffset, l positionalData[axis.units.len] = length; positionalData[axis.counterUnits.len] = Math.max(0, axisOffset - 10); - if (useForeignObject) { + if(useForeignObject) { // We need to set width and height explicitly to px as span will not expand with width and height being // 100% in all browsers - const length = Math.round(positionalData[axis.units.len]); - const counterLength = Math.round(positionalData[axis.counterUnits.len]); + const stepLength = Math.round(positionalData[axis.units.len]); + const stepCounterLength = Math.round(positionalData[axis.counterUnits.len]); const content = ` + style="${axis.units.len}: ${stepLength}px; ${axis.counterUnits.len}: ${stepCounterLength}px"> ${labels[index]} `.trim(); diff --git a/src/core/creation.spec.js b/src/core/creation.spec.js index 59baf789..3ca3ef90 100644 --- a/src/core/creation.spec.js +++ b/src/core/creation.spec.js @@ -28,7 +28,7 @@ describe('Creation', () => { }); it('should remove previous chartist svg elements', () => { - const fixture = addFixture(`
`); + const fixture = addFixture('
'); const container = fixture.wrapper.querySelector('#chart-container'); const svg1 = createSvg(container, '500px', '400px', 'ct-fish-bar'); diff --git a/src/core/data.js b/src/core/data.js index 19ebcb98..86b7b3cd 100644 --- a/src/core/data.js +++ b/src/core/data.js @@ -161,7 +161,7 @@ export function getDataArray(data, reverse, multi) { } else { // We need to prepare multi value output (x and y data) if(multi) { - var multiValue = {}; + const multiValue = {}; // Single series value arrays are assumed to specify the Y-Axis value // For example: [1, 2] => [{x: undefined, y: 1}, {x: undefined, y: 2}] @@ -321,15 +321,15 @@ export function getHighLow(data, options, dimension) { const findLow = options.low === undefined; // Function to recursively walk through arrays and find highest and lowest number - function recursiveHighLow(data) { - if(data === undefined) { + function recursiveHighLow(sourceData) { + if(sourceData === undefined) { return undefined; - } else if(data instanceof Array) { - for(let i = 0; i < data.length; i++) { - recursiveHighLow(data[i]); + } else if(sourceData instanceof Array) { + for(let i = 0; i < sourceData.length; i++) { + recursiveHighLow(sourceData[i]); } } else { - const value = dimension ? +data[dimension] : +data; + const value = dimension ? +sourceData[dimension] : +sourceData; if(findHigh && value > highLow.high) { highLow.high = value; @@ -460,7 +460,7 @@ export function getBounds(axisLength, highLow, scaleMinSpace, onlyInteger) { const values = []; for(let i = bounds.min; i <= bounds.max; i = safeIncrement(i, bounds.step)) { - var value = roundWithPrecision(i); + const value = roundWithPrecision(i); if(value !== values[values.length - 1]) { values.push(value); } diff --git a/src/core/functional.js b/src/core/functional.js index fbb92d88..461c5bcb 100644 --- a/src/core/functional.js +++ b/src/core/functional.js @@ -41,10 +41,10 @@ export const sum = (previous, current) => previous + (current ? current : 0); * ``` * * @memberof Chartist.Core - * @param arr - * @param cb + * @param array + * @param callback * @return {Array} */ -export const serialMap = (arr, cb) => - times(Math.max(...arr.map((e) => e.length))) - .map((e, index) => cb(...arr.map((e) => e[index]))); +export const serialMap = (array, callback) => + times(Math.max(...array.map((element) => element.length))) + .map((inner, index) => callback(...array.map((element) => element[index]))); diff --git a/src/core/lang.js b/src/core/lang.js index 8d35b22f..72f606e6 100644 --- a/src/core/lang.js +++ b/src/core/lang.js @@ -91,10 +91,10 @@ export function ensureUnit(value, unit) { * @return {Object} Returns an object containing the value as number and the unit as string. */ export function quantity(input) { - if (typeof input === 'string') { + if(typeof input === 'string') { const match = (/^(\d+)\s*(.*)$/g).exec(input); return { - value : +match[1], + value: +match[1], unit: match[2] || undefined }; } diff --git a/src/core/math.js b/src/core/math.js index 0dadbbe0..d6b21ede 100644 --- a/src/core/math.js +++ b/src/core/math.js @@ -52,7 +52,7 @@ export function rho(num) { } function gcd(p, q) { - if (p % q === 0) { + if(p % q === 0) { return q; } else { return gcd(q, p % q); @@ -66,7 +66,7 @@ export function rho(num) { let x1 = 2; let x2 = 2; let divisor; - if (num % 2 === 0) { + if(num % 2 === 0) { return 2; } @@ -74,7 +74,7 @@ export function rho(num) { x1 = f(x1) % num; x2 = f(f(x2)) % num; divisor = gcd(Math.abs(x1 - x2), num); - } while (divisor === 1); + } while(divisor === 1); return divisor; } diff --git a/src/core/options-provider.js b/src/core/options-provider.js index b6dff106..05895064 100644 --- a/src/core/options-provider.js +++ b/src/core/options-provider.js @@ -18,10 +18,10 @@ export function optionsProvider(options, responsiveOptions, eventEmitter) { const previousOptions = currentOptions; currentOptions = extend({}, baseOptions); - if (responsiveOptions) { + if(responsiveOptions) { responsiveOptions.forEach((responsiveOption) => { const mql = window.matchMedia(responsiveOption[0]); - if (mql.matches) { + if(mql.matches) { currentOptions = extend(currentOptions, responsiveOption[1]); } }); @@ -39,9 +39,9 @@ export function optionsProvider(options, responsiveOptions, eventEmitter) { mediaQueryListeners.forEach((mql) => mql.removeListener(updateCurrentOptions)); } - if (!window.matchMedia) { + if(!window.matchMedia) { throw 'window.matchMedia not found! Make sure you\'re using a polyfill.'; - } else if (responsiveOptions) { + } else if(responsiveOptions) { responsiveOptions.forEach((responsiveOption) => { const mql = window.matchMedia(responsiveOption[0]); mql.addListener(updateCurrentOptions); diff --git a/src/interpolation/cardinal.js b/src/interpolation/cardinal.js index ae501000..ecf982f3 100644 --- a/src/interpolation/cardinal.js +++ b/src/interpolation/cardinal.js @@ -35,7 +35,7 @@ export function cardinal(options) { const t = Math.min(1, Math.max(0, options.tension)); const c = 1 - t; - return function cardinal(pathCoordinates, valueData) { + return function cardinalInterpolation(pathCoordinates, valueData) { // First we try to split the coordinates into segments // This is necessary to treat "holes" in line charts const segments = splitIntoSegments(pathCoordinates, valueData, { @@ -51,7 +51,7 @@ export function cardinal(options) { // For each segment we will recurse the cardinal function // Join the segment path data into a single path and return return SvgPath.join( - segments.map((segment) => cardinal(segment.pathCoordinates, segment.valueData)) + segments.map((segment) => cardinalInterpolation(segment.pathCoordinates, segment.valueData)) ); } else { // If there was only one segment we can proceed regularly by using pathCoordinates and valueData from the first diff --git a/src/interpolation/monotone-cubic.js b/src/interpolation/monotone-cubic.js index 1bdb069d..00469598 100644 --- a/src/interpolation/monotone-cubic.js +++ b/src/interpolation/monotone-cubic.js @@ -32,7 +32,7 @@ export function monotoneCubic(options) { options = extend({}, defaultOptions, options); - return function monotoneCubic(pathCoordinates, valueData) { + return function monotoneCubicInterpolation(pathCoordinates, valueData) { // First we try to split the coordinates into segments // This is necessary to treat "holes" in line charts const segments = splitIntoSegments(pathCoordinates, valueData, { @@ -49,7 +49,7 @@ export function monotoneCubic(options) { // For each segment we will recurse the monotoneCubic fn function // Join the segment path data into a single path and return return SvgPath.join( - segments.map((segment) => monotoneCubic(segment.pathCoordinates, segment.valueData)) + segments.map((segment) => monotoneCubicInterpolation(segment.pathCoordinates, segment.valueData)) ); } else { // If there was only one segment we can proceed regularly by using pathCoordinates and valueData from the first diff --git a/src/interpolation/none.js b/src/interpolation/none.js index 777e728a..90c64246 100644 --- a/src/interpolation/none.js +++ b/src/interpolation/none.js @@ -25,7 +25,7 @@ export function none(options) { options = extend({}, defaultOptions, options); - return function none(pathCoordinates, valueData) { + return function noneInterpolation(pathCoordinates, valueData) { const path = new SvgPath(); let hole = true; diff --git a/src/interpolation/simple.js b/src/interpolation/simple.js index bec2b7d8..839d6c3b 100644 --- a/src/interpolation/simple.js +++ b/src/interpolation/simple.js @@ -34,7 +34,7 @@ export function simple(options) { const d = 1 / Math.max(1, options.divisor); - return function simple(pathCoordinates, valueData) { + return function simpleInterpolation(pathCoordinates, valueData) { const path = new SvgPath(); let prevX; let prevY; diff --git a/src/interpolation/step.js b/src/interpolation/step.js index 2581c50b..91513f28 100644 --- a/src/interpolation/step.js +++ b/src/interpolation/step.js @@ -29,14 +29,14 @@ export function step(options) { options = extend({}, defaultOptions, options); - return function step(pathCoordinates, valueData) { + return function stepInterpolation(pathCoordinates, valueData) { const path = new SvgPath(); let prevX; let prevY; let prevData; - for (let i = 0; i < pathCoordinates.length; i += 2) { + for(let i = 0; i < pathCoordinates.length; i += 2) { const currX = pathCoordinates[i]; const currY = pathCoordinates[i + 1]; const currData = valueData[i / 2]; diff --git a/src/styles/chartist.scss b/src/styles/chartist.scss index e3caaa6b..41f78fc9 100644 --- a/src/styles/chartist.scss +++ b/src/styles/chartist.scss @@ -38,7 +38,7 @@ -ms-flex-pack: $ct-text-justify; justify-content: $ct-text-justify; // Fallback to text-align for non-flex browsers - @if($ct-text-justify == 'flex-start') { + @if ($ct-text-justify == 'flex-start') { text-align: left; } @else if ($ct-text-justify == 'flex-end') { text-align: right; diff --git a/src/svg/svg-list.js b/src/svg/svg-list.js index b56d40b6..aec6746a 100644 --- a/src/svg/svg-list.js +++ b/src/svg/svg-list.js @@ -10,32 +10,32 @@ import {Svg} from './svg'; */ export class SvgList { constructor(nodeList) { - var list = this; + const list = this; this.svgElements = []; - for(var i = 0; i < nodeList.length; i++) { + for(let i = 0; i < nodeList.length; i++) { this.svgElements.push(new Svg(nodeList[i])); } // Add delegation methods for Svg - Object.keys(Svg.prototype).filter(function(prototypeProperty) { - return ['constructor', - 'parent', - 'querySelector', - 'querySelectorAll', - 'replace', - 'append', - 'classes', - 'height', - 'width'].indexOf(prototypeProperty) === -1; - }).forEach(function(prototypeProperty) { - list[prototypeProperty] = function() { - var args = Array.prototype.slice.call(arguments, 0); - list.svgElements.forEach(function(element) { - Svg.prototype[prototypeProperty].apply(element, args); - }); - return list; - }; - }); + Object.keys(Svg.prototype).filter((prototypeProperty) => [ + 'constructor', + 'parent', + 'querySelector', + 'querySelectorAll', + 'replace', + 'append', + 'classes', + 'height', + 'width' + ].indexOf(prototypeProperty) === -1) + .forEach((prototypeProperty) => { + list[prototypeProperty] = () => { + const args = Array.from(arguments); + list.svgElements.forEach((element) => + Svg.prototype[prototypeProperty].apply(element, args)); + return list; + }; + }); } } diff --git a/src/svg/svg-path.js b/src/svg/svg-path.js index d634d9ee..c59d6d18 100644 --- a/src/svg/svg-path.js +++ b/src/svg/svg-path.js @@ -25,16 +25,16 @@ const defaultOptions = { }; function element(command, params, pathElements, pos, relative, data) { - var pathElement = extend({ + const pathElement = extend({ command: relative ? command.toLowerCase() : command.toUpperCase() - }, params, data ? { data: data } : {} ); + }, params, data ? {data: data} : {}); pathElements.splice(pos, 0, pathElement); } function forEachParam(pathElements, cb) { - pathElements.forEach(function(pathElement, pathElementIndex) { - elementDescriptions[pathElement.command.toLowerCase()].forEach(function(paramName, paramIndex) { + pathElements.forEach((pathElement, pathElementIndex) => { + elementDescriptions[pathElement.command.toLowerCase()].forEach((paramName, paramIndex) => { cb(pathElement, paramName, pathElementIndex, paramIndex, pathElements); }); }); @@ -59,10 +59,10 @@ export class SvgPath { * @return {SvgPath} */ static join(paths, close, options) { - var joinedPath = new SvgPath(close, options); - for(var i = 0; i < paths.length; i++) { - var path = paths[i]; - for(var j = 0; j < path.pathElements.length; j++) { + const joinedPath = new SvgPath(close, options); + for(let i = 0; i < paths.length; i++) { + const path = paths[i]; + for(let j = 0; j < path.pathElements.length; j++) { joinedPath.pathElements.push(path.pathElements[j]); } } @@ -203,15 +203,15 @@ export class SvgPath { */ parse(path) { // Parsing the SVG path string into an array of arrays [['M', '10', '10'], ['L', '100', '100']] - var chunks = path.replace(/([A-Za-z])([0-9])/g, '$1 $2') + const chunks = path.replace(/([A-Za-z])([0-9])/g, '$1 $2') .replace(/([0-9])([A-Za-z])/g, '$1 $2') .split(/[\s,]+/) - .reduce(function(result, element) { - if(element.match(/[A-Za-z]/)) { + .reduce((result, pathElement) => { + if(pathElement.match(/[A-Za-z]/)) { result.push([]); } - result[result.length - 1].push(element); + result[result.length - 1].push(pathElement); return result; }, []); @@ -222,22 +222,20 @@ export class SvgPath { // Using svgPathElementDescriptions to map raw path arrays into objects that contain the command and the parameters // For example {command: 'M', x: '10', y: '10'} - var elements = chunks.map(function(chunk) { - var command = chunk.shift(), - description = elementDescriptions[command.toLowerCase()]; + const elements = chunks.map((chunk) => { + const command = chunk.shift(); + const description = elementDescriptions[command.toLowerCase()]; return extend({ command: command - }, description.reduce(function(result, paramName, index) { + }, description.reduce((result, paramName, index) => { result[paramName] = +chunk[index]; return result; }, {})); }); // Preparing a splice call with the elements array as var arg params and insert the parsed elements at the current position - var spliceArgs = [this.pos, 0]; - Array.prototype.push.apply(spliceArgs, elements); - Array.prototype.splice.apply(this.pathElements, spliceArgs); + this.pathElements.splice(this.pos, 0, ...elements); // Increase the internal position by the element count this.pos += elements.length; @@ -251,17 +249,17 @@ export class SvgPath { * @return {String} */ stringify() { - var accuracyMultiplier = Math.pow(10, this.options.accuracy); + const accuracyMultiplier = Math.pow(10, this.options.accuracy); - return this.pathElements.reduce(function(path, pathElement) { - var params = elementDescriptions[pathElement.command.toLowerCase()].map(function(paramName) { - return this.options.accuracy ? + return this.pathElements.reduce((path, pathElement) => { + const params = elementDescriptions[pathElement.command.toLowerCase()].map((paramName) => + this.options.accuracy ? (Math.round(pathElement[paramName] * accuracyMultiplier) / accuracyMultiplier) : - pathElement[paramName]; - }.bind(this)); + pathElement[paramName] + ); return path + pathElement.command + params.join(','); - }.bind(this), '') + (this.close ? 'Z' : ''); + }, '') + (this.close ? 'Z' : ''); } /** @@ -273,9 +271,9 @@ export class SvgPath { * @return {SvgPath} The current path object for easy call chaining. */ scale(x, y) { - forEachParam(this.pathElements, function(pathElement, paramName) { - pathElement[paramName] *= paramName[0] === 'x' ? x : y; - }); + forEachParam(this.pathElements, (pathElement, paramName) => + pathElement[paramName] *= paramName[0] === 'x' ? x : y + ); return this; } @@ -288,9 +286,9 @@ export class SvgPath { * @return {SvgPath} The current path object for easy call chaining. */ translate(x, y) { - forEachParam(this.pathElements, function(pathElement, paramName) { - pathElement[paramName] += paramName[0] === 'x' ? x : y; - }); + forEachParam(this.pathElements, (pathElement, paramName) => + pathElement[paramName] += paramName[0] === 'x' ? x : y + ); return this; } @@ -307,8 +305,8 @@ export class SvgPath { * @return {SvgPath} The current path object for easy call chaining. */ transform(transformFnc) { - forEachParam(this.pathElements, function(pathElement, paramName, pathElementIndex, paramIndex, pathElements) { - var transformed = transformFnc(pathElement, paramName, pathElementIndex, paramIndex, pathElements); + forEachParam(this.pathElements, (pathElement, paramName, pathElementIndex, paramIndex, pathElements) => { + const transformed = transformFnc(pathElement, paramName, pathElementIndex, paramIndex, pathElements); if(transformed || transformed === 0) { pathElement[paramName] = transformed; } @@ -324,13 +322,11 @@ export class SvgPath { * @return {SvgPath} */ clone(close) { - var c = new SvgPath(close || this.close); - c.pos = this.pos; - c.pathElements = this.pathElements.slice().map(function cloneElements(pathElement) { - return extend({}, pathElement); - }); - c.options = extend({}, this.options); - return c; + const clone = new SvgPath(close || this.close); + clone.pos = this.pos; + clone.pathElements = this.pathElements.slice().map((pathElement) => extend({}, pathElement)); + clone.options = extend({}, this.options); + return clone; } /** @@ -341,11 +337,11 @@ export class SvgPath { * @return {Array} */ splitByCommand(command) { - var split = [ + const split = [ new SvgPath() ]; - this.pathElements.forEach(function(pathElement) { + this.pathElements.forEach((pathElement) => { if(pathElement.command === command.toUpperCase() && split[split.length - 1].pathElements.length !== 0) { split.push(new SvgPath()); } diff --git a/src/svg/svg-path.spec.js b/src/svg/svg-path.spec.js index ee04d546..4d2dd487 100644 --- a/src/svg/svg-path.spec.js +++ b/src/svg/svg-path.spec.js @@ -22,12 +22,12 @@ describe('SvgPath', () => { expect(path.pathElements.length).toBe(6); expect(path.pathElements).toEqual([ - { command: 'M', x: 1, y: 2 }, - { command: 'm', x: 3, y: 4 }, - { command: 'L', x: 5, y: 6 }, - { command: 'l', x: 7, y: 8 }, - { command: 'C', x1: 9, y1: 10, x2: 11, y2: 12, x: 13, y: 14 }, - { command: 'c', x1: 15, y1: 16, x2: 17, y2: 18, x: 19, y: 20 } + {command: 'M', x: 1, y: 2}, + {command: 'm', x: 3, y: 4}, + {command: 'L', x: 5, y: 6}, + {command: 'l', x: 7, y: 8}, + {command: 'C', x1: 9, y1: 10, x2: 11, y2: 12, x: 13, y: 14}, + {command: 'c', x1: 15, y1: 16, x2: 17, y2: 18, x: 19, y: 20} ]); }); @@ -46,13 +46,13 @@ describe('SvgPath', () => { expect(path.pathElements.length).toBe(7); expect(path.pathElements).toEqual([ - { command: 'M', x: -1, y: 0 }, - { command: 'M', x: 1, y: 2 }, - { command: 'M', x: 3, y: 4 }, - { command: 'M', x: 5, y: 6 }, - { command: 'M', x: 7, y: 8 }, - { command: 'M', x: 9, y: 10 }, - { command: 'M', x: 11, y: 12 } + {command: 'M', x: -1, y: 0}, + {command: 'M', x: 1, y: 2}, + {command: 'M', x: 3, y: 4}, + {command: 'M', x: 5, y: 6}, + {command: 'M', x: 7, y: 8}, + {command: 'M', x: 9, y: 10}, + {command: 'M', x: 11, y: 12} ]); }); @@ -98,9 +98,9 @@ describe('SvgPath', () => { .scale(10, 100); expect(path.pathElements).toEqual([ - { command: 'M', x: 10, y: 200 }, - { command: 'L', x: 30, y: 400 }, - { command: 'C', x1: 50, y1: 600, x2: 70, y2: 800, x: 90, y: 1000 } + {command: 'M', x: 10, y: 200}, + {command: 'L', x: 30, y: 400}, + {command: 'C', x1: 50, y1: 600, x2: 70, y2: 800, x: 90, y: 1000} ]); }); @@ -112,9 +112,9 @@ describe('SvgPath', () => { .translate(10, 100); expect(path.pathElements).toEqual([ - { command: 'M', x: 11, y: 102 }, - { command: 'L', x: 13, y: 104 }, - { command: 'C', x1: 15, y1: 106, x2: 17, y2: 108, x: 19, y: 110 } + {command: 'M', x: 11, y: 102}, + {command: 'L', x: 13, y: 104}, + {command: 'C', x1: 15, y1: 106, x2: 17, y2: 108, x: 19, y: 110} ]); }); @@ -132,9 +132,9 @@ describe('SvgPath', () => { }); expect(path.pathElements).toEqual([ - { command: 'M', x: 1, y: 100 }, - { command: 'L', x: 3, y: 100 }, - { command: 'C', x1: 5, y1: 100, x2: 7, y2: 100, x: 0, y: 0 } + {command: 'M', x: 1, y: 100}, + {command: 'L', x: 3, y: 100}, + {command: 'C', x1: 5, y1: 100, x2: 7, y2: 100, x: 0, y: 0} ]); }); diff --git a/src/svg/svg.js b/src/svg/svg.js index 4a603404..9108e8a6 100644 --- a/src/svg/svg.js +++ b/src/svg/svg.js @@ -70,7 +70,7 @@ export class Svg { } if(key.indexOf(':') !== -1) { - var namespacedAttribute = key.split(':'); + const namespacedAttribute = key.split(':'); this._node.setAttributeNS(namespaces[namespacedAttribute[0]], key, attributes[key]); } else { this._node.setAttribute(key, attributes[key]); @@ -375,7 +375,7 @@ export class Svg { Object.keys(animations).forEach((attribute) => { - const createAnimate = (animationDefinition, guided) => { + const createAnimate = (animationDefinition, createGuided) => { const attributeProperties = {}; let animationEasing; let timeout; @@ -401,7 +401,7 @@ export class Svg { } // Adding "fill: freeze" if we are in guided mode and set initial attribute values - if(guided) { + if(createGuided) { animationDefinition.fill = 'freeze'; // Animated property on our element should already be set to the animation from value in guided mode attributeProperties[attribute] = animationDefinition.from; @@ -417,7 +417,7 @@ export class Svg { attributeName: attribute }, animationDefinition)); - if(guided) { + if(createGuided) { // If guided we take the value that was put aside in timeout and trigger the animation manually with a timeout setTimeout(() => { // If beginElement fails we set the animated attribute to the end position and remove the animate element @@ -454,7 +454,7 @@ export class Svg { }); } - if(guided) { + if(createGuided) { // Set animated attribute to current animated value attributeProperties[attribute] = animationDefinition.to; this.attr(attributeProperties); diff --git a/src/testing/fixtures.js b/src/testing/fixtures.js index 8501638d..28c09951 100644 --- a/src/testing/fixtures.js +++ b/src/testing/fixtures.js @@ -1,7 +1,7 @@ export let container = null; export function initializeFixtures() { - if (!container) { + if(!container) { container = document.createElement('div'); container.setAttribute('data-fixture-container', `${+new Date()}`); document.body.appendChild(container); @@ -9,14 +9,14 @@ export function initializeFixtures() { } export function destroyFixtures() { - if (container) { - document.body.removeChild(container); - container = null; - } + if(container) { + document.body.removeChild(container); + container = null; } +} export function loadFixture(path) { - if (!container) { + if(!container) { initializeFixtures(); } diff --git a/src/testing/jasmine-dom-matchers.js b/src/testing/jasmine-dom-matchers.js index d09c4b2c..ff671a43 100644 --- a/src/testing/jasmine-dom-matchers.js +++ b/src/testing/jasmine-dom-matchers.js @@ -13,9 +13,6 @@ function createCustomMatchers(matchers) { const domMatchers = { toHaveClass(actual, expected) { - console.log(actual); - console.log(expected); - const pass = actual.classList.contains(expected); return { pass, diff --git a/yarn.lock b/yarn.lock index 2c197b35..5a6b8e93 100644 --- a/yarn.lock +++ b/yarn.lock @@ -18,10 +18,35 @@ accepts@1.1.4: mime-types "~2.0.4" negotiator "0.4.9" +acorn-jsx@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" + dependencies: + acorn "^3.0.4" + +acorn@^3.0.4: + version "3.3.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" + +acorn@^4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.3.tgz#1a3e850b428e73ba6b09d1cc527f5aaad4d03ef1" + after@0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/after/-/after-0.8.1.tgz#ab5d4fb883f596816d3515f8f791c0af486dd627" +ajv-keywords@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.1.1.tgz#02550bc605a3e576041565628af972e06c549d50" + +ajv@^4.7.0: + version "4.8.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.8.2.tgz#65486936ca36fea39a1504332a78bebd5d447bdc" + dependencies: + co "^4.6.0" + json-stable-stringify "^1.0.1" + align-text@^0.1.1, align-text@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" @@ -38,6 +63,10 @@ amdefine@>=0.0.4: version "1.0.0" resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.0.tgz#fd17474700cb5cc9c2b709f0be9d23ce3c198c33" +ansi-escapes@^1.1.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" + ansi-regex@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.0.0.tgz#c5061b6e0ef8a81775e50f5d66151bf6bf371107" @@ -99,6 +128,16 @@ array-slice@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5" +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + dependencies: + array-uniq "^1.0.1" + +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + array-unique@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" @@ -214,6 +253,15 @@ babel-core@^6.16.0, babel-core@^6.9.0: slash "^1.0.0" source-map "^0.5.0" +babel-eslint: + version "7.1.0" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-7.1.0.tgz#d506a5174ba224e25a2d17e128e2ba8987139ddc" + dependencies: + babel-traverse "^6.15.0" + babel-types "^6.15.0" + babylon "^6.11.2" + lodash.pickby "^4.6.0" + babel-generator@^6.17.0: version "6.17.0" resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.17.0.tgz#b894e3808beef7800f2550635bfe024b6226cf33" @@ -305,6 +353,20 @@ babel-template@^6.14.0, babel-template@^6.16.0, babel-template@^6.9.0: babylon "^6.11.0" lodash "^4.2.0" +babel-traverse@^6.15.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.18.0.tgz#5aeaa980baed2a07c8c47329cd90c3b90c80f05e" + dependencies: + babel-code-frame "^6.16.0" + babel-messages "^6.8.0" + babel-runtime "^6.9.0" + babel-types "^6.18.0" + babylon "^6.11.0" + debug "^2.2.0" + globals "^9.0.0" + invariant "^2.2.0" + lodash "^4.2.0" + babel-traverse@^6.16.0: version "6.16.0" resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.16.0.tgz#fba85ae1fd4d107de9ce003149cc57f53bef0c4f" @@ -319,6 +381,15 @@ babel-traverse@^6.16.0: invariant "^2.2.0" lodash "^4.2.0" +babel-types@^6.15.0, babel-types@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.18.0.tgz#1f7d5a73474c59eb9151b2417bbff4e4fce7c3f8" + dependencies: + babel-runtime "^6.9.1" + esutils "^2.0.2" + lodash "^4.2.0" + to-fast-properties "^1.0.1" + babel-types@^6.16.0, babel-types@^6.8.0: version "6.16.0" resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.16.0.tgz#71cca1dbe5337766225c5c193071e8ebcbcffcfe" @@ -332,6 +403,10 @@ babylon@^6.11.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.13.0.tgz#58ed40dd2a8120612be5f318c2c0bedbebde4a0b" +babylon@^6.11.2: + version "6.13.1" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.13.1.tgz#adca350e088f0467647157652bafead6ddb8dfdb" + backo2@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" @@ -528,10 +603,20 @@ bytes@2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.4.0.tgz#7d97196f9d5baf7f6935e25985549edd2a6c2339" +caller-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" + dependencies: + callsites "^0.2.0" + callsite@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" +callsites@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" + camelcase-keys@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" @@ -566,7 +651,7 @@ center-align@^0.1.1: align-text "^0.1.3" lazy-cache "^1.0.3" -chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: +chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" dependencies: @@ -606,6 +691,10 @@ chokidar@1.6.0: optionalDependencies: fsevents "^1.0.0" +circular-json@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.1.tgz#be8b36aefccde8b3ca7aa2d6afc07a37242c0d2d" + clap@^1.0.9: version "1.1.1" resolved "https://registry.yarnpkg.com/clap/-/clap-1.1.1.tgz#a8a93e0bfb7581ac199c4f001a5525a724ce696d" @@ -621,6 +710,16 @@ cli-color@^0.3.2: memoizee "~0.3.8" timers-ext "0.1" +cli-cursor@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" + dependencies: + restore-cursor "^1.0.1" + +cli-width@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.1.0.tgz#b234ca209b29ef66fc518d9b98d5847b00edf00a" + cliui@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" @@ -641,6 +740,10 @@ clone@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149" +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + coa@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/coa/-/coa-1.0.1.tgz#7f959346cfc8719e3f7233cd6852854a7c67d8a3" @@ -725,6 +828,14 @@ concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" +concat-stream@^1.4.6: + version "1.5.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.5.2.tgz#708978624d856af41a5a741defdd261da752c266" + dependencies: + inherits "~2.0.1" + readable-stream "~2.0.0" + typedarray "~0.0.5" + concat-stream@1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.5.0.tgz#53f7d43c51c5e43f81c8fdd03321c631be68d611" @@ -903,10 +1014,26 @@ deep-extend@~0.4.0: version "0.4.1" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.1.tgz#efe4113d08085f4e6f9687759810f807469e2253" +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + defined@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" +del@^2.0.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" + dependencies: + globby "^5.0.0" + is-path-cwd "^1.0.0" + is-path-in-cwd "^1.0.0" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + rimraf "^2.2.8" + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -945,6 +1072,13 @@ di@^0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" +doctrine@^1.2.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" + dependencies: + esutils "^2.0.2" + isarray "^1.0.0" + dom-serialize@^2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b" @@ -1080,7 +1214,7 @@ error-ex@^1.2.0: dependencies: is-arrayish "^0.2.1" -es5-ext@^0.10.12, es5-ext@^0.10.7, es5-ext@^0.10.9, es5-ext@~0.10.11, es5-ext@~0.10.2, es5-ext@~0.10.5, es5-ext@~0.10.6, es5-ext@~0.10.7: +es5-ext@^0.10.12, es5-ext@^0.10.7, es5-ext@^0.10.8, es5-ext@^0.10.9, es5-ext@~0.10.11, es5-ext@~0.10.2, es5-ext@~0.10.5, es5-ext@~0.10.6, es5-ext@~0.10.7: version "0.10.12" resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.12.tgz#aa84641d4db76b62abba5e45fd805ecbab140047" dependencies: @@ -1103,11 +1237,32 @@ es6-iterator@2: es5-ext "^0.10.7" es6-symbol "3" +es6-map@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.4.tgz#a34b147be224773a4d7da8072794cefa3632b897" + dependencies: + d "~0.1.1" + es5-ext "~0.10.11" + es6-iterator "2" + es6-set "~0.1.3" + es6-symbol "~3.1.0" + event-emitter "~0.3.4" + es6-promise@~4.0.3: version "4.0.5" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.0.5.tgz#7882f30adde5b240ccfa7f7d78c548330951ae42" -es6-symbol@^3.0.2, es6-symbol@~3.1, es6-symbol@3: +es6-set@~0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.4.tgz#9516b6761c2964b92ff479456233a247dc707ce8" + dependencies: + d "~0.1.1" + es5-ext "~0.10.11" + es6-iterator "2" + es6-symbol "3" + event-emitter "~0.3.4" + +es6-symbol@^3.0.2, es6-symbol@~3.1, es6-symbol@~3.1.0, es6-symbol@3: version "3.1.0" resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.0.tgz#94481c655e7a7cad82eba832d97d5433496d7ffa" dependencies: @@ -1128,6 +1283,15 @@ es6-template-strings@^2.0.0: es5-ext "^0.10.12" esniff "^1.1" +es6-weak-map@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.1.tgz#0d2bbd8827eb5fb4ba8f97fbfea50d43db21ea81" + dependencies: + d "^0.1.1" + es5-ext "^0.10.8" + es6-iterator "2" + es6-symbol "3" + es6-weak-map@~0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-0.1.4.tgz#706cef9e99aa236ba7766c239c8b9e286ea7d228" @@ -1141,10 +1305,57 @@ escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" -escape-string-regexp@^1.0.2: +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" +escope@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" + dependencies: + es6-map "^0.1.3" + es6-weak-map "^2.0.1" + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint: + version "3.8.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-3.8.1.tgz#7d02db44cd5aaf4fa7aa489e1f083baa454342ba" + dependencies: + chalk "^1.1.3" + concat-stream "^1.4.6" + debug "^2.1.1" + doctrine "^1.2.2" + escope "^3.6.0" + espree "^3.3.1" + estraverse "^4.2.0" + esutils "^2.0.2" + file-entry-cache "^2.0.0" + glob "^7.0.3" + globals "^9.2.0" + ignore "^3.1.5" + imurmurhash "^0.1.4" + inquirer "^0.12.0" + is-my-json-valid "^2.10.0" + is-resolvable "^1.0.0" + js-yaml "^3.5.1" + json-stable-stringify "^1.0.0" + levn "^0.3.0" + lodash "^4.0.0" + mkdirp "^0.5.0" + natural-compare "^1.4.0" + optionator "^0.8.2" + path-is-inside "^1.0.1" + pluralize "^1.2.1" + progress "^1.1.8" + require-uncached "^1.0.2" + shelljs "^0.6.0" + strip-bom "^3.0.0" + strip-json-comments "~1.0.1" + table "^3.7.8" + text-table "~0.2.0" + user-home "^2.0.0" + esniff@^1.1: version "1.1.0" resolved "https://registry.yarnpkg.com/esniff/-/esniff-1.1.0.tgz#c66849229f91464dede2e0d40201ed6abf65f2ac" @@ -1152,10 +1363,32 @@ esniff@^1.1: d "1" es5-ext "^0.10.12" +espree@^3.3.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/espree/-/espree-3.3.2.tgz#dbf3fadeb4ecb4d4778303e50103b3d36c88b89c" + dependencies: + acorn "^4.0.1" + acorn-jsx "^3.0.0" + esprima@^2.6.0: version "2.7.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" +esrecurse@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.1.0.tgz#4713b6536adf7f2ac4f327d559e7756bff648220" + dependencies: + estraverse "~4.1.0" + object-assign "^4.0.1" + +estraverse@^4.1.1, estraverse@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" + +estraverse@~4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.1.1.tgz#f6caca728933a850ef90661d0e17982ba47111a2" + esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" @@ -1181,6 +1414,10 @@ exec-sh@^0.2.0: dependencies: merge "^1.1.3" +exit-hook@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" + expand-braces@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/expand-braces/-/expand-braces-0.1.2.tgz#488b1d1d2451cb3d3a6b192cfc030f44c5855fea" @@ -1246,6 +1483,10 @@ extsprintf@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" +fast-levenshtein@~2.0.4: + version "2.0.5" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.5.tgz#bd33145744519ab1c36c3ee9f31f08e9079b67f2" + fb-watchman@^1.8.0: version "1.9.0" resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-1.9.0.tgz#6f268f1f347a6b3c875d1e89da7e1ed79adfc0ec" @@ -1258,6 +1499,20 @@ fd-slicer@~1.0.1: dependencies: pend "~1.2.0" +figures@^1.3.5: + version "1.7.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" + dependencies: + escape-string-regexp "^1.0.5" + object-assign "^4.1.0" + +file-entry-cache@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" + dependencies: + flat-cache "^1.2.1" + object-assign "^4.0.1" + filename-regex@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.0.tgz#996e3e80479b98b9897f15a8a58b3d084e926775" @@ -1314,6 +1569,15 @@ flagged-respawn@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-0.3.2.tgz#ff191eddcd7088a675b2610fffc976be9b8074b5" +flat-cache@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.2.1.tgz#6c837d6225a7de5659323740b36d5361f71691ff" + dependencies: + circular-json "^0.3.0" + del "^2.0.2" + graceful-fs "^4.1.2" + write "^0.2.1" + flatten@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782" @@ -1547,6 +1811,21 @@ globals@^8.3.0: version "8.18.0" resolved "https://registry.yarnpkg.com/globals/-/globals-8.18.0.tgz#93d4a62bdcac38cfafafc47d6b034768cb0ffcb4" +globals@^9.0.0, globals@^9.2.0: + version "9.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.12.0.tgz#992ce90828c3a55fa8f16fada177adb64664cf9d" + +globby@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" + dependencies: + array-union "^1.0.1" + arrify "^1.0.0" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + globule@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/globule/-/globule-1.0.0.tgz#f22aebaacce02be492453e979c3ae9b6983f1c6c" @@ -1689,10 +1968,18 @@ iconv-lite@0.4.13: version "0.4.13" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2" +ignore@^3.1.5: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.2.0.tgz#8d88f03c3002a0ac52114db25d2c673b0bf1e435" + immutable@^3.7.6, immutable@3.8.1: version "3.8.1" resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.1.tgz#200807f11ab0f72710ea485542de088075f68cd2" +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + in-publish@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51" @@ -1730,6 +2017,24 @@ ini@^1.3.4, ini@~1.3.0: version "1.3.4" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" +inquirer@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.12.0.tgz#1ef2bfd63504df0bc75785fff8c2c41df12f077e" + dependencies: + ansi-escapes "^1.1.0" + ansi-regex "^2.0.0" + chalk "^1.0.0" + cli-cursor "^1.0.1" + cli-width "^2.0.0" + figures "^1.3.5" + lodash "^4.3.0" + readline2 "^1.0.1" + run-async "^0.1.0" + rx-lite "^3.1.2" + string-width "^1.0.1" + strip-ansi "^3.0.0" + through "^2.3.6" + interpolate: version "0.1.0" resolved "https://registry.yarnpkg.com/interpolate/-/interpolate-0.1.0.tgz#b60177a4ba941fb3724c821905d99aade13d1df9" @@ -1805,13 +2110,17 @@ is-fullwidth-code-point@^1.0.0: dependencies: number-is-nan "^1.0.0" +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + is-glob@^2.0.0, is-glob@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" dependencies: is-extglob "^1.0.0" -is-my-json-valid@^2.12.4: +is-my-json-valid@^2.10.0, is-my-json-valid@^2.12.4: version "2.15.0" resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.15.0.tgz#936edda3ca3c211fd98f3b2d3e08da43f7b2915b" dependencies: @@ -1830,6 +2139,22 @@ is-number@^2.0.2, is-number@^2.1.0: dependencies: kind-of "^3.0.2" +is-path-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" + +is-path-in-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" + dependencies: + is-path-inside "^1.0.0" + +is-path-inside@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f" + dependencies: + path-is-inside "^1.0.1" + is-plain-obj@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" @@ -1852,6 +2177,12 @@ is-relative@^0.2.1: dependencies: is-unc-path "^0.1.1" +is-resolvable@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.0.0.tgz#8df57c61ea2e3c501408d100fb013cf8d6e0cc62" + dependencies: + tryit "^1.0.1" + is-stream@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" @@ -1884,7 +2215,7 @@ is@~0.2.6: version "0.2.7" resolved "https://registry.yarnpkg.com/is/-/is-0.2.7.tgz#3b34a2c48f359972f35042849193ae7264b63562" -isarray@~1.0.0, isarray@1.0.0: +isarray@^1.0.0, isarray@~1.0.0, isarray@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" @@ -1932,7 +2263,7 @@ js-tokens@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-2.0.0.tgz#79903f5563ee778cc1162e6dcf1a0027c97f9cb5" -js-yaml@~3.6.1: +js-yaml@^3.5.1, js-yaml@~3.6.1: version "3.6.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.6.1.tgz#6e5fe67d8b205ce4d22fad05b7781e8dadcc4b30" dependencies: @@ -1951,6 +2282,12 @@ json-schema@0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" +json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + dependencies: + jsonify "~0.0.0" + json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" @@ -1973,6 +2310,10 @@ jsonfile@^2.1.0: optionalDependencies: graceful-fs "^4.1.6" +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + jsonpointer@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.0.tgz#6661e161d2fc445f19f98430231343722e1fcbd5" @@ -2130,6 +2471,13 @@ lcid@^1.0.0: dependencies: invert-kv "^1.0.0" +levn@^0.3.0, levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + liftoff@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-2.3.0.tgz#a98f2ff67183d8ba7cfaca10548bd7ff0550b385" @@ -2203,11 +2551,15 @@ lodash.pick@^4.2.1: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" +lodash.pickby@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.pickby/-/lodash.pickby-4.6.0.tgz#7dea21d8c18d7703a27c704c15d3b84a67e33aff" + lodash@^3.10.1, lodash@^3.8.0: version "3.10.1" resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" -lodash@^4.0.0, lodash@^4.0.1, lodash@^4.14.0, lodash@^4.2.0, lodash@^4.5.0: +lodash@^4.0.0, lodash@^4.0.1, lodash@^4.14.0, lodash@^4.2.0, lodash@^4.3.0, lodash@^4.5.0: version "4.16.4" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.16.4.tgz#01ce306b9bad1319f2a5528674f88297aeb70127" @@ -2410,6 +2762,10 @@ ms@0.7.1: version "0.7.1" resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" +mute-stream@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0" + mz@^2.3.1: version "2.4.0" resolved "https://registry.yarnpkg.com/mz/-/mz-2.4.0.tgz#987ba9624d89395388c37cb4741e2caf4dd13b1a" @@ -2422,6 +2778,10 @@ nan@^2.3.0, nan@^2.3.2: version "2.4.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.4.0.tgz#fb3c59d45fe4effe215f0b890f8adf6eb32d2232" +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + ncp@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ncp/-/ncp-2.0.0.tgz#195a21d6c46e361d2fb1281ba38b91e9df7bdbb3" @@ -2620,6 +2980,10 @@ once@~1.3.0, once@~1.3.3: dependencies: wrappy "1" +onetime@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" + openurl@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/openurl/-/openurl-1.1.0.tgz#e2f2189d999c04823201f083f0f1a7cd8903187a" @@ -2638,6 +3002,17 @@ optimist@^0.6.1: minimist "~0.0.1" wordwrap "~0.0.2" +optionator@^0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" + dependencies: + 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" + options@>=0.0.5: version "0.0.6" resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f" @@ -2728,6 +3103,10 @@ path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" +path-is-inside@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + path-root-regex@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d" @@ -2778,6 +3157,10 @@ pinkie@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" +pluralize@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45" + portscanner@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/portscanner/-/portscanner-1.0.0.tgz#3b5cfe393828b5160abc600e6270ebc2f1590558" @@ -2989,6 +3372,10 @@ postcss-zindex@^2.0.1: postcss "^5.0.4" uniqs "^2.0.0" +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + prepend-http@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" @@ -3005,7 +3392,7 @@ process-nextick-args@~1.0.6: version "1.0.7" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" -progress@~1.1.8: +progress@^1.1.8, progress@~1.1.8: version "1.1.8" resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" @@ -3148,6 +3535,14 @@ readdirp@^2.0.0: readable-stream "^2.0.2" set-immediate-shim "^1.0.1" +readline2@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35" + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + mute-stream "0.0.5" + rechoir@^0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" @@ -3300,6 +3695,13 @@ require-main-filename@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" +require-uncached@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.2.tgz#67dad3b733089e77030124678a459589faf6a7ec" + dependencies: + caller-path "^0.1.0" + resolve-from "^1.0.0" + requires-port@1.x.x: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" @@ -3311,6 +3713,10 @@ resolve-dir@^0.1.0: expand-tilde "^1.2.2" global-modules "^0.2.3" +resolve-from@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" + resolve@^1.1.6, resolve@^1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" @@ -3322,6 +3728,13 @@ resp-modifier@6.0.2: debug "^2.2.0" minimatch "^3.0.2" +restore-cursor@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" + dependencies: + exit-hook "^1.0.0" + onetime "^1.0.0" + retry@^0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.0.tgz#649e15ca408422d98318161935e7f7d652d435dd" @@ -3354,6 +3767,16 @@ rsvp@^3.0.13, rsvp@^3.0.18: version "3.3.3" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.3.3.tgz#34633caaf8bc66ceff4be3c2e1dffd032538a813" +run-async@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389" + dependencies: + once "^1.3.0" + +rx-lite@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102" + rx@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" @@ -3448,6 +3871,10 @@ shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" +shelljs@^0.6.0: + version "0.6.1" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.6.1.tgz#ec6211bed1920442088fe0f70b2837232ed2c8a8" + sigmund@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" @@ -3460,6 +3887,10 @@ slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" +slice-ansi@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" + sntp@1.x.x: version "1.0.9" resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" @@ -3635,6 +4066,13 @@ string-width@^1.0.1, string-width@^1.0.2: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" +string-width@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.0.0.tgz#635c5436cc72a6e0c387ceca278d4e2eec52687e" + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^3.0.0" + stringstream@~0.0.4: version "0.0.5" resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" @@ -3651,13 +4089,17 @@ strip-bom@^2.0.0: dependencies: is-utf8 "^0.2.0" +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + strip-indent@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" dependencies: get-stdin "^4.0.1" -strip-json-comments@~1.0.4: +strip-json-comments@~1.0.1, strip-json-comments@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91" @@ -3709,6 +4151,17 @@ systemjs@^0.19.39, systemjs@0.19.39: dependencies: when "^3.7.5" +table@^3.7.8: + version "3.8.3" + resolved "https://registry.yarnpkg.com/table/-/table-3.8.3.tgz#2bbc542f0fda9861a755d3947fefd8b3f513855f" + dependencies: + ajv "^4.7.0" + ajv-keywords "^1.0.0" + chalk "^1.1.1" + lodash "^4.0.0" + slice-ansi "0.0.4" + string-width "^2.0.0" + tar-fs@^1.13.0: version "1.14.0" resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-1.14.0.tgz#f99cc074bf33bed21cd921a21720797bb18e6c96" @@ -3747,6 +4200,10 @@ tar@^2.0.0, tar@~2.2.0, tar@~2.2.1: fstream "^1.0.2" inherits "2" +text-table@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + tfunk@^3.0.1: version "3.0.2" resolved "https://registry.yarnpkg.com/tfunk/-/tfunk-3.0.2.tgz#327ebc6176af2680c6cd0d6d22297c79d7f96efd" @@ -3770,6 +4227,10 @@ throttleit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c" +through@^2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + timers-ext@0.1: version "0.1.0" resolved "https://registry.yarnpkg.com/timers-ext/-/timers-ext-0.1.0.tgz#00345a2ca93089d1251322054389d263e27b77e2" @@ -3817,6 +4278,10 @@ trim-newlines@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" +tryit@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.2.tgz#c196b0073e6b1c595d93c9c830855b7acc32a453" + tunnel-agent@~0.4.1: version "0.4.3" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" @@ -3825,6 +4290,12 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.3" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.3.tgz#3da382f670f25ded78d7b3d1792119bca0b7132d" +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + dependencies: + prelude-ls "~1.1.2" + type-is@~1.6.13: version "1.6.13" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.13.tgz#6e83ba7bc30cd33a7bb0b7fb00737a2085bf9d08" @@ -3891,6 +4362,12 @@ user-home@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" +user-home@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f" + dependencies: + os-homedir "^1.0.0" + useragent@^2.1.9: version "2.1.9" resolved "https://registry.yarnpkg.com/useragent/-/useragent-2.1.9.tgz#4dba2bc4dad1875777ab15de3ff8098b475000b7" @@ -3988,6 +4465,10 @@ wordwrap@~0.0.2: version "0.0.3" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" +wordwrap@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + wordwrap@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" @@ -4002,6 +4483,12 @@ wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" +write@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" + dependencies: + mkdirp "^0.5.1" + ws@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/ws/-/ws-1.0.1.tgz#7d0b2a2e58cddd819039c29c9de65045e1b310e9" From eba2255474f09771e1eaa09f47e8e5345634d90d Mon Sep 17 00:00:00 2001 From: Gion Date: Wed, 6 Apr 2022 10:39:43 +0200 Subject: [PATCH 08/44] WIP Temporary fixes to make build and start work again --- README.md | 12 + dist/chartist.css | 42 - dist/chartist.css.map | 2 +- dist/chartist.esm.js | 40 +- dist/chartist.esm.js.map | 2 +- dist/chartist.min.css | 2 +- dist/chartist.min.css.map | 2 +- dist/chartist.umd.js | 5 +- dist/chartist.umd.js.map | 2 +- package-lock.json | 8327 +++++++++++++++++++++++++++++++++++++ package.json | 30 +- src/core/globals.js | 1 - 12 files changed, 8377 insertions(+), 90 deletions(-) create mode 100644 package-lock.json diff --git a/README.md b/README.md index 348946be..fd92fa04 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,17 @@ # Big welcome by the Chartist Guy +Note: This is the readme of chartist 1 and should be rewritten for version 2 which is currently under development within this repository. + +## Developer information Version 2 WIP + +``` +npm i +npx jspm i +npm run build +OR +npm start +``` + [![Join the chat at https://gitter.im/gionkunz/chartist-js](https://badges.gitter.im/gionkunz/chartist-js.svg)](https://gitter.im/gionkunz/chartist-js?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![npm version](http://img.shields.io/npm/v/chartist.svg)](https://npmjs.org/package/chartist) [![build status](http://img.shields.io/travis/gionkunz/chartist-js.svg)](https://travis-ci.org/gionkunz/chartist-js) [![Inline docs](http://inch-ci.org/github/gionkunz/chartist-js.svg?branch=develop)](http://inch-ci.org/github/gionkunz/chartist-js) diff --git a/dist/chartist.css b/dist/chartist.css index f5ff2388..71e2415a 100644 --- a/dist/chartist.css +++ b/dist/chartist.css @@ -7,8 +7,6 @@ .ct-chart-line .ct-label, .ct-chart-bar .ct-label { display: block; - display: -webkit-box; - display: -ms-flexbox; display: flex; } .ct-chart-pie .ct-label, @@ -16,101 +14,61 @@ dominant-baseline: central; } .ct-label.ct-horizontal.ct-start { - -webkit-box-align: flex-end; - -ms-flex-align: flex-end; align-items: flex-end; - -webkit-box-pack: flex-start; - -ms-flex-pack: flex-start; justify-content: flex-start; text-align: left; text-anchor: start; } .ct-label.ct-horizontal.ct-end { - -webkit-box-align: flex-start; - -ms-flex-align: flex-start; align-items: flex-start; - -webkit-box-pack: flex-start; - -ms-flex-pack: flex-start; justify-content: flex-start; text-align: left; text-anchor: start; } .ct-label.ct-vertical.ct-start { - -webkit-box-align: flex-end; - -ms-flex-align: flex-end; align-items: flex-end; - -webkit-box-pack: flex-end; - -ms-flex-pack: flex-end; justify-content: flex-end; text-align: right; text-anchor: end; } .ct-label.ct-vertical.ct-end { - -webkit-box-align: flex-end; - -ms-flex-align: flex-end; align-items: flex-end; - -webkit-box-pack: flex-start; - -ms-flex-pack: flex-start; justify-content: flex-start; text-align: left; text-anchor: start; } .ct-chart-bar .ct-label.ct-horizontal.ct-start { - -webkit-box-align: flex-end; - -ms-flex-align: flex-end; align-items: flex-end; - -webkit-box-pack: center; - -ms-flex-pack: center; justify-content: center; text-align: center; text-anchor: start; } .ct-chart-bar .ct-label.ct-horizontal.ct-end { - -webkit-box-align: flex-start; - -ms-flex-align: flex-start; align-items: flex-start; - -webkit-box-pack: center; - -ms-flex-pack: center; justify-content: center; text-align: center; text-anchor: start; } .ct-chart-bar.ct-horizontal-bars .ct-label.ct-horizontal.ct-start { - -webkit-box-align: flex-end; - -ms-flex-align: flex-end; align-items: flex-end; - -webkit-box-pack: flex-start; - -ms-flex-pack: flex-start; justify-content: flex-start; text-align: left; text-anchor: start; } .ct-chart-bar.ct-horizontal-bars .ct-label.ct-horizontal.ct-end { - -webkit-box-align: flex-start; - -ms-flex-align: flex-start; align-items: flex-start; - -webkit-box-pack: flex-start; - -ms-flex-pack: flex-start; justify-content: flex-start; text-align: left; text-anchor: start; } .ct-chart-bar.ct-horizontal-bars .ct-label.ct-vertical.ct-start { - -webkit-box-align: center; - -ms-flex-align: center; align-items: center; - -webkit-box-pack: flex-end; - -ms-flex-pack: flex-end; justify-content: flex-end; text-align: right; text-anchor: end; } .ct-chart-bar.ct-horizontal-bars .ct-label.ct-vertical.ct-end { - -webkit-box-align: center; - -ms-flex-align: center; align-items: center; - -webkit-box-pack: flex-start; - -ms-flex-pack: flex-start; justify-content: flex-start; text-align: left; text-anchor: end; } diff --git a/dist/chartist.css.map b/dist/chartist.css.map index 74426712..6a838f9b 100644 --- a/dist/chartist.css.map +++ b/dist/chartist.css.map @@ -1 +1 @@ -{"version":3,"sources":["src/styles/chartist.scss","src/styles/settings/_chartist-settings.scss"],"names":[],"mappings":"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","file":"chartist.css"} \ No newline at end of file +{"version":3,"sources":["src/styles/chartist.scss","src/styles/settings/_chartist-settings.scss"],"names":[],"mappings":"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","file":"chartist.css"} \ No newline at end of file diff --git a/dist/chartist.esm.js b/dist/chartist.esm.js index f3b8ca63..41e969f6 100644 --- a/dist/chartist.esm.js +++ b/dist/chartist.esm.js @@ -1,11 +1,9 @@ /* Chartist.js 1.0.0 - * Copyright © 2016 Gion Kunz + * Copyright © 2022 Gion Kunz * Free to use under either the WTFPL license or the MIT license. * https://raw.githubusercontent.com/chartist-js/chartist/master/LICENSE-WTFPL * https://raw.githubusercontent.com/chartist-js/chartist/master/LICENSE-MIT */ -var version = '1.0.0'; - /** * This object contains all namespaces used within Chartist. * @@ -58,7 +56,7 @@ function replaceAll(str, subStr, newSubStr) { * @param {String|Node} query The query to use for selecting a Node or a DOM node that will be returned directly * @return {Node} */ -function querySelector$1(query) { +function querySelector(query) { return query instanceof Node ? query : document.querySelector(query); } @@ -962,7 +960,6 @@ var Svg = function () { * @return {Object|String} The current wrapper object will be returned so it can be used for chaining or the attribute value if used as getter function. */ - _createClass(Svg, [{ key: 'attr', value: function attr(attributes, ns) { @@ -1048,7 +1045,7 @@ var Svg = function () { }, { key: 'querySelector', - value: function querySelector(selector) { + value: function querySelector$$1(selector) { var foundNode = this._node.querySelector(selector); return foundNode ? new Svg(foundNode) : null; } @@ -1791,7 +1788,6 @@ var EventEmitter = function () { * @param {Function} handler A event handler function */ - _createClass(EventEmitter, [{ key: 'addEventHandler', value: function addEventHandler(event, handler) { @@ -1871,7 +1867,7 @@ var BaseChart = function () { _classCallCheck(this, BaseChart); - this.container = querySelector$1(query); + this.container = querySelector(query); this.data = data || {}; this.data.labels = this.data.labels || []; this.data.series = this.data.series || []; @@ -2325,7 +2321,7 @@ var elementDescriptions = { * @memberof SvgPath * @type {Object} */ -var defaultOptions$1 = { +var defaultOptions = { // The accuracy in digit count after the decimal point. This will be used to round numbers in the SVG path. If this option is set to false then no rounding will be performed. accuracy: 3 }; @@ -2385,7 +2381,7 @@ var SvgPath = function () { this.pathElements = []; this.pos = 0; this.close = close; - this.options = extend({}, defaultOptions$1, options); + this.options = extend({}, defaultOptions, options); } /** @@ -2396,7 +2392,6 @@ var SvgPath = function () { * @return {SvgPath|Number} If the position parameter was passed then the return value will be the path object for easy call chaining. If no position parameter was passed then the current position is returned. */ - _createClass(SvgPath, [{ key: 'position', value: function position(pos) { @@ -3102,12 +3097,12 @@ function monotoneCubic(options) { -var interpolation = Object.freeze({ - none: none, - simple: simple, - step: step, - cardinal: cardinal, - monotoneCubic: monotoneCubic +var interpolation = /*#__PURE__*/Object.freeze({ + none: none, + simple: simple, + step: step, + cardinal: cardinal, + monotoneCubic: monotoneCubic }); /** @@ -3115,7 +3110,7 @@ var interpolation = Object.freeze({ * * @memberof Chartist.Line */ -var defaultOptions = { +var defaultOptions$1 = { // Options for X-Axis axisX: { // The offset of the labels to the chart area @@ -3297,7 +3292,7 @@ var LineChart = function (_BaseChart) { function LineChart(query, data, options, responsiveOptions) { _classCallCheck(this, LineChart); - return _possibleConstructorReturn(this, (LineChart.__proto__ || Object.getPrototypeOf(LineChart)).call(this, query, data, defaultOptions, extend({}, defaultOptions, options), responsiveOptions)); + return _possibleConstructorReturn(this, (LineChart.__proto__ || Object.getPrototypeOf(LineChart)).call(this, query, data, defaultOptions$1, extend({}, defaultOptions$1, options), responsiveOptions)); } /** @@ -3305,7 +3300,6 @@ var LineChart = function (_BaseChart) { * */ - _createClass(LineChart, [{ key: 'createChart', value: function createChart(options) { @@ -3320,7 +3314,7 @@ var LineChart = function (_BaseChart) { var seriesGroup = this.svg.elem('g'); var labelGroup = this.svg.elem('g').addClass(options.classNames.labelGroup); - var chartRect = createChartRect(this.svg, options, defaultOptions.padding); + var chartRect = createChartRect(this.svg, options, defaultOptions$1.padding); var axisX = void 0; var axisY = void 0; @@ -3670,7 +3664,6 @@ var BarChart = function (_BaseChart) { * */ - _createClass(BarChart, [{ key: 'createChart', value: function createChart(options) { @@ -4089,7 +4082,6 @@ var PieChart = function (_BaseChart) { * @param options */ - _createClass(PieChart, [{ key: 'createChart', value: function createChart(options) { @@ -4290,6 +4282,6 @@ var PieChart = function (_BaseChart) { return PieChart; }(BaseChart); -export { interpolation as Interpolation, EventEmitter, extend, optionsProvider, namespaces, precision, escapingMap, version, replaceAll, querySelector$1 as querySelector, safeHasProperty, isNumeric, isFalseyButZero, getNumberOrUndefined, ensureUnit, quantity, alphaNumerate, noop, times, sum, serialMap, EPSILON, orderOfMagnitude, projectLength, roundWithPrecision, rho, polarToCartesian, serialize, deserialize, normalizeData, getMetaData, isDataHoleValue, reverseData, getDataArray, isMultiValue, getMultiValue, getSeriesOption, splitIntoSegments, getHighLow, getBounds, createSvg, normalizePadding, createChartRect, createGrid, createGridBackground, createLabel, BaseChart, LineChart, BarChart, PieChart, Axis, axisUnits, AutoScaleAxis, FixedScaleAxis, StepAxis, Svg, isSupported, easings, SvgList, SvgPath }; +export { interpolation as Interpolation, EventEmitter, extend, optionsProvider, namespaces, precision, escapingMap, replaceAll, querySelector, safeHasProperty, isNumeric, isFalseyButZero, getNumberOrUndefined, ensureUnit, quantity, alphaNumerate, noop, times, sum, serialMap, EPSILON, orderOfMagnitude, projectLength, roundWithPrecision, rho, polarToCartesian, serialize, deserialize, normalizeData, getMetaData, isDataHoleValue, reverseData, getDataArray, isMultiValue, getMultiValue, getSeriesOption, splitIntoSegments, getHighLow, getBounds, createSvg, normalizePadding, createChartRect, createGrid, createGridBackground, createLabel, BaseChart, LineChart, BarChart, PieChart, Axis, axisUnits, AutoScaleAxis, FixedScaleAxis, StepAxis, Svg, isSupported, easings, SvgList, SvgPath }; //# sourceMappingURL=chartist.esm.js.map \ No newline at end of file diff --git a/dist/chartist.esm.js.map b/dist/chartist.esm.js.map index 4bd851fb..520b2c8c 100644 --- a/dist/chartist.esm.js.map +++ b/dist/chartist.esm.js.map @@ -1 +1 @@ -{"version":3,"sources":["../package.json!file:/home/gion/Code/chartist/tooling/system-loaders/package.json","../src/core/globals.js","../src/core/lang.js","../jspm_packages/npm/systemjs-plugin-babel@0.0.16/babel-helpers/toConsumableArray.js","../src/core/functional.js","../src/core/math.js","../src/core/extend.js","../src/core/data.js","../jspm_packages/npm/systemjs-plugin-babel@0.0.16/babel-helpers/classCallCheck.js","../jspm_packages/npm/systemjs-plugin-babel@0.0.16/babel-helpers/createClass.js","../src/svg/svg-list.js","../src/svg/svg.js","../src/core/creation.js","../src/core/options-provider.js","../src/event/event-emitter.js","../src/charts/base.js","../jspm_packages/npm/systemjs-plugin-babel@0.0.16/babel-helpers/possibleConstructorReturn.js","../jspm_packages/npm/systemjs-plugin-babel@0.0.16/babel-helpers/inherits.js","../src/axes/axis.js","../jspm_packages/npm/systemjs-plugin-babel@0.0.16/babel-helpers/get.js","../src/axes/auto-scale-axis.js","../src/axes/fixed-scale-axis.js","../src/axes/step-axis.js","../src/svg/svg-path.js","../src/interpolation/none.js","../src/interpolation/simple.js","../src/interpolation/step.js","../src/interpolation/cardinal.js","../src/interpolation/monotone-cubic.js","../src/charts/line.js","../src/charts/bar.js","../src/charts/pie.js"],"names":["version","namespaces","precision","escapingMap","replaceAll","str","subStr","newSubStr","replace","RegExp","querySelector","query","Node","document","safeHasProperty","object","property","hasOwnProperty","isNumeric","value","isFinite","isFalseyButZero","getNumberOrUndefined","undefined","ensureUnit","unit","quantity","input","match","exec","alphaNumerate","n","String","fromCharCode","arr","Array","isArray","i","arr2","length","from","noop","times","sum","previous","current","serialMap","array","callback","Math","max","map","element","inner","index","EPSILON","orderOfMagnitude","floor","log","abs","LN10","projectLength","axisLength","bounds","range","roundWithPrecision","digits","pow","globalPrecision","round","rho","num","gcd","p","q","f","x","x1","x2","divisor","polarToCartesian","centerX","centerY","radius","angleInDegrees","angleInRadians","PI","cos","sin","extend","target","sources","source","prop","sourceProp","serialize","data","JSON","stringify","Object","keys","reduce","result","key","deserialize","parse","e","normalizeData","reverse","multi","labelCount","output","normalized","series","getDataArray","every","labels","slice","push","getMetaData","meta","isDataHoleValue","isNaN","reverseData","recursiveConvert","multiValue","y","isMultiValue","getMultiValue","dimension","getSeriesOption","options","name","seriesOptions","splitIntoSegments","pathCoordinates","valueData","defaultOptions","segments","hole","fillHoles","increasingX","getHighLow","toUpperCase","highLow","high","Number","MAX_VALUE","low","findHigh","findLow","recursiveHighLow","sourceData","referenceValue","min","getBounds","scaleMinSpace","onlyInteger","valueRange","oom","step","ceil","numberOfSteps","scaleUp","smallestFactor","optimizationCounter","Error","safeIncrement","increment","newMin","newMax","values","instance","Constructor","TypeError","defineProperties","props","descriptor","enumerable","configurable","writable","defineProperty","protoProps","staticProps","prototype","SvgList","nodeList","list","svgElements","Svg","filter","prototypeProperty","indexOf","forEach","args","apply","attributes","className","parent","insertFirst","Element","_node","createElementNS","svg","attr","ct","addClass","firstChild","insertBefore","appendChild","ns","getAttributeNS","getAttribute","namespacedAttribute","split","setAttributeNS","setAttribute","bind","parentNode","SVGElement","node","nodeName","selector","foundNode","foundNodes","querySelectorAll","content","container","createElement","innerHTML","xmlns","fnObj","elem","t","createTextNode","removeChild","newElement","replaceChild","trim","names","classes","concat","pos","self","join","removedClasses","getBoundingClientRect","height","width","animations","guided","eventEmitter","attribute","createAnimate","animationDefinition","createGuided","attributeProperties","animationEasing","timeout","easing","easings","begin","dur","calcMode","keySplines","keyTimes","fill","animate","beginElement","err","to","remove","addEventListener","emit","isSupported","feature","implementation","hasFeature","createSvg","normalizePadding","padding","fallback","top","right","bottom","left","createChartRect","fallbackPadding","hasAxis","axisX","axisY","yAxisOffset","offset","xAxisOffset","normalizedPadding","chartPadding","chartRect","y1","y2","position","createGrid","axis","group","positionalData","units","counterUnits","gridElement","createGridBackground","gridGroup","gridBackground","createLabel","axisOffset","labelOffset","useForeignObject","labelElement","len","stepLength","stepCounterLength","foreignObject","text","optionsProvider","responsiveOptions","baseOptions","currentOptions","mediaQueryListeners","updateCurrentOptions","mediaEvent","previousOptions","responsiveOption","mql","window","matchMedia","matches","removeMediaQueryListeners","removeListener","addListener","EventEmitter","handlers","event","handler","splice","starHandler","BaseChart","supportsForeignObject","supportsAnimations","resizeListener","update","__chartist__","detach","initializeTimeoutId","setTimeout","initialize","override","createChart","getCurrentOptions","removeEventListener","clearTimeout","addEventHandler","removeEventHandler","plugins","plugin","call","ReferenceError","subClass","superClass","create","setPrototypeOf","__proto__","axisUnits","Axis","ticks","rectEnd","rectStart","gridOffset","rectOffset","labelGroup","chartOptions","axisOptions","projectedValues","projectValue","labelValues","labelInterpolationFnc","projectedValue","labelLength","showGrid","classNames","grid","dir","showLabel","label","end","get","receiver","Function","desc","getOwnPropertyDescriptor","getPrototypeOf","getter","AutoScaleAxis","axisUnit","FixedScaleAxis","sort","a","b","StepAxis","calc","stretch","elementDescriptions","command","params","pathElements","relative","pathElement","toLowerCase","forEachParam","cb","pathElementIndex","paramName","paramIndex","SvgPath","paths","close","joinedPath","path","j","count","rx","ry","xAr","lAf","sf","chunks","pop","elements","chunk","shift","description","accuracyMultiplier","accuracy","transformFnc","transformed","clone","none","noneInterpolation","currX","currY","currData","move","line","simple","d","simpleInterpolation","prevX","prevY","prevData","curve","stepInterpolation","postpone","cardinal","tension","c","cardinalInterpolation","segment","z","iLen","monotoneCubic","monotoneCubicInterpolation","xs","ys","ms","ds","dys","dxs","LineChart","chart","seriesGroup","type","fullWidth","createGridAndLabels","showGridBackground","raw","seriesIndex","seriesElement","pathData","valueIndex","smoothing","lineSmooth","showPoint","point","showLine","showArea","areaBase","areaBaseProjected","splitByCommand","pathSegment","solidPathSegments","firstElement","lastElement","areaPath","area","BarChart","distributeSeries","horizontalBars","stackBars","serialSums","prev","curr","valueAxis","labelAxisTicks","labelAxis","zeroPoint","stackedBarValues","biPol","periodHalfLength","labelAxisValueIndex","projected","seriesBarDistance","previousStack","positions","stackMode","metaData","bar","determineAnchorPosition","center","direction","toTheRight","PieChart","seriesGroups","labelsGroup","labelRadius","startAngle","donut","chartDonut","chartPie","totalDataSum","total","donutWidth","labelPosition","hasSingleValInSeries","val","ignoreEmptyValues","endAngle","overlappigStartAngle","start","arc","sliceDonut","slicePie","rawValue","interpolatedValue","labelDirection"],"mappings":"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","file":"chartist.esm.js"} \ No newline at end of file +{"version":3,"sources":[],"names":[],"mappings":"","file":"chartist.esm.js"} \ No newline at end of file diff --git a/dist/chartist.min.css b/dist/chartist.min.css index 18dde681..e7f3e339 100644 --- a/dist/chartist.min.css +++ b/dist/chartist.min.css @@ -1,2 +1,2 @@ -.ct-label{fill:rgba(0,0,0,.4);color:rgba(0,0,0,.4);font-size:.75rem;line-height:1}.ct-chart-bar .ct-label,.ct-chart-line .ct-label{display:block;display:-webkit-box;display:-ms-flexbox;display:flex}.ct-chart-donut .ct-label,.ct-chart-pie .ct-label{dominant-baseline:central}.ct-label.ct-horizontal.ct-start{-webkit-box-align:flex-end;-ms-flex-align:flex-end;align-items:flex-end}.ct-label.ct-horizontal.ct-end,.ct-label.ct-horizontal.ct-start{-webkit-box-pack:flex-start;-ms-flex-pack:flex-start;justify-content:flex-start;text-align:left;text-anchor:start}.ct-label.ct-horizontal.ct-end{-webkit-box-align:flex-start;-ms-flex-align:flex-start;align-items:flex-start}.ct-label.ct-vertical.ct-start{-webkit-box-align:flex-end;-ms-flex-align:flex-end;align-items:flex-end;-webkit-box-pack:flex-end;-ms-flex-pack:flex-end;justify-content:flex-end;text-align:right;text-anchor:end}.ct-label.ct-vertical.ct-end{-webkit-box-pack:flex-start;-ms-flex-pack:flex-start;justify-content:flex-start;text-align:left}.ct-chart-bar .ct-label.ct-horizontal.ct-start,.ct-label.ct-vertical.ct-end{-webkit-box-align:flex-end;-ms-flex-align:flex-end;align-items:flex-end;text-anchor:start}.ct-chart-bar .ct-label.ct-horizontal.ct-end,.ct-chart-bar .ct-label.ct-horizontal.ct-start{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;text-align:center}.ct-chart-bar .ct-label.ct-horizontal.ct-end{-webkit-box-align:flex-start;-ms-flex-align:flex-start;align-items:flex-start;text-anchor:start}.ct-chart-bar.ct-horizontal-bars .ct-label.ct-horizontal.ct-start{-webkit-box-align:flex-end;-ms-flex-align:flex-end;align-items:flex-end;-webkit-box-pack:flex-start;-ms-flex-pack:flex-start;justify-content:flex-start;text-align:left;text-anchor:start}.ct-chart-bar.ct-horizontal-bars .ct-label.ct-horizontal.ct-end{-webkit-box-align:flex-start;-ms-flex-align:flex-start;align-items:flex-start;-webkit-box-pack:flex-start;-ms-flex-pack:flex-start;justify-content:flex-start;text-align:left;text-anchor:start}.ct-chart-bar.ct-horizontal-bars .ct-label.ct-vertical.ct-start{-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:flex-end;-ms-flex-pack:flex-end;justify-content:flex-end;text-align:right;text-anchor:end}.ct-chart-bar.ct-horizontal-bars .ct-label.ct-vertical.ct-end{-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:flex-start;-ms-flex-pack:flex-start;justify-content:flex-start;text-align:left;text-anchor:end}.ct-grid{stroke:rgba(0,0,0,.2);stroke-width:1px;stroke-dasharray:2px}.ct-grid-background{fill:none}.ct-point{stroke-width:10px;stroke-linecap:round}.ct-line{fill:none;stroke-width:4px}.ct-area{stroke:none;fill-opacity:.1}.ct-bar{fill:none;stroke-width:10px}.ct-slice-donut{fill:none;stroke-width:60px}.ct-series-a .ct-bar,.ct-series-a .ct-line,.ct-series-a .ct-point,.ct-series-a .ct-slice-donut{stroke:#d70206}.ct-series-a .ct-area,.ct-series-a .ct-slice-pie{fill:#d70206}.ct-series-b .ct-bar,.ct-series-b .ct-line,.ct-series-b .ct-point,.ct-series-b .ct-slice-donut{stroke:#f05b4f}.ct-series-b .ct-area,.ct-series-b .ct-slice-pie{fill:#f05b4f}.ct-series-c .ct-bar,.ct-series-c .ct-line,.ct-series-c .ct-point,.ct-series-c .ct-slice-donut{stroke:#f4c63d}.ct-series-c .ct-area,.ct-series-c .ct-slice-pie{fill:#f4c63d}.ct-series-d .ct-bar,.ct-series-d .ct-line,.ct-series-d .ct-point,.ct-series-d .ct-slice-donut{stroke:#d17905}.ct-series-d .ct-area,.ct-series-d .ct-slice-pie{fill:#d17905}.ct-series-e .ct-bar,.ct-series-e .ct-line,.ct-series-e .ct-point,.ct-series-e .ct-slice-donut{stroke:#453d3f}.ct-series-e .ct-area,.ct-series-e .ct-slice-pie{fill:#453d3f}.ct-series-f .ct-bar,.ct-series-f .ct-line,.ct-series-f .ct-point,.ct-series-f .ct-slice-donut{stroke:#59922b}.ct-series-f .ct-area,.ct-series-f .ct-slice-pie{fill:#59922b}.ct-series-g .ct-bar,.ct-series-g .ct-line,.ct-series-g .ct-point,.ct-series-g .ct-slice-donut{stroke:#0544d3}.ct-series-g .ct-area,.ct-series-g .ct-slice-pie{fill:#0544d3}.ct-series-h .ct-bar,.ct-series-h .ct-line,.ct-series-h .ct-point,.ct-series-h .ct-slice-donut{stroke:#6b0392}.ct-series-h .ct-area,.ct-series-h .ct-slice-pie{fill:#6b0392}.ct-series-i .ct-bar,.ct-series-i .ct-line,.ct-series-i .ct-point,.ct-series-i .ct-slice-donut{stroke:#f05b4f}.ct-series-i .ct-area,.ct-series-i .ct-slice-pie{fill:#f05b4f}.ct-series-j .ct-bar,.ct-series-j .ct-line,.ct-series-j .ct-point,.ct-series-j .ct-slice-donut{stroke:#dda458}.ct-series-j .ct-area,.ct-series-j .ct-slice-pie{fill:#dda458}.ct-series-k .ct-bar,.ct-series-k .ct-line,.ct-series-k .ct-point,.ct-series-k .ct-slice-donut{stroke:#eacf7d}.ct-series-k .ct-area,.ct-series-k .ct-slice-pie{fill:#eacf7d}.ct-series-l .ct-bar,.ct-series-l .ct-line,.ct-series-l .ct-point,.ct-series-l .ct-slice-donut{stroke:#86797d}.ct-series-l .ct-area,.ct-series-l .ct-slice-pie{fill:#86797d}.ct-series-m .ct-bar,.ct-series-m .ct-line,.ct-series-m .ct-point,.ct-series-m .ct-slice-donut{stroke:#b2c326}.ct-series-m .ct-area,.ct-series-m .ct-slice-pie{fill:#b2c326}.ct-series-n .ct-bar,.ct-series-n .ct-line,.ct-series-n .ct-point,.ct-series-n .ct-slice-donut{stroke:#6188e2}.ct-series-n .ct-area,.ct-series-n .ct-slice-pie{fill:#6188e2}.ct-series-o .ct-bar,.ct-series-o .ct-line,.ct-series-o .ct-point,.ct-series-o .ct-slice-donut{stroke:#a748ca}.ct-series-o .ct-area,.ct-series-o .ct-slice-pie{fill:#a748ca}.ct-square{display:block;position:relative;width:100%}.ct-square:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:100%}.ct-square:after{content:"";display:table;clear:both}.ct-square>svg{display:block;position:absolute;top:0;left:0}.ct-minor-second{display:block;position:relative;width:100%}.ct-minor-second:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:93.75%}.ct-minor-second:after{content:"";display:table;clear:both}.ct-minor-second>svg{display:block;position:absolute;top:0;left:0}.ct-major-second{display:block;position:relative;width:100%}.ct-major-second:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:88.88889%}.ct-major-second:after{content:"";display:table;clear:both}.ct-major-second>svg{display:block;position:absolute;top:0;left:0}.ct-minor-third{display:block;position:relative;width:100%}.ct-minor-third:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:83.33333%}.ct-minor-third:after{content:"";display:table;clear:both}.ct-minor-third>svg{display:block;position:absolute;top:0;left:0}.ct-major-third{display:block;position:relative;width:100%}.ct-major-third:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:80%}.ct-major-third:after{content:"";display:table;clear:both}.ct-major-third>svg{display:block;position:absolute;top:0;left:0}.ct-perfect-fourth{display:block;position:relative;width:100%}.ct-perfect-fourth:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:75%}.ct-perfect-fourth:after{content:"";display:table;clear:both}.ct-perfect-fourth>svg{display:block;position:absolute;top:0;left:0}.ct-perfect-fifth{display:block;position:relative;width:100%}.ct-perfect-fifth:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:66.66667%}.ct-perfect-fifth:after{content:"";display:table;clear:both}.ct-perfect-fifth>svg{display:block;position:absolute;top:0;left:0}.ct-minor-sixth{display:block;position:relative;width:100%}.ct-minor-sixth:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:62.5%}.ct-minor-sixth:after{content:"";display:table;clear:both}.ct-minor-sixth>svg{display:block;position:absolute;top:0;left:0}.ct-golden-section{display:block;position:relative;width:100%}.ct-golden-section:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:61.8047%}.ct-golden-section:after{content:"";display:table;clear:both}.ct-golden-section>svg{display:block;position:absolute;top:0;left:0}.ct-major-sixth{display:block;position:relative;width:100%}.ct-major-sixth:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:60%}.ct-major-sixth:after{content:"";display:table;clear:both}.ct-major-sixth>svg{display:block;position:absolute;top:0;left:0}.ct-minor-seventh{display:block;position:relative;width:100%}.ct-minor-seventh:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:56.25%}.ct-minor-seventh:after{content:"";display:table;clear:both}.ct-minor-seventh>svg{display:block;position:absolute;top:0;left:0}.ct-major-seventh{display:block;position:relative;width:100%}.ct-major-seventh:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:53.33333%}.ct-major-seventh:after{content:"";display:table;clear:both}.ct-major-seventh>svg{display:block;position:absolute;top:0;left:0}.ct-octave{display:block;position:relative;width:100%}.ct-octave:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:50%}.ct-octave:after{content:"";display:table;clear:both}.ct-octave>svg{display:block;position:absolute;top:0;left:0}.ct-major-tenth{display:block;position:relative;width:100%}.ct-major-tenth:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:40%}.ct-major-tenth:after{content:"";display:table;clear:both}.ct-major-tenth>svg{display:block;position:absolute;top:0;left:0}.ct-major-eleventh{display:block;position:relative;width:100%}.ct-major-eleventh:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:37.5%}.ct-major-eleventh:after{content:"";display:table;clear:both}.ct-major-eleventh>svg{display:block;position:absolute;top:0;left:0}.ct-major-twelfth{display:block;position:relative;width:100%}.ct-major-twelfth:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:33.33333%}.ct-major-twelfth:after{content:"";display:table;clear:both}.ct-major-twelfth>svg{display:block;position:absolute;top:0;left:0}.ct-double-octave{display:block;position:relative;width:100%}.ct-double-octave:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:25%}.ct-double-octave:after{content:"";display:table;clear:both}.ct-double-octave>svg{display:block;position:absolute;top:0;left:0} +.ct-label{fill:rgba(0,0,0,.4);color:rgba(0,0,0,.4);font-size:.75rem;line-height:1}.ct-chart-bar .ct-label,.ct-chart-line .ct-label{display:block;display:flex}.ct-chart-donut .ct-label,.ct-chart-pie .ct-label{dominant-baseline:central}.ct-label.ct-horizontal.ct-start{text-anchor:start;align-items:flex-end;justify-content:flex-start;text-align:left}.ct-label.ct-horizontal.ct-end{text-anchor:start;align-items:flex-start;justify-content:flex-start;text-align:left}.ct-label.ct-vertical.ct-start{text-anchor:end;align-items:flex-end;justify-content:flex-end;text-align:right}.ct-label.ct-vertical.ct-end{text-anchor:start;align-items:flex-end;justify-content:flex-start;text-align:left}.ct-chart-bar .ct-label.ct-horizontal.ct-start{text-anchor:start;align-items:flex-end;justify-content:center;text-align:center}.ct-chart-bar .ct-label.ct-horizontal.ct-end{text-anchor:start;align-items:flex-start;justify-content:center;text-align:center}.ct-chart-bar.ct-horizontal-bars .ct-label.ct-horizontal.ct-start{text-anchor:start;align-items:flex-end;justify-content:flex-start;text-align:left}.ct-chart-bar.ct-horizontal-bars .ct-label.ct-horizontal.ct-end{text-anchor:start;align-items:flex-start;justify-content:flex-start;text-align:left}.ct-chart-bar.ct-horizontal-bars .ct-label.ct-vertical.ct-start{text-anchor:end;align-items:center;justify-content:flex-end;text-align:right}.ct-chart-bar.ct-horizontal-bars .ct-label.ct-vertical.ct-end{text-anchor:end;align-items:center;justify-content:flex-start;text-align:left}.ct-grid{stroke:rgba(0,0,0,.2);stroke-width:1px;stroke-dasharray:2px}.ct-grid-background{fill:none}.ct-point{stroke-width:10px;stroke-linecap:round}.ct-line{fill:none;stroke-width:4px}.ct-area{stroke:none;fill-opacity:.1}.ct-bar{fill:none;stroke-width:10px}.ct-slice-donut{fill:none;stroke-width:60px}.ct-series-a .ct-bar,.ct-series-a .ct-line,.ct-series-a .ct-point,.ct-series-a .ct-slice-donut{stroke:#d70206}.ct-series-a .ct-area,.ct-series-a .ct-slice-pie{fill:#d70206}.ct-series-b .ct-bar,.ct-series-b .ct-line,.ct-series-b .ct-point,.ct-series-b .ct-slice-donut{stroke:#f05b4f}.ct-series-b .ct-area,.ct-series-b .ct-slice-pie{fill:#f05b4f}.ct-series-c .ct-bar,.ct-series-c .ct-line,.ct-series-c .ct-point,.ct-series-c .ct-slice-donut{stroke:#f4c63d}.ct-series-c .ct-area,.ct-series-c .ct-slice-pie{fill:#f4c63d}.ct-series-d .ct-bar,.ct-series-d .ct-line,.ct-series-d .ct-point,.ct-series-d .ct-slice-donut{stroke:#d17905}.ct-series-d .ct-area,.ct-series-d .ct-slice-pie{fill:#d17905}.ct-series-e .ct-bar,.ct-series-e .ct-line,.ct-series-e .ct-point,.ct-series-e .ct-slice-donut{stroke:#453d3f}.ct-series-e .ct-area,.ct-series-e .ct-slice-pie{fill:#453d3f}.ct-series-f .ct-bar,.ct-series-f .ct-line,.ct-series-f .ct-point,.ct-series-f .ct-slice-donut{stroke:#59922b}.ct-series-f .ct-area,.ct-series-f .ct-slice-pie{fill:#59922b}.ct-series-g .ct-bar,.ct-series-g .ct-line,.ct-series-g .ct-point,.ct-series-g .ct-slice-donut{stroke:#0544d3}.ct-series-g .ct-area,.ct-series-g .ct-slice-pie{fill:#0544d3}.ct-series-h .ct-bar,.ct-series-h .ct-line,.ct-series-h .ct-point,.ct-series-h .ct-slice-donut{stroke:#6b0392}.ct-series-h .ct-area,.ct-series-h .ct-slice-pie{fill:#6b0392}.ct-series-i .ct-bar,.ct-series-i .ct-line,.ct-series-i .ct-point,.ct-series-i .ct-slice-donut{stroke:#f05b4f}.ct-series-i .ct-area,.ct-series-i .ct-slice-pie{fill:#f05b4f}.ct-series-j .ct-bar,.ct-series-j .ct-line,.ct-series-j .ct-point,.ct-series-j .ct-slice-donut{stroke:#dda458}.ct-series-j .ct-area,.ct-series-j .ct-slice-pie{fill:#dda458}.ct-series-k .ct-bar,.ct-series-k .ct-line,.ct-series-k .ct-point,.ct-series-k .ct-slice-donut{stroke:#eacf7d}.ct-series-k .ct-area,.ct-series-k .ct-slice-pie{fill:#eacf7d}.ct-series-l .ct-bar,.ct-series-l .ct-line,.ct-series-l .ct-point,.ct-series-l .ct-slice-donut{stroke:#86797d}.ct-series-l .ct-area,.ct-series-l .ct-slice-pie{fill:#86797d}.ct-series-m .ct-bar,.ct-series-m .ct-line,.ct-series-m .ct-point,.ct-series-m .ct-slice-donut{stroke:#b2c326}.ct-series-m .ct-area,.ct-series-m .ct-slice-pie{fill:#b2c326}.ct-series-n .ct-bar,.ct-series-n .ct-line,.ct-series-n .ct-point,.ct-series-n .ct-slice-donut{stroke:#6188e2}.ct-series-n .ct-area,.ct-series-n .ct-slice-pie{fill:#6188e2}.ct-series-o .ct-bar,.ct-series-o .ct-line,.ct-series-o .ct-point,.ct-series-o .ct-slice-donut{stroke:#a748ca}.ct-series-o .ct-area,.ct-series-o .ct-slice-pie{fill:#a748ca}.ct-square{display:block;position:relative;width:100%}.ct-square:before{content:"";display:block;float:left;height:0;padding-bottom:100%;width:0}.ct-square:after{clear:both;content:"";display:table}.ct-square>svg{display:block;left:0;position:absolute;top:0}.ct-minor-second{display:block;position:relative;width:100%}.ct-minor-second:before{content:"";display:block;float:left;height:0;padding-bottom:93.75%;width:0}.ct-minor-second:after{clear:both;content:"";display:table}.ct-minor-second>svg{display:block;left:0;position:absolute;top:0}.ct-major-second{display:block;position:relative;width:100%}.ct-major-second:before{content:"";display:block;float:left;height:0;padding-bottom:88.88889%;width:0}.ct-major-second:after{clear:both;content:"";display:table}.ct-major-second>svg{display:block;left:0;position:absolute;top:0}.ct-minor-third{display:block;position:relative;width:100%}.ct-minor-third:before{content:"";display:block;float:left;height:0;padding-bottom:83.33333%;width:0}.ct-minor-third:after{clear:both;content:"";display:table}.ct-minor-third>svg{display:block;left:0;position:absolute;top:0}.ct-major-third{display:block;position:relative;width:100%}.ct-major-third:before{content:"";display:block;float:left;height:0;padding-bottom:80%;width:0}.ct-major-third:after{clear:both;content:"";display:table}.ct-major-third>svg{display:block;left:0;position:absolute;top:0}.ct-perfect-fourth{display:block;position:relative;width:100%}.ct-perfect-fourth:before{content:"";display:block;float:left;height:0;padding-bottom:75%;width:0}.ct-perfect-fourth:after{clear:both;content:"";display:table}.ct-perfect-fourth>svg{display:block;left:0;position:absolute;top:0}.ct-perfect-fifth{display:block;position:relative;width:100%}.ct-perfect-fifth:before{content:"";display:block;float:left;height:0;padding-bottom:66.66667%;width:0}.ct-perfect-fifth:after{clear:both;content:"";display:table}.ct-perfect-fifth>svg{display:block;left:0;position:absolute;top:0}.ct-minor-sixth{display:block;position:relative;width:100%}.ct-minor-sixth:before{content:"";display:block;float:left;height:0;padding-bottom:62.5%;width:0}.ct-minor-sixth:after{clear:both;content:"";display:table}.ct-minor-sixth>svg{display:block;left:0;position:absolute;top:0}.ct-golden-section{display:block;position:relative;width:100%}.ct-golden-section:before{content:"";display:block;float:left;height:0;padding-bottom:61.8047%;width:0}.ct-golden-section:after{clear:both;content:"";display:table}.ct-golden-section>svg{display:block;left:0;position:absolute;top:0}.ct-major-sixth{display:block;position:relative;width:100%}.ct-major-sixth:before{content:"";display:block;float:left;height:0;padding-bottom:60%;width:0}.ct-major-sixth:after{clear:both;content:"";display:table}.ct-major-sixth>svg{display:block;left:0;position:absolute;top:0}.ct-minor-seventh{display:block;position:relative;width:100%}.ct-minor-seventh:before{content:"";display:block;float:left;height:0;padding-bottom:56.25%;width:0}.ct-minor-seventh:after{clear:both;content:"";display:table}.ct-minor-seventh>svg{display:block;left:0;position:absolute;top:0}.ct-major-seventh{display:block;position:relative;width:100%}.ct-major-seventh:before{content:"";display:block;float:left;height:0;padding-bottom:53.33333%;width:0}.ct-major-seventh:after{clear:both;content:"";display:table}.ct-major-seventh>svg{display:block;left:0;position:absolute;top:0}.ct-octave{display:block;position:relative;width:100%}.ct-octave:before{content:"";display:block;float:left;height:0;padding-bottom:50%;width:0}.ct-octave:after{clear:both;content:"";display:table}.ct-octave>svg{display:block;left:0;position:absolute;top:0}.ct-major-tenth{display:block;position:relative;width:100%}.ct-major-tenth:before{content:"";display:block;float:left;height:0;padding-bottom:40%;width:0}.ct-major-tenth:after{clear:both;content:"";display:table}.ct-major-tenth>svg{display:block;left:0;position:absolute;top:0}.ct-major-eleventh{display:block;position:relative;width:100%}.ct-major-eleventh:before{content:"";display:block;float:left;height:0;padding-bottom:37.5%;width:0}.ct-major-eleventh:after{clear:both;content:"";display:table}.ct-major-eleventh>svg{display:block;left:0;position:absolute;top:0}.ct-major-twelfth{display:block;position:relative;width:100%}.ct-major-twelfth:before{content:"";display:block;float:left;height:0;padding-bottom:33.33333%;width:0}.ct-major-twelfth:after{clear:both;content:"";display:table}.ct-major-twelfth>svg{display:block;left:0;position:absolute;top:0}.ct-double-octave{display:block;position:relative;width:100%}.ct-double-octave:before{content:"";display:block;float:left;height:0;padding-bottom:25%;width:0}.ct-double-octave:after{clear:both;content:"";display:table}.ct-double-octave>svg{display:block;left:0;position:absolute;top:0} /*# sourceMappingURL=chartist.min.css.map */ \ No newline at end of file diff --git a/dist/chartist.min.css.map b/dist/chartist.min.css.map index f51ef128..805445ad 100644 --- a/dist/chartist.min.css.map +++ b/dist/chartist.min.css.map @@ -1 +1 @@ -{"version":3,"sources":["src/styles/chartist.scss","src/styles/settings/_chartist-settings.scss"],"names":[],"mappings":"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","file":"chartist.min.css"} \ No newline at end of file +{"version":3,"sources":["src/styles/chartist.scss","src/styles/settings/_chartist-settings.scss"],"names":[],"mappings":"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","file":"chartist.min.css"} \ No newline at end of file diff --git a/dist/chartist.umd.js b/dist/chartist.umd.js index 66bdda63..655d1c13 100644 --- a/dist/chartist.umd.js +++ b/dist/chartist.umd.js @@ -1,9 +1,8 @@ /* Chartist.js 1.0.0 - * Copyright © 2016 Gion Kunz + * Copyright © 2022 Gion Kunz * Free to use under either the WTFPL license or the MIT license. * https://raw.githubusercontent.com/chartist-js/chartist/master/LICENSE-WTFPL * https://raw.githubusercontent.com/chartist-js/chartist/master/LICENSE-MIT */ -!function(a,b){"object"==typeof exports&&"undefined"!=typeof module?b(exports):"function"==typeof define&&define.amd?define(["exports"],b):b(a.Chartist=a.Chartist||{})}(this,function(a){"use strict";function b(a,b,c){return a.replace(new RegExp(b,"g"),c)}function c(a){return a instanceof Node?a:document.querySelector(a)}function d(a,b){return null!==a&&"object"==typeof a&&a.hasOwnProperty(b)}function e(a){return null!==a&&isFinite(a)}function f(a){return!a&&0!==a}function g(a){return e(a)?+a:void 0}function h(a,b){return"number"==typeof a&&(a+=b),a}function i(a){if("string"==typeof a){var b=/^(\d+)\s*(.*)$/g.exec(a);return{value:+b[1],unit:b[2]||void 0}}return{value:a}}function j(a){return String.fromCharCode(97+a%26)}function k(a){return Math.floor(Math.log(Math.abs(a))/Math.LN10)}function l(a,b,c){return b/c.range*a}function m(a,b){var c=Math.pow(10,b||V);return Math.round(a*c)/c}function n(a){function b(a,c){return a%c===0?c:b(c,a%c)}function c(a){return a*a+1}if(1===a)return a;var d=2,e=2,f=void 0;if(a%2===0)return 2;do d=c(d)%a,e=c(c(e))%a,f=b(Math.abs(d-e),a);while(1===f);return f}function o(a,b,c,d){var e=(d-90)*Math.PI/180;return{x:a+c*Math.cos(e),y:b+c*Math.sin(e)}}function p(){var a=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};a=a||{};for(var b=arguments.length,c=Array(b>1?b-1:0),d=1;d1&&void 0!==arguments[1]?arguments[1]:"y";return g(x(a)?a[b]:a)}function z(a,b,c){if(a.name&&b.series&&b.series[a.name]){var d=b.series[a.name];return d.hasOwnProperty(c)?d[c]:b[c]}return b[c]}function A(a,b,c){var d={increasingX:!1,fillHoles:!1};c=p({},d,c);for(var e=[],f=!0,g=0;g=2&&a[g]<=a[g-2]&&(f=!0),f&&(e.push({pathCoordinates:[],valueData:[]}),f=!1),e[e.length-1].pathCoordinates.push(a[g],a[g+1]),e[e.length-1].valueData.push(b[g/2]));return e}function B(a,b,c){function d(a){if(void 0!==a)if(a instanceof Array)for(var b=0;be.high&&(e.high=h),g&&h0?e.low=0:(e.high=1,e.low=0)),e}function C(a,b,c,d){function e(a,b){return a===(a+=b)&&(a*=1+(b>0?aa:-aa)),a}var f={high:b.high,low:b.low};f.valueRange=f.high-f.low,f.oom=k(f.valueRange),f.step=Math.pow(10,f.oom),f.min=Math.floor(f.low/f.step)*f.step,f.max=Math.ceil(f.high/f.step)*f.step,f.range=f.max-f.min,f.numberOfSteps=Math.round(f.range/f.step);var g=l(a,f.step,f),h=g=c)f.step=1;else if(d&&i=c)f.step=i;else for(var j=0;;){if(h&&l(a,f.step,f)<=c)f.step*=2;else{if(h||!(l(a,f.step/2,f)>=c))break;if(f.step/=2,d&&f.step%1!==0){f.step*=2;break}}if(j++>1e3)throw new Error("Exceeded maximum number of iterations while optimizing scale step!")}f.step=Math.max(f.step,aa);for(var o=f.min,p=f.max;o+f.step<=f.low;)o=e(o,f.step);for(;p-f.step>=f.high;)p=e(p,-f.step);f.min=o,f.max=p,f.range=f.max-f.min;for(var q=[],r=f.min;r<=f.max;r=e(r,f.step)){var s=m(r);s!==q[q.length-1]&&q.push(s)}return f.values=q,f}function D(a){return document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#"+a,"1.1")}function E(a){var b=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"100%",c=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"100%",d=arguments[3];Array.from(a.querySelectorAll("svg")).filter(function(a){return a.getAttributeNS(U.xmlns,"ct")}).forEach(function(b){return a.removeChild(b)});var e=new ea("svg").attr({width:b,height:c}).addClass(d).attr({style:"width: "+b+"; height: "+c+";"});return a.appendChild(e._node),e}function F(a){var b=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;return"number"==typeof a?{top:a,right:a,bottom:a,left:a}:{top:"number"==typeof a.top?a.top:b,right:"number"==typeof a.right?a.right:b,bottom:"number"==typeof a.bottom?a.bottom:b,left:"number"==typeof a.left?a.left:b}}function G(a,b,c){var d=!(!b.axisX&&!b.axisY),e=d?b.axisY.offset:0,f=d?b.axisX.offset:0,g=a.width()||i(b.width).value||0,h=a.height()||i(b.height).value||0,j=F(b.chartPadding,c);g=Math.max(g,e+j.left+j.right),h=Math.max(h,f+j.top+j.bottom);var k={padding:j,width:function(){return this.x2-this.x1},height:function(){return this.y1-this.y2}};return d?("start"===b.axisX.position?(k.y2=j.top+f,k.y1=Math.max(h-j.bottom,k.y2+1)):(k.y2=j.top,k.y1=Math.max(h-j.bottom-f,k.y2+1)),"start"===b.axisY.position?(k.x1=j.left+e,k.x2=Math.max(g-j.right,k.x1+1)):(k.x1=j.left,k.x2=Math.max(g-j.right-e,k.x1+1))):(k.x1=j.left,k.x2=Math.max(g-j.right,k.x1+1),k.y2=j.top,k.y1=Math.max(h-j.bottom,k.y2+1)),k}function H(a,b,c,d,e,f,g,h){var i={};i[c.units.pos+"1"]=a,i[c.units.pos+"2"]=a,i[c.counterUnits.pos+"1"]=d,i[c.counterUnits.pos+"2"]=d+e;var j=f.elem("line",i,g.join(" "));h.emit("draw",p({type:"grid",axis:c,index:b,group:f,element:j},i))}function I(a,b,c,d){var e=a.elem("rect",{x:b.x1,y:b.y2,width:b.width(),height:b.height()},c,!0);d.emit("draw",{type:"gridBackground",group:a,element:e})}function J(a,b,c,d,e,f,g,h,i,j,k){var l=void 0,m={};if(m[e.units.pos]=a+g[e.units.pos],m[e.counterUnits.pos]=g[e.counterUnits.pos],m[e.units.len]=b,m[e.counterUnits.len]=Math.max(0,f-10),j){var n=Math.round(m[e.units.len]),o=Math.round(m[e.counterUnits.len]),q=('\n \n '+d[c]+"\n \n ").trim();l=h.foreignObject(q,p({style:"overflow: visible;"},m))}else l=h.elem("text",m,i.join(" ")).text(d[c]);k.emit("draw",p({type:"label",axis:e,index:c,group:h,element:l,text:d[c]},m))}function K(a,b,c){function d(a){var d=g;g=p({},f),b&&b.forEach(function(a){var b=window.matchMedia(a[0]);b.matches&&(g=p(g,a[1]))}),c&&a&&c.emit("optionsChanged",{previousOptions:d,currentOptions:g})}function e(){h.forEach(function(a){return a.removeListener(d)})}var f=p({},a),g=void 0,h=[];if(!window.matchMedia)throw"window.matchMedia not found! Make sure you're using a polyfill.";return b&&b.forEach(function(a){var b=window.matchMedia(a[0]);b.addListener(d),h.push(b)}),d(),{removeMediaQueryListeners:e,getCurrentOptions:function(){return p({},g)}}}function L(a,b,c,d,e,f){var g=p({command:e?a.toLowerCase():a.toUpperCase()},b,f?{data:f}:{});c.splice(d,0,g)}function M(a,b){a.forEach(function(c,d){qa[c.command.toLowerCase()].forEach(function(e,f){b(c,e,d,f,a)})})}function N(a){var b={fillHoles:!1};return a=p({},b,a),function(b,c){for(var d=new sa,e=!0,f=0;f1)return sa.join(g.map(function(a){return b(a.pathCoordinates,a.valueData)}));if(e=g[0].pathCoordinates,f=g[0].valueData,e.length<=4)return N()(e,f);for(var h=(new sa).move(e[0],e[1],!1,f[0]),i=void 0,j=0,k=e.length;k-2*!i>j;j+=2){var l=[{x:+e[j-2],y:+e[j-1]},{x:+e[j],y:+e[j+1]},{x:+e[j+2],y:+e[j+3]},{x:+e[j+4],y:+e[j+5]}];i?j?k-4===j?l[3]={x:+e[0],y:+e[1]}:k-2===j&&(l[2]={x:+e[0],y:+e[1]},l[3]={x:+e[2],y:+e[3]}):l[0]={x:+e[k-2],y:+e[k-1]}:k-4===j?l[3]=l[2]:j||(l[0]={x:+e[j],y:+e[j+1]}),h.curve(c*(-l[0].x+6*l[1].x+l[2].x)/6+d*l[2].x,c*(-l[0].y+6*l[1].y+l[2].y)/6+d*l[2].y,c*(l[1].x+6*l[2].x-l[3].x)/6+d*l[2].x,c*(l[1].y+6*l[2].y-l[3].y)/6+d*l[2].y,l[2].x,l[2].y,!1,f[(j+2)/2])}return h}return N()([])}}function R(a){var b={fillHoles:!1};return a=p({},b,a),function b(c,d){var e=A(c,d,{fillHoles:a.fillHoles,increasingX:!0});if(e.length){if(e.length>1)return sa.join(e.map(function(a){return b(a.pathCoordinates,a.valueData)}));if(c=e[0].pathCoordinates,d=e[0].valueData,c.length<=4)return N()(c,d);for(var f=[],g=[],h=c.length/2,i=[],j=[],k=[],l=[],m=0;m0!=j[o]>0?i[o]=0:(i[o]=3*(l[o-1]+l[o])/((2*l[o]+l[o-1])/j[o-1]+(l[o]+2*l[o-1])/j[o]),isFinite(i[o])||(i[o]=0));for(var p=(new sa).move(f[0],g[0],!1,d[0]),q=0;qa.x;return d&&"explode"===c||!d&&"implode"===c?"start":d&&"implode"===c||!d&&"explode"===c?"end":"middle"}var T="1.0.0",U={svg:"http://www.w3.org/2000/svg",xmlns:"http://www.w3.org/2000/xmlns/",xhtml:"http://www.w3.org/1999/xhtml",xlink:"http://www.w3.org/1999/xlink",ct:"http://gionkunz.github.com/chartist-js/ct"},V=8,W={"&":"&","<":"<",">":">",'"':""","'":"'"},X=function(a){if(Array.isArray(a)){for(var b=0,c=Array(a.length);b1}).map(function(a){var b=a.pathElements[0],c=a.pathElements[a.pathElements.length-1];return a.clone(!0).position(0).remove(1).move(b.x,f).line(b.x,b.y).position(a.pathElements.length+1).line(c.x,f)}).forEach(function(e){var f=l.elem("path",{d:e.stringify()},a.classNames.area,!0);b.eventEmitter.emit("draw",{type:"area",values:c.normalized.series[g],path:e.clone(),series:d,seriesIndex:g,axisX:i,axisY:k,chartRect:h,index:g,group:l,element:f})})}()}),this.eventEmitter.emit("created",{bounds:k.bounds,chartRect:h,axisX:i,axisY:k,svg:this.svg,options:a})}}]),b}(ha),wa={axisX:{offset:30,position:"end",labelOffset:{x:0,y:0},showLabel:!0,showGrid:!0,labelInterpolationFnc:Y,scaleMinSpace:30,onlyInteger:!1},axisY:{offset:40,position:"start",labelOffset:{x:0,y:0},showLabel:!0,showGrid:!0,labelInterpolationFnc:Y,scaleMinSpace:20,onlyInteger:!1},width:void 0,height:void 0,high:void 0,low:void 0,referenceValue:0,chartPadding:{top:15,right:15,bottom:5,left:10},seriesBarDistance:15,stackBars:!1,stackMode:"accumulate",horizontalBars:!1,distributeSeries:!1,reverseData:!1,showGridBackground:!1,classNames:{chart:"ct-chart-bar",horizontalBars:"ct-horizontal-bars",label:"ct-label",labelGroup:"ct-labels",series:"ct-series",bar:"ct-bar",grid:"ct-grid",gridGroup:"ct-grids",gridBackground:"ct-grid-background",vertical:"ct-vertical",horizontal:"ct-horizontal",start:"ct-start",end:"ct-end"}},xa=function(a){function b(a,c,d,e){return ba(this,b),ia(this,(b.__proto__||Object.getPrototypeOf(b)).call(this,a,c,wa,p({},wa,d),e))}return ja(b,a),ca(b,[{key:"createChart",value:function(a){var b=arguments,c=this,d=void 0,f=void 0;a.distributeSeries?(d=s(this.data,a.reverseData,a.horizontalBars?"x":"y"),d.normalized.series=d.normalized.series.map(function(a){return[a]})):d=s(this.data,a.reverseData,a.horizontalBars?"x":"y"),this.svg=E(this.container,a.width,a.height,a.classNames.chart+(a.horizontalBars?" "+a.classNames.horizontalBars:""));var g=this.svg.elem("g").addClass(a.classNames.gridGroup),h=this.svg.elem("g"),i=this.svg.elem("g").addClass(a.classNames.labelGroup);if(a.stackBars&&0!==d.normalized.series.length){var k=_(d.normalized.series,function(){return Array.from(b).map(function(a){ -return a}).reduce(function(a,b){return{x:a.x+(b&&b.x)||0,y:a.y+(b&&b.y)||0}},{x:0,y:0})});f=B([k],a,a.horizontalBars?"x":"y")}else f=B(d.normalized.series,a,a.horizontalBars?"x":"y");f.high=+a.high||(0===a.high?0:f.high),f.low=+a.low||(0===a.low?0:f.low);var l=G(this.svg,a,wa.padding),m=void 0,n=void 0,o=void 0,r=void 0,u=void 0;n=a.distributeSeries&&a.stackBars?d.normalized.labels.slice(0,1):d.normalized.labels,a.horizontalBars?(m=r=void 0===a.axisX.type?new na(ka.x,d.normalized.series,l,p({},a.axisX,{highLow:f,referenceValue:0})):new a.axisX.type(ka.x,d.normalized.series,l,p({},a.axisX,{highLow:f,referenceValue:0})),o=u=void 0===a.axisY.type?new pa(ka.y,d.normalized.series,l,{ticks:n}):new a.axisY.type(ka.y,d.normalized.series,l,a.axisY)):(o=r=void 0===a.axisX.type?new pa(ka.x,d.normalized.series,l,{ticks:n}):new a.axisX.type(ka.x,d.normalized.series,l,a.axisX),m=u=void 0===a.axisY.type?new na(ka.y,d.normalized.series,l,p({},a.axisY,{highLow:f,referenceValue:0})):new a.axisY.type(ka.y,d.normalized.series,l,p({},a.axisY,{highLow:f,referenceValue:0})));var v=a.horizontalBars?l.x1+m.projectValue(0):l.y1-m.projectValue(0),w=[];o.createGridAndLabels(g,i,this.supportsForeignObject,a,this.eventEmitter),m.createGridAndLabels(g,i,this.supportsForeignObject,a,this.eventEmitter),a.showGridBackground&&I(g,l,a.classNames.gridBackground,this.eventEmitter),d.raw.series.forEach(function(b,f){var g=f-(d.raw.series.length-1)/2,i=void 0;i=a.distributeSeries&&!a.stackBars?o.axisLength/d.normalized.series.length/2:a.distributeSeries&&a.stackBars?o.axisLength/2:o.axisLength/d.normalized.series[f].length/2;var k=h.elem("g");k.attr({"ct:series-name":b.name,"ct:meta":q(b.meta)}),k.addClass([a.classNames.series,b.className||a.classNames.series+"-"+j(f)].join(" ")),d.normalized.series[f].forEach(function(h,j){var n=void 0;n=a.distributeSeries&&!a.stackBars?f:a.distributeSeries&&a.stackBars?0:j;var s=void 0;s=a.horizontalBars?{x:l.x1+m.projectValue(h&&h.x?h.x:0,j,d.normalized.series[f]),y:l.y1-o.projectValue(h&&h.y?h.y:0,n,d.normalized.series[f])}:{x:l.x1+o.projectValue(h&&h.x?h.x:0,n,d.normalized.series[f]),y:l.y1-m.projectValue(h&&h.y?h.y:0,j,d.normalized.series[f])},o instanceof pa&&(o.options.stretch||(s[o.units.pos]+=i*(a.horizontalBars?-1:1)),s[o.units.pos]+=a.stackBars||a.distributeSeries?0:g*a.seriesBarDistance*(a.horizontalBars?-1:1));var x=w[j]||v;if(w[j]=x-(v-s[o.counterUnits.pos]),void 0!==h){var y={};y[o.units.pos+"1"]=s[o.units.pos],y[o.units.pos+"2"]=s[o.units.pos],!a.stackBars||"accumulate"!==a.stackMode&&a.stackMode?(y[o.counterUnits.pos+"1"]=v,y[o.counterUnits.pos+"2"]=s[o.counterUnits.pos]):(y[o.counterUnits.pos+"1"]=x,y[o.counterUnits.pos+"2"]=w[j]),y.x1=Math.min(Math.max(y.x1,l.x1),l.x2),y.x2=Math.min(Math.max(y.x2,l.x1),l.x2),y.y1=Math.min(Math.max(y.y1,l.y2),l.y1),y.y2=Math.min(Math.max(y.y2,l.y2),l.y1);var z=t(b,j),A=k.elem("line",y,a.classNames.bar).attr({"ct:value":[h.x,h.y].filter(e).join(","),"ct:meta":q(z)});c.eventEmitter.emit("draw",p({type:"bar",value:h,index:j,meta:z,series:b,seriesIndex:f,axisX:r,axisY:u,chartRect:l,group:k,element:A},y))}})}),this.eventEmitter.emit("created",{bounds:m.bounds,chartRect:l,axisX:r,axisY:u,svg:this.svg,options:a})}}]),b}(ha),ya={width:void 0,height:void 0,chartPadding:5,classNames:{chartPie:"ct-chart-pie",chartDonut:"ct-chart-donut",series:"ct-series",slicePie:"ct-slice-pie",sliceDonut:"ct-slice-donut",label:"ct-label"},startAngle:0,total:void 0,donut:!1,donutWidth:60,showLabel:!0,labelOffset:0,labelPosition:"inside",labelInterpolationFnc:Y,labelDirection:"neutral",reverseData:!1,ignoreEmptyValues:!1},za=function(a){function b(a,c,d,e){return ba(this,b),ia(this,(b.__proto__||Object.getPrototypeOf(b)).call(this,a,c,ya,p({},ya,d),e))}return ja(b,a),ca(b,[{key:"createChart",value:function(a){var b=this,c=s(this.data),d=[],e=void 0,g=void 0,h=a.startAngle;this.svg=E(this.container,a.width,a.height,a.donut?a.classNames.chartDonut:a.classNames.chartPie);var k=G(this.svg,a,ya.padding),l=Math.min(k.width()/2,k.height()/2),m=a.total||c.normalized.series.reduce($,0),n=i(a.donutWidth);"%"===n.unit&&(n.value*=l/100),l-=a.donut?n.value/2:0,g="outside"===a.labelPosition||a.donut?l:"center"===a.labelPosition?0:l/2,g+=a.labelOffset;var p={x:k.x1+k.width()/2,y:k.y2+k.height()/2},r=1===c.raw.series.filter(function(a){return a.hasOwnProperty("value")?0!==a.value:0!==a}).length;c.raw.series.forEach(function(a,c){return d[c]=b.svg.elem("g",null,null)}),a.showLabel&&(e=this.svg.elem("g",null,null)),c.raw.series.forEach(function(i,k){if(0!==c.normalized.series[k]||!a.ignoreEmptyValues){d[k].attr({"ct:series-name":i.name}),d[k].addClass([a.classNames.series,i.className||a.classNames.series+"-"+j(k)].join(" "));var s=m>0?h+c.normalized.series[k]/m*360:0,t=Math.max(0,h-(0===k||r?0:.2));s-t>=359.99&&(s=t+359.99);var u=o(p.x,p.y,l,t),v=o(p.x,p.y,l,s),w=new sa(!a.donut).move(v.x,v.y).arc(l,l,0,s-h>180,0,u.x,u.y);a.donut||w.line(p.x,p.y);var x=d[k].elem("path",{d:w.stringify()},a.donut?a.classNames.sliceDonut:a.classNames.slicePie);if(x.attr({"ct:value":c.normalized.series[k],"ct:meta":q(i.meta)}),a.donut&&x.attr({style:"stroke-width: "+n.value+"px"}),b.eventEmitter.emit("draw",{type:"slice",value:c.normalized.series[k],totalDataSum:m,index:k,meta:i.meta,series:i,group:d[k],element:x,path:w.clone(),center:p,radius:l,startAngle:h,endAngle:s}),a.showLabel){var y=void 0;y=1===c.raw.series.length?{x:p.x,y:p.y}:o(p.x,p.y,g,h+(s-h)/2);var z=void 0;z=c.normalized.labels&&!f(c.normalized.labels[k])?c.normalized.labels[k]:c.normalized.series[k];var A=a.labelInterpolationFnc(z,k);if(A||0===A){var B=e.elem("text",{dx:y.x,dy:y.y,"text-anchor":S(p,y,a.labelDirection)},a.classNames.label).text(""+A);b.eventEmitter.emit("draw",{type:"label",index:k,group:e,element:B,text:""+A,x:y.x,y:y.y})}}h=s}}),this.eventEmitter.emit("created",{chartRect:k,svg:this.svg,options:a})}}]),b}(ha);a.Interpolation=ta,a.EventEmitter=ga,a.extend=p,a.optionsProvider=K,a.namespaces=U,a.precision=V,a.escapingMap=W,a.version=T,a.replaceAll=b,a.querySelector=c,a.safeHasProperty=d,a.isNumeric=e,a.isFalseyButZero=f,a.getNumberOrUndefined=g,a.ensureUnit=h,a.quantity=i,a.alphaNumerate=j,a.noop=Y,a.times=Z,a.sum=$,a.serialMap=_,a.EPSILON=aa,a.orderOfMagnitude=k,a.projectLength=l,a.roundWithPrecision=m,a.rho=n,a.polarToCartesian=o,a.serialize=q,a.deserialize=r,a.normalizeData=s,a.getMetaData=t,a.isDataHoleValue=u,a.reverseData=v,a.getDataArray=w,a.isMultiValue=x,a.getMultiValue=y,a.getSeriesOption=z,a.splitIntoSegments=A,a.getHighLow=B,a.getBounds=C,a.createSvg=E,a.normalizePadding=F,a.createChartRect=G,a.createGrid=H,a.createGridBackground=I,a.createLabel=J,a.BaseChart=ha,a.LineChart=va,a.BarChart=xa,a.PieChart=za,a.Axis=la,a.axisUnits=ka,a.AutoScaleAxis=na,a.FixedScaleAxis=oa,a.StepAxis=pa,a.Svg=ea,a.isSupported=D,a.easings=fa,a.SvgList=da,a.SvgPath=sa,Object.defineProperty(a,"__esModule",{value:!0})}); +!function(a,b){"object"==typeof exports&&"undefined"!=typeof module?b(exports):"function"==typeof define&&define.amd?define(["exports"],b):b(a.Chartist={})}(this,function(a){"use strict";function b(a,b,c){return a.replace(new RegExp(b,"g"),c)}function c(a){return a instanceof Node?a:document.querySelector(a)}function d(a,b){return null!==a&&"object"==typeof a&&a.hasOwnProperty(b)}function e(a){return null!==a&&isFinite(a)}function f(a){return!a&&0!==a}function g(a){return e(a)?+a:void 0}function h(a,b){return"number"==typeof a&&(a+=b),a}function i(a){if("string"==typeof a){var b=/^(\d+)\s*(.*)$/g.exec(a);return{value:+b[1],unit:b[2]||void 0}}return{value:a}}function j(a){return String.fromCharCode(97+a%26)}function k(a){return Math.floor(Math.log(Math.abs(a))/Math.LN10)}function l(a,b,c){return b/c.range*a}function m(a,b){var c=Math.pow(10,b||U);return Math.round(a*c)/c}function n(a){function b(a,c){return a%c==0?c:b(c,a%c)}function c(a){return a*a+1}if(1===a)return a;var d=2,e=2,f=void 0;if(a%2==0)return 2;do{d=c(d)%a,e=c(c(e))%a,f=b(Math.abs(d-e),a)}while(1===f);return f}function o(a,b,c,d){var e=(d-90)*Math.PI/180;return{x:a+c*Math.cos(e),y:b+c*Math.sin(e)}}function p(){var a=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};a=a||{};for(var b=arguments.length,c=Array(b>1?b-1:0),d=1;d1&&void 0!==arguments[1]?arguments[1]:"y";return g(x(a)?a[b]:a)}function z(a,b,c){if(a.name&&b.series&&b.series[a.name]){var d=b.series[a.name];return d.hasOwnProperty(c)?d[c]:b[c]}return b[c]}function A(a,b,c){c=p({},{increasingX:!1,fillHoles:!1},c);for(var d=[],e=!0,f=0;f=2&&a[f]<=a[f-2]&&(e=!0),e&&(d.push({pathCoordinates:[],valueData:[]}),e=!1),d[d.length-1].pathCoordinates.push(a[f],a[f+1]),d[d.length-1].valueData.push(b[f/2]));return d}function B(a,b,c){function d(a){if(void 0!==a)if(a instanceof Array)for(var b=0;be.high&&(e.high=h),g&&h0?e.low=0:(e.high=1,e.low=0)),e}function C(a,b,c,d){function e(a,b){return a===(a+=b)&&(a*=1+(b>0?_:-_)),a}var f={high:b.high,low:b.low};f.valueRange=f.high-f.low,f.oom=k(f.valueRange),f.step=Math.pow(10,f.oom),f.min=Math.floor(f.low/f.step)*f.step,f.max=Math.ceil(f.high/f.step)*f.step,f.range=f.max-f.min,f.numberOfSteps=Math.round(f.range/f.step);var g=l(a,f.step,f),h=g=c)f.step=1;else if(d&&i=c)f.step=i;else for(var j=0;;){if(h&&l(a,f.step,f)<=c)f.step*=2;else{if(h||!(l(a,f.step/2,f)>=c))break;if(f.step/=2,d&&f.step%1!=0){f.step*=2;break}}if(j++>1e3)throw new Error("Exceeded maximum number of iterations while optimizing scale step!")}f.step=Math.max(f.step,_);for(var o=f.min,p=f.max;o+f.step<=f.low;)o=e(o,f.step);for(;p-f.step>=f.high;)p=e(p,-f.step);f.min=o,f.max=p,f.range=f.max-f.min;for(var q=[],r=f.min;r<=f.max;r=e(r,f.step)){var s=m(r);s!==q[q.length-1]&&q.push(s)}return f.values=q,f}function D(a){return document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#"+a,"1.1")}function E(a){var b=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"100%",c=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"100%",d=arguments[3];Array.from(a.querySelectorAll("svg")).filter(function(a){return a.getAttributeNS(T.xmlns,"ct")}).forEach(function(b){return a.removeChild(b)});var e=new da("svg").attr({width:b,height:c}).addClass(d).attr({style:"width: "+b+"; height: "+c+";"});return a.appendChild(e._node),e}function F(a){var b=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;return"number"==typeof a?{top:a,right:a,bottom:a,left:a}:{top:"number"==typeof a.top?a.top:b,right:"number"==typeof a.right?a.right:b,bottom:"number"==typeof a.bottom?a.bottom:b,left:"number"==typeof a.left?a.left:b}}function G(a,b,c){var d=!(!b.axisX&&!b.axisY),e=d?b.axisY.offset:0,f=d?b.axisX.offset:0,g=a.width()||i(b.width).value||0,h=a.height()||i(b.height).value||0,j=F(b.chartPadding,c);g=Math.max(g,e+j.left+j.right),h=Math.max(h,f+j.top+j.bottom);var k={padding:j,width:function(){return this.x2-this.x1},height:function(){return this.y1-this.y2}};return d?("start"===b.axisX.position?(k.y2=j.top+f,k.y1=Math.max(h-j.bottom,k.y2+1)):(k.y2=j.top,k.y1=Math.max(h-j.bottom-f,k.y2+1)),"start"===b.axisY.position?(k.x1=j.left+e,k.x2=Math.max(g-j.right,k.x1+1)):(k.x1=j.left,k.x2=Math.max(g-j.right-e,k.x1+1))):(k.x1=j.left,k.x2=Math.max(g-j.right,k.x1+1),k.y2=j.top,k.y1=Math.max(h-j.bottom,k.y2+1)),k}function H(a,b,c,d,e,f,g,h){var i={};i[c.units.pos+"1"]=a,i[c.units.pos+"2"]=a,i[c.counterUnits.pos+"1"]=d,i[c.counterUnits.pos+"2"]=d+e;var j=f.elem("line",i,g.join(" "));h.emit("draw",p({type:"grid",axis:c,index:b,group:f,element:j},i))}function I(a,b,c,d){var e=a.elem("rect",{x:b.x1,y:b.y2,width:b.width(),height:b.height()},c,!0);d.emit("draw",{type:"gridBackground",group:a,element:e})}function J(a,b,c,d,e,f,g,h,i,j,k){var l=void 0,m={};if(m[e.units.pos]=a+g[e.units.pos],m[e.counterUnits.pos]=g[e.counterUnits.pos],m[e.units.len]=b,m[e.counterUnits.len]=Math.max(0,f-10),j){var n=Math.round(m[e.units.len]),o=Math.round(m[e.counterUnits.len]),q=('\n \n '+d[c]+"\n \n ").trim();l=h.foreignObject(q,p({style:"overflow: visible;"},m))}else l=h.elem("text",m,i.join(" ")).text(d[c]);k.emit("draw",p({type:"label",axis:e,index:c,group:h,element:l,text:d[c]},m))}function K(a,b,c){function d(a){var d=g;g=p({},f),b&&b.forEach(function(a){window.matchMedia(a[0]).matches&&(g=p(g,a[1]))}),c&&a&&c.emit("optionsChanged",{previousOptions:d,currentOptions:g})}function e(){h.forEach(function(a){return a.removeListener(d)})}var f=p({},a),g=void 0,h=[];if(!window.matchMedia)throw"window.matchMedia not found! Make sure you're using a polyfill.";return b&&b.forEach(function(a){var b=window.matchMedia(a[0]);b.addListener(d),h.push(b)}),d(),{removeMediaQueryListeners:e,getCurrentOptions:function(){return p({},g)}}}function L(a,b,c,d,e,f){var g=p({command:e?a.toLowerCase():a.toUpperCase()},b,f?{data:f}:{});c.splice(d,0,g)}function M(a,b){a.forEach(function(c,d){pa[c.command.toLowerCase()].forEach(function(e,f){b(c,e,d,f,a)})})}function N(a){return a=p({},{fillHoles:!1},a),function(b,c){for(var d=new ra,e=!0,f=0;f1)return ra.join(g.map(function(a){return d(a.pathCoordinates,a.valueData)}));if(e=g[0].pathCoordinates,f=g[0].valueData,e.length<=4)return N()(e,f);for(var h=(new ra).move(e[0],e[1],!1,f[0]),i=void 0,j=0,k=e.length;k-2*!i>j;j+=2){var l=[{x:+e[j-2],y:+e[j-1]},{x:+e[j],y:+e[j+1]},{x:+e[j+2],y:+e[j+3]},{x:+e[j+4],y:+e[j+5]}];i?j?k-4===j?l[3]={x:+e[0],y:+e[1]}:k-2===j&&(l[2]={x:+e[0],y:+e[1]},l[3]={x:+e[2],y:+e[3]}):l[0]={x:+e[k-2],y:+e[k-1]}:k-4===j?l[3]=l[2]:j||(l[0]={x:+e[j],y:+e[j+1]}),h.curve(b*(-l[0].x+6*l[1].x+l[2].x)/6+c*l[2].x,b*(-l[0].y+6*l[1].y+l[2].y)/6+c*l[2].y,b*(l[1].x+6*l[2].x-l[3].x)/6+c*l[2].x,b*(l[1].y+6*l[2].y-l[3].y)/6+c*l[2].y,l[2].x,l[2].y,!1,f[(j+2)/2])}return h}return N()([])}}function R(a){return a=p({},{fillHoles:!1},a),function b(c,d){var e=A(c,d,{fillHoles:a.fillHoles,increasingX:!0});if(e.length){if(e.length>1)return ra.join(e.map(function(a){return b(a.pathCoordinates,a.valueData)}));if(c=e[0].pathCoordinates,d=e[0].valueData,c.length<=4)return N()(c,d);for(var f=[],g=[],h=c.length/2,i=[],j=[],k=[],l=[],m=0;m0!=j[o]>0?i[o]=0:(i[o]=3*(l[o-1]+l[o])/((2*l[o]+l[o-1])/j[o-1]+(l[o]+2*l[o-1])/j[o]),isFinite(i[o])||(i[o]=0));for(var p=(new ra).move(f[0],g[0],!1,d[0]),q=0;qa.x;return d&&"explode"===c||!d&&"implode"===c?"start":d&&"implode"===c||!d&&"explode"===c?"end":"middle"}var T={svg:"http://www.w3.org/2000/svg",xmlns:"http://www.w3.org/2000/xmlns/",xhtml:"http://www.w3.org/1999/xhtml",xlink:"http://www.w3.org/1999/xlink",ct:"http://gionkunz.github.com/chartist-js/ct"},U=8,V={"&":"&","<":"<",">":">",'"':""","'":"'"},W=function(a){if(Array.isArray(a)){for(var b=0,c=Array(a.length);b1}).map(function(a){var b=a.pathElements[0],c=a.pathElements[a.pathElements.length-1];return a.clone(!0).position(0).remove(1).move(b.x,f).line(b.x,b.y).position(a.pathElements.length+1).line(c.x,f)}).forEach(function(e){var f=l.elem("path",{d:e.stringify()},a.classNames.area,!0);b.eventEmitter.emit("draw",{type:"area",values:c.normalized.series[g],path:e.clone(),series:d,seriesIndex:g,axisX:i,axisY:k,chartRect:h,index:g,group:l,element:f})})}()}),this.eventEmitter.emit("created",{bounds:k.bounds,chartRect:h,axisX:i,axisY:k,svg:this.svg,options:a})}}]),b}(ga),va={axisX:{offset:30,position:"end",labelOffset:{x:0,y:0},showLabel:!0,showGrid:!0,labelInterpolationFnc:X,scaleMinSpace:30,onlyInteger:!1},axisY:{offset:40,position:"start",labelOffset:{x:0,y:0},showLabel:!0,showGrid:!0,labelInterpolationFnc:X,scaleMinSpace:20,onlyInteger:!1},width:void 0,height:void 0,high:void 0,low:void 0,referenceValue:0,chartPadding:{top:15,right:15,bottom:5,left:10},seriesBarDistance:15,stackBars:!1,stackMode:"accumulate",horizontalBars:!1,distributeSeries:!1,reverseData:!1,showGridBackground:!1,classNames:{chart:"ct-chart-bar",horizontalBars:"ct-horizontal-bars",label:"ct-label",labelGroup:"ct-labels",series:"ct-series",bar:"ct-bar",grid:"ct-grid",gridGroup:"ct-grids",gridBackground:"ct-grid-background",vertical:"ct-vertical",horizontal:"ct-horizontal",start:"ct-start",end:"ct-end"}},wa=function(a){function b(a,c,d,e){return aa(this,b),ha(this,(b.__proto__||Object.getPrototypeOf(b)).call(this,a,c,va,p({},va,d),e))}return ia(b,a),ba(b,[{key:"createChart",value:function(a){var b=arguments,c=this,d=void 0,f=void 0;a.distributeSeries?(d=s(this.data,a.reverseData,a.horizontalBars?"x":"y"),d.normalized.series=d.normalized.series.map(function(a){return[a]})):d=s(this.data,a.reverseData,a.horizontalBars?"x":"y"),this.svg=E(this.container,a.width,a.height,a.classNames.chart+(a.horizontalBars?" "+a.classNames.horizontalBars:""));var g=this.svg.elem("g").addClass(a.classNames.gridGroup),h=this.svg.elem("g"),i=this.svg.elem("g").addClass(a.classNames.labelGroup);if(a.stackBars&&0!==d.normalized.series.length){f=B([$(d.normalized.series,function(){return Array.from(b).map(function(a){return a}).reduce(function(a,b){return{x:a.x+(b&&b.x)||0,y:a.y+(b&&b.y)||0}},{x:0,y:0})})],a,a.horizontalBars?"x":"y")}else f=B(d.normalized.series,a,a.horizontalBars?"x":"y");f.high=+a.high||(0===a.high?0:f.high),f.low=+a.low||(0===a.low?0:f.low);var k=G(this.svg,a,va.padding),l=void 0,m=void 0,n=void 0,o=void 0,r=void 0;m=a.distributeSeries&&a.stackBars?d.normalized.labels.slice(0,1):d.normalized.labels,a.horizontalBars?(l=o=void 0===a.axisX.type?new ma(ja.x,d.normalized.series,k,p({},a.axisX,{highLow:f,referenceValue:0})):new a.axisX.type(ja.x,d.normalized.series,k,p({},a.axisX,{highLow:f,referenceValue:0})),n=r=void 0===a.axisY.type?new oa(ja.y,d.normalized.series,k,{ticks:m}):new a.axisY.type(ja.y,d.normalized.series,k,a.axisY)):(n=o=void 0===a.axisX.type?new oa(ja.x,d.normalized.series,k,{ticks:m}):new a.axisX.type(ja.x,d.normalized.series,k,a.axisX),l=r=void 0===a.axisY.type?new ma(ja.y,d.normalized.series,k,p({},a.axisY,{highLow:f,referenceValue:0})):new a.axisY.type(ja.y,d.normalized.series,k,p({},a.axisY,{highLow:f,referenceValue:0})));var u=a.horizontalBars?k.x1+l.projectValue(0):k.y1-l.projectValue(0),v=[];n.createGridAndLabels(g,i,this.supportsForeignObject,a,this.eventEmitter),l.createGridAndLabels(g,i,this.supportsForeignObject,a,this.eventEmitter),a.showGridBackground&&I(g,k,a.classNames.gridBackground,this.eventEmitter),d.raw.series.forEach(function(b,f){var g=f-(d.raw.series.length-1)/2,i=void 0;i=a.distributeSeries&&!a.stackBars?n.axisLength/d.normalized.series.length/2:a.distributeSeries&&a.stackBars?n.axisLength/2:n.axisLength/d.normalized.series[f].length/2;var m=h.elem("g");m.attr({"ct:series-name":b.name,"ct:meta":q(b.meta)}),m.addClass([a.classNames.series,b.className||a.classNames.series+"-"+j(f)].join(" ")),d.normalized.series[f].forEach(function(h,j){var s=void 0;s=a.distributeSeries&&!a.stackBars?f:a.distributeSeries&&a.stackBars?0:j;var w=void 0;w=a.horizontalBars?{x:k.x1+l.projectValue(h&&h.x?h.x:0,j,d.normalized.series[f]),y:k.y1-n.projectValue(h&&h.y?h.y:0,s,d.normalized.series[f])}:{x:k.x1+n.projectValue(h&&h.x?h.x:0,s,d.normalized.series[f]),y:k.y1-l.projectValue(h&&h.y?h.y:0,j,d.normalized.series[f])},n instanceof oa&&(n.options.stretch||(w[n.units.pos]+=i*(a.horizontalBars?-1:1)),w[n.units.pos]+=a.stackBars||a.distributeSeries?0:g*a.seriesBarDistance*(a.horizontalBars?-1:1));var x=v[j]||u;if(v[j]=x-(u-w[n.counterUnits.pos]),void 0!==h){var y={};y[n.units.pos+"1"]=w[n.units.pos],y[n.units.pos+"2"]=w[n.units.pos],!a.stackBars||"accumulate"!==a.stackMode&&a.stackMode?(y[n.counterUnits.pos+"1"]=u,y[n.counterUnits.pos+"2"]=w[n.counterUnits.pos]):(y[n.counterUnits.pos+"1"]=x,y[n.counterUnits.pos+"2"]=v[j]),y.x1=Math.min(Math.max(y.x1,k.x1),k.x2),y.x2=Math.min(Math.max(y.x2,k.x1),k.x2),y.y1=Math.min(Math.max(y.y1,k.y2),k.y1),y.y2=Math.min(Math.max(y.y2,k.y2),k.y1);var z=t(b,j),A=m.elem("line",y,a.classNames.bar).attr({"ct:value":[h.x,h.y].filter(e).join(","),"ct:meta":q(z)});c.eventEmitter.emit("draw",p({type:"bar",value:h,index:j,meta:z,series:b,seriesIndex:f,axisX:o,axisY:r,chartRect:k,group:m,element:A},y))}})}),this.eventEmitter.emit("created",{bounds:l.bounds,chartRect:k,axisX:o,axisY:r,svg:this.svg,options:a})}}]),b}(ga),xa={width:void 0,height:void 0,chartPadding:5,classNames:{chartPie:"ct-chart-pie",chartDonut:"ct-chart-donut",series:"ct-series",slicePie:"ct-slice-pie",sliceDonut:"ct-slice-donut",label:"ct-label"},startAngle:0,total:void 0,donut:!1,donutWidth:60,showLabel:!0,labelOffset:0,labelPosition:"inside",labelInterpolationFnc:X,labelDirection:"neutral",reverseData:!1,ignoreEmptyValues:!1},ya=function(a){function b(a,c,d,e){return aa(this,b),ha(this,(b.__proto__||Object.getPrototypeOf(b)).call(this,a,c,xa,p({},xa,d),e))}return ia(b,a),ba(b,[{key:"createChart",value:function(a){var b=this,c=s(this.data),d=[],e=void 0,g=void 0,h=a.startAngle;this.svg=E(this.container,a.width,a.height,a.donut?a.classNames.chartDonut:a.classNames.chartPie);var k=G(this.svg,a,xa.padding),l=Math.min(k.width()/2,k.height()/2),m=a.total||c.normalized.series.reduce(Z,0),n=i(a.donutWidth);"%"===n.unit&&(n.value*=l/100),l-=a.donut?n.value/2:0,g="outside"===a.labelPosition||a.donut?l:"center"===a.labelPosition?0:l/2,g+=a.labelOffset;var p={x:k.x1+k.width()/2,y:k.y2+k.height()/2},r=1===c.raw.series.filter(function(a){return a.hasOwnProperty("value")?0!==a.value:0!==a}).length;c.raw.series.forEach(function(a,c){return d[c]=b.svg.elem("g",null,null)}),a.showLabel&&(e=this.svg.elem("g",null,null)),c.raw.series.forEach(function(i,k){if(0!==c.normalized.series[k]||!a.ignoreEmptyValues){d[k].attr({"ct:series-name":i.name}),d[k].addClass([a.classNames.series,i.className||a.classNames.series+"-"+j(k)].join(" "));var s=m>0?h+c.normalized.series[k]/m*360:0,t=Math.max(0,h-(0===k||r?0:.2));s-t>=359.99&&(s=t+359.99);var u=o(p.x,p.y,l,t),v=o(p.x,p.y,l,s),w=new ra(!a.donut).move(v.x,v.y).arc(l,l,0,s-h>180,0,u.x,u.y);a.donut||w.line(p.x,p.y);var x=d[k].elem("path",{d:w.stringify()},a.donut?a.classNames.sliceDonut:a.classNames.slicePie);if(x.attr({"ct:value":c.normalized.series[k],"ct:meta":q(i.meta)}),a.donut&&x.attr({style:"stroke-width: "+n.value+"px"}),b.eventEmitter.emit("draw",{type:"slice",value:c.normalized.series[k],totalDataSum:m,index:k,meta:i.meta,series:i,group:d[k],element:x,path:w.clone(),center:p,radius:l,startAngle:h,endAngle:s}),a.showLabel){var y=void 0;y=1===c.raw.series.length?{x:p.x,y:p.y}:o(p.x,p.y,g,h+(s-h)/2);var z=void 0;z=c.normalized.labels&&!f(c.normalized.labels[k])?c.normalized.labels[k]:c.normalized.series[k];var A=a.labelInterpolationFnc(z,k);if(A||0===A){var B=e.elem("text",{dx:y.x,dy:y.y,"text-anchor":S(p,y,a.labelDirection)},a.classNames.label).text(""+A);b.eventEmitter.emit("draw",{type:"label",index:k,group:e,element:B,text:""+A,x:y.x,y:y.y})}}h=s}}),this.eventEmitter.emit("created",{chartRect:k,svg:this.svg,options:a})}}]),b}(ga);a.Interpolation=sa,a.EventEmitter=fa,a.extend=p,a.optionsProvider=K,a.namespaces=T,a.precision=U,a.escapingMap=V,a.replaceAll=b,a.querySelector=c,a.safeHasProperty=d,a.isNumeric=e,a.isFalseyButZero=f,a.getNumberOrUndefined=g,a.ensureUnit=h,a.quantity=i,a.alphaNumerate=j,a.noop=X,a.times=Y,a.sum=Z,a.serialMap=$,a.EPSILON=_,a.orderOfMagnitude=k,a.projectLength=l,a.roundWithPrecision=m,a.rho=n,a.polarToCartesian=o,a.serialize=q,a.deserialize=r,a.normalizeData=s,a.getMetaData=t,a.isDataHoleValue=u,a.reverseData=v,a.getDataArray=w,a.isMultiValue=x,a.getMultiValue=y,a.getSeriesOption=z,a.splitIntoSegments=A,a.getHighLow=B,a.getBounds=C,a.createSvg=E,a.normalizePadding=F,a.createChartRect=G,a.createGrid=H,a.createGridBackground=I,a.createLabel=J,a.BaseChart=ga,a.LineChart=ua,a.BarChart=wa,a.PieChart=ya,a.Axis=ka,a.axisUnits=ja,a.AutoScaleAxis=ma,a.FixedScaleAxis=na,a.StepAxis=oa,a.Svg=da,a.isSupported=D,a.easings=ea,a.SvgList=ca,a.SvgPath=ra,Object.defineProperty(a,"__esModule",{value:!0})}); //# sourceMappingURL=chartist.umd.js.map \ No newline at end of file diff --git a/dist/chartist.umd.js.map b/dist/chartist.umd.js.map index 317abd6d..b524e9ed 100644 --- a/dist/chartist.umd.js.map +++ b/dist/chartist.umd.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/core/lang.js","../src/core/math.js","../src/core/extend.js","../src/core/data.js","../src/svg/svg.js","../src/core/creation.js","../src/core/options-provider.js","../src/svg/svg-path.js","../src/interpolation/none.js","../src/interpolation/simple.js","../src/interpolation/step.js","../src/interpolation/cardinal.js","../src/interpolation/monotone-cubic.js","../src/charts/pie.js","../package.json!file:/home/gion/Code/chartist/tooling/system-loaders/package.json","../src/core/globals.js","../jspm_packages/npm/systemjs-plugin-babel@0.0.16/babel-helpers/toConsumableArray.js","../src/core/functional.js","../jspm_packages/npm/systemjs-plugin-babel@0.0.16/babel-helpers/classCallCheck.js","../jspm_packages/npm/systemjs-plugin-babel@0.0.16/babel-helpers/createClass.js","../src/svg/svg-list.js","../src/event/event-emitter.js","../src/charts/base.js","../jspm_packages/npm/systemjs-plugin-babel@0.0.16/babel-helpers/possibleConstructorReturn.js","../jspm_packages/npm/systemjs-plugin-babel@0.0.16/babel-helpers/inherits.js","../src/axes/axis.js","../jspm_packages/npm/systemjs-plugin-babel@0.0.16/babel-helpers/get.js","../src/axes/auto-scale-axis.js","../src/axes/fixed-scale-axis.js","../src/axes/step-axis.js","../src/charts/line.js","../src/charts/bar.js"],"names":["replaceAll","str","subStr","newSubStr","replace","RegExp","querySelector","query","Node","document","safeHasProperty","object","property","hasOwnProperty","isNumeric","value","isFinite","isFalseyButZero","getNumberOrUndefined","undefined","ensureUnit","unit","quantity","input","match","exec","alphaNumerate","n","String","fromCharCode","orderOfMagnitude","Math","floor","log","abs","LN10","projectLength","axisLength","length","bounds","range","roundWithPrecision","digits","precision","pow","globalPrecision","round","rho","num","gcd","p","q","f","x","x1","x2","divisor","polarToCartesian","centerX","centerY","radius","angleInDegrees","angleInRadians","PI","cos","sin","extend","target","arguments","sources","Array","_len","_key","i","source","prop","sourceProp","serialize","data","JSON","stringify","Object","keys","escapingMap","reduce","result","key","deserialize","parse","e","normalizeData","reverse","multi","labelCount","output","normalized","series","getDataArray","every","max","apply","_toConsumableArray","map","labels","slice","push","_output$normalized$la","times","getMetaData","index","meta","isDataHoleValue","isNaN","reverseData","_step","Symbol","iterator","_iteratorNormalCompletion","_iterator","next","done","recursiveConvert","multiValue","y","isMultiValue","getMultiValue","dimension","getSeriesOption","options","name","seriesOptions","splitIntoSegments","pathCoordinates","valueData","defaultOptions","segments","hole","fillHoles","increasingX","getHighLow","recursiveHighLow","sourceData","findHigh","highLow","high","findLow","low","toUpperCase","Number","MAX_VALUE","referenceValue","min","getBounds","scaleMinSpace","onlyInteger","safeIncrement","increment","EPSILON","valueRange","oom","step","ceil","numberOfSteps","scaleUp","smallestFactor","optimizationCounter","Error","newMin","newMax","values","isSupported","feature","implementation","hasFeature","createSvg","container","width","height","className","from","querySelectorAll","filter","svg","getAttributeNS","namespaces","xmlns","forEach","removeChild","Svg","attr","addClass","appendChild","_node","normalizePadding","padding","fallback","top","right","bottom","left","createChartRect","fallbackPadding","hasAxis","axisX","axisY","yAxisOffset","offset","xAxisOffset","normalizedPadding","chartPadding","chartRect","this","y1","y2","position","createGrid","axis","group","classes","eventEmitter","positionalData","units","pos","counterUnits","gridElement","elem","join","emit","createGridBackground","gridGroup","gridBackground","createLabel","axisOffset","labelOffset","useForeignObject","labelElement","len","stepLength","stepCounterLength","content","trim","foreignObject","text","optionsProvider","responsiveOptions","updateCurrentOptions","mediaEvent","previousOptions","currentOptions","baseOptions","responsiveOption","mql","window","matchMedia","matches","removeMediaQueryListeners","removeListener","mediaQueryListeners","addListener","element","command","params","pathElements","relative","pathElement","toLowerCase","splice","forEachParam","cb","pathElementIndex","paramName","paramIndex","none","path","SvgPath","currX","currY","currData","move","line","simple","d","prevX","prevY","prevData","curve","postpone","cardinal","t","tension","c","cardinalInterpolation","segment","z","iLen","monotoneCubic","monotoneCubicInterpolation","xs","ys","ms","ds","dys","dxs","determineAnchorPosition","center","label","direction","toTheRight","version","arr","isArray","arr2","noop","sum","previous","current","serialMap","array","callback","inner","_classCallCheck","instance","Constructor","TypeError","_createClass","defineProperties","props","descriptor","enumerable","configurable","writable","defineProperty","protoProps","staticProps","prototype","SvgList","nodeList","list","svgElements","prototypeProperty","indexOf","args","_arguments","attributes","parent","insertFirst","Element","createElementNS","ct","firstChild","insertBefore","ns","getAttribute","namespacedAttribute","split","setAttributeNS","setAttribute","bind","parentNode","SVGElement","node","nodeName","selector","foundNode","foundNodes","createElement","innerHTML","fnObj","createTextNode","newElement","replaceChild","names","concat","self","removedClasses","getBoundingClientRect","animations","guided","attribute","createAnimate","animationDefinition","createGuided","attributeProperties","animationEasing","timeout","easing","easings","begin","dur","calcMode","keySplines","keyTimes","fill","animate","_this","beginElement","err","to","remove","addEventListener","EventEmitter","handlers","event","handler","starHandler","BaseChart","supportsForeignObject","supportsAnimations","resizeListener","update","__chartist__","detach","initializeTimeoutId","setTimeout","initialize","override","createChart","getCurrentOptions","clearTimeout","removeEventListener","addEventHandler","removeEventHandler","_this2","plugins","plugin","_possibleConstructorReturn","call","ReferenceError","_inherits","subClass","superClass","create","setPrototypeOf","__proto__","axisUnits","Axis","ticks","rectEnd","rectStart","gridOffset","rectOffset","labelGroup","chartOptions","axisOptions","projectedValues","projectValue","labelValues","labelInterpolationFnc","projectedValue","labelLength","showGrid","classNames","grid","dir","showLabel","end","_get","get","receiver","Function","desc","getOwnPropertyDescriptor","getPrototypeOf","getter","AutoScaleAxis","_Axis","axisUnit","FixedScaleAxis","sort","a","b","StepAxis","calc","stretch","elementDescriptions","close","paths","joinedPath","j","count","rx","ry","xAr","lAf","sf","chunks","pop","elements","chunk","shift","description","_pathElements","accuracyMultiplier","accuracy","transformFnc","transformed","clone","LineChart","_BaseChart","chart","seriesGroup","type","fullWidth","createGridAndLabels","showGridBackground","raw","seriesIndex","seriesElement","pathData","valueIndex","smoothing","lineSmooth","showPoint","point","showLine","showArea","areaBase","areaBaseProjected","splitByCommand","pathSegment","solidPathSegments","firstElement","lastElement","areaPath","area","BarChart","distributeSeries","horizontalBars","stackBars","serialSums","prev","curr","valueAxis","labelAxisTicks","labelAxis","zeroPoint","stackedBarValues","biPol","periodHalfLength","labelAxisValueIndex","projected","seriesBarDistance","previousStack","positions","stackMode","metaData","bar","PieChart","seriesGroups","labelsGroup","labelRadius","startAngle","donut","chartDonut","chartPie","totalDataSum","total","donutWidth","labelPosition","hasSingleValInSeries","val","ignoreEmptyValues","endAngle","overlappigStartAngle","start","arc","sliceDonut","slicePie","rawValue","interpolatedValue","labelDirection"],"mappings":"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","file":"chartist.umd.js","sourcesContent":["/**\n * Replaces all occurrences of subStr in str with newSubStr and returns a new string.\n *\n * @param {String} str\n * @param {String} subStr\n * @param {String} newSubStr\n * @return {String}\n */\nexport function replaceAll(str, subStr, newSubStr) {\n return str.replace(new RegExp(subStr, 'g'), newSubStr);\n}\n\n/**\n * This is a wrapper around document.querySelector that will return the query if it's already of type Node\n *\n * @memberof Chartist.Core\n * @param {String|Node} query The query to use for selecting a Node or a DOM node that will be returned directly\n * @return {Node}\n */\nexport function querySelector(query) {\n return query instanceof Node ? query : document.querySelector(query);\n}\n\n/**\n * This function safely checks if an objects has an owned property.\n *\n * @param {Object} object The object where to check for a property\n * @param {string} property The property name\n * @returns {boolean} Returns true if the object owns the specified property\n */\nexport function safeHasProperty(object, property) {\n return object !== null &&\n typeof object === 'object' &&\n object.hasOwnProperty(property);\n}\n\n/**\n * Checks if a value can be safely coerced to a number. This includes all values except null which result in finite numbers when coerced. This excludes NaN, since it's not finite.\n *\n * @memberof Chartist.Core\n * @param value\n * @returns {Boolean}\n */\nexport function isNumeric(value) {\n return value === null ? false : isFinite(value);\n}\n\n/**\n * Returns true on all falsey values except the numeric value 0.\n *\n * @memberof Chartist.Core\n * @param value\n * @returns {boolean}\n */\nexport function isFalseyButZero(value) {\n return !value && value !== 0;\n}\n\n/**\n * Returns a number if the passed parameter is a valid number or the function will return undefined. On all other values than a valid number, this function will return undefined.\n *\n * @memberof Chartist.Core\n * @param value\n * @returns {*}\n */\nexport function getNumberOrUndefined(value) {\n return isNumeric(value) ? +value : undefined;\n}\n\n/**\n * Converts a number to a string with a unit. If a string is passed then this will be returned unmodified.\n *\n * @memberof Chartist.Core\n * @param {Number} value\n * @param {String} unit\n * @return {String} Returns the passed number value with unit.\n */\nexport function ensureUnit(value, unit) {\n if(typeof value === 'number') {\n value = value + unit;\n }\n\n return value;\n}\n\n/**\n * Converts a number or string to a quantity object.\n *\n * @memberof Chartist.Core\n * @param {String|Number} input\n * @return {Object} Returns an object containing the value as number and the unit as string.\n */\nexport function quantity(input) {\n if(typeof input === 'string') {\n const match = (/^(\\d+)\\s*(.*)$/g).exec(input);\n return {\n value: +match[1],\n unit: match[2] || undefined\n };\n }\n\n return {\n value: input\n };\n}\n\n/**\n * Generates a-z from a number 0 to 26\n *\n * @memberof Chartist.Core\n * @param {Number} n A number from 0 to 26 that will result in a letter a-z\n * @return {String} A character from a-z based on the input number n\n */\nexport function alphaNumerate(n) {\n // Limit to a-z\n return String.fromCharCode(97 + n % 26);\n}\n","import {precision as globalPrecision} from './globals';\n\nexport const EPSILON = 2.221E-16;\n\n/**\n * Calculate the order of magnitude for the chart scale\n *\n * @memberof Chartist.Core\n * @param {Number} value The value Range of the chart\n * @return {Number} The order of magnitude\n */\nexport function orderOfMagnitude(value) {\n return Math.floor(Math.log(Math.abs(value)) / Math.LN10);\n}\n\n/**\n * Project a data length into screen coordinates (pixels)\n *\n * @memberof Chartist.Core\n * @param {Object} axisLength The svg element for the chart\n * @param {Number} length Single data value from a series array\n * @param {Object} bounds All the values to set the bounds of the chart\n * @return {Number} The projected data length in pixels\n */\nexport function projectLength(axisLength, length, bounds) {\n return length / bounds.range * axisLength;\n}\n\n/**\n * This helper function can be used to round values with certain precision level after decimal. This is used to prevent rounding errors near float point precision limit.\n *\n * @memberof Chartist.Core\n * @param {Number} value The value that should be rounded with precision\n * @param {Number} [digits] The number of digits after decimal used to do the rounding\n * @returns {number} Rounded value\n */\nexport function roundWithPrecision(value, digits) {\n const precision = Math.pow(10, digits || globalPrecision);\n return Math.round(value * precision) / precision;\n}\n\n/**\n * Pollard Rho Algorithm to find smallest factor of an integer value. There are more efficient algorithms for factorization, but this one is quite efficient and not so complex.\n *\n * @memberof Chartist.Core\n * @param {Number} num An integer number where the smallest factor should be searched for\n * @returns {Number} The smallest integer factor of the parameter num.\n */\nexport function rho(num) {\n if(num === 1) {\n return num;\n }\n\n function gcd(p, q) {\n if(p % q === 0) {\n return q;\n } else {\n return gcd(q, p % q);\n }\n }\n\n function f(x) {\n return x * x + 1;\n }\n\n let x1 = 2;\n let x2 = 2;\n let divisor;\n if(num % 2 === 0) {\n return 2;\n }\n\n do {\n x1 = f(x1) % num;\n x2 = f(f(x2)) % num;\n divisor = gcd(Math.abs(x1 - x2), num);\n } while(divisor === 1);\n\n return divisor;\n}\n\n/**\n * Calculate cartesian coordinates of polar coordinates\n *\n * @memberof Chartist.Core\n * @param {Number} centerX X-axis coordinates of center point of circle segment\n * @param {Number} centerY X-axis coordinates of center point of circle segment\n * @param {Number} radius Radius of circle segment\n * @param {Number} angleInDegrees Angle of circle segment in degrees\n * @return {{x:Number, y:Number}} Coordinates of point on circumference\n */\nexport function polarToCartesian(centerX, centerY, radius, angleInDegrees) {\n const angleInRadians = (angleInDegrees - 90) * Math.PI / 180.0;\n\n return {\n x: centerX + (radius * Math.cos(angleInRadians)),\n y: centerY + (radius * Math.sin(angleInRadians))\n };\n}\n","/**\n * Simple recursive object extend\n *\n * @memberof Chartist.Core\n * @param {Object} target Target object where the source will be merged into\n * @param {Object...} sources This object (objects) will be merged into target and then target is returned\n * @return {Object} An object that has the same reference as target but is extended and merged with the properties of source\n */\nexport function extend(target = {}, ...sources) {\n target = target || {};\n\n for(let i = 0; i < sources.length; i++) {\n const source = sources[i];\n for(let prop in source) {\n const sourceProp = source[prop];\n if(typeof sourceProp === 'object' && sourceProp !== null && !(sourceProp instanceof Array)) {\n target[prop] = extend(target[prop], sourceProp);\n } else {\n target[prop] = sourceProp;\n }\n }\n }\n\n return target;\n}\n","import {escapingMap} from './globals';\nimport {replaceAll, safeHasProperty, getNumberOrUndefined} from './lang';\nimport {times} from './functional';\nimport {extend} from './extend';\nimport {orderOfMagnitude, projectLength, roundWithPrecision, rho, EPSILON} from './math';\n\n/**\n * This function serializes arbitrary data to a string. In case of data that can't be easily converted to a string, this function will create a wrapper object and serialize the data using JSON.stringify. The outcoming string will always be escaped using Chartist.escapingMap.\n * If called with null or undefined the function will return immediately with null or undefined.\n *\n * @memberof Chartist.Core\n * @param {Number|String|Object} data\n * @return {String}\n */\nexport function serialize(data) {\n if(data === null || data === undefined) {\n return data;\n } else if(typeof data === 'number') {\n data = '' + data;\n } else if(typeof data === 'object') {\n data = JSON.stringify({data: data});\n }\n\n return Object.keys(escapingMap)\n .reduce((result, key) => replaceAll(result, key, escapingMap[key]), data);\n}\n\n/**\n * This function de-serializes a string previously serialized with Chartist.serialize. The string will always be unescaped using Chartist.escapingMap before it's returned. Based on the input value the return type can be Number, String or Object. JSON.parse is used with try / catch to see if the unescaped string can be parsed into an Object and this Object will be returned on success.\n *\n * @memberof Chartist.Core\n * @param {String} data\n * @return {String|Number|Object}\n */\nexport function deserialize(data) {\n if(typeof data !== 'string') {\n return data;\n }\n\n data = Object.keys(escapingMap)\n .reduce((result, key) => replaceAll(result, escapingMap[key], key), data);\n\n try {\n data = JSON.parse(data);\n data = data.data !== undefined ? data.data : data;\n } catch(e) {\n }\n\n return data;\n}\n\n/**\n * Ensures that the data object passed as second argument to the charts is present and correctly initialized.\n *\n * @param {Object} data The data object that is passed as second argument to the charts\n * @return {Object} The normalized data object\n */\nexport function normalizeData(data, reverse, multi) {\n let labelCount;\n const output = {\n raw: data,\n normalized: {}\n };\n\n // Check if we should generate some labels based on existing series data\n output.normalized.series = getDataArray({\n series: data.series || []\n }, reverse, multi);\n\n // If all elements of the normalized data array are arrays we're dealing with\n // multi series data and we need to find the largest series if they are un-even\n if(output.normalized.series.every((value) => value instanceof Array)) {\n // Getting the series with the the most elements\n labelCount = Math.max(...output.normalized.series.map((series) => series.length));\n } else {\n // We're dealing with Pie data so we just take the normalized array length\n labelCount = output.normalized.series.length;\n }\n\n output.normalized.labels = (data.labels || []).slice();\n // Padding the labels to labelCount with empty strings\n output.normalized.labels\n .push(...times(Math.max(0, labelCount - output.normalized.labels.length))\n .map(() => ''));\n\n if(reverse) {\n reverseData(output.normalized);\n }\n\n return output;\n}\n\n/**\n * Get meta data of a specific value in a series.\n *\n * @param series\n * @param index\n * @returns {*}\n */\nexport function getMetaData(series, index) {\n const value = series.data ? series.data[index] : series[index];\n return value ? value.meta : undefined;\n}\n\n/**\n * Checks if a value is considered a hole in the data series.\n *\n * @param {*} value\n * @returns {boolean} True if the value is considered a data hole\n */\nexport function isDataHoleValue(value) {\n return value === null ||\n value === undefined ||\n (typeof value === 'number' && isNaN(value));\n}\n\n/**\n * Reverses the series, labels and series data arrays.\n *\n * @memberof Chartist.Core\n * @param data\n */\nexport function reverseData(data) {\n data.labels.reverse();\n data.series.reverse();\n for(let series of data.series) {\n if(typeof(series) === 'object' && series.data !== undefined) {\n series.data.reverse();\n } else if(series instanceof Array) {\n series.reverse();\n }\n }\n}\n\n/**\n * Convert data series into plain array\n *\n * @memberof Chartist.Core\n * @param {Object} data The series object that contains the data to be visualized in the chart\n * @param {Boolean} [reverse] If true the whole data is reversed by the getDataArray call. This will modify the data object passed as first parameter. The labels as well as the series order is reversed. The whole series data arrays are reversed too.\n * @param {Boolean} [multi] Create a multi dimensional array from a series data array where a value object with `x` and `y` values will be created.\n * @return {Array} A plain array that contains the data to be visualized in the chart\n */\nexport function getDataArray(data, reverse, multi) {\n // Recursively walks through nested arrays and convert string values to numbers and objects with value properties\n // to values. Check the tests in data core -> data normalization for a detailed specification of expected values\n function recursiveConvert(value) {\n if(safeHasProperty(value, 'value')) {\n // We are dealing with value object notation so we need to recurse on value property\n return recursiveConvert(value.value);\n } else if(safeHasProperty(value, 'data')) {\n // We are dealing with series object notation so we need to recurse on data property\n return recursiveConvert(value.data);\n } else if(value instanceof Array) {\n // Data is of type array so we need to recurse on the series\n return value.map(recursiveConvert);\n } else if(isDataHoleValue(value)) {\n // We're dealing with a hole in the data and therefore need to return undefined\n // We're also returning undefined for multi value output\n return undefined;\n } else {\n // We need to prepare multi value output (x and y data)\n if(multi) {\n const multiValue = {};\n\n // Single series value arrays are assumed to specify the Y-Axis value\n // For example: [1, 2] => [{x: undefined, y: 1}, {x: undefined, y: 2}]\n // If multi is a string then it's assumed that it specified which dimension should be filled as default\n if(typeof multi === 'string') {\n multiValue[multi] = getNumberOrUndefined(value);\n } else {\n multiValue.y = getNumberOrUndefined(value);\n }\n\n multiValue.x = value.hasOwnProperty('x') ? getNumberOrUndefined(value.x) : multiValue.x;\n multiValue.y = value.hasOwnProperty('y') ? getNumberOrUndefined(value.y) : multiValue.y;\n\n return multiValue;\n\n } else {\n // We can return simple data\n return getNumberOrUndefined(value);\n }\n }\n }\n\n return data.series.map(recursiveConvert);\n}\n\n/**\n * Checks if provided value object is multi value (contains x or y properties)\n *\n * @memberof Chartist.Core\n * @param value\n */\nexport function isMultiValue(value) {\n return typeof value === 'object' &&\n (value.hasOwnProperty('x') || value.hasOwnProperty('y'));\n}\n\n/**\n * Gets a value from a dimension `value.x` or `value.y` while returning value directly if it's a valid numeric value. If the value is not numeric and it's falsey this function will return `defaultValue`.\n *\n * @memberof Chartist.Core\n * @param value\n * @param dimension\n * @returns {*}\n */\nexport function getMultiValue(value, dimension = 'y') {\n if(isMultiValue(value)) {\n return getNumberOrUndefined(value[dimension]);\n } else {\n return getNumberOrUndefined(value);\n }\n}\n\n/**\n * Helper to read series specific options from options object. It automatically falls back to the global option if\n * there is no option in the series options.\n *\n * @param {Object} series Series object\n * @param {Object} options Chartist options object\n * @param {string} key The options key that should be used to obtain the options\n * @returns {*}\n */\nexport function getSeriesOption(series, options, key) {\n if(series.name && options.series && options.series[series.name]) {\n const seriesOptions = options.series[series.name];\n return seriesOptions.hasOwnProperty(key) ? seriesOptions[key] : options[key];\n } else {\n return options[key];\n }\n}\n\n/**\n * Splits a list of coordinates and associated values into segments. Each returned segment contains a pathCoordinates\n * valueData property describing the segment.\n *\n * With the default options, segments consist of contiguous sets of points that do not have an undefined value. Any\n * points with undefined values are discarded.\n *\n * **Options**\n * The following options are used to determine how segments are formed\n * ```javascript\n * var options = {\n * // If fillHoles is true, undefined values are simply discarded without creating a new segment. Assuming other options are default, this returns single segment.\n * fillHoles: false,\n * // If increasingX is true, the coordinates in all segments have strictly increasing x-values.\n * increasingX: false\n * };\n * ```\n *\n * @memberof Chartist.Core\n * @param {Array} pathCoordinates List of point coordinates to be split in the form [x1, y1, x2, y2 ... xn, yn]\n * @param {Array} valueData List of associated point values in the form [v1, v2 .. vn]\n * @param {Object} [options] Options set by user\n * @return {Array} List of segments, each containing a pathCoordinates and valueData property.\n */\nexport function splitIntoSegments(pathCoordinates, valueData, options) {\n const defaultOptions = {\n increasingX: false,\n fillHoles: false\n };\n\n options = extend({}, defaultOptions, options);\n\n const segments = [];\n let hole = true;\n\n for(let i = 0; i < pathCoordinates.length; i += 2) {\n // If this value is a \"hole\" we set the hole flag\n if(getMultiValue(valueData[i / 2].value) === undefined) {\n // if(valueData[i / 2].value === undefined) {\n if(!options.fillHoles) {\n hole = true;\n }\n } else {\n if(options.increasingX && i >= 2 && pathCoordinates[i] <= pathCoordinates[i - 2]) {\n // X is not increasing, so we need to make sure we start a new segment\n hole = true;\n }\n\n\n // If it's a valid value we need to check if we're coming out of a hole and create a new empty segment\n if(hole) {\n segments.push({\n pathCoordinates: [],\n valueData: []\n });\n // As we have a valid value now, we are not in a \"hole\" anymore\n hole = false;\n }\n\n // Add to the segment pathCoordinates and valueData\n segments[segments.length - 1].pathCoordinates.push(pathCoordinates[i], pathCoordinates[i + 1]);\n segments[segments.length - 1].valueData.push(valueData[i / 2]);\n }\n }\n\n return segments;\n}\n\n/**\n * Get highest and lowest value of data array. This Array contains the data that will be visualized in the chart.\n *\n * @memberof Chartist.Core\n * @param {Array} data The array that contains the data to be visualized in the chart\n * @param {Object} options The Object that contains the chart options\n * @param {String} dimension Axis dimension 'x' or 'y' used to access the correct value and high / low configuration\n * @return {Object} An object that contains the highest and lowest value that will be visualized on the chart.\n */\nexport function getHighLow(data, options, dimension) {\n // TODO: Remove workaround for deprecated global high / low config. Axis high / low configuration is preferred\n options = extend({}, options, dimension ? options['axis' + dimension.toUpperCase()] : {});\n\n const highLow = {\n high: options.high === undefined ? -Number.MAX_VALUE : +options.high,\n low: options.low === undefined ? Number.MAX_VALUE : +options.low\n };\n const findHigh = options.high === undefined;\n const findLow = options.low === undefined;\n\n // Function to recursively walk through arrays and find highest and lowest number\n function recursiveHighLow(sourceData) {\n if(sourceData === undefined) {\n return undefined;\n } else if(sourceData instanceof Array) {\n for(let i = 0; i < sourceData.length; i++) {\n recursiveHighLow(sourceData[i]);\n }\n } else {\n const value = dimension ? +sourceData[dimension] : +sourceData;\n\n if(findHigh && value > highLow.high) {\n highLow.high = value;\n }\n\n if(findLow && value < highLow.low) {\n highLow.low = value;\n }\n }\n }\n\n // Start to find highest and lowest number recursively\n if(findHigh || findLow) {\n recursiveHighLow(data);\n }\n\n // Overrides of high / low based on reference value, it will make sure that the invisible reference value is\n // used to generate the chart. This is useful when the chart always needs to contain the position of the\n // invisible reference value in the view i.e. for bipolar scales.\n if(options.referenceValue || options.referenceValue === 0) {\n highLow.high = Math.max(options.referenceValue, highLow.high);\n highLow.low = Math.min(options.referenceValue, highLow.low);\n }\n\n // If high and low are the same because of misconfiguration or flat data (only the same value) we need\n // to set the high or low to 0 depending on the polarity\n if(highLow.high <= highLow.low) {\n // If both values are 0 we set high to 1\n if(highLow.low === 0) {\n highLow.high = 1;\n } else if(highLow.low < 0) {\n // If we have the same negative value for the bounds we set bounds.high to 0\n highLow.high = 0;\n } else if(highLow.high > 0) {\n // If we have the same positive value for the bounds we set bounds.low to 0\n highLow.low = 0;\n } else {\n // If data array was empty, values are Number.MAX_VALUE and -Number.MAX_VALUE. Set bounds to prevent errors\n highLow.high = 1;\n highLow.low = 0;\n }\n }\n\n return highLow;\n}\n\n/**\n * Calculate and retrieve all the bounds for the chart and return them in one array\n *\n * @memberof Chartist.Core\n * @param {Number} axisLength The length of the Axis used for\n * @param {Object} highLow An object containing a high and low property indicating the value range of the chart.\n * @param {Number} scaleMinSpace The minimum projected length a step should result in\n * @param {Boolean} onlyInteger\n * @return {Object} All the values to set the bounds of the chart\n */\nexport function getBounds(axisLength, highLow, scaleMinSpace, onlyInteger) {\n const bounds = {\n high: highLow.high,\n low: highLow.low\n };\n\n bounds.valueRange = bounds.high - bounds.low;\n bounds.oom = orderOfMagnitude(bounds.valueRange);\n bounds.step = Math.pow(10, bounds.oom);\n bounds.min = Math.floor(bounds.low / bounds.step) * bounds.step;\n bounds.max = Math.ceil(bounds.high / bounds.step) * bounds.step;\n bounds.range = bounds.max - bounds.min;\n bounds.numberOfSteps = Math.round(bounds.range / bounds.step);\n\n // Optimize scale step by checking if subdivision is possible based on horizontalGridMinSpace\n // If we are already below the scaleMinSpace value we will scale up\n const length = projectLength(axisLength, bounds.step, bounds);\n const scaleUp = length < scaleMinSpace;\n const smallestFactor = onlyInteger ? rho(bounds.range) : 0;\n\n // First check if we should only use integer steps and if step 1 is still larger than scaleMinSpace so we can use 1\n if(onlyInteger && projectLength(axisLength, 1, bounds) >= scaleMinSpace) {\n bounds.step = 1;\n } else if(onlyInteger && smallestFactor < bounds.step && projectLength(axisLength, smallestFactor, bounds) >= scaleMinSpace) {\n // If step 1 was too small, we can try the smallest factor of range\n // If the smallest factor is smaller than the current bounds.step and the projected length of smallest factor\n // is larger than the scaleMinSpace we should go for it.\n bounds.step = smallestFactor;\n } else {\n // Trying to divide or multiply by 2 and find the best step value\n let optimizationCounter = 0;\n while(true) {\n if(scaleUp && projectLength(axisLength, bounds.step, bounds) <= scaleMinSpace) {\n bounds.step *= 2;\n } else if(!scaleUp && projectLength(axisLength, bounds.step / 2, bounds) >= scaleMinSpace) {\n bounds.step /= 2;\n if(onlyInteger && bounds.step % 1 !== 0) {\n bounds.step *= 2;\n break;\n }\n } else {\n break;\n }\n\n if(optimizationCounter++ > 1000) {\n throw new Error('Exceeded maximum number of iterations while optimizing scale step!');\n }\n }\n }\n\n bounds.step = Math.max(bounds.step, EPSILON);\n function safeIncrement(value, increment) {\n // If increment is too small use *= (1+EPSILON) as a simple nextafter\n if(value === (value += increment)) {\n value *= (1 + (increment > 0 ? EPSILON : -EPSILON));\n }\n return value;\n }\n\n // Narrow min and max based on new step\n let newMin = bounds.min;\n let newMax = bounds.max;\n while(newMin + bounds.step <= bounds.low) {\n newMin = safeIncrement(newMin, bounds.step);\n }\n while(newMax - bounds.step >= bounds.high) {\n newMax = safeIncrement(newMax, -bounds.step);\n }\n bounds.min = newMin;\n bounds.max = newMax;\n bounds.range = bounds.max - bounds.min;\n\n const values = [];\n for(let i = bounds.min; i <= bounds.max; i = safeIncrement(i, bounds.step)) {\n const value = roundWithPrecision(i);\n if(value !== values[values.length - 1]) {\n values.push(value);\n }\n }\n bounds.values = values;\n\n return bounds;\n}\n","import {namespaces, ensureUnit, quantity, extend} from '../core/core';\nimport {SvgList} from './svg-list';\n\n/**\n * Svg creates a new SVG object wrapper with a starting element. You can use the wrapper to fluently create sub-elements and modify them.\n *\n * @memberof Svg\n * @constructor\n * @param {String|Element} name The name of the SVG element to create or an SVG dom element which should be wrapped into Svg\n * @param {Object} attributes An object with properties that will be added as attributes to the SVG element that is created. Attributes with undefined values will not be added.\n * @param {String} className This class or class list will be added to the SVG element\n * @param {Object} parent The parent SVG wrapper object where this newly created wrapper and it's element will be attached to as child\n * @param {Boolean} insertFirst If this param is set to true in conjunction with a parent element the newly created element will be added as first child element in the parent element\n */\nexport class Svg {\n\n constructor(name, attributes, className, parent, insertFirst) {\n // If Svg is getting called with an SVG element we just return the wrapper\n if(name instanceof Element) {\n this._node = name;\n } else {\n this._node = document.createElementNS(namespaces.svg, name);\n\n // If this is an SVG element created then custom namespace\n if(name === 'svg') {\n this.attr({\n 'xmlns:ct': namespaces.ct\n });\n }\n }\n\n if(attributes) {\n this.attr(attributes);\n }\n\n if(className) {\n this.addClass(className);\n }\n\n if(parent) {\n if(insertFirst && parent._node.firstChild) {\n parent._node.insertBefore(this._node, parent._node.firstChild);\n } else {\n parent._node.appendChild(this._node);\n }\n }\n }\n\n /**\n * Set attributes on the current SVG element of the wrapper you're currently working on.\n *\n * @memberof Svg\n * @param {Object|String} attributes An object with properties that will be added as attributes to the SVG element that is created. Attributes with undefined values will not be added. If this parameter is a String then the function is used as a getter and will return the attribute value.\n * @param {String} [ns] If specified, the attribute will be obtained using getAttributeNs. In order to write namepsaced attributes you can use the namespace:attribute notation within the attributes object.\n * @return {Object|String} The current wrapper object will be returned so it can be used for chaining or the attribute value if used as getter function.\n */\n attr(attributes, ns) {\n if(typeof attributes === 'string') {\n if(ns) {\n return this._node.getAttributeNS(ns, attributes);\n } else {\n return this._node.getAttribute(attributes);\n }\n }\n\n Object.keys(attributes).forEach(function(key) {\n // If the attribute value is undefined we can skip this one\n if(attributes[key] === undefined) {\n return;\n }\n\n if(key.indexOf(':') !== -1) {\n const namespacedAttribute = key.split(':');\n this._node.setAttributeNS(namespaces[namespacedAttribute[0]], key, attributes[key]);\n } else {\n this._node.setAttribute(key, attributes[key]);\n }\n }.bind(this));\n\n return this;\n }\n\n /**\n * Create a new SVG element whose wrapper object will be selected for further operations. This way you can also create nested groups easily.\n *\n * @memberof Svg\n * @param {String} name The name of the SVG element that should be created as child element of the currently selected element wrapper\n * @param {Object} [attributes] An object with properties that will be added as attributes to the SVG element that is created. Attributes with undefined values will not be added.\n * @param {String} [className] This class or class list will be added to the SVG element\n * @param {Boolean} [insertFirst] If this param is set to true in conjunction with a parent element the newly created element will be added as first child element in the parent element\n * @return {Svg} Returns a Svg wrapper object that can be used to modify the containing SVG data\n */\n elem(name, attributes, className, insertFirst) {\n return new Svg(name, attributes, className, this, insertFirst);\n }\n\n /**\n * Returns the parent Chartist.SVG wrapper object\n *\n * @memberof Svg\n * @return {Svg} Returns a Svg wrapper around the parent node of the current node. If the parent node is not existing or it's not an SVG node then this function will return null.\n */\n parent() {\n return this._node.parentNode instanceof SVGElement ? new Svg(this._node.parentNode) : null;\n }\n\n /**\n * This method returns a Svg wrapper around the root SVG element of the current tree.\n *\n * @memberof Svg\n * @return {Svg} The root SVG element wrapped in a Svg element\n */\n root() {\n let node = this._node;\n while(node.nodeName !== 'svg') {\n node = node.parentNode;\n }\n return new Svg(node);\n }\n\n /**\n * Find the first child SVG element of the current element that matches a CSS selector. The returned object is a Svg wrapper.\n *\n * @memberof Svg\n * @param {String} selector A CSS selector that is used to query for child SVG elements\n * @return {Svg} The SVG wrapper for the element found or null if no element was found\n */\n querySelector(selector) {\n const foundNode = this._node.querySelector(selector);\n return foundNode ? new Svg(foundNode) : null;\n }\n\n /**\n * Find the all child SVG elements of the current element that match a CSS selector. The returned object is a Svg.List wrapper.\n *\n * @memberof Svg\n * @param {String} selector A CSS selector that is used to query for child SVG elements\n * @return {SvgList} The SVG wrapper list for the element found or null if no element was found\n */\n querySelectorAll(selector) {\n const foundNodes = this._node.querySelectorAll(selector);\n return foundNodes.length ? new SvgList(foundNodes) : null;\n }\n\n /**\n * Returns the underlying SVG node for the current element.\n *\n * @memberof Svg\n * @returns {Node}\n */\n getNode() {\n return this._node;\n }\n\n /**\n * This method creates a foreignObject (see https://developer.mozilla.org/en-US/docs/Web/SVG/Element/foreignObject) that allows to embed HTML content into a SVG graphic. With the help of foreignObjects you can enable the usage of regular HTML elements inside of SVG where they are subject for SVG positioning and transformation but the Browser will use the HTML rendering capabilities for the containing DOM.\n *\n * @memberof Svg\n * @param {Node|String} content The DOM Node, or HTML string that will be converted to a DOM Node, that is then placed into and wrapped by the foreignObject\n * @param {String} [attributes] An object with properties that will be added as attributes to the foreignObject element that is created. Attributes with undefined values will not be added.\n * @param {String} [className] This class or class list will be added to the SVG element\n * @param {Boolean} [insertFirst] Specifies if the foreignObject should be inserted as first child\n * @return {Svg} New wrapper object that wraps the foreignObject element\n */\n foreignObject(content, attributes, className, insertFirst) {\n // If content is string then we convert it to DOM\n // TODO: Handle case where content is not a string nor a DOM Node\n if(typeof content === 'string') {\n const container = document.createElement('div');\n container.innerHTML = content;\n content = container.firstChild;\n }\n\n // Adding namespace to content element\n content.setAttribute('xmlns', namespaces.xmlns);\n\n // Creating the foreignObject without required extension attribute (as described here\n // http://www.w3.org/TR/SVG/extend.html#ForeignObjectElement)\n const fnObj = this.elem('foreignObject', attributes, className, insertFirst);\n\n // Add content to foreignObjectElement\n fnObj._node.appendChild(content);\n\n return fnObj;\n }\n\n /**\n * This method adds a new text element to the current Svg wrapper.\n *\n * @memberof Svg\n * @param {String} t The text that should be added to the text element that is created\n * @return {Svg} The same wrapper object that was used to add the newly created element\n */\n text(t) {\n this._node.appendChild(document.createTextNode(t));\n return this;\n }\n\n /**\n * This method will clear all child nodes of the current wrapper object.\n *\n * @memberof Svg\n * @return {Svg} The same wrapper object that got emptied\n */\n empty() {\n while(this._node.firstChild) {\n this._node.removeChild(this._node.firstChild);\n }\n\n return this;\n }\n\n /**\n * This method will cause the current wrapper to remove itself from its parent wrapper. Use this method if you'd like to get rid of an element in a given DOM structure.\n *\n * @memberof Svg\n * @return {Svg} The parent wrapper object of the element that got removed\n */\n remove() {\n this._node.parentNode.removeChild(this._node);\n return this.parent();\n }\n\n /**\n * This method will replace the element with a new element that can be created outside of the current DOM.\n *\n * @memberof Svg\n * @param {Svg} newElement The new Svg object that will be used to replace the current wrapper object\n * @return {Svg} The wrapper of the new element\n */\n replace(newElement) {\n this._node.parentNode.replaceChild(newElement._node, this._node);\n return newElement;\n }\n\n /**\n * This method will append an element to the current element as a child.\n *\n * @memberof Svg\n * @param {Svg} element The Svg element that should be added as a child\n * @param {Boolean} [insertFirst] Specifies if the element should be inserted as first child\n * @return {Svg} The wrapper of the appended object\n */\n append(element, insertFirst) {\n if(insertFirst && this._node.firstChild) {\n this._node.insertBefore(element._node, this._node.firstChild);\n } else {\n this._node.appendChild(element._node);\n }\n\n return this;\n }\n\n /**\n * Returns an array of class names that are attached to the current wrapper element. This method can not be chained further.\n *\n * @memberof Svg\n * @return {Array} A list of classes or an empty array if there are no classes on the current element\n */\n classes() {\n return this._node.getAttribute('class') ? this._node.getAttribute('class').trim().split(/\\s+/) : [];\n }\n\n /**\n * Adds one or a space separated list of classes to the current element and ensures the classes are only existing once.\n *\n * @memberof Svg\n * @param {String} names A white space separated list of class names\n * @return {Svg} The wrapper of the current element\n */\n addClass(names) {\n this._node.setAttribute('class',\n this.classes()\n .concat(names.trim().split(/\\s+/))\n .filter(function(elem, pos, self) {\n return self.indexOf(elem) === pos;\n }).join(' ')\n );\n\n return this;\n }\n\n /**\n * Removes one or a space separated list of classes from the current element.\n *\n * @memberof Svg\n * @param {String} names A white space separated list of class names\n * @return {Svg} The wrapper of the current element\n */\n removeClass(names) {\n const removedClasses = names.trim().split(/\\s+/);\n\n this._node.setAttribute('class',\n this.classes().filter((name) => removedClasses.indexOf(name) === -1).join(' '));\n\n return this;\n }\n\n /**\n * Removes all classes from the current element.\n *\n * @memberof Svg\n * @return {Svg} The wrapper of the current element\n */\n removeAllClasses() {\n this._node.setAttribute('class', '');\n return this;\n }\n\n /**\n * Get element height using `getBoundingClientRect`\n *\n * @memberof Svg\n * @return {Number} The elements height in pixels\n */\n height() {\n return this._node.getBoundingClientRect().height;\n }\n\n /**\n * Get element width using `getBoundingClientRect`\n *\n * @memberof Chartist.Core\n * @return {Number} The elements width in pixels\n */\n width() {\n return this._node.getBoundingClientRect().width;\n }\n\n /**\n * The animate function lets you animate the current element with SMIL animations. You can add animations for multiple attributes at the same time by using an animation definition object. This object should contain SMIL animation attributes. Please refer to http://www.w3.org/TR/SVG/animate.html for a detailed specification about the available animation attributes. Additionally an easing property can be passed in the animation definition object. This can be a string with a name of an easing function in `Svg.Easing` or an array with four numbers specifying a cubic Bézier curve.\n * **An animations object could look like this:**\n * ```javascript\n * element.animate({\n * opacity: {\n * dur: 1000,\n * from: 0,\n * to: 1\n * },\n * x1: {\n * dur: '1000ms',\n * from: 100,\n * to: 200,\n * easing: 'easeOutQuart'\n * },\n * y1: {\n * dur: '2s',\n * from: 0,\n * to: 100\n * }\n * });\n * ```\n * **Automatic unit conversion**\n * For the `dur` and the `begin` animate attribute you can also omit a unit by passing a number. The number will automatically be converted to milli seconds.\n * **Guided mode**\n * The default behavior of SMIL animations with offset using the `begin` attribute is that the attribute will keep it's original value until the animation starts. Mostly this behavior is not desired as you'd like to have your element attributes already initialized with the animation `from` value even before the animation starts. Also if you don't specify `fill=\"freeze\"` on an animate element or if you delete the animation after it's done (which is done in guided mode) the attribute will switch back to the initial value. This behavior is also not desired when performing simple one-time animations. For one-time animations you'd want to trigger animations immediately instead of relative to the document begin time. That's why in guided mode Svg will also use the `begin` property to schedule a timeout and manually start the animation after the timeout. If you're using multiple SMIL definition objects for an attribute (in an array), guided mode will be disabled for this attribute, even if you explicitly enabled it.\n * If guided mode is enabled the following behavior is added:\n * - Before the animation starts (even when delayed with `begin`) the animated attribute will be set already to the `from` value of the animation\n * - `begin` is explicitly set to `indefinite` so it can be started manually without relying on document begin time (creation)\n * - The animate element will be forced to use `fill=\"freeze\"`\n * - The animation will be triggered with `beginElement()` in a timeout where `begin` of the definition object is interpreted in milli seconds. If no `begin` was specified the timeout is triggered immediately.\n * - After the animation the element attribute value will be set to the `to` value of the animation\n * - The animate element is deleted from the DOM\n *\n * @memberof Svg\n * @param {Object} animations An animations object where the property keys are the attributes you'd like to animate. The properties should be objects again that contain the SMIL animation attributes (usually begin, dur, from, and to). The property begin and dur is auto converted (see Automatic unit conversion). You can also schedule multiple animations for the same attribute by passing an Array of SMIL definition objects. Attributes that contain an array of SMIL definition objects will not be executed in guided mode.\n * @param {Boolean} guided Specify if guided mode should be activated for this animation (see Guided mode). If not otherwise specified, guided mode will be activated.\n * @param {Object} eventEmitter If specified, this event emitter will be notified when an animation starts or ends.\n * @return {Svg} The current element where the animation was added\n */\n animate(animations, guided, eventEmitter) {\n if(guided === undefined) {\n guided = true;\n }\n\n Object.keys(animations).forEach((attribute) => {\n\n const createAnimate = (animationDefinition, createGuided) => {\n const attributeProperties = {};\n let animationEasing;\n let timeout;\n\n // Check if an easing is specified in the definition object and delete it from the object as it will not\n // be part of the animate element attributes.\n if(animationDefinition.easing) {\n // If already an easing Bézier curve array we take it or we lookup a easing array in the Easing object\n animationEasing = animationDefinition.easing instanceof Array ?\n animationDefinition.easing :\n easings[animationDefinition.easing];\n delete animationDefinition.easing;\n }\n\n // If numeric dur or begin was provided we assume milli seconds\n animationDefinition.begin = ensureUnit(animationDefinition.begin, 'ms');\n animationDefinition.dur = ensureUnit(animationDefinition.dur, 'ms');\n\n if(animationEasing) {\n animationDefinition.calcMode = 'spline';\n animationDefinition.keySplines = animationEasing.join(' ');\n animationDefinition.keyTimes = '0;1';\n }\n\n // Adding \"fill: freeze\" if we are in guided mode and set initial attribute values\n if(createGuided) {\n animationDefinition.fill = 'freeze';\n // Animated property on our element should already be set to the animation from value in guided mode\n attributeProperties[attribute] = animationDefinition.from;\n this.attr(attributeProperties);\n\n // In guided mode we also set begin to indefinite so we can trigger the start manually and put the begin\n // which needs to be in ms aside\n timeout = quantity(animationDefinition.begin || 0).value;\n animationDefinition.begin = 'indefinite';\n }\n\n const animate = this.elem('animate', extend({\n attributeName: attribute\n }, animationDefinition));\n\n if(createGuided) {\n // If guided we take the value that was put aside in timeout and trigger the animation manually with a timeout\n setTimeout(() => {\n // If beginElement fails we set the animated attribute to the end position and remove the animate element\n // This happens if the SMIL ElementTimeControl interface is not supported or any other problems occurred in\n // the browser. (Currently FF 34 does not support animate elements in foreignObjects)\n try {\n animate._node.beginElement();\n } catch(err) {\n // Set animated attribute to current animated value\n attributeProperties[attribute] = animationDefinition.to;\n this.attr(attributeProperties);\n // Remove the animate element as it's no longer required\n animate.remove();\n }\n }, timeout);\n }\n\n if(eventEmitter) {\n animate._node.addEventListener('beginEvent', () =>\n eventEmitter.emit('animationBegin', {\n element: this,\n animate: animate._node,\n params: animationDefinition\n })\n );\n }\n\n animate._node.addEventListener('endEvent', () => {\n if(eventEmitter) {\n eventEmitter.emit('animationEnd', {\n element: this,\n animate: animate._node,\n params: animationDefinition\n });\n }\n\n if(createGuided) {\n // Set animated attribute to current animated value\n attributeProperties[attribute] = animationDefinition.to;\n this.attr(attributeProperties);\n // Remove the animate element as it's no longer required\n animate.remove();\n }\n });\n };\n\n // If current attribute is an array of definition objects we create an animate for each and disable guided mode\n if(animations[attribute] instanceof Array) {\n animations[attribute]\n .forEach((animationDefinition) => createAnimate(animationDefinition, false));\n } else {\n createAnimate(animations[attribute], guided);\n }\n });\n\n return this;\n }\n}\n\n/**\n * This method checks for support of a given SVG feature like Extensibility, SVG-animation or the like. Check http://www.w3.org/TR/SVG11/feature for a detailed list.\n *\n * @memberof Svg\n * @param {String} feature The SVG 1.1 feature that should be checked for support.\n * @return {Boolean} True of false if the feature is supported or not\n */\nexport function isSupported(feature) {\n return document.implementation.hasFeature('http://www.w3.org/TR/SVG11/feature#' + feature, '1.1');\n}\n\n/**\n * This Object contains some standard easing cubic bezier curves. Then can be used with their name in the `Svg.animate`. You can also extend the list and use your own name in the `animate` function. Click the show code button to see the available bezier functions.\n *\n * @memberof Svg\n */\nexport const easings = {\n easeInSine: [0.47, 0, 0.745, 0.715],\n easeOutSine: [0.39, 0.575, 0.565, 1],\n easeInOutSine: [0.445, 0.05, 0.55, 0.95],\n easeInQuad: [0.55, 0.085, 0.68, 0.53],\n easeOutQuad: [0.25, 0.46, 0.45, 0.94],\n easeInOutQuad: [0.455, 0.03, 0.515, 0.955],\n easeInCubic: [0.55, 0.055, 0.675, 0.19],\n easeOutCubic: [0.215, 0.61, 0.355, 1],\n easeInOutCubic: [0.645, 0.045, 0.355, 1],\n easeInQuart: [0.895, 0.03, 0.685, 0.22],\n easeOutQuart: [0.165, 0.84, 0.44, 1],\n easeInOutQuart: [0.77, 0, 0.175, 1],\n easeInQuint: [0.755, 0.05, 0.855, 0.06],\n easeOutQuint: [0.23, 1, 0.32, 1],\n easeInOutQuint: [0.86, 0, 0.07, 1],\n easeInExpo: [0.95, 0.05, 0.795, 0.035],\n easeOutExpo: [0.19, 1, 0.22, 1],\n easeInOutExpo: [1, 0, 0, 1],\n easeInCirc: [0.6, 0.04, 0.98, 0.335],\n easeOutCirc: [0.075, 0.82, 0.165, 1],\n easeInOutCirc: [0.785, 0.135, 0.15, 0.86],\n easeInBack: [0.6, -0.28, 0.735, 0.045],\n easeOutBack: [0.175, 0.885, 0.32, 1.275],\n easeInOutBack: [0.68, -0.55, 0.265, 1.55]\n};\n","import {namespaces} from './globals';\nimport {Svg} from '../svg/svg';\nimport {quantity} from './lang';\nimport {extend} from './extend';\n\n/**\n * Create or reinitialize the SVG element for the chart\n *\n * @memberof Chartist.Core\n * @param {Node} container The containing DOM Node object that will be used to plant the SVG element\n * @param {String} width Set the width of the SVG element. Default is 100%\n * @param {String} height Set the height of the SVG element. Default is 100%\n * @param {String} className Specify a class to be added to the SVG element\n * @return {Object} The created/reinitialized SVG element\n */\nexport function createSvg(container, width = '100%', height = '100%', className) {\n // Check if there is a previous SVG element in the container that contains the Chartist XML namespace and remove it\n // Since the DOM API does not support namespaces we need to manually search the returned list http://www.w3.org/TR/selectors-api/\n Array.from(container.querySelectorAll('svg'))\n .filter((svg) => svg.getAttributeNS(namespaces.xmlns, 'ct'))\n .forEach((svg) => container.removeChild(svg));\n\n // Create svg object with width and height or use 100% as default\n const svg = new Svg('svg').attr({\n width,\n height\n }).addClass(className).attr({\n // TODO: Check better solution (browser support) and remove inline styles due to CSP\n style: `width: ${width}; height: ${height};`\n });\n\n // Add the DOM node to our container\n container.appendChild(svg._node);\n\n return svg;\n}\n\n/**\n * Converts a number into a padding object.\n *\n * @memberof Chartist.Core\n * @param {Object|Number} padding\n * @param {Number} [fallback] This value is used to fill missing values if a incomplete padding object was passed\n * @returns {Object} Returns a padding object containing top, right, bottom, left properties filled with the padding number passed in as argument. If the argument is something else than a number (presumably already a correct padding object) then this argument is directly returned.\n */\nexport function normalizePadding(padding, fallback = 0) {\n return typeof padding === 'number' ? {\n top: padding,\n right: padding,\n bottom: padding,\n left: padding\n } : {\n top: typeof padding.top === 'number' ? padding.top : fallback,\n right: typeof padding.right === 'number' ? padding.right : fallback,\n bottom: typeof padding.bottom === 'number' ? padding.bottom : fallback,\n left: typeof padding.left === 'number' ? padding.left : fallback\n };\n}\n\n/**\n * Initialize chart drawing rectangle (area where chart is drawn) x1,y1 = bottom left / x2,y2 = top right\n *\n * @memberof Chartist.Core\n * @param {Object} svg The svg element for the chart\n * @param {Object} options The Object that contains all the optional values for the chart\n * @param {Number} [fallbackPadding] The fallback padding if partial padding objects are used\n * @return {Object} The chart rectangles coordinates inside the svg element plus the rectangles measurements\n */\nexport function createChartRect(svg, options, fallbackPadding) {\n const hasAxis = !!(options.axisX || options.axisY);\n const yAxisOffset = hasAxis ? options.axisY.offset : 0;\n const xAxisOffset = hasAxis ? options.axisX.offset : 0;\n // If width or height results in invalid value (including 0) we fallback to the unitless settings or even 0\n let width = svg.width() || quantity(options.width).value || 0;\n let height = svg.height() || quantity(options.height).value || 0;\n const normalizedPadding = normalizePadding(options.chartPadding, fallbackPadding);\n\n // If settings were to small to cope with offset (legacy) and padding, we'll adjust\n width = Math.max(width, yAxisOffset + normalizedPadding.left + normalizedPadding.right);\n height = Math.max(height, xAxisOffset + normalizedPadding.top + normalizedPadding.bottom);\n\n const chartRect = {\n padding: normalizedPadding,\n width: function() {\n return this.x2 - this.x1;\n },\n height: function() {\n return this.y1 - this.y2;\n }\n };\n\n if(hasAxis) {\n if(options.axisX.position === 'start') {\n chartRect.y2 = normalizedPadding.top + xAxisOffset;\n chartRect.y1 = Math.max(height - normalizedPadding.bottom, chartRect.y2 + 1);\n } else {\n chartRect.y2 = normalizedPadding.top;\n chartRect.y1 = Math.max(height - normalizedPadding.bottom - xAxisOffset, chartRect.y2 + 1);\n }\n\n if(options.axisY.position === 'start') {\n chartRect.x1 = normalizedPadding.left + yAxisOffset;\n chartRect.x2 = Math.max(width - normalizedPadding.right, chartRect.x1 + 1);\n } else {\n chartRect.x1 = normalizedPadding.left;\n chartRect.x2 = Math.max(width - normalizedPadding.right - yAxisOffset, chartRect.x1 + 1);\n }\n } else {\n chartRect.x1 = normalizedPadding.left;\n chartRect.x2 = Math.max(width - normalizedPadding.right, chartRect.x1 + 1);\n chartRect.y2 = normalizedPadding.top;\n chartRect.y1 = Math.max(height - normalizedPadding.bottom, chartRect.y2 + 1);\n }\n\n return chartRect;\n}\n\n/**\n * Creates a grid line based on a projected value.\n *\n * @memberof Chartist.Core\n * @param position\n * @param index\n * @param axis\n * @param offset\n * @param length\n * @param group\n * @param classes\n * @param eventEmitter\n */\nexport function createGrid(position, index, axis, offset, length, group, classes, eventEmitter) {\n const positionalData = {};\n positionalData[`${axis.units.pos}1`] = position;\n positionalData[`${axis.units.pos}2`] = position;\n positionalData[`${axis.counterUnits.pos}1`] = offset;\n positionalData[`${axis.counterUnits.pos}2`] = offset + length;\n\n const gridElement = group.elem('line', positionalData, classes.join(' '));\n\n // Event for grid draw\n eventEmitter.emit('draw',\n extend({\n type: 'grid',\n axis,\n index,\n group,\n element: gridElement\n }, positionalData)\n );\n}\n\n/**\n * Creates a grid background rect and emits the draw event.\n *\n * @memberof Chartist.Core\n * @param gridGroup\n * @param chartRect\n * @param className\n * @param eventEmitter\n */\nexport function createGridBackground(gridGroup, chartRect, className, eventEmitter) {\n const gridBackground = gridGroup.elem('rect', {\n x: chartRect.x1,\n y: chartRect.y2,\n width: chartRect.width(),\n height: chartRect.height()\n }, className, true);\n\n // Event for grid background draw\n eventEmitter.emit('draw', {\n type: 'gridBackground',\n group: gridGroup,\n element: gridBackground\n });\n}\n\n/**\n * Creates a label based on a projected value and an axis.\n *\n * @memberof Chartist.Core\n * @param position\n * @param length\n * @param index\n * @param labels\n * @param axis\n * @param axisOffset\n * @param labelOffset\n * @param group\n * @param classes\n * @param useForeignObject\n * @param eventEmitter\n */\nexport function createLabel(position, length, index, labels, axis, axisOffset, labelOffset, group, classes, useForeignObject, eventEmitter) {\n let labelElement;\n const positionalData = {};\n\n positionalData[axis.units.pos] = position + labelOffset[axis.units.pos];\n positionalData[axis.counterUnits.pos] = labelOffset[axis.counterUnits.pos];\n positionalData[axis.units.len] = length;\n positionalData[axis.counterUnits.len] = Math.max(0, axisOffset - 10);\n\n if(useForeignObject) {\n // We need to set width and height explicitly to px as span will not expand with width and height being\n // 100% in all browsers\n const stepLength = Math.round(positionalData[axis.units.len]);\n const stepCounterLength = Math.round(positionalData[axis.counterUnits.len]);\n const content = `\n \n ${labels[index]}\n \n `.trim();\n\n labelElement = group.foreignObject(content, extend({\n style: 'overflow: visible;'\n }, positionalData));\n } else {\n labelElement = group.elem('text', positionalData, classes.join(' ')).text(labels[index]);\n }\n\n eventEmitter.emit('draw', extend({\n type: 'label',\n axis,\n index,\n group,\n element: labelElement,\n text: labels[index]\n }, positionalData));\n}\n","import {extend} from './extend';\n\n/**\n * Provides options handling functionality with callback for options changes triggered by responsive options and media query matches\n *\n * @memberof Chartist.Core\n * @param {Object} options Options set by user\n * @param {Array} responsiveOptions Optional functions to add responsive behavior to chart\n * @param {Object} eventEmitter The event emitter that will be used to emit the options changed events\n * @return {Object} The consolidated options object from the defaults, base and matching responsive options\n */\nexport function optionsProvider(options, responsiveOptions, eventEmitter) {\n const baseOptions = extend({}, options);\n let currentOptions;\n const mediaQueryListeners = [];\n\n function updateCurrentOptions(mediaEvent) {\n const previousOptions = currentOptions;\n currentOptions = extend({}, baseOptions);\n\n if(responsiveOptions) {\n responsiveOptions.forEach((responsiveOption) => {\n const mql = window.matchMedia(responsiveOption[0]);\n if(mql.matches) {\n currentOptions = extend(currentOptions, responsiveOption[1]);\n }\n });\n }\n\n if(eventEmitter && mediaEvent) {\n eventEmitter.emit('optionsChanged', {\n previousOptions,\n currentOptions\n });\n }\n }\n\n function removeMediaQueryListeners() {\n mediaQueryListeners.forEach((mql) => mql.removeListener(updateCurrentOptions));\n }\n\n if(!window.matchMedia) {\n throw 'window.matchMedia not found! Make sure you\\'re using a polyfill.';\n } else if(responsiveOptions) {\n responsiveOptions.forEach((responsiveOption) => {\n const mql = window.matchMedia(responsiveOption[0]);\n mql.addListener(updateCurrentOptions);\n mediaQueryListeners.push(mql);\n });\n }\n // Execute initially without an event argument so we get the correct options\n updateCurrentOptions();\n\n return {\n removeMediaQueryListeners,\n getCurrentOptions() {\n return extend({}, currentOptions);\n }\n };\n}\n","import {extend} from '../core/core';\n\n/**\n * Contains the descriptors of supported element types in a SVG path. Currently only move, line and curve are supported.\n *\n * @memberof SvgPath\n * @type {Object}\n */\nconst elementDescriptions = {\n m: ['x', 'y'],\n l: ['x', 'y'],\n c: ['x1', 'y1', 'x2', 'y2', 'x', 'y'],\n a: ['rx', 'ry', 'xAr', 'lAf', 'sf', 'x', 'y']\n};\n\n/**\n * Default options for newly created SVG path objects.\n *\n * @memberof SvgPath\n * @type {Object}\n */\nconst defaultOptions = {\n // The accuracy in digit count after the decimal point. This will be used to round numbers in the SVG path. If this option is set to false then no rounding will be performed.\n accuracy: 3\n};\n\nfunction element(command, params, pathElements, pos, relative, data) {\n const pathElement = extend({\n command: relative ? command.toLowerCase() : command.toUpperCase()\n }, params, data ? {data: data} : {});\n\n pathElements.splice(pos, 0, pathElement);\n}\n\nfunction forEachParam(pathElements, cb) {\n pathElements.forEach((pathElement, pathElementIndex) => {\n elementDescriptions[pathElement.command.toLowerCase()].forEach((paramName, paramIndex) => {\n cb(pathElement, paramName, pathElementIndex, paramIndex, pathElements);\n });\n });\n}\n\n/**\n * Used to construct a new path object.\n *\n * @memberof SvgPath\n * @param {Boolean} close If set to true then this path will be closed when stringified (with a Z at the end)\n * @param {Object} options Options object that overrides the default objects. See default options for more details.\n * @constructor\n */\nexport class SvgPath {\n /**\n * This static function on `SvgPath` is joining multiple paths together into one paths.\n *\n * @memberof SvgPath\n * @param {Array} paths A list of paths to be joined together. The order is important.\n * @param {boolean} [close] If the newly created path should be a closed path\n * @param {Object} [options] Path options for the newly created path.\n * @return {SvgPath}\n */\n static join(paths, close, options) {\n const joinedPath = new SvgPath(close, options);\n for(let i = 0; i < paths.length; i++) {\n const path = paths[i];\n for(let j = 0; j < path.pathElements.length; j++) {\n joinedPath.pathElements.push(path.pathElements[j]);\n }\n }\n return joinedPath;\n }\n\n constructor(close, options) {\n this.pathElements = [];\n this.pos = 0;\n this.close = close;\n this.options = extend({}, defaultOptions, options);\n }\n\n /**\n * Gets or sets the current position (cursor) inside of the path. You can move around the cursor freely but limited to 0 or the count of existing elements. All modifications with element functions will insert new elements at the position of this cursor.\n *\n * @memberof SvgPath\n * @param {Number} [pos] If a number is passed then the cursor is set to this position in the path element array.\n * @return {SvgPath|Number} If the position parameter was passed then the return value will be the path object for easy call chaining. If no position parameter was passed then the current position is returned.\n */\n position(pos) {\n if(pos !== undefined) {\n this.pos = Math.max(0, Math.min(this.pathElements.length, pos));\n return this;\n } else {\n return this.pos;\n }\n }\n\n /**\n * Removes elements from the path starting at the current position.\n *\n * @memberof SvgPath\n * @param {Number} count Number of path elements that should be removed from the current position.\n * @return {SvgPath} The current path object for easy call chaining.\n */\n remove(count) {\n this.pathElements.splice(this.pos, count);\n return this;\n }\n\n /**\n * Use this function to add a new move SVG path element.\n *\n * @memberof SvgPath\n * @param {Number} x The x coordinate for the move element.\n * @param {Number} y The y coordinate for the move element.\n * @param {Boolean} [relative] If set to true the move element will be created with relative coordinates (lowercase letter)\n * @param {*} [data] Any data that should be stored with the element object that will be accessible in pathElement\n * @return {SvgPath} The current path object for easy call chaining.\n */\n move(x, y, relative, data) {\n element('M', {\n x: +x,\n y: +y\n }, this.pathElements, this.pos++, relative, data);\n return this;\n }\n\n /**\n * Use this function to add a new line SVG path element.\n *\n * @memberof SvgPath\n * @param {Number} x The x coordinate for the line element.\n * @param {Number} y The y coordinate for the line element.\n * @param {Boolean} [relative] If set to true the line element will be created with relative coordinates (lowercase letter)\n * @param {*} [data] Any data that should be stored with the element object that will be accessible in pathElement\n * @return {SvgPath} The current path object for easy call chaining.\n */\n line(x, y, relative, data) {\n element('L', {\n x: +x,\n y: +y\n }, this.pathElements, this.pos++, relative, data);\n return this;\n }\n\n /**\n * Use this function to add a new curve SVG path element.\n *\n * @memberof SvgPath\n * @param {Number} x1 The x coordinate for the first control point of the bezier curve.\n * @param {Number} y1 The y coordinate for the first control point of the bezier curve.\n * @param {Number} x2 The x coordinate for the second control point of the bezier curve.\n * @param {Number} y2 The y coordinate for the second control point of the bezier curve.\n * @param {Number} x The x coordinate for the target point of the curve element.\n * @param {Number} y The y coordinate for the target point of the curve element.\n * @param {Boolean} [relative] If set to true the curve element will be created with relative coordinates (lowercase letter)\n * @param {*} [data] Any data that should be stored with the element object that will be accessible in pathElement\n * @return {SvgPath} The current path object for easy call chaining.\n */\n curve(x1, y1, x2, y2, x, y, relative, data) {\n element('C', {\n x1: +x1,\n y1: +y1,\n x2: +x2,\n y2: +y2,\n x: +x,\n y: +y\n }, this.pathElements, this.pos++, relative, data);\n return this;\n }\n\n /**\n * Use this function to add a new non-bezier curve SVG path element.\n *\n * @memberof SvgPath\n * @param {Number} rx The radius to be used for the x-axis of the arc.\n * @param {Number} ry The radius to be used for the y-axis of the arc.\n * @param {Number} xAr Defines the orientation of the arc\n * @param {Number} lAf Large arc flag\n * @param {Number} sf Sweep flag\n * @param {Number} x The x coordinate for the target point of the curve element.\n * @param {Number} y The y coordinate for the target point of the curve element.\n * @param {Boolean} [relative] If set to true the curve element will be created with relative coordinates (lowercase letter)\n * @param {*} [data] Any data that should be stored with the element object that will be accessible in pathElement\n * @return {SvgPath} The current path object for easy call chaining.\n */\n arc(rx, ry, xAr, lAf, sf, x, y, relative, data) {\n element('A', {\n rx: +rx,\n ry: +ry,\n xAr: +xAr,\n lAf: +lAf,\n sf: +sf,\n x: +x,\n y: +y\n }, this.pathElements, this.pos++, relative, data);\n return this;\n }\n\n /**\n * Parses an SVG path seen in the d attribute of path elements, and inserts the parsed elements into the existing path object at the current cursor position. Any closing path indicators (Z at the end of the path) will be ignored by the parser as this is provided by the close option in the options of the path object.\n *\n * @memberof SvgPath\n * @param {String} path Any SVG path that contains move (m), line (l) or curve (c) components.\n * @return {SvgPath} The current path object for easy call chaining.\n */\n parse(path) {\n // Parsing the SVG path string into an array of arrays [['M', '10', '10'], ['L', '100', '100']]\n const chunks = path.replace(/([A-Za-z])([0-9])/g, '$1 $2')\n .replace(/([0-9])([A-Za-z])/g, '$1 $2')\n .split(/[\\s,]+/)\n .reduce((result, pathElement) => {\n if(pathElement.match(/[A-Za-z]/)) {\n result.push([]);\n }\n\n result[result.length - 1].push(pathElement);\n return result;\n }, []);\n\n // If this is a closed path we remove the Z at the end because this is determined by the close option\n if(chunks[chunks.length - 1][0].toUpperCase() === 'Z') {\n chunks.pop();\n }\n\n // Using svgPathElementDescriptions to map raw path arrays into objects that contain the command and the parameters\n // For example {command: 'M', x: '10', y: '10'}\n const elements = chunks.map((chunk) => {\n const command = chunk.shift();\n const description = elementDescriptions[command.toLowerCase()];\n\n return extend({\n command: command\n }, description.reduce((result, paramName, index) => {\n result[paramName] = +chunk[index];\n return result;\n }, {}));\n });\n\n // Preparing a splice call with the elements array as var arg params and insert the parsed elements at the current position\n this.pathElements.splice(this.pos, 0, ...elements);\n // Increase the internal position by the element count\n this.pos += elements.length;\n\n return this;\n }\n\n /**\n * This function renders to current SVG path object into a final SVG string that can be used in the d attribute of SVG path elements. It uses the accuracy option to round big decimals. If the close parameter was set in the constructor of this path object then a path closing Z will be appended to the output string.\n *\n * @memberof SvgPath\n * @return {String}\n */\n stringify() {\n const accuracyMultiplier = Math.pow(10, this.options.accuracy);\n\n return this.pathElements.reduce((path, pathElement) => {\n const params = elementDescriptions[pathElement.command.toLowerCase()].map((paramName) =>\n this.options.accuracy ?\n (Math.round(pathElement[paramName] * accuracyMultiplier) / accuracyMultiplier) :\n pathElement[paramName]\n );\n\n return path + pathElement.command + params.join(',');\n }, '') + (this.close ? 'Z' : '');\n }\n\n /**\n * Scales all elements in the current SVG path object. There is an individual parameter for each coordinate. Scaling will also be done for control points of curves, affecting the given coordinate.\n *\n * @memberof SvgPath\n * @param {Number} x The number which will be used to scale the x, x1 and x2 of all path elements.\n * @param {Number} y The number which will be used to scale the y, y1 and y2 of all path elements.\n * @return {SvgPath} The current path object for easy call chaining.\n */\n scale(x, y) {\n forEachParam(this.pathElements, (pathElement, paramName) =>\n pathElement[paramName] *= paramName[0] === 'x' ? x : y\n );\n return this;\n }\n\n /**\n * Translates all elements in the current SVG path object. The translation is relative and there is an individual parameter for each coordinate. Translation will also be done for control points of curves, affecting the given coordinate.\n *\n * @memberof SvgPath\n * @param {Number} x The number which will be used to translate the x, x1 and x2 of all path elements.\n * @param {Number} y The number which will be used to translate the y, y1 and y2 of all path elements.\n * @return {SvgPath} The current path object for easy call chaining.\n */\n translate(x, y) {\n forEachParam(this.pathElements, (pathElement, paramName) =>\n pathElement[paramName] += paramName[0] === 'x' ? x : y\n );\n return this;\n }\n\n /**\n * This function will run over all existing path elements and then loop over their attributes. The callback function will be called for every path element attribute that exists in the current path.\n * The method signature of the callback function looks like this:\n * ```javascript\n * function(pathElement, paramName, pathElementIndex, paramIndex, pathElements)\n * ```\n * If something else than undefined is returned by the callback function, this value will be used to replace the old value. This allows you to build custom transformations of path objects that can't be achieved using the basic transformation functions scale and translate.\n *\n * @memberof SvgPath\n * @param {Function} transformFnc The callback function for the transformation. Check the signature in the function description.\n * @return {SvgPath} The current path object for easy call chaining.\n */\n transform(transformFnc) {\n forEachParam(this.pathElements, (pathElement, paramName, pathElementIndex, paramIndex, pathElements) => {\n const transformed = transformFnc(pathElement, paramName, pathElementIndex, paramIndex, pathElements);\n if(transformed || transformed === 0) {\n pathElement[paramName] = transformed;\n }\n });\n return this;\n }\n\n /**\n * This function clones a whole path object with all its properties. This is a deep clone and path element objects will also be cloned.\n *\n * @memberof SvgPath\n * @param {Boolean} [close] Optional option to set the new cloned path to closed. If not specified or false, the original path close option will be used.\n * @return {SvgPath}\n */\n clone(close) {\n const clone = new SvgPath(close || this.close);\n clone.pos = this.pos;\n clone.pathElements = this.pathElements.slice().map((pathElement) => extend({}, pathElement));\n clone.options = extend({}, this.options);\n return clone;\n }\n\n /**\n * Split a Svg.Path object by a specific command in the path chain. The path chain will be split and an array of newly created paths objects will be returned. This is useful if you'd like to split an SVG path by it's move commands, for example, in order to isolate chunks of drawings.\n *\n * @memberof SvgPath\n * @param {String} command The command you'd like to use to split the path\n * @return {Array}\n */\n splitByCommand(command) {\n const split = [\n new SvgPath()\n ];\n\n this.pathElements.forEach((pathElement) => {\n if(pathElement.command === command.toUpperCase() && split[split.length - 1].pathElements.length !== 0) {\n split.push(new SvgPath());\n }\n\n split[split.length - 1].pathElements.push(pathElement);\n });\n\n return split;\n }\n}\n","import {extend, getMultiValue} from '../core/core';\nimport {SvgPath} from '../svg/svg-path';\n\n/**\n * This interpolation function does not smooth the path and the result is only containing lines and no curves.\n *\n * @example\n * var chart = new Chartist.Line('.ct-chart', {\n * labels: [1, 2, 3, 4, 5],\n * series: [[1, 2, 8, 1, 7]]\n * }, {\n * lineSmooth: Chartist.Interpolation.none({\n * fillHoles: false\n * })\n * });\n *\n *\n * @memberof Chartist.Interpolation\n * @return {Function}\n */\nexport function none(options) {\n const defaultOptions = {\n fillHoles: false\n };\n\n options = extend({}, defaultOptions, options);\n\n return function noneInterpolation(pathCoordinates, valueData) {\n const path = new SvgPath();\n let hole = true;\n\n for(let i = 0; i < pathCoordinates.length; i += 2) {\n const currX = pathCoordinates[i];\n const currY = pathCoordinates[i + 1];\n const currData = valueData[i / 2];\n\n if(getMultiValue(currData.value) !== undefined) {\n\n if(hole) {\n path.move(currX, currY, false, currData);\n } else {\n path.line(currX, currY, false, currData);\n }\n\n hole = false;\n } else if(!options.fillHoles) {\n hole = true;\n }\n }\n\n return path;\n };\n}\n","import {extend} from '../core/core';\nimport {SvgPath} from '../svg/svg-path';\n\n/**\n * Simple smoothing creates horizontal handles that are positioned with a fraction of the length between two data points. You can use the divisor option to specify the amount of smoothing.\n *\n * Simple smoothing can be used instead of `Chartist.Smoothing.cardinal` if you'd like to get rid of the artifacts it produces sometimes. Simple smoothing produces less flowing lines but is accurate by hitting the points and it also doesn't swing below or above the given data point.\n *\n * All smoothing functions within Chartist are factory functions that accept an options parameter. The simple interpolation function accepts one configuration parameter `divisor`, between 1 and ∞, which controls the smoothing characteristics.\n *\n * @example\n * var chart = new Chartist.Line('.ct-chart', {\n * labels: [1, 2, 3, 4, 5],\n * series: [[1, 2, 8, 1, 7]]\n * }, {\n * lineSmooth: Chartist.Interpolation.simple({\n * divisor: 2,\n * fillHoles: false\n * })\n * });\n *\n *\n * @memberof Chartist.Interpolation\n * @param {Object} options The options of the simple interpolation factory function.\n * @return {Function}\n */\nexport function simple(options) {\n const defaultOptions = {\n divisor: 2,\n fillHoles: false\n };\n\n options = extend({}, defaultOptions, options);\n\n const d = 1 / Math.max(1, options.divisor);\n\n return function simpleInterpolation(pathCoordinates, valueData) {\n const path = new SvgPath();\n let prevX;\n let prevY;\n let prevData;\n\n for(let i = 0; i < pathCoordinates.length; i += 2) {\n const currX = pathCoordinates[i];\n const currY = pathCoordinates[i + 1];\n const length = (currX - prevX) * d;\n const currData = valueData[i / 2];\n\n if(currData.value !== undefined) {\n\n if(prevData === undefined) {\n path.move(currX, currY, false, currData);\n } else {\n path.curve(\n prevX + length,\n prevY,\n currX - length,\n currY,\n currX,\n currY,\n false,\n currData\n );\n }\n\n prevX = currX;\n prevY = currY;\n prevData = currData;\n } else if(!options.fillHoles) {\n prevX = prevY = prevData = undefined;\n }\n }\n\n return path;\n };\n}\n","import {extend} from '../core/core';\nimport {SvgPath} from '../svg/svg-path';\n\n/**\n * Step interpolation will cause the line chart to move in steps rather than diagonal or smoothed lines. This interpolation will create additional points that will also be drawn when the `showPoint` option is enabled.\n *\n * All smoothing functions within Chartist are factory functions that accept an options parameter. The step interpolation function accepts one configuration parameter `postpone`, that can be `true` or `false`. The default value is `true` and will cause the step to occur where the value actually changes. If a different behaviour is needed where the step is shifted to the left and happens before the actual value, this option can be set to `false`.\n *\n * @example\n * var chart = new Chartist.Line('.ct-chart', {\n * labels: [1, 2, 3, 4, 5],\n * series: [[1, 2, 8, 1, 7]]\n * }, {\n * lineSmooth: Chartist.Interpolation.step({\n * postpone: true,\n * fillHoles: false\n * })\n * });\n *\n * @memberof Chartist.Interpolation\n * @param options\n * @returns {Function}\n */\nexport function step(options) {\n const defaultOptions = {\n postpone: true,\n fillHoles: false\n };\n\n options = extend({}, defaultOptions, options);\n\n return function stepInterpolation(pathCoordinates, valueData) {\n const path = new SvgPath();\n\n let prevX;\n let prevY;\n let prevData;\n\n for(let i = 0; i < pathCoordinates.length; i += 2) {\n const currX = pathCoordinates[i];\n const currY = pathCoordinates[i + 1];\n const currData = valueData[i / 2];\n\n // If the current point is also not a hole we can draw the step lines\n if(currData.value !== undefined) {\n if(prevData === undefined) {\n path.move(currX, currY, false, currData);\n } else {\n if(options.postpone) {\n // If postponed we should draw the step line with the value of the previous value\n path.line(currX, prevY, false, prevData);\n } else {\n // If not postponed we should draw the step line with the value of the current value\n path.line(prevX, currY, false, currData);\n }\n // Line to the actual point (this should only be a Y-Axis movement\n path.line(currX, currY, false, currData);\n }\n\n prevX = currX;\n prevY = currY;\n prevData = currData;\n } else if(!options.fillHoles) {\n prevX = prevY = prevData = undefined;\n }\n }\n\n return path;\n };\n}\n","import {extend, splitIntoSegments} from '../core/core';\nimport {SvgPath} from '../svg/svg-path';\nimport {none} from './none';\n\n/**\n * Cardinal / Catmull-Rome spline interpolation is the default smoothing function in Chartist. It produces nice results where the splines will always meet the points. It produces some artifacts though when data values are increased or decreased rapidly. The line may not follow a very accurate path and if the line should be accurate this smoothing function does not produce the best results.\n *\n * Cardinal splines can only be created if there are more than two data points. If this is not the case this smoothing will fallback to `Chartist.Smoothing.none`.\n *\n * All smoothing functions within Chartist are factory functions that accept an options parameter. The cardinal interpolation function accepts one configuration parameter `tension`, between 0 and 1, which controls the smoothing intensity.\n *\n * @example\n * var chart = new Chartist.Line('.ct-chart', {\n * labels: [1, 2, 3, 4, 5],\n * series: [[1, 2, 8, 1, 7]]\n * }, {\n * lineSmooth: Chartist.Interpolation.cardinal({\n * tension: 1,\n * fillHoles: false\n * })\n * });\n *\n * @memberof Chartist.Interpolation\n * @param {Object} options The options of the cardinal factory function.\n * @return {Function}\n */\nexport function cardinal(options) {\n const defaultOptions = {\n tension: 1,\n fillHoles: false\n };\n\n options = extend({}, defaultOptions, options);\n\n const t = Math.min(1, Math.max(0, options.tension));\n const c = 1 - t;\n\n return function cardinalInterpolation(pathCoordinates, valueData) {\n // First we try to split the coordinates into segments\n // This is necessary to treat \"holes\" in line charts\n const segments = splitIntoSegments(pathCoordinates, valueData, {\n fillHoles: options.fillHoles\n });\n\n if(!segments.length) {\n // If there were no segments return 'none' interpolation\n return none()([]);\n } else if(segments.length > 1) {\n // If the split resulted in more that one segment we need to interpolate each segment individually and join them\n // afterwards together into a single path.\n // For each segment we will recurse the cardinal function\n // Join the segment path data into a single path and return\n return SvgPath.join(\n segments.map((segment) => cardinalInterpolation(segment.pathCoordinates, segment.valueData))\n );\n } else {\n // If there was only one segment we can proceed regularly by using pathCoordinates and valueData from the first\n // segment\n pathCoordinates = segments[0].pathCoordinates;\n valueData = segments[0].valueData;\n\n // If less than two points we need to fallback to no smoothing\n if(pathCoordinates.length <= 4) {\n return none()(pathCoordinates, valueData);\n }\n\n const path = new SvgPath().move(pathCoordinates[0], pathCoordinates[1], false, valueData[0]);\n let z;\n\n for(let i = 0, iLen = pathCoordinates.length; iLen - 2 * !z > i; i += 2) {\n const p = [\n {x: +pathCoordinates[i - 2], y: +pathCoordinates[i - 1]},\n {x: +pathCoordinates[i], y: +pathCoordinates[i + 1]},\n {x: +pathCoordinates[i + 2], y: +pathCoordinates[i + 3]},\n {x: +pathCoordinates[i + 4], y: +pathCoordinates[i + 5]}\n ];\n\n if(z) {\n if(!i) {\n p[0] = {x: +pathCoordinates[iLen - 2], y: +pathCoordinates[iLen - 1]};\n } else if(iLen - 4 === i) {\n p[3] = {x: +pathCoordinates[0], y: +pathCoordinates[1]};\n } else if(iLen - 2 === i) {\n p[2] = {x: +pathCoordinates[0], y: +pathCoordinates[1]};\n p[3] = {x: +pathCoordinates[2], y: +pathCoordinates[3]};\n }\n } else {\n if(iLen - 4 === i) {\n p[3] = p[2];\n } else if(!i) {\n p[0] = {x: +pathCoordinates[i], y: +pathCoordinates[i + 1]};\n }\n }\n\n path.curve(\n (t * (-p[0].x + 6 * p[1].x + p[2].x) / 6) + (c * p[2].x),\n (t * (-p[0].y + 6 * p[1].y + p[2].y) / 6) + (c * p[2].y),\n (t * (p[1].x + 6 * p[2].x - p[3].x) / 6) + (c * p[2].x),\n (t * (p[1].y + 6 * p[2].y - p[3].y) / 6) + (c * p[2].y),\n p[2].x,\n p[2].y,\n false,\n valueData[(i + 2) / 2]\n );\n }\n\n return path;\n }\n };\n}\n","import {extend, splitIntoSegments} from '../core/core';\nimport {SvgPath} from '../svg/svg-path';\nimport {none} from './none';\n\n/**\n * Monotone Cubic spline interpolation produces a smooth curve which preserves monotonicity. Unlike cardinal splines, the curve will not extend beyond the range of y-values of the original data points.\n *\n * Monotone Cubic splines can only be created if there are more than two data points. If this is not the case this smoothing will fallback to `Chartist.Smoothing.none`.\n *\n * The x-values of subsequent points must be increasing to fit a Monotone Cubic spline. If this condition is not met for a pair of adjacent points, then there will be a break in the curve between those data points.\n *\n * All smoothing functions within Chartist are factory functions that accept an options parameter.\n *\n * @example\n * var chart = new Chartist.Line('.ct-chart', {\n * labels: [1, 2, 3, 4, 5],\n * series: [[1, 2, 8, 1, 7]]\n * }, {\n * lineSmooth: Chartist.Interpolation.monotoneCubic({\n * fillHoles: false\n * })\n * });\n *\n * @memberof Chartist.Interpolation\n * @param {Object} [options] The options of the monotoneCubic factory function.\n * @return {Function}\n */\nexport function monotoneCubic(options) {\n const defaultOptions = {\n fillHoles: false\n };\n\n options = extend({}, defaultOptions, options);\n\n return function monotoneCubicInterpolation(pathCoordinates, valueData) {\n // First we try to split the coordinates into segments\n // This is necessary to treat \"holes\" in line charts\n const segments = splitIntoSegments(pathCoordinates, valueData, {\n fillHoles: options.fillHoles,\n increasingX: true\n });\n\n if(!segments.length) {\n // If there were no segments return 'Chartist.Interpolation.none'\n return none()([]);\n } else if(segments.length > 1) {\n // If the split resulted in more that one segment we need to interpolate each segment individually and join them\n // afterwards together into a single path.\n // For each segment we will recurse the monotoneCubic fn function\n // Join the segment path data into a single path and return\n return SvgPath.join(\n segments.map((segment) => monotoneCubicInterpolation(segment.pathCoordinates, segment.valueData))\n );\n } else {\n // If there was only one segment we can proceed regularly by using pathCoordinates and valueData from the first\n // segment\n pathCoordinates = segments[0].pathCoordinates;\n valueData = segments[0].valueData;\n\n // If less than three points we need to fallback to no smoothing\n if(pathCoordinates.length <= 4) {\n return none()(pathCoordinates, valueData);\n }\n\n const xs = [];\n const ys = [];\n const n = pathCoordinates.length / 2;\n const ms = [];\n const ds = [];\n const dys = [];\n const dxs = [];\n\n // Populate x and y coordinates into separate arrays, for readability\n for(let i = 0; i < n; i++) {\n xs[i] = pathCoordinates[i * 2];\n ys[i] = pathCoordinates[i * 2 + 1];\n }\n\n // Calculate deltas and derivative\n for(let i = 0; i < n - 1; i++) {\n dys[i] = ys[i + 1] - ys[i];\n dxs[i] = xs[i + 1] - xs[i];\n ds[i] = dys[i] / dxs[i];\n }\n\n // Determine desired slope (m) at each point using Fritsch-Carlson method\n // See: http://math.stackexchange.com/questions/45218/implementation-of-monotone-cubic-interpolation\n ms[0] = ds[0];\n ms[n - 1] = ds[n - 2];\n\n for(let i = 1; i < n - 1; i++) {\n if(ds[i] === 0 || ds[i - 1] === 0 || (ds[i - 1] > 0) !== (ds[i] > 0)) {\n ms[i] = 0;\n } else {\n ms[i] = 3 * (dxs[i - 1] + dxs[i]) / (\n (2 * dxs[i] + dxs[i - 1]) / ds[i - 1] +\n (dxs[i] + 2 * dxs[i - 1]) / ds[i]);\n\n if(!isFinite(ms[i])) {\n ms[i] = 0;\n }\n }\n }\n\n // Now build a path from the slopes\n const path = new SvgPath().move(xs[0], ys[0], false, valueData[0]);\n\n for(let i = 0; i < n - 1; i++) {\n path.curve(\n // First control point\n xs[i] + dxs[i] / 3,\n ys[i] + ms[i] * dxs[i] / 3,\n // Second control point\n xs[i + 1] - dxs[i] / 3,\n ys[i + 1] - ms[i + 1] * dxs[i] / 3,\n // End point\n xs[i + 1],\n ys[i + 1],\n\n false,\n valueData[i + 1]\n );\n }\n\n return path;\n }\n };\n}\n","import {alphaNumerate, quantity, isFalseyButZero} from '../core/lang';\nimport {noop, sum} from '../core/functional';\nimport {polarToCartesian} from '../core/math';\nimport {extend} from '../core/extend';\nimport {normalizeData, serialize} from '../core/data';\nimport {createSvg, createChartRect} from '../core/creation';\nimport {SvgPath} from '../svg/svg-path';\nimport {BaseChart} from './base';\n\n/**\n * Default options in line charts. Expand the code view to see a detailed list of options with comments.\n *\n * @memberof Chartist.Pie\n */\nconst defaultOptions = {\n // Specify a fixed width for the chart as a string (i.e. '100px' or '50%')\n width: undefined,\n // Specify a fixed height for the chart as a string (i.e. '100px' or '50%')\n height: undefined,\n // Padding of the chart drawing area to the container element and labels as a number or padding object {top: 5, right: 5, bottom: 5, left: 5}\n chartPadding: 5,\n // Override the class names that are used to generate the SVG structure of the chart\n classNames: {\n chartPie: 'ct-chart-pie',\n chartDonut: 'ct-chart-donut',\n series: 'ct-series',\n slicePie: 'ct-slice-pie',\n sliceDonut: 'ct-slice-donut',\n label: 'ct-label'\n },\n // The start angle of the pie chart in degrees where 0 points north. A higher value offsets the start angle clockwise.\n startAngle: 0,\n // An optional total you can specify. By specifying a total value, the sum of the values in the series must be this total in order to draw a full pie. You can use this parameter to draw only parts of a pie or gauge charts.\n total: undefined,\n // If specified the donut CSS classes will be used and strokes will be drawn instead of pie slices.\n donut: false,\n // Specify the donut stroke width, currently done in javascript for convenience. May move to CSS styles in the future.\n // This option can be set as number or string to specify a relative width (i.e. 100 or '30%').\n donutWidth: 60,\n // If a label should be shown or not\n showLabel: true,\n // Label position offset from the standard position which is half distance of the radius. This value can be either positive or negative. Positive values will position the label away from the center.\n labelOffset: 0,\n // This option can be set to 'inside', 'outside' or 'center'. Positioned with 'inside' the labels will be placed on half the distance of the radius to the border of the Pie by respecting the 'labelOffset'. The 'outside' option will place the labels at the border of the pie and 'center' will place the labels in the absolute center point of the chart. The 'center' option only makes sense in conjunction with the 'labelOffset' option.\n labelPosition: 'inside',\n // An interpolation function for the label value\n labelInterpolationFnc: noop,\n // Label direction can be 'neutral', 'explode' or 'implode'. The labels anchor will be positioned based on those settings as well as the fact if the labels are on the right or left side of the center of the chart. Usually explode is useful when labels are positioned far away from the center.\n labelDirection: 'neutral',\n // If true the whole data is reversed including labels, the series order as well as the whole series data arrays.\n reverseData: false,\n // If true empty values will be ignored to avoid drawing unncessary slices and labels\n ignoreEmptyValues: false\n};\n\n/**\n * Determines SVG anchor position based on direction and center parameter\n *\n * @param center\n * @param label\n * @param direction\n * @return {string}\n */\nexport function determineAnchorPosition(center, label, direction) {\n const toTheRight = label.x > center.x;\n\n if(toTheRight && direction === 'explode' ||\n !toTheRight && direction === 'implode') {\n return 'start';\n } else if(toTheRight && direction === 'implode' ||\n !toTheRight && direction === 'explode') {\n return 'end';\n } else {\n return 'middle';\n }\n}\n\nexport class PieChart extends BaseChart {\n /**\n * This method creates a new pie chart and returns an object that can be used to redraw the chart.\n *\n * @memberof Chartist.Pie\n * @param {String|Node} query A selector query string or directly a DOM element\n * @param {Object} data The data object in the pie chart needs to have a series property with a one dimensional data array. The values will be normalized against each other and don't necessarily need to be in percentage. The series property can also be an array of value objects that contain a value property and a className property to override the CSS class name for the series group.\n * @param {Object} [options] The options object with options that override the default options. Check the examples for a detailed list.\n * @param {Array} [responsiveOptions] Specify an array of responsive option arrays which are a media query and options object pair => [[mediaQueryString, optionsObject],[more...]]\n * @return {Object} An object with a version and an update method to manually redraw the chart\n *\n * @example\n * // Simple pie chart example with four series\n * new Chartist.Pie('.ct-chart', {\n * series: [10, 2, 4, 3]\n * });\n *\n * @example\n * // Drawing a donut chart\n * new Chartist.Pie('.ct-chart', {\n * series: [10, 2, 4, 3]\n * }, {\n * donut: true\n * });\n *\n * @example\n * // Using donut, startAngle and total to draw a gauge chart\n * new Chartist.Pie('.ct-chart', {\n * series: [20, 10, 30, 40]\n * }, {\n * donut: true,\n * donutWidth: 20,\n * startAngle: 270,\n * total: 200\n * });\n *\n * @example\n * // Drawing a pie chart with padding and labels that are outside the pie\n * new Chartist.Pie('.ct-chart', {\n * series: [20, 10, 30, 40]\n * }, {\n * chartPadding: 30,\n * labelOffset: 50,\n * labelDirection: 'explode'\n * });\n *\n * @example\n * // Overriding the class names for individual series as well as a name and meta data.\n * // The name will be written as ct:series-name attribute and the meta data will be serialized and written\n * // to a ct:meta attribute.\n * new Chartist.Pie('.ct-chart', {\n * series: [{\n * value: 20,\n * name: 'Series 1',\n * className: 'my-custom-class-one',\n * meta: 'Meta One'\n * }, {\n * value: 10,\n * name: 'Series 2',\n * className: 'my-custom-class-two',\n * meta: 'Meta Two'\n * }, {\n * value: 70,\n * name: 'Series 3',\n * className: 'my-custom-class-three',\n * meta: 'Meta Three'\n * }]\n * });\n */\n constructor(query, data, options, responsiveOptions) {\n super(query, data, defaultOptions, extend({}, defaultOptions, options), responsiveOptions);\n }\n\n /**\n * Creates the pie chart\n *\n * @param options\n */\n createChart(options) {\n const data = normalizeData(this.data);\n const seriesGroups = [];\n let labelsGroup;\n let labelRadius;\n let startAngle = options.startAngle;\n\n // Create SVG.js draw\n this.svg = createSvg(this.container, options.width, options.height, options.donut ? options.classNames.chartDonut : options.classNames.chartPie);\n // Calculate charting rect\n const chartRect = createChartRect(this.svg, options, defaultOptions.padding);\n // Get biggest circle radius possible within chartRect\n let radius = Math.min(chartRect.width() / 2, chartRect.height() / 2);\n // Calculate total of all series to get reference value or use total reference from optional options\n const totalDataSum = options.total ||\n data.normalized.series.reduce(sum, 0);\n\n const donutWidth = quantity(options.donutWidth);\n if(donutWidth.unit === '%') {\n donutWidth.value *= radius / 100;\n }\n\n // If this is a donut chart we need to adjust our radius to enable strokes to be drawn inside\n // Unfortunately this is not possible with the current SVG Spec\n // See this proposal for more details: http://lists.w3.org/Archives/Public/www-svg/2003Oct/0000.html\n radius -= options.donut ? donutWidth.value / 2 : 0;\n\n // If labelPosition is set to `outside` or a donut chart is drawn then the label position is at the radius,\n // if regular pie chart it's half of the radius\n if(options.labelPosition === 'outside' || options.donut) {\n labelRadius = radius;\n } else if(options.labelPosition === 'center') {\n // If labelPosition is center we start with 0 and will later wait for the labelOffset\n labelRadius = 0;\n } else {\n // Default option is 'inside' where we use half the radius so the label will be placed in the center of the pie\n // slice\n labelRadius = radius / 2;\n }\n // Add the offset to the labelRadius where a negative offset means closed to the center of the chart\n labelRadius += options.labelOffset;\n\n // Calculate end angle based on total sum and current data value and offset with padding\n const center = {\n x: chartRect.x1 + chartRect.width() / 2,\n y: chartRect.y2 + chartRect.height() / 2\n };\n\n // Check if there is only one non-zero value in the series array.\n const hasSingleValInSeries = data.raw.series\n .filter((val) => val.hasOwnProperty('value') ? val.value !== 0 : val !== 0)\n .length === 1;\n\n // Creating the series groups\n data.raw.series\n .forEach((series, index) => seriesGroups[index] = this.svg.elem('g', null, null));\n // if we need to show labels we create the label group now\n if(options.showLabel) {\n labelsGroup = this.svg.elem('g', null, null);\n }\n\n // Draw the series\n // initialize series groups\n data.raw.series.forEach((series, index) => {\n // If current value is zero and we are ignoring empty values then skip to next value\n if(data.normalized.series[index] === 0 && options.ignoreEmptyValues) {\n return;\n }\n\n // If the series is an object and contains a name or meta data we add a custom attribute\n seriesGroups[index].attr({\n 'ct:series-name': series.name\n });\n\n // Use series class from series data or if not set generate one\n seriesGroups[index].addClass([\n options.classNames.series,\n series.className || `${options.classNames.series}-${alphaNumerate(index)}`\n ].join(' '));\n\n // If the whole dataset is 0 endAngle should be zero. Can't divide by 0.\n let endAngle = (totalDataSum > 0 ? startAngle + data.normalized.series[index] / totalDataSum * 360 : 0);\n\n // Use slight offset so there are no transparent hairline issues\n const overlappigStartAngle = Math.max(0, startAngle - (index === 0 || hasSingleValInSeries ? 0 : 0.2));\n\n // If we need to draw the arc for all 360 degrees we need to add a hack where we close the circle\n // with Z and use 359.99 degrees\n if(endAngle - overlappigStartAngle >= 359.99) {\n endAngle = overlappigStartAngle + 359.99;\n }\n\n const start = polarToCartesian(center.x, center.y, radius, overlappigStartAngle);\n const end = polarToCartesian(center.x, center.y, radius, endAngle);\n\n // Create a new path element for the pie chart. If this isn't a donut chart we should close the path for a correct stroke\n const path = new SvgPath(!options.donut)\n .move(end.x, end.y)\n .arc(radius, radius, 0, endAngle - startAngle > 180, 0, start.x, start.y);\n\n // If regular pie chart (no donut) we add a line to the center of the circle for completing the pie\n if(!options.donut) {\n path.line(center.x, center.y);\n }\n\n // Create the SVG path\n // If this is a donut chart we add the donut class, otherwise just a regular slice\n const pathElement = seriesGroups[index].elem('path', {\n d: path.stringify()\n }, options.donut ? options.classNames.sliceDonut : options.classNames.slicePie);\n\n // Adding the pie series value to the path\n pathElement.attr({\n 'ct:value': data.normalized.series[index],\n 'ct:meta': serialize(series.meta)\n });\n\n // If this is a donut, we add the stroke-width as style attribute\n if(options.donut) {\n pathElement.attr({\n 'style': 'stroke-width: ' + donutWidth.value + 'px'\n });\n }\n\n // Fire off draw event\n this.eventEmitter.emit('draw', {\n type: 'slice',\n value: data.normalized.series[index],\n totalDataSum: totalDataSum,\n index: index,\n meta: series.meta,\n series: series,\n group: seriesGroups[index],\n element: pathElement,\n path: path.clone(),\n center: center,\n radius: radius,\n startAngle: startAngle,\n endAngle: endAngle\n });\n\n // If we need to show labels we need to add the label for this slice now\n if(options.showLabel) {\n let labelPosition;\n\n if(data.raw.series.length === 1) {\n // If we have only 1 series, we can position the label in the center of the pie\n labelPosition = {\n x: center.x,\n y: center.y\n };\n } else {\n // Position at the labelRadius distance from center and between start and end angle\n labelPosition = polarToCartesian(\n center.x,\n center.y,\n labelRadius,\n startAngle + (endAngle - startAngle) / 2\n );\n }\n\n let rawValue;\n if(data.normalized.labels && !isFalseyButZero(data.normalized.labels[index])) {\n rawValue = data.normalized.labels[index];\n } else {\n rawValue = data.normalized.series[index];\n }\n\n const interpolatedValue = options.labelInterpolationFnc(rawValue, index);\n\n if(interpolatedValue || interpolatedValue === 0) {\n const labelElement = labelsGroup.elem('text', {\n dx: labelPosition.x,\n dy: labelPosition.y,\n 'text-anchor': determineAnchorPosition(center, labelPosition, options.labelDirection)\n }, options.classNames.label).text('' + interpolatedValue);\n\n // Fire off draw event\n this.eventEmitter.emit('draw', {\n type: 'label',\n index,\n group: labelsGroup,\n element: labelElement,\n text: '' + interpolatedValue,\n x: labelPosition.x,\n y: labelPosition.y\n });\n }\n }\n\n // Set next startAngle to current endAngle.\n // (except for last slice)\n startAngle = endAngle;\n });\n\n this.eventEmitter.emit('created', {\n chartRect,\n svg: this.svg,\n options\n });\n }\n}\n","","export {version} from 'package.json!version';\n\n/**\n * This object contains all namespaces used within Chartist.\n *\n * @type {{svg: string, xmlns: string, xhtml: string, xlink: string, ct: string}}\n */\nexport let namespaces = {\n svg: 'http://www.w3.org/2000/svg',\n xmlns: 'http://www.w3.org/2000/xmlns/',\n xhtml: 'http://www.w3.org/1999/xhtml',\n xlink: 'http://www.w3.org/1999/xlink',\n ct: 'http://gionkunz.github.com/chartist-js/ct'\n};\n\n/**\n * Precision level used internally in Chartist for rounding. If you require more decimal places you can increase this number.\n *\n * @type {number}\n */\nexport let precision = 8;\n\n/**\n * A map with characters to escape for strings to be safely used as attribute values.\n *\n * @type {Object}\n */\nexport let escapingMap = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n '\\'': '''\n};\n","export default (function (arr) {\n if (Array.isArray(arr)) {\n for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];\n\n return arr2;\n } else {\n return Array.from(arr);\n }\n});","/**\n * Helps to simplify functional style code\n *\n * @memberof Chartist.Core\n * @param {*} n This exact value will be returned by the noop function\n * @return {*} The same value that was provided to the n parameter\n */\nexport const noop = (n) => n;\n\n/**\n * Functional style helper to produce array with given length initialized with undefined values\n *\n * @memberof Chartist.Core\n * @param length\n * @return {Array}\n */\nexport const times = (length) => Array.from({length});\n\n/**\n * Sum helper to be used in reduce functions\n *\n * @memberof Chartist.Core\n * @param previous\n * @param current\n * @return {*}\n */\nexport const sum = (previous, current) => previous + (current ? current : 0);\n\n/**\n * Map for multi dimensional arrays where their nested arrays will be mapped in serial. The output array will have the length of the largest nested array. The callback function is called with variable arguments where each argument is the nested array value (or undefined if there are no more values).\n *\n * For example:\n * @example\n * ```javascript\n * const data = [[1, 2], [3], []];\n * serialMap(data, cb);\n *\n * // where cb will be called 2 times\n * // 1. call arguments: (1, 3, undefined)\n * // 2. call arguments: (2, undefined, undefined)\n * ```\n *\n * @memberof Chartist.Core\n * @param array\n * @param callback\n * @return {Array}\n */\nexport const serialMap = (array, callback) =>\n times(Math.max(...array.map((element) => element.length)))\n .map((inner, index) => callback(...array.map((element) => element[index])));\n","export default (function (instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n});","export default (function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);\n if (staticProps) defineProperties(Constructor, staticProps);\n return Constructor;\n };\n})();","import {Svg} from './svg';\n\n/**\n * This helper class is to wrap multiple `Svg` elements into a list where you can call the `Svg` functions on all elements in the list with one call. This is helpful when you'd like to perform calls with `Svg` on multiple elements.\n * An instance of this class is also returned by `Svg.querySelectorAll`.\n *\n * @memberof Svg\n * @param {Array|NodeList} nodeList An Array of SVG DOM nodes or a SVG DOM NodeList (as returned by document.querySelectorAll)\n * @constructor\n */\nexport class SvgList {\n constructor(nodeList) {\n const list = this;\n\n this.svgElements = [];\n for(let i = 0; i < nodeList.length; i++) {\n this.svgElements.push(new Svg(nodeList[i]));\n }\n\n // Add delegation methods for Svg\n Object.keys(Svg.prototype).filter((prototypeProperty) => [\n 'constructor',\n 'parent',\n 'querySelector',\n 'querySelectorAll',\n 'replace',\n 'append',\n 'classes',\n 'height',\n 'width'\n ].indexOf(prototypeProperty) === -1)\n .forEach((prototypeProperty) => {\n list[prototypeProperty] = () => {\n const args = Array.from(arguments);\n list.svgElements.forEach((element) =>\n Svg.prototype[prototypeProperty].apply(element, args));\n return list;\n };\n });\n }\n}\n","export class EventEmitter {\n constructor() {\n this.handlers = [];\n }\n\n /**\n * Add an event handler for a specific event\n *\n * @memberof Chartist.Event\n * @param {String} event The event name\n * @param {Function} handler A event handler function\n */\n addEventHandler(event, handler) {\n this.handlers[event] = this.handlers[event] || [];\n this.handlers[event].push(handler);\n }\n\n /**\n * Remove an event handler of a specific event name or remove all event handlers for a specific event.\n *\n * @memberof Chartist.Event\n * @param {String} event The event name where a specific or all handlers should be removed\n * @param {Function} [handler] An optional event handler function. If specified only this specific handler will be removed and otherwise all handlers are removed.\n */\n removeEventHandler(event, handler) {\n // Only do something if there are event handlers with this name existing\n if(this.handlers[event]) {\n // If handler is set we will look for a specific handler and only remove this\n if(handler) {\n this.handlers[event].splice(this.handlers[event].indexOf(handler), 1);\n if(this.handlers[event].length === 0) {\n delete this.handlers[event];\n }\n } else {\n // If no handler is specified we remove all handlers for this event\n delete this.handlers[event];\n }\n }\n }\n\n /**\n * Use this function to emit an event. All handlers that are listening for this event will be triggered with the data parameter.\n *\n * @memberof Chartist.Event\n * @param {String} event The event name that should be triggered\n * @param {*} data Arbitrary data that will be passed to the event handler callback functions\n */\n emit(event, data) {\n // Only do something if there are event handlers with this name existing\n if(this.handlers[event]) {\n this.handlers[event].forEach((handler) => handler(data));\n }\n\n // Emit event to star event handlers\n if(this.handlers['*']) {\n this.handlers['*'].forEach((starHandler) => starHandler(event, data));\n }\n }\n}\n","import {querySelector, extend, optionsProvider} from '../core/core';\nimport {EventEmitter} from '../event/event-emitter';\nimport {isSupported} from '../svg/svg';\n\nexport class BaseChart {\n /**\n * Constructor of chart base class.\n *\n * @param query\n * @param data\n * @param defaultOptions\n * @param options\n * @param responsiveOptions\n * @constructor\n */\n constructor(query, data, defaultOptions, options, responsiveOptions) {\n this.container = querySelector(query);\n this.data = data || {};\n this.data.labels = this.data.labels || [];\n this.data.series = this.data.series || [];\n this.defaultOptions = defaultOptions;\n this.options = options;\n this.responsiveOptions = responsiveOptions;\n this.eventEmitter = new EventEmitter();\n this.supportsForeignObject = isSupported('Extensibility');\n this.supportsAnimations = isSupported('AnimationEventsAttribute');\n this.resizeListener = () => this.update();\n\n if(this.container) {\n // If chartist was already initialized in this container we are detaching all event listeners first\n if(this.container.__chartist__) {\n this.container.__chartist__.detach();\n }\n\n this.container.__chartist__ = this;\n }\n\n // Using event loop for first draw to make it possible to register event listeners in the same call stack where\n // the chart was created.\n this.initializeTimeoutId = setTimeout(() => this.initialize(), 0);\n }\n\n createChart() {\n throw new Error('Base chart type can\\'t be instantiated!');\n }\n\n // TODO: Currently we need to re-draw the chart on window resize. This is usually very bad and will affect performance.\n // This is done because we can't work with relative coordinates when drawing the chart because SVG Path does not\n // work with relative positions yet. We need to check if we can do a viewBox hack to switch to percentage.\n // See http://mozilla.6506.n7.nabble.com/Specyfing-paths-with-percentages-unit-td247474.html\n // Update: can be done using the above method tested here: http://codepen.io/gionkunz/pen/KDvLj\n // The problem is with the label offsets that can't be converted into percentage and affecting the chart container\n /**\n * Updates the chart which currently does a full reconstruction of the SVG DOM\n *\n * @param {Object} [data] Optional data you'd like to set for the chart before it will update. If not specified the update method will use the data that is already configured with the chart.\n * @param {Object} [options] Optional options you'd like to add to the previous options for the chart before it will update. If not specified the update method will use the options that have been already configured with the chart.\n * @param {Boolean} [override] If set to true, the passed options will be used to extend the options that have been configured already. Otherwise the chart default options will be used as the base\n * @memberof Chartist.Base\n */\n update(data, options, override) {\n if(data) {\n this.data = data || {};\n this.data.labels = this.data.labels || [];\n this.data.series = this.data.series || [];\n // Event for data transformation that allows to manipulate the data before it gets rendered in the charts\n this.eventEmitter.emit('data', {\n type: 'update',\n data: this.data\n });\n }\n\n if(options) {\n this.options = extend({}, override ? this.options : this.defaultOptions, options);\n\n // If chartist was not initialized yet, we just set the options and leave the rest to the initialization\n // Otherwise we re-create the optionsProvider at this point\n if(!this.initializeTimeoutId) {\n this.optionsProvider.removeMediaQueryListeners();\n this.optionsProvider = optionsProvider(this.options, this.responsiveOptions, this.eventEmitter);\n }\n }\n\n // Only re-created the chart if it has been initialized yet\n if(!this.initializeTimeoutId) {\n this.createChart(this.optionsProvider.getCurrentOptions());\n }\n\n // Return a reference to the chart object to chain up calls\n return this;\n }\n\n /**\n * This method can be called on the API object of each chart and will un-register all event listeners that were added to other components. This currently includes a window.resize listener as well as media query listeners if any responsive options have been provided. Use this function if you need to destroy and recreate Chartist charts dynamically.\n *\n * @memberof Chartist.Base\n */\n detach() {\n // Only detach if initialization already occurred on this chart. If this chart still hasn't initialized (therefore\n // the initializationTimeoutId is still a valid timeout reference, we will clear the timeout\n if(!this.initializeTimeoutId) {\n window.removeEventListener('resize', this.resizeListener);\n this.optionsProvider.removeMediaQueryListeners();\n } else {\n window.clearTimeout(this.initializeTimeoutId);\n }\n\n return this;\n }\n\n /**\n * Use this function to register event handlers. The handler callbacks are synchronous and will run in the main thread rather than the event loop.\n *\n * @memberof Chartist.Base\n * @param {String} event Name of the event. Check the examples for supported events.\n * @param {Function} handler The handler function that will be called when an event with the given name was emitted. This function will receive a data argument which contains event data. See the example for more details.\n */\n on(event, handler) {\n this.eventEmitter.addEventHandler(event, handler);\n return this;\n }\n\n /**\n * Use this function to un-register event handlers. If the handler function parameter is omitted all handlers for the given event will be un-registered.\n *\n * @memberof Chartist.Base\n * @param {String} event Name of the event for which a handler should be removed\n * @param {Function} [handler] The handler function that that was previously used to register a new event handler. This handler will be removed from the event handler list. If this parameter is omitted then all event handlers for the given event are removed from the list.\n */\n off(event, handler) {\n this.eventEmitter.removeEventHandler(event, handler);\n return this;\n }\n\n initialize() {\n // Add window resize listener that re-creates the chart\n window.addEventListener('resize', this.resizeListener);\n\n // Obtain current options based on matching media queries (if responsive options are given)\n // This will also register a listener that is re-creating the chart based on media changes\n this.optionsProvider = optionsProvider(this.options, this.responsiveOptions, this.eventEmitter);\n // Register options change listener that will trigger a chart update\n this.eventEmitter.addEventHandler('optionsChanged', () => this.update());\n\n // Before the first chart creation we need to register us with all plugins that are configured\n // Initialize all relevant plugins with our chart object and the plugin options specified in the config\n if(this.options.plugins) {\n this.options.plugins.forEach((plugin) => {\n if(plugin instanceof Array) {\n plugin[0](this, plugin[1]);\n } else {\n plugin(this);\n }\n });\n }\n\n // Event for data transformation that allows to manipulate the data before it gets rendered in the charts\n this.eventEmitter.emit('data', {\n type: 'initial',\n data: this.data\n });\n\n // Create the first chart\n this.createChart(this.optionsProvider.getCurrentOptions());\n\n // As chart is initialized from the event loop now we can reset our timeout reference\n // This is important if the chart gets initialized on the same element twice\n this.initializeTimeoutId = undefined;\n }\n}\n","export default (function (self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self;\n});","export default (function (subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n});","import {isFalseyButZero} from '../core/lang';\nimport {createGrid, createLabel} from '../core/creation';\n\nexport const axisUnits = {\n x: {\n pos: 'x',\n len: 'width',\n dir: 'horizontal',\n rectStart: 'x1',\n rectEnd: 'x2',\n rectOffset: 'y2'\n },\n y: {\n pos: 'y',\n len: 'height',\n dir: 'vertical',\n rectStart: 'y2',\n rectEnd: 'y1',\n rectOffset: 'x1'\n }\n};\n\nexport class Axis {\n initialize(units, chartRect, ticks, options) {\n this.units = units;\n this.counterUnits = units === axisUnits.x ? axisUnits.y : axisUnits.x;\n this.options = options;\n this.chartRect = chartRect;\n this.axisLength = chartRect[this.units.rectEnd] - chartRect[this.units.rectStart];\n this.gridOffset = chartRect[this.units.rectOffset];\n this.ticks = ticks;\n }\n\n projectValue(value, index, data) {\n throw new Error('Base axis can\\'t be instantiated!');\n }\n\n createGridAndLabels(gridGroup, labelGroup, useForeignObject, chartOptions, eventEmitter) {\n const axisOptions = chartOptions['axis' + this.units.pos.toUpperCase()];\n const projectedValues = this.ticks.map(this.projectValue.bind(this));\n const labelValues = this.ticks.map(axisOptions.labelInterpolationFnc);\n\n projectedValues.forEach((projectedValue, index) => {\n const labelOffset = {\n x: 0,\n y: 0\n };\n\n // TODO: Find better solution for solving this problem\n // Calculate how much space we have available for the label\n let labelLength;\n if(projectedValues[index + 1]) {\n // If we still have one label ahead, we can calculate the distance to the next tick / label\n labelLength = projectedValues[index + 1] - projectedValue;\n } else {\n // If we don't have a label ahead and we have only two labels in total, we just take the remaining distance to\n // on the whole axis length. We limit that to a minimum of 30 pixel, so that labels close to the border will\n // still be visible inside of the chart padding.\n labelLength = Math.max(this.axisLength - projectedValue, 30);\n }\n\n // Skip grid lines and labels where interpolated label values are falsey (except for 0)\n if(isFalseyButZero(labelValues[index]) && labelValues[index] !== '') {\n return;\n }\n\n // Transform to global coordinates using the chartRect\n // We also need to set the label offset for the createLabel function\n if(this.units.pos === 'x') {\n projectedValue = this.chartRect.x1 + projectedValue;\n labelOffset.x = chartOptions.axisX.labelOffset.x;\n\n // If the labels should be positioned in start position (top side for vertical axis) we need to set a\n // different offset as for positioned with end (bottom)\n if(chartOptions.axisX.position === 'start') {\n labelOffset.y = this.chartRect.padding.top +\n chartOptions.axisX.labelOffset.y +\n (useForeignObject ? 5 : 20);\n } else {\n labelOffset.y = this.chartRect.y1 +\n chartOptions.axisX.labelOffset.y +\n (useForeignObject ? 5 : 20);\n }\n } else {\n projectedValue = this.chartRect.y1 - projectedValue;\n labelOffset.y = chartOptions.axisY.labelOffset.y - (useForeignObject ? labelLength : 0);\n\n // If the labels should be positioned in start position (left side for horizontal axis) we need to set a\n // different offset as for positioned with end (right side)\n if(chartOptions.axisY.position === 'start') {\n labelOffset.x = useForeignObject ?\n this.chartRect.padding.left + chartOptions.axisY.labelOffset.x :\n this.chartRect.x1 - 10;\n } else {\n labelOffset.x = this.chartRect.x2 + chartOptions.axisY.labelOffset.x + 10;\n }\n }\n\n if(axisOptions.showGrid) {\n createGrid(projectedValue, index, this, this.gridOffset, this.chartRect[this.counterUnits.len](), gridGroup, [\n chartOptions.classNames.grid,\n chartOptions.classNames[this.units.dir]\n ], eventEmitter);\n }\n\n if(axisOptions.showLabel) {\n createLabel(projectedValue, labelLength, index, labelValues, this, axisOptions.offset, labelOffset, labelGroup, [\n chartOptions.classNames.label,\n chartOptions.classNames[this.units.dir],\n (axisOptions.position === 'start' ? chartOptions.classNames[axisOptions.position] : chartOptions.classNames.end)\n ], useForeignObject, eventEmitter);\n }\n });\n }\n}\n","export default (function get(object, property, receiver) {\n if (object === null) object = Function.prototype;\n var desc = Object.getOwnPropertyDescriptor(object, property);\n\n if (desc === undefined) {\n var parent = Object.getPrototypeOf(object);\n\n if (parent === null) {\n return undefined;\n } else {\n return get(parent, property, receiver);\n }\n } else if (\"value\" in desc) {\n return desc.value;\n } else {\n var getter = desc.get;\n\n if (getter === undefined) {\n return undefined;\n }\n\n return getter.call(receiver);\n }\n});","import {getBounds, getHighLow, getMultiValue} from '../core/data';\nimport {Axis} from './axis';\n\nexport class AutoScaleAxis extends Axis {\n constructor(axisUnit, data, chartRect, options) {\n super();\n // Usually we calculate highLow based on the data but this can be overriden by a highLow object in the options\n const highLow = options.highLow || getHighLow(data, options, axisUnit.pos);\n this.bounds = getBounds(chartRect[axisUnit.rectEnd] - chartRect[axisUnit.rectStart], highLow, options.scaleMinSpace || 20, options.onlyInteger);\n this.range = {\n min: this.bounds.min,\n max: this.bounds.max\n };\n\n super.initialize(axisUnit, chartRect, this.bounds.values, options);\n }\n\n projectValue(value) {\n return this.axisLength * (+getMultiValue(value, this.units.pos) - this.bounds.min) / this.bounds.range;\n }\n}\n","import {getMultiValue, getHighLow} from '../core/data';\nimport {times} from '../core/functional';\nimport {Axis} from './axis';\n\nexport class FixedScaleAxis extends Axis {\n constructor(axisUnit, data, chartRect, options) {\n super();\n\n const highLow = options.highLow || getHighLow(data, options, axisUnit.pos);\n this.divisor = options.divisor || 1;\n this.ticks = options.ticks ||\n times(this.divisor).map(\n (value, index) => highLow.low + (highLow.high - highLow.low) / this.divisor * index\n );\n this.ticks.sort((a, b) => a - b);\n this.range = {\n min: highLow.low,\n max: highLow.high\n };\n\n super.initialize(axisUnit, chartRect, this.ticks, options);\n\n this.stepLength = this.axisLength / this.divisor;\n }\n\n projectValue(value) {\n return this.axisLength * (+getMultiValue(value, this.units.pos) - this.range.min) /\n (this.range.max - this.range.min);\n }\n}\n","import {Axis} from './axis';\n\nexport class StepAxis extends Axis {\n constructor(axisUnit, data, chartRect, options) {\n super();\n super.initialize(axisUnit, chartRect, options.ticks, options);\n\n const calc = Math.max(1, options.ticks.length - (options.stretch ? 1 : 0));\n this.stepLength = this.axisLength / calc;\n }\n\n projectValue(value, index) {\n return this.stepLength * index;\n }\n}\n","import {isNumeric, alphaNumerate} from '../core/lang';\nimport {noop} from '../core/functional';\nimport {extend} from '../core/extend';\nimport {normalizeData, serialize, getMetaData, getSeriesOption} from '../core/data';\nimport {createSvg, createChartRect, createGridBackground} from '../core/creation';\nimport {StepAxis, AutoScaleAxis, axisUnits} from '../axes/axes';\nimport {BaseChart} from './base';\nimport {monotoneCubic, none} from '../interpolation/interpolation';\n\n/**\n * Default options in line charts. Expand the code view to see a detailed list of options with comments.\n *\n * @memberof Chartist.Line\n */\nconst defaultOptions = {\n // Options for X-Axis\n axisX: {\n // The offset of the labels to the chart area\n offset: 30,\n // Position where labels are placed. Can be set to `start` or `end` where `start` is equivalent to left or top on vertical axis and `end` is equivalent to right or bottom on horizontal axis.\n position: 'end',\n // Allows you to correct label positioning on this axis by positive or negative x and y offset.\n labelOffset: {\n x: 0,\n y: 0\n },\n // If labels should be shown or not\n showLabel: true,\n // If the axis grid should be drawn or not\n showGrid: true,\n // Interpolation function that allows you to intercept the value from the axis label\n labelInterpolationFnc: noop,\n // Set the axis type to be used to project values on this axis. If not defined, Chartist.StepAxis will be used for the X-Axis, where the ticks option will be set to the labels in the data and the stretch option will be set to the global fullWidth option. This type can be changed to any axis constructor available (e.g. Chartist.FixedScaleAxis), where all axis options should be present here.\n type: undefined\n },\n // Options for Y-Axis\n axisY: {\n // The offset of the labels to the chart area\n offset: 40,\n // Position where labels are placed. Can be set to `start` or `end` where `start` is equivalent to left or top on vertical axis and `end` is equivalent to right or bottom on horizontal axis.\n position: 'start',\n // Allows you to correct label positioning on this axis by positive or negative x and y offset.\n labelOffset: {\n x: 0,\n y: 0\n },\n // If labels should be shown or not\n showLabel: true,\n // If the axis grid should be drawn or not\n showGrid: true,\n // Interpolation function that allows you to intercept the value from the axis label\n labelInterpolationFnc: noop,\n // Set the axis type to be used to project values on this axis. If not defined, Chartist.AutoScaleAxis will be used for the Y-Axis, where the high and low options will be set to the global high and low options. This type can be changed to any axis constructor available (e.g. Chartist.FixedScaleAxis), where all axis options should be present here.\n type: undefined,\n // This value specifies the minimum height in pixel of the scale steps\n scaleMinSpace: 20,\n // Use only integer values (whole numbers) for the scale steps\n onlyInteger: false\n },\n // Specify a fixed width for the chart as a string (i.e. '100px' or '50%')\n width: undefined,\n // Specify a fixed height for the chart as a string (i.e. '100px' or '50%')\n height: undefined,\n // If the line should be drawn or not\n showLine: true,\n // If dots should be drawn or not\n showPoint: true,\n // If the line chart should draw an area\n showArea: false,\n // The base for the area chart that will be used to close the area shape (is normally 0)\n areaBase: 0,\n // Specify if the lines should be smoothed. This value can be true or false where true will result in smoothing using the default smoothing interpolation function Chartist.Interpolation.cardinal and false results in Chartist.Interpolation.none. You can also choose other smoothing / interpolation functions available in the Chartist.Interpolation module, or write your own interpolation function. Check the examples for a brief description.\n lineSmooth: true,\n // If the line chart should add a background fill to the .ct-grids group.\n showGridBackground: false,\n // Overriding the natural low of the chart allows you to zoom in or limit the charts lowest displayed value\n low: undefined,\n // Overriding the natural high of the chart allows you to zoom in or limit the charts highest displayed value\n high: undefined,\n // Padding of the chart drawing area to the container element and labels as a number or padding object {top: 5, right: 5, bottom: 5, left: 5}\n chartPadding: {\n top: 15,\n right: 15,\n bottom: 5,\n left: 10\n },\n // When set to true, the last grid line on the x-axis is not drawn and the chart elements will expand to the full available width of the chart. For the last label to be drawn correctly you might need to add chart padding or offset the last label with a draw event handler.\n fullWidth: false,\n // If true the whole data is reversed including labels, the series order as well as the whole series data arrays.\n reverseData: false,\n // Override the class names that get used to generate the SVG structure of the chart\n classNames: {\n chart: 'ct-chart-line',\n label: 'ct-label',\n labelGroup: 'ct-labels',\n series: 'ct-series',\n line: 'ct-line',\n point: 'ct-point',\n area: 'ct-area',\n grid: 'ct-grid',\n gridGroup: 'ct-grids',\n gridBackground: 'ct-grid-background',\n vertical: 'ct-vertical',\n horizontal: 'ct-horizontal',\n start: 'ct-start',\n end: 'ct-end'\n }\n};\n\nexport class LineChart extends BaseChart {\n /**\n * This method creates a new line chart.\n *\n * @memberof Chartist.Line\n * @param {String|Node} query A selector query string or directly a DOM element\n * @param {Object} data The data object that needs to consist of a labels and a series array\n * @param {Object} [options] The options object with options that override the default options. Check the examples for a detailed list.\n * @param {Array} [responsiveOptions] Specify an array of responsive option arrays which are a media query and options object pair => [[mediaQueryString, optionsObject],[more...]]\n * @return {Object} An object which exposes the API for the created chart\n *\n * @example\n * // Create a simple line chart\n * var data = {\n * // A labels array that can contain any sort of values\n * labels: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri'],\n * // Our series array that contains series objects or in this case series data arrays\n * series: [\n * [5, 2, 4, 2, 0]\n * ]\n * };\n *\n * // As options we currently only set a static size of 300x200 px\n * var options = {\n * width: '300px',\n * height: '200px'\n * };\n *\n * // In the global name space Chartist we call the Line function to initialize a line chart. As a first parameter we pass in a selector where we would like to get our chart created. Second parameter is the actual data object and as a third parameter we pass in our options\n * new Chartist.Line('.ct-chart', data, options);\n *\n * @example\n * // Use specific interpolation function with configuration from the Chartist.Interpolation module\n *\n * var chart = new Chartist.Line('.ct-chart', {\n * labels: [1, 2, 3, 4, 5],\n * series: [\n * [1, 1, 8, 1, 7]\n * ]\n * }, {\n * lineSmooth: Chartist.Interpolation.cardinal({\n * tension: 0.2\n * })\n * });\n *\n * @example\n * // Create a line chart with responsive options\n *\n * var data = {\n * // A labels array that can contain any sort of values\n * labels: ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'],\n * // Our series array that contains series objects or in this case series data arrays\n * series: [\n * [5, 2, 4, 2, 0]\n * ]\n * };\n *\n * // In addition to the regular options we specify responsive option overrides that will override the default configutation based on the matching media queries.\n * var responsiveOptions = [\n * ['screen and (min-width: 641px) and (max-width: 1024px)', {\n * showPoint: false,\n * axisX: {\n * labelInterpolationFnc: function(value) {\n * // Will return Mon, Tue, Wed etc. on medium screens\n * return value.slice(0, 3);\n * }\n * }\n * }],\n * ['screen and (max-width: 640px)', {\n * showLine: false,\n * axisX: {\n * labelInterpolationFnc: function(value) {\n * // Will return M, T, W etc. on small screens\n * return value[0];\n * }\n * }\n * }]\n * ];\n *\n * new Chartist.Line('.ct-chart', data, null, responsiveOptions);\n *\n */\n constructor(query, data, options, responsiveOptions) {\n super(query, data, defaultOptions, extend({}, defaultOptions, options), responsiveOptions);\n }\n\n /**\n * Creates a new chart\n *\n */\n createChart(options) {\n const data = normalizeData(this.data, options.reverseData, true);\n\n // Create new svg object\n this.svg = createSvg(this.container, options.width, options.height, options.classNames.chart);\n // Create groups for labels, grid and series\n const gridGroup = this.svg.elem('g').addClass(options.classNames.gridGroup);\n const seriesGroup = this.svg.elem('g');\n const labelGroup = this.svg.elem('g').addClass(options.classNames.labelGroup);\n\n const chartRect = createChartRect(this.svg, options, defaultOptions.padding);\n let axisX;\n let axisY;\n\n if(options.axisX.type === undefined) {\n axisX = new StepAxis(axisUnits.x, data.normalized.series, chartRect, extend({}, options.axisX, {\n ticks: data.normalized.labels,\n stretch: options.fullWidth\n }));\n } else {\n axisX = new options.axisX.type(axisUnits.x, data.normalized.series, chartRect, options.axisX);\n }\n\n if(options.axisY.type === undefined) {\n axisY = new AutoScaleAxis(axisUnits.y, data.normalized.series, chartRect, extend({}, options.axisY, {\n high: isNumeric(options.high) ? options.high : options.axisY.high,\n low: isNumeric(options.low) ? options.low : options.axisY.low\n }));\n } else {\n axisY = new options.axisY.type(axisUnits.y, data.normalized.series, chartRect, options.axisY);\n }\n\n axisX.createGridAndLabels(gridGroup, labelGroup, this.supportsForeignObject, options, this.eventEmitter);\n axisY.createGridAndLabels(gridGroup, labelGroup, this.supportsForeignObject, options, this.eventEmitter);\n\n if(options.showGridBackground) {\n createGridBackground(gridGroup, chartRect, options.classNames.gridBackground, this.eventEmitter);\n }\n\n // Draw the series\n data.raw.series.forEach((series, seriesIndex) => {\n const seriesElement = seriesGroup.elem('g');\n\n // Write attributes to series group element. If series name or meta is undefined the attributes will not be written\n seriesElement.attr({\n 'ct:series-name': series.name,\n 'ct:meta': serialize(series.meta)\n });\n\n // Use series class from series data or if not set generate one\n seriesElement.addClass([\n options.classNames.series,\n series.className || `${options.classNames.series}-${alphaNumerate(seriesIndex)}`\n ].join(' '));\n\n const pathCoordinates = [];\n const pathData = [];\n\n data.normalized.series[seriesIndex].forEach((value, valueIndex) => {\n const p = {\n x: chartRect.x1 + axisX.projectValue(value, valueIndex, data.normalized.series[seriesIndex]),\n y: chartRect.y1 - axisY.projectValue(value, valueIndex, data.normalized.series[seriesIndex])\n };\n pathCoordinates.push(p.x, p.y);\n pathData.push({\n value,\n valueIndex,\n meta: getMetaData(series, valueIndex)\n });\n });\n\n const seriesOptions = {\n lineSmooth: getSeriesOption(series, options, 'lineSmooth'),\n showPoint: getSeriesOption(series, options, 'showPoint'),\n showLine: getSeriesOption(series, options, 'showLine'),\n showArea: getSeriesOption(series, options, 'showArea'),\n areaBase: getSeriesOption(series, options, 'areaBase')\n };\n\n let smoothing;\n if(typeof seriesOptions.lineSmooth === 'function') {\n smoothing = seriesOptions.lineSmooth;\n } else {\n smoothing = seriesOptions.lineSmooth ? monotoneCubic() : none();\n }\n\n // Interpolating path where pathData will be used to annotate each path element so we can trace back the original\n // index, value and meta data\n const path = smoothing(pathCoordinates, pathData);\n\n // If we should show points we need to create them now to avoid secondary loop\n // Points are drawn from the pathElements returned by the interpolation function\n // Small offset for Firefox to render squares correctly\n if(seriesOptions.showPoint) {\n\n path.pathElements.forEach((pathElement) => {\n const point = seriesElement.elem('line', {\n x1: pathElement.x,\n y1: pathElement.y,\n x2: pathElement.x + 0.01,\n y2: pathElement.y\n }, options.classNames.point).attr({\n 'ct:value': [pathElement.data.value.x, pathElement.data.value.y].filter(isNumeric).join(','),\n 'ct:meta': serialize(pathElement.data.meta)\n });\n\n this.eventEmitter.emit('draw', {\n type: 'point',\n value: pathElement.data.value,\n index: pathElement.data.valueIndex,\n meta: pathElement.data.meta,\n series,\n seriesIndex,\n axisX,\n axisY,\n group: seriesElement,\n element: point,\n x: pathElement.x,\n y: pathElement.y\n });\n });\n }\n\n if(seriesOptions.showLine) {\n const line = seriesElement.elem('path', {\n d: path.stringify()\n }, options.classNames.line, true);\n\n this.eventEmitter.emit('draw', {\n type: 'line',\n values: data.normalized.series[seriesIndex],\n path: path.clone(),\n chartRect,\n // TODO: Remove redundant\n index: seriesIndex,\n series,\n seriesIndex,\n seriesMeta: series.meta,\n axisX,\n axisY,\n group: seriesElement,\n element: line\n });\n }\n\n // Area currently only works with axes that support a range!\n if(seriesOptions.showArea && axisY.range) {\n // If areaBase is outside the chart area (< min or > max) we need to set it respectively so that\n // the area is not drawn outside the chart area.\n const areaBase = Math.max(Math.min(seriesOptions.areaBase, axisY.range.max), axisY.range.min);\n\n // We project the areaBase value into screen coordinates\n const areaBaseProjected = chartRect.y1 - axisY.projectValue(areaBase);\n\n // In order to form the area we'll first split the path by move commands so we can chunk it up into segments\n path.splitByCommand('M')\n // We filter only \"solid\" segments that contain more than one point. Otherwise there's no need for an area\n .filter((pathSegment) => pathSegment.pathElements.length > 1)\n .map((solidPathSegments) => {\n // Receiving the filtered solid path segments we can now convert those segments into fill areas\n const firstElement = solidPathSegments.pathElements[0];\n const lastElement = solidPathSegments.pathElements[solidPathSegments.pathElements.length - 1];\n\n // Cloning the solid path segment with closing option and removing the first move command from the clone\n // We then insert a new move that should start at the area base and draw a straight line up or down\n // at the end of the path we add an additional straight line to the projected area base value\n // As the closing option is set our path will be automatically closed\n return solidPathSegments.clone(true)\n .position(0)\n .remove(1)\n .move(firstElement.x, areaBaseProjected)\n .line(firstElement.x, firstElement.y)\n .position(solidPathSegments.pathElements.length + 1)\n .line(lastElement.x, areaBaseProjected);\n\n })\n .forEach((areaPath) => {\n // For each of our newly created area paths, we'll now create path elements by stringifying our path objects\n // and adding the created DOM elements to the correct series group\n const area = seriesElement.elem('path', {\n d: areaPath.stringify()\n }, options.classNames.area, true);\n\n // Emit an event for each area that was drawn\n this.eventEmitter.emit('draw', {\n type: 'area',\n values: data.normalized.series[seriesIndex],\n path: areaPath.clone(),\n series,\n seriesIndex,\n axisX,\n axisY,\n chartRect,\n // TODO: Remove redundant\n index: seriesIndex,\n group: seriesElement,\n element: area\n });\n });\n }\n });\n\n this.eventEmitter.emit('created', {\n // TODO: Remove redundant\n bounds: axisY.bounds,\n chartRect,\n axisX,\n axisY,\n svg: this.svg,\n options\n });\n }\n}\n","import {isNumeric, alphaNumerate} from '../core/lang';\nimport {noop, serialMap} from '../core/functional';\nimport {extend} from '../core/extend';\nimport {normalizeData, serialize, getMetaData, getHighLow} from '../core/data';\nimport {createSvg, createChartRect, createGridBackground} from '../core/creation';\nimport {AutoScaleAxis, StepAxis, axisUnits} from '../axes/axes';\nimport {BaseChart} from './base';\n\n/**\n * Default options in bar charts. Expand the code view to see a detailed list of options with comments.\n *\n * @memberof Chartist.Bar\n */\nconst defaultOptions = {\n // Options for X-Axis\n axisX: {\n // The offset of the chart drawing area to the border of the container\n offset: 30,\n // Position where labels are placed. Can be set to `start` or `end` where `start` is equivalent to left or top on vertical axis and `end` is equivalent to right or bottom on horizontal axis.\n position: 'end',\n // Allows you to correct label positioning on this axis by positive or negative x and y offset.\n labelOffset: {\n x: 0,\n y: 0\n },\n // If labels should be shown or not\n showLabel: true,\n // If the axis grid should be drawn or not\n showGrid: true,\n // Interpolation function that allows you to intercept the value from the axis label\n labelInterpolationFnc: noop,\n // This value specifies the minimum width in pixel of the scale steps\n scaleMinSpace: 30,\n // Use only integer values (whole numbers) for the scale steps\n onlyInteger: false\n },\n // Options for Y-Axis\n axisY: {\n // The offset of the chart drawing area to the border of the container\n offset: 40,\n // Position where labels are placed. Can be set to `start` or `end` where `start` is equivalent to left or top on vertical axis and `end` is equivalent to right or bottom on horizontal axis.\n position: 'start',\n // Allows you to correct label positioning on this axis by positive or negative x and y offset.\n labelOffset: {\n x: 0,\n y: 0\n },\n // If labels should be shown or not\n showLabel: true,\n // If the axis grid should be drawn or not\n showGrid: true,\n // Interpolation function that allows you to intercept the value from the axis label\n labelInterpolationFnc: noop,\n // This value specifies the minimum height in pixel of the scale steps\n scaleMinSpace: 20,\n // Use only integer values (whole numbers) for the scale steps\n onlyInteger: false\n },\n // Specify a fixed width for the chart as a string (i.e. '100px' or '50%')\n width: undefined,\n // Specify a fixed height for the chart as a string (i.e. '100px' or '50%')\n height: undefined,\n // Overriding the natural high of the chart allows you to zoom in or limit the charts highest displayed value\n high: undefined,\n // Overriding the natural low of the chart allows you to zoom in or limit the charts lowest displayed value\n low: undefined,\n // Unless low/high are explicitly set, bar chart will be centered at zero by default. Set referenceValue to null to auto scale.\n referenceValue: 0,\n // Padding of the chart drawing area to the container element and labels as a number or padding object {top: 5, right: 5, bottom: 5, left: 5}\n chartPadding: {\n top: 15,\n right: 15,\n bottom: 5,\n left: 10\n },\n // Specify the distance in pixel of bars in a group\n seriesBarDistance: 15,\n // If set to true this property will cause the series bars to be stacked. Check the `stackMode` option for further stacking options.\n stackBars: false,\n // If set to 'overlap' this property will force the stacked bars to draw from the zero line.\n // If set to 'accumulate' this property will form a total for each series point. This will also influence the y-axis and the overall bounds of the chart. In stacked mode the seriesBarDistance property will have no effect.\n stackMode: 'accumulate',\n // Inverts the axes of the bar chart in order to draw a horizontal bar chart. Be aware that you also need to invert your axis settings as the Y Axis will now display the labels and the X Axis the values.\n horizontalBars: false,\n // If set to true then each bar will represent a series and the data array is expected to be a one dimensional array of data values rather than a series array of series. This is useful if the bar chart should represent a profile rather than some data over time.\n distributeSeries: false,\n // If true the whole data is reversed including labels, the series order as well as the whole series data arrays.\n reverseData: false,\n // If the bar chart should add a background fill to the .ct-grids group.\n showGridBackground: false,\n // Override the class names that get used to generate the SVG structure of the chart\n classNames: {\n chart: 'ct-chart-bar',\n horizontalBars: 'ct-horizontal-bars',\n label: 'ct-label',\n labelGroup: 'ct-labels',\n series: 'ct-series',\n bar: 'ct-bar',\n grid: 'ct-grid',\n gridGroup: 'ct-grids',\n gridBackground: 'ct-grid-background',\n vertical: 'ct-vertical',\n horizontal: 'ct-horizontal',\n start: 'ct-start',\n end: 'ct-end'\n }\n};\n\nexport class BarChart extends BaseChart {\n /**\n * This method creates a new bar chart and returns API object that you can use for later changes.\n *\n * @memberof Chartist.Bar\n * @param {String|Node} query A selector query string or directly a DOM element\n * @param {Object} data The data object that needs to consist of a labels and a series array\n * @param {Object} [options] The options object with options that override the default options. Check the examples for a detailed list.\n * @param {Array} [responsiveOptions] Specify an array of responsive option arrays which are a media query and options object pair => [[mediaQueryString, optionsObject],[more...]]\n * @return {Object} An object which exposes the API for the created chart\n *\n * @example\n * // Create a simple bar chart\n * var data = {\n * labels: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri'],\n * series: [\n * [5, 2, 4, 2, 0]\n * ]\n * };\n *\n * // In the global name space Chartist we call the Bar function to initialize a bar chart. As a first parameter we pass in a selector where we would like to get our chart created and as a second parameter we pass our data object.\n * new Chartist.Bar('.ct-chart', data);\n *\n * @example\n * // This example creates a bipolar grouped bar chart where the boundaries are limitted to -10 and 10\n * new Chartist.Bar('.ct-chart', {\n * labels: [1, 2, 3, 4, 5, 6, 7],\n * series: [\n * [1, 3, 2, -5, -3, 1, -6],\n * [-5, -2, -4, -1, 2, -3, 1]\n * ]\n * }, {\n * seriesBarDistance: 12,\n * low: -10,\n * high: 10\n * });\n *\n */\n constructor(query, data, options, responsiveOptions) {\n super(query, data, defaultOptions, extend({}, defaultOptions, options), responsiveOptions);\n }\n\n /**\n * Creates a new chart\n *\n */\n createChart(options) {\n let data;\n let highLow;\n\n if(options.distributeSeries) {\n data = normalizeData(this.data, options.reverseData, options.horizontalBars ? 'x' : 'y');\n data.normalized.series = data.normalized.series.map((value) => [value]);\n } else {\n data = normalizeData(this.data, options.reverseData, options.horizontalBars ? 'x' : 'y');\n }\n\n // Create new svg element\n this.svg = createSvg(\n this.container,\n options.width,\n options.height,\n options.classNames.chart + (options.horizontalBars ? ' ' + options.classNames.horizontalBars : '')\n );\n\n // Drawing groups in correct order\n const gridGroup = this.svg.elem('g').addClass(options.classNames.gridGroup);\n const seriesGroup = this.svg.elem('g');\n const labelGroup = this.svg.elem('g').addClass(options.classNames.labelGroup);\n\n if(options.stackBars && data.normalized.series.length !== 0) {\n // If stacked bars we need to calculate the high low from stacked values from each series\n const serialSums = serialMap(data.normalized.series, () =>\n Array.from(arguments)\n .map((value) => value)\n .reduce((prev, curr) => {\n return {\n x: prev.x + (curr && curr.x) || 0,\n y: prev.y + (curr && curr.y) || 0\n };\n }, {x: 0, y: 0})\n );\n\n highLow = getHighLow([serialSums], options, options.horizontalBars ? 'x' : 'y');\n\n } else {\n highLow = getHighLow(data.normalized.series, options, options.horizontalBars ? 'x' : 'y');\n }\n\n // Overrides of high / low from settings\n highLow.high = +options.high || (options.high === 0 ? 0 : highLow.high);\n highLow.low = +options.low || (options.low === 0 ? 0 : highLow.low);\n\n const chartRect = createChartRect(this.svg, options, defaultOptions.padding);\n let valueAxis;\n let labelAxisTicks;\n let labelAxis;\n let axisX;\n let axisY;\n\n // We need to set step count based on some options combinations\n if(options.distributeSeries && options.stackBars) {\n // If distributed series are enabled and bars need to be stacked, we'll only have one bar and therefore should\n // use only the first label for the step axis\n labelAxisTicks = data.normalized.labels.slice(0, 1);\n } else {\n // If distributed series are enabled but stacked bars aren't, we should use the series labels\n // If we are drawing a regular bar chart with two dimensional series data, we just use the labels array\n // as the bars are normalized\n labelAxisTicks = data.normalized.labels;\n }\n\n // Set labelAxis and valueAxis based on the horizontalBars setting. This setting will flip the axes if necessary.\n if(options.horizontalBars) {\n if(options.axisX.type === undefined) {\n valueAxis = axisX = new AutoScaleAxis(axisUnits.x, data.normalized.series, chartRect, extend({}, options.axisX, {\n highLow: highLow,\n referenceValue: 0\n }));\n } else {\n valueAxis = axisX = new options.axisX.type(axisUnits.x, data.normalized.series, chartRect, extend({}, options.axisX, {\n highLow: highLow,\n referenceValue: 0\n }));\n }\n\n if(options.axisY.type === undefined) {\n labelAxis = axisY = new StepAxis(axisUnits.y, data.normalized.series, chartRect, {\n ticks: labelAxisTicks\n });\n } else {\n labelAxis = axisY = new options.axisY.type(axisUnits.y, data.normalized.series, chartRect, options.axisY);\n }\n } else {\n if(options.axisX.type === undefined) {\n labelAxis = axisX = new StepAxis(axisUnits.x, data.normalized.series, chartRect, {\n ticks: labelAxisTicks\n });\n } else {\n labelAxis = axisX = new options.axisX.type(axisUnits.x, data.normalized.series, chartRect, options.axisX);\n }\n\n if(options.axisY.type === undefined) {\n valueAxis = axisY = new AutoScaleAxis(axisUnits.y, data.normalized.series, chartRect, extend({}, options.axisY, {\n highLow: highLow,\n referenceValue: 0\n }));\n } else {\n valueAxis = axisY = new options.axisY.type(axisUnits.y, data.normalized.series, chartRect, extend({}, options.axisY, {\n highLow: highLow,\n referenceValue: 0\n }));\n }\n }\n\n // Projected 0 point\n const zeroPoint = options.horizontalBars ?\n (chartRect.x1 + valueAxis.projectValue(0)) :\n (chartRect.y1 - valueAxis.projectValue(0));\n // Used to track the screen coordinates of stacked bars\n const stackedBarValues = [];\n\n labelAxis.createGridAndLabels(gridGroup, labelGroup, this.supportsForeignObject, options, this.eventEmitter);\n valueAxis.createGridAndLabels(gridGroup, labelGroup, this.supportsForeignObject, options, this.eventEmitter);\n\n if(options.showGridBackground) {\n createGridBackground(gridGroup, chartRect, options.classNames.gridBackground, this.eventEmitter);\n }\n\n // Draw the series\n data.raw.series.forEach((series, seriesIndex) => {\n // Calculating bi-polar value of index for seriesOffset. For i = 0..4 biPol will be -1.5, -0.5, 0.5, 1.5 etc.\n const biPol = seriesIndex - (data.raw.series.length - 1) / 2;\n // Half of the period width between vertical grid lines used to position bars\n let periodHalfLength;\n\n // We need to set periodHalfLength based on some options combinations\n if(options.distributeSeries && !options.stackBars) {\n // If distributed series are enabled but stacked bars aren't, we need to use the length of the normaizedData array\n // which is the series count and divide by 2\n periodHalfLength = labelAxis.axisLength / data.normalized.series.length / 2;\n } else if(options.distributeSeries && options.stackBars) {\n // If distributed series and stacked bars are enabled we'll only get one bar so we should just divide the axis\n // length by 2\n periodHalfLength = labelAxis.axisLength / 2;\n } else {\n // On regular bar charts we should just use the series length\n periodHalfLength = labelAxis.axisLength / data.normalized.series[seriesIndex].length / 2;\n }\n\n // Adding the series group to the series element\n const seriesElement = seriesGroup.elem('g');\n\n // Write attributes to series group element. If series name or meta is undefined the attributes will not be written\n seriesElement.attr({\n 'ct:series-name': series.name,\n 'ct:meta': serialize(series.meta)\n });\n\n // Use series class from series data or if not set generate one\n seriesElement.addClass([\n options.classNames.series,\n series.className || `${options.classNames.series}-${alphaNumerate(seriesIndex)}`\n ].join(' '));\n\n data.normalized.series[seriesIndex].forEach((value, valueIndex) => {\n let labelAxisValueIndex;\n // We need to set labelAxisValueIndex based on some options combinations\n if(options.distributeSeries && !options.stackBars) {\n // If distributed series are enabled but stacked bars aren't, we can use the seriesIndex for later projection\n // on the step axis for label positioning\n labelAxisValueIndex = seriesIndex;\n } else if(options.distributeSeries && options.stackBars) {\n // If distributed series and stacked bars are enabled, we will only get one bar and therefore always use\n // 0 for projection on the label step axis\n labelAxisValueIndex = 0;\n } else {\n // On regular bar charts we just use the value index to project on the label step axis\n labelAxisValueIndex = valueIndex;\n }\n\n let projected;\n // We need to transform coordinates differently based on the chart layout\n if(options.horizontalBars) {\n projected = {\n x: chartRect.x1 + valueAxis.projectValue(value && value.x ? value.x : 0, valueIndex, data.normalized.series[seriesIndex]),\n y: chartRect.y1 - labelAxis.projectValue(value && value.y ? value.y : 0, labelAxisValueIndex, data.normalized.series[seriesIndex])\n };\n } else {\n projected = {\n x: chartRect.x1 + labelAxis.projectValue(value && value.x ? value.x : 0, labelAxisValueIndex, data.normalized.series[seriesIndex]),\n y: chartRect.y1 - valueAxis.projectValue(value && value.y ? value.y : 0, valueIndex, data.normalized.series[seriesIndex])\n }\n }\n\n // If the label axis is a step based axis we will offset the bar into the middle of between two steps using\n // the periodHalfLength value. Also we do arrange the different series so that they align up to each other using\n // the seriesBarDistance. If we don't have a step axis, the bar positions can be chosen freely so we should not\n // add any automated positioning.\n if(labelAxis instanceof StepAxis) {\n // Offset to center bar between grid lines, but only if the step axis is not stretched\n if(!labelAxis.options.stretch) {\n projected[labelAxis.units.pos] += periodHalfLength * (options.horizontalBars ? -1 : 1);\n }\n // Using bi-polar offset for multiple series if no stacked bars or series distribution is used\n projected[labelAxis.units.pos] += (options.stackBars || options.distributeSeries) ? 0 : biPol * options.seriesBarDistance * (options.horizontalBars ? -1 : 1);\n }\n\n // Enter value in stacked bar values used to remember previous screen value for stacking up bars\n const previousStack = stackedBarValues[valueIndex] || zeroPoint;\n stackedBarValues[valueIndex] = previousStack - (zeroPoint - projected[labelAxis.counterUnits.pos]);\n\n // Skip if value is undefined\n if(value === undefined) {\n return;\n }\n\n const positions = {};\n positions[`${labelAxis.units.pos}1`] = projected[labelAxis.units.pos];\n positions[`${labelAxis.units.pos}2`] = projected[labelAxis.units.pos];\n\n if(options.stackBars && (options.stackMode === 'accumulate' || !options.stackMode)) {\n // Stack mode: accumulate (default)\n // If bars are stacked we use the stackedBarValues reference and otherwise base all bars off the zero line\n // We want backwards compatibility, so the expected fallback without the 'stackMode' option\n // to be the original behaviour (accumulate)\n positions[`${labelAxis.counterUnits.pos}1`] = previousStack;\n positions[`${labelAxis.counterUnits.pos}2`] = stackedBarValues[valueIndex];\n } else {\n // Draw from the zero line normally\n // This is also the same code for Stack mode: overlap\n positions[`${labelAxis.counterUnits.pos}1`] = zeroPoint;\n positions[`${labelAxis.counterUnits.pos}2`] = projected[labelAxis.counterUnits.pos];\n }\n\n // Limit x and y so that they are within the chart rect\n positions.x1 = Math.min(Math.max(positions.x1, chartRect.x1), chartRect.x2);\n positions.x2 = Math.min(Math.max(positions.x2, chartRect.x1), chartRect.x2);\n positions.y1 = Math.min(Math.max(positions.y1, chartRect.y2), chartRect.y1);\n positions.y2 = Math.min(Math.max(positions.y2, chartRect.y2), chartRect.y1);\n\n const metaData = getMetaData(series, valueIndex);\n\n // Create bar element\n const bar = seriesElement.elem('line', positions, options.classNames.bar).attr({\n 'ct:value': [value.x, value.y].filter(isNumeric).join(','),\n 'ct:meta': serialize(metaData)\n });\n\n this.eventEmitter.emit('draw', extend({\n type: 'bar',\n value,\n index: valueIndex,\n meta: metaData,\n series,\n seriesIndex,\n axisX,\n axisY,\n chartRect,\n group: seriesElement,\n element: bar\n }, positions));\n });\n });\n\n this.eventEmitter.emit('created', {\n bounds: valueAxis.bounds,\n chartRect,\n axisX,\n axisY,\n svg: this.svg,\n options\n });\n }\n}\n"]} \ No newline at end of file +{"version":3,"sources":[],"names":[],"mappings":"","file":"chartist.umd.js"} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..a024ed77 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,8327 @@ +{ + "name": "chartist", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.16.7" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", + "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true + }, + "@eslint/eslintrc": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.1.tgz", + "integrity": "sha512-bxvbYnBPN1Gibwyp6NrpnFzA3YtRL3BBAyEAFVIpNTm2Rn4Vy87GA5M4aSn3InRrlsbX5N0GW7XIx+U4SAEKdQ==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.3.1", + "globals": "^13.9.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "globals": { + "version": "13.13.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", + "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "dev": true + }, + "@humanwhocodes/config-array": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", + "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "@npmcli/fs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", + "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", + "dev": true, + "requires": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + }, + "dependencies": { + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "dev": true, + "requires": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + } + } + }, + "@socket.io/base64-arraybuffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@socket.io/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", + "integrity": "sha512-dOlCBKnDw4iShaIsH/bxujKTM18+2TOAsYz+KSc11Am38H4q5Xw8Bbz97ZYdrVNM+um3p7w86Bvvmcn9q+5+eQ==", + "dev": true + }, + "@socket.io/component-emitter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.0.0.tgz", + "integrity": "sha512-2pTGuibAXJswAPJjaKisthqS/NOK5ypG4LYT6tEAV0S/mxW0zOIvYvGK0V8w8+SHxAm6vRMSjqSalFXeBAqs+Q==", + "dev": true + }, + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true + }, + "@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "dev": true + }, + "@types/component-emitter": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.11.tgz", + "integrity": "sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ==", + "dev": true + }, + "@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", + "dev": true + }, + "@types/cors": { + "version": "2.8.12", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", + "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==", + "dev": true + }, + "@types/estree": { + "version": "0.0.38", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.38.tgz", + "integrity": "sha512-F/v7t1LwS4vnXuPooJQGBRKRGIoxWUTmA4VHfqjOccFsNDThD5bfUNpITive6s352O7o384wcpEaDV8rHCehDA==", + "dev": true + }, + "@types/minimist": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", + "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", + "dev": true + }, + "@types/node": { + "version": "17.0.23", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", + "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==", + "dev": true + }, + "@types/normalize-package-data": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", + "dev": true + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, + "acorn": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "requires": { + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "agentkeepalive": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz", + "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "depd": "^1.1.2", + "humanize-ms": "^1.2.1" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "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.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.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" + } + } + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=", + "dev": true + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true + }, + "are-we-there-yet": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.0.tgz", + "integrity": "sha512-0GWpv50YSOcLXaN6/FAKY3vfRbllXWV2xvfA/oKJF8pzFhWXPV+yjhJXDBbjscDYowv7Yw1A3uigpzn5iEGTyw==", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "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-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", + "dev": true + }, + "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 + }, + "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 + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "async-each-series": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/async-each-series/-/async-each-series-0.1.1.tgz", + "integrity": "sha1-dhfBkXQB/Yykooqtzj266Yr+tDI=", + "dev": true + }, + "async-foreach": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", + "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "autoprefixer": { + "version": "10.4.4", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.4.tgz", + "integrity": "sha512-Tm8JxsB286VweiZ5F0anmbyGiNI3v3wGv3mz9W+cxEDYB/6jbnj6GM9H9mK3wIL8ftgl+C07Lcwb8PG5PCCPzA==", + "dev": true, + "requires": { + "browserslist": "^4.20.2", + "caniuse-lite": "^1.0.30001317", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + } + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "dev": true + }, + "axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "dev": true, + "requires": { + "follow-redirects": "^1.14.0" + } + }, + "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": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + } + }, + "babel-core": { + "version": "6.26.3", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", + "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.1", + "debug": "^2.6.9", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.8", + "slash": "^1.0.0", + "source-map": "^0.5.7" + }, + "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 + } + } + }, + "babel-eslint": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-7.1.0.tgz", + "integrity": "sha1-1QalF0uiJOJaLRfhKOK6iYcTndw=", + "dev": true, + "requires": { + "babel-traverse": "^6.15.0", + "babel-types": "^6.15.0", + "babylon": "^6.11.2", + "lodash.pickby": "^4.6.0" + } + }, + "babel-generator": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "dev": true, + "requires": { + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "babel-helper-hoist-variables": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", + "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-syntax-dynamic-import": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", + "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=", + "dev": true + }, + "babel-plugin-transform-amd-system-wrapper": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-amd-system-wrapper/-/babel-plugin-transform-amd-system-wrapper-0.3.7.tgz", + "integrity": "sha1-Uhx4LTVkRJHJeepoPopeHK/wukI=", + "dev": true, + "requires": { + "babel-template": "^6.9.0" + } + }, + "babel-plugin-transform-cjs-system-wrapper": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-cjs-system-wrapper/-/babel-plugin-transform-cjs-system-wrapper-0.6.2.tgz", + "integrity": "sha1-vXSUd1KJQk/0k7btRV3klb1xuh0=", + "dev": true, + "requires": { + "babel-template": "^6.9.0" + } + }, + "babel-plugin-transform-es2015-modules-systemjs": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", + "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", + "dev": true, + "requires": { + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-global-system-wrapper": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-global-system-wrapper/-/babel-plugin-transform-global-system-wrapper-0.3.4.tgz", + "integrity": "sha1-lI3X0p/CFEfjm9NEfy3rx/L3Oqw=", + "dev": true, + "requires": { + "babel-template": "^6.9.0" + } + }, + "babel-plugin-transform-system-register": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-system-register/-/babel-plugin-transform-system-register-0.0.1.tgz", + "integrity": "sha1-nf9AOQwnY6xRjwsq18XqT2WlviU=", + "dev": true + }, + "babel-register": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "dev": true, + "requires": { + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" + }, + "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-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "requires": { + "source-map": "^0.5.6" + } + } + } + }, + "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": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "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.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "dev": true + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "bl": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", + "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", + "dev": true, + "requires": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "body-parser": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", + "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", + "dev": true, + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.10.3", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "dependencies": { + "destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "qs": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + } + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browser-sync": { + "version": "2.27.9", + "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.27.9.tgz", + "integrity": "sha512-3zBtggcaZIeU9so4ja9yxk7/CZu9B3DOL6zkxFpzHCHsQmkGBPVXg61jItbeoa+WXgNLnr1sYES/2yQwyEZ2+w==", + "dev": true, + "requires": { + "browser-sync-client": "^2.27.9", + "browser-sync-ui": "^2.27.9", + "bs-recipes": "1.3.4", + "bs-snippet-injector": "^2.0.1", + "chokidar": "^3.5.1", + "connect": "3.6.6", + "connect-history-api-fallback": "^1", + "dev-ip": "^1.0.1", + "easy-extender": "^2.3.4", + "eazy-logger": "3.1.0", + "etag": "^1.8.1", + "fresh": "^0.5.2", + "fs-extra": "3.0.1", + "http-proxy": "^1.18.1", + "immutable": "^3", + "localtunnel": "^2.0.1", + "micromatch": "^4.0.2", + "opn": "5.3.0", + "portscanner": "2.1.1", + "qs": "6.2.3", + "raw-body": "^2.3.2", + "resp-modifier": "6.0.2", + "rx": "4.1.0", + "send": "0.16.2", + "serve-index": "1.9.1", + "serve-static": "1.13.2", + "server-destroy": "1.0.1", + "socket.io": "^4.4.1", + "ua-parser-js": "1.0.2", + "yargs": "^17.3.1" + } + }, + "browser-sync-client": { + "version": "2.27.9", + "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.27.9.tgz", + "integrity": "sha512-FHW8kydp7FXo6jnX3gXJCpHAHtWNLK0nx839nnK+boMfMI1n4KZd0+DmTxHBsHsF3OHud4V4jwoN8U5HExMIdQ==", + "dev": true, + "requires": { + "etag": "1.8.1", + "fresh": "0.5.2", + "mitt": "^1.1.3", + "rxjs": "^5.5.6" + } + }, + "browser-sync-ui": { + "version": "2.27.9", + "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-2.27.9.tgz", + "integrity": "sha512-rsduR2bRIwFvM8CX6iY/Nu5aWub0WB9zfSYg9Le/RV5N5DEyxJYey0VxdfWCnzDOoelassTDzYQo+r0iJno3qw==", + "dev": true, + "requires": { + "async-each-series": "0.1.1", + "connect-history-api-fallback": "^1", + "immutable": "^3", + "server-destroy": "1.0.1", + "socket.io-client": "^4.4.1", + "stream-throttle": "^0.1.3" + } + }, + "browserslist": { + "version": "4.20.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", + "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001317", + "electron-to-chromium": "^1.4.84", + "escalade": "^3.1.1", + "node-releases": "^2.0.2", + "picocolors": "^1.0.0" + } + }, + "bs-recipes": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/bs-recipes/-/bs-recipes-1.3.4.tgz", + "integrity": "sha1-DS1NSKcYyMBEdp/cT4lZLci2lYU=", + "dev": true + }, + "bs-snippet-injector": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/bs-snippet-injector/-/bs-snippet-injector-2.0.1.tgz", + "integrity": "sha1-YbU5PxH1JVntEgaTEANDtu2wTdU=", + "dev": true + }, + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dev": true, + "requires": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", + "dev": true + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "dev": true + }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", + "dev": true + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "buffer-peek-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-peek-stream/-/buffer-peek-stream-1.1.0.tgz", + "integrity": "sha512-b3MXlJ52rPOL5xCAQsiCOy/tY9WXOP/hwATporJriUDxnT3MjJgVppDzTFegpg2Nw7NMS28MKC6IKvaXLnGr+Q==", + "dev": true + }, + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true + }, + "cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "dev": true, + "requires": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "dependencies": { + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + } + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true + }, + "camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + } + } + }, + "caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001325", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001325.tgz", + "integrity": "sha512-sB1bZHjseSjDtijV1Hb7PB2Zd58Kyx+n/9EotvZ4Qcz2K3d0lWB8dB4nb8wN/TsOGFq3UuAm0zQZNQ4SoR7TrQ==", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dev": true, + "requires": { + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "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" + } + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "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": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.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": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, + "cli-color": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-0.3.3.tgz", + "integrity": "sha1-EtW90Vj/igsNtAEZiRPAPfBp9vU=", + "dev": true, + "requires": { + "d": "~0.1.1", + "es5-ext": "~0.10.6", + "memoizee": "~0.3.8", + "timers-ext": "0.1" + }, + "dependencies": { + "d": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/d/-/d-0.1.1.tgz", + "integrity": "sha1-2hhMU10Y2O57oqoim5FACfrhEwk=", + "dev": true, + "requires": { + "es5-ext": "~0.10.2" + } + } + } + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true + }, + "colord": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.2.tgz", + "integrity": "sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ==", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "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": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "connect": { + "version": "3.6.6", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", + "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=", + "dev": true, + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.0", + "parseurl": "~1.3.2", + "utils-merge": "1.0.1" + } + }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "dev": true + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "css-declaration-sorter": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.2.2.tgz", + "integrity": "sha512-Ufadglr88ZLsrvS11gjeu/40Lw74D9Am/Jpr3LlYm5Q4ZP5KdlUhG+6u2EjyXeZcxmZ2h1ebCKngDjolpeLHpg==", + "dev": true + }, + "css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + } + }, + "css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, + "requires": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + } + }, + "css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, + "cssnano": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.7.tgz", + "integrity": "sha512-pVsUV6LcTXif7lvKKW9ZrmX+rGRzxkEdJuVJcp5ftUjWITgwam5LMZOgaTvUrWPkcORBey6he7JKb4XAJvrpKg==", + "dev": true, + "requires": { + "cssnano-preset-default": "^5.2.7", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" + } + }, + "cssnano-preset-default": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.7.tgz", + "integrity": "sha512-JiKP38ymZQK+zVKevphPzNSGHSlTI+AOwlasoSRtSVMUU285O7/6uZyd5NbW92ZHp41m0sSHe6JoZosakj63uA==", + "dev": true, + "requires": { + "css-declaration-sorter": "^6.2.2", + "cssnano-utils": "^3.1.0", + "postcss-calc": "^8.2.3", + "postcss-colormin": "^5.3.0", + "postcss-convert-values": "^5.1.0", + "postcss-discard-comments": "^5.1.1", + "postcss-discard-duplicates": "^5.1.0", + "postcss-discard-empty": "^5.1.1", + "postcss-discard-overridden": "^5.1.0", + "postcss-merge-longhand": "^5.1.4", + "postcss-merge-rules": "^5.1.1", + "postcss-minify-font-values": "^5.1.0", + "postcss-minify-gradients": "^5.1.1", + "postcss-minify-params": "^5.1.2", + "postcss-minify-selectors": "^5.2.0", + "postcss-normalize-charset": "^5.1.0", + "postcss-normalize-display-values": "^5.1.0", + "postcss-normalize-positions": "^5.1.0", + "postcss-normalize-repeat-style": "^5.1.0", + "postcss-normalize-string": "^5.1.0", + "postcss-normalize-timing-functions": "^5.1.0", + "postcss-normalize-unicode": "^5.1.0", + "postcss-normalize-url": "^5.1.0", + "postcss-normalize-whitespace": "^5.1.1", + "postcss-ordered-values": "^5.1.1", + "postcss-reduce-initial": "^5.1.0", + "postcss-reduce-transforms": "^5.1.0", + "postcss-svgo": "^5.1.0", + "postcss-unique-selectors": "^5.1.1" + } + }, + "cssnano-utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", + "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", + "dev": true + }, + "csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dev": true, + "requires": { + "css-tree": "^1.1.2" + } + }, + "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.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "data-uri-to-buffer": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-0.0.4.tgz", + "integrity": "sha1-RuE6udqOMJdFyNAc5UchPr2y/j8=", + "dev": true + }, + "date-format": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.6.tgz", + "integrity": "sha512-B9vvg5rHuQ8cbUXE/RMWMyX2YA5TecT3jKF5fLtGNlzPlU7zblSPmAm2OImDbWL+LDOQ6pUm+4LOFz+ywS41Zw==", + "dev": true + }, + "debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", + "dev": true + }, + "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 + }, + "decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "dev": true, + "requires": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + } + } + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "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, + "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" + } + } + } + }, + "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 + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "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=", + "dev": true + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "dev-ip": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dev-ip/-/dev-ip-1.0.1.tgz", + "integrity": "sha1-p2o+0YVb56ASu4rBbLgPPADcKPA=", + "dev": true + }, + "di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", + "dev": true + }, + "dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", + "dev": true, + "requires": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" + } + }, + "dom-serializer": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "dev": true + }, + "domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "easy-extender": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/easy-extender/-/easy-extender-2.3.4.tgz", + "integrity": "sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q==", + "dev": true, + "requires": { + "lodash": "^4.17.10" + } + }, + "eazy-logger": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eazy-logger/-/eazy-logger-3.1.0.tgz", + "integrity": "sha512-/snsn2JqBtUSSstEl4R0RKjkisGHAhvYj89i7r3ytNUKW12y178KDZwXLXIgwDqLW6E/VRMT9qfld7wvFae8bQ==", + "dev": true, + "requires": { + "tfunk": "^4.0.0" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "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.4.104", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.104.tgz", + "integrity": "sha512-2kjoAyiG7uMyGRM9mx25s3HAzmQG2ayuYXxsFmYugHSDcwxREgLtscZvbL1JcW9S/OemeQ3f/SG6JhDwpnCclQ==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "optional": true, + "requires": { + "iconv-lite": "^0.6.2" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } + } + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "engine.io": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.1.3.tgz", + "integrity": "sha512-rqs60YwkvWTLLnfazqgZqLa/aKo+9cueVfEi/dZ8PyGyaf8TLOxj++4QMIgeG3Gn0AhrWiFXvghsoY9L9h25GA==", + "dev": true, + "requires": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.0.3", + "ws": "~8.2.3" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "engine.io-client": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.1.1.tgz", + "integrity": "sha512-V05mmDo4gjimYW+FGujoGmmmxRaDsrVr7AXA3ZIfa04MWM1jOfZfUwou0oNqhNwy/votUDvGDt4JA4QF4e0b4g==", + "dev": true, + "requires": { + "@socket.io/component-emitter": "~3.0.0", + "debug": "~4.3.1", + "engine.io-parser": "~5.0.0", + "has-cors": "1.1.0", + "parseqs": "0.0.6", + "parseuri": "0.0.6", + "ws": "~8.2.3", + "xmlhttprequest-ssl": "~2.0.0", + "yeast": "0.1.2" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "engine.io-parser": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.3.tgz", + "integrity": "sha512-BtQxwF27XUNnSafQLvDi0dQ8s3i6VgzSoQMJacpIcGNrlUdfHSKbgm3jmjCVvQluGzqwujQMPAoMai3oYSTurg==", + "dev": true, + "requires": { + "@socket.io/base64-arraybuffer": "~1.0.2" + } + }, + "ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", + "dev": true + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + }, + "env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true + }, + "err-code": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz", + "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=", + "dev": true + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es5-ext": { + "version": "0.10.59", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.59.tgz", + "integrity": "sha512-cOgyhW0tIJyQY1Kfw6Kr0viu9ZlUctVchRMZ7R0HiH3dxTSp5zJDLecwxUqPUrGKMsgBI1wd1FL+d9Jxfi4cLw==", + "dev": true, + "requires": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + } + }, + "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": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "dev": true + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dev": true, + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "es6-template-strings": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es6-template-strings/-/es6-template-strings-2.0.1.tgz", + "integrity": "sha1-sWbGpiVi9Hi7d3X2ypYQOlmbSyw=", + "dev": true, + "requires": { + "es5-ext": "^0.10.12", + "esniff": "^1.1" + } + }, + "es6-weak-map": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-0.1.4.tgz", + "integrity": "sha1-cGzvnpmqI2undmwjnIueKG6n0ig=", + "dev": true, + "requires": { + "d": "~0.1.1", + "es5-ext": "~0.10.6", + "es6-iterator": "~0.1.3", + "es6-symbol": "~2.0.1" + }, + "dependencies": { + "d": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/d/-/d-0.1.1.tgz", + "integrity": "sha1-2hhMU10Y2O57oqoim5FACfrhEwk=", + "dev": true, + "requires": { + "es5-ext": "~0.10.2" + } + }, + "es6-iterator": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-0.1.3.tgz", + "integrity": "sha1-1vWLjE/EE8JJtLqhl2j45NfIlE4=", + "dev": true, + "requires": { + "d": "~0.1.1", + "es5-ext": "~0.10.5", + "es6-symbol": "~2.0.1" + } + }, + "es6-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-2.0.1.tgz", + "integrity": "sha1-dhtcZ8/U8dGK+yNPaR1nhoLLO/M=", + "dev": true, + "requires": { + "d": "~0.1.1", + "es5-ext": "~0.10.5" + } + } + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "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 + }, + "eslint": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.12.0.tgz", + "integrity": "sha512-it1oBL9alZg1S8UycLm5YDMAkIhtH6FtAzuZs6YvoGVldWjbS08BkAdb/ymP9LlAyq8koANu32U7Ib/w+UNh8Q==", + "dev": true, + "requires": { + "@eslint/eslintrc": "^1.2.1", + "@humanwhocodes/config-array": "^0.9.2", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^6.0.1", + "globals": "^13.6.0", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "globals": { + "version": "13.13.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", + "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^2.0.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true + }, + "esniff": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/esniff/-/esniff-1.1.0.tgz", + "integrity": "sha1-xmhJIp+RRk3t4uDUAgHtar9l8qw=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.12" + } + }, + "espree": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz", + "integrity": "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==", + "dev": true, + "requires": { + "acorn": "^8.7.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^3.3.0" + } + }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "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-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "exec-sh": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.2.tgz", + "integrity": "sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw==", + "dev": true, + "requires": { + "merge": "^1.2.0" + } + }, + "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": { + "is-descriptor": "^0.1.0" + } + }, + "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" + } + } + } + }, + "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=", + "dev": true, + "requires": { + "fill-range": "^2.1.0" + }, + "dependencies": { + "fill-range": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "dev": true, + "requires": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "expand-tilde": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz", + "integrity": "sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=", + "dev": true, + "requires": { + "os-homedir": "^1.0.1" + } + }, + "ext": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.6.0.tgz", + "integrity": "sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==", + "dev": true, + "requires": { + "type": "^2.5.0" + }, + "dependencies": { + "type": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.6.0.tgz", + "integrity": "sha512-eiDBDOmkih5pMbo9OqsqPRGMljLodLcwd5XD5JbtNB0o89xZAwynY9EdCDsJU7LtcVCClu9DvM7/0Ep1hYX3EQ==", + "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": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "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" + } + }, + "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" + } + } + } + }, + "extract-zip": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", + "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", + "dev": true, + "requires": { + "concat-stream": "^1.6.2", + "debug": "^2.6.9", + "mkdirp": "^0.5.4", + "yauzl": "^2.10.0" + } + }, + "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": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fb-watchman": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "dev": true, + "requires": { + "bser": "2.1.1" + } + }, + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "dev": true, + "requires": { + "pend": "~1.2.0" + } + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "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" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "findup-sync": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", + "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^3.1.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + }, + "dependencies": { + "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": { + "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" + } + } + } + }, + "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" + } + } + } + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "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" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "fined": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", + "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" + }, + "dependencies": { + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + } + } + }, + "flagged-respawn": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", + "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", + "dev": true + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", + "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", + "dev": true + }, + "follow-redirects": { + "version": "1.14.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", + "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==", + "dev": true + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "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.1" + } + }, + "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.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fraction.js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "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 + }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "fs-extra": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", + "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^3.0.0", + "universalify": "^0.1.0" + } + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "fs-promise": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/fs-promise/-/fs-promise-0.5.0.tgz", + "integrity": "sha1-Q0fWv2JGVacGGkMZITw5MnatPvM=", + "dev": true, + "requires": { + "any-promise": "^1.0.0", + "fs-extra": "^0.26.5", + "mz": "^2.3.1", + "thenify-all": "^1.6.0" + }, + "dependencies": { + "fs-extra": { + "version": "0.26.7", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.26.7.tgz", + "integrity": "sha1-muH92UiXeY7at20JGM9C0MMYT6k=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" + } + }, + "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.6" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "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": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "dev": true, + "requires": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "gaze": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", + "dev": true, + "requires": { + "globule": "^1.0.0" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "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-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" + }, + "dependencies": { + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "^2.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + } + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.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.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "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.1", + "which": "^1.2.14" + }, + "dependencies": { + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "globule": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.3.tgz", + "integrity": "sha512-mb1aYtDbIjTu4ShMB85m3UzjX9BVKe9WCzsnfMSZk+K5GpIbBOexgg4PPCt5eHDEG5/ZQAUX2Kct02zfiPLsKg==", + "dev": true, + "requires": { + "glob": "~7.1.1", + "lodash": "~4.17.10", + "minimatch": "~3.0.2" + }, + "dependencies": { + "glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "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" + } + }, + "minimatch": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", + "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "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 + }, + "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.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "dev": true, + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + } + }, + "hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true + }, + "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": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "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" + } + } + } + }, + "hasha": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-2.2.0.tgz", + "integrity": "sha1-eNfL/B5tZjA/55g3NlmEUXsvbuE=", + "dev": true, + "requires": { + "is-stream": "^1.0.1", + "pinkie-promise": "^2.0.0" + } + }, + "home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" + } + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "dev": true + }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "dependencies": { + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true + } + } + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", + "dev": true, + "requires": { + "ms": "^2.0.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true + }, + "immutable": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", + "integrity": "sha1-wkOZUUVbs5kT2vKBN28VMOEErfM=", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "interpolate": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/interpolate/-/interpolate-0.1.0.tgz", + "integrity": "sha1-tgF3pLqUH7NyTIIZBdmareE9Hfk=", + "dev": true + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "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.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.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-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-core-module": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "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.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-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", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-number-like": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz", + "integrity": "sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==", + "dev": true, + "requires": { + "lodash.isfinite": "^3.3.2" + } + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-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-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==", + "dev": true, + "requires": { + "is-unc-path": "^1.0.0" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "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-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "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", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isbinaryfile": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "jasmine-core": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.0.1.tgz", + "integrity": "sha512-w+JDABxQCkxbGGxg+a2hUVZyqUS2JKngvIyLGu/xiw2ZwgsoSB0iiecLQsQORSeaKQ6iGrCyWG86RfNDuoA7Lg==", + "dev": true + }, + "js-base64": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", + "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==", + "dev": true + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "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 + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "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 + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "jsonfile": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", + "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jspm": { + "version": "0.17.0-beta.49", + "resolved": "https://registry.npmjs.org/jspm/-/jspm-0.17.0-beta.49.tgz", + "integrity": "sha512-66Kr63r7VqpwSrmCzpFn0FAwmWH2AmwIkU6Y8rB0ET16zoJo73wxoDfBNPtgT1ONOG7l5gvoUqmT3K4rHtX2Xg==", + "dev": true, + "requires": { + "bluebird": "^3.0.5", + "chalk": "^1.1.1", + "core-js": "^1.2.6", + "glob": "^6.0.1", + "graceful-fs": "^4.1.2", + "jspm-github": "^0.14.11", + "jspm-npm": "^0.30.3", + "jspm-registry": "^0.4.1", + "liftoff": "^2.2.0", + "minimatch": "^3.0.0", + "mkdirp": "~0.5.1", + "ncp": "^2.0.0", + "proper-lockfile": "^1.1.2", + "request": "^2.67.0", + "rimraf": "^2.4.4", + "sane": "^1.3.3", + "semver": "^5.1.0", + "systemjs": "0.21.4", + "systemjs-builder": "0.16.13", + "traceur": "0.0.105", + "uglify-js": "^2.6.1" + }, + "dependencies": { + "core-js": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=", + "dev": true + }, + "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.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + }, + "dependencies": { + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "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" + } + } + } + } + } + }, + "jspm-github": { + "version": "0.14.14", + "resolved": "https://registry.npmjs.org/jspm-github/-/jspm-github-0.14.14.tgz", + "integrity": "sha512-KqSUVqbyiZAlQ+EPDmRzZ1QUdFs5X8hlvo/bKU9/vyv4MsYcGGD6rOEHzcya0nETinRXQrlCRPfnZt1SzrPotQ==", + "dev": true, + "requires": { + "bluebird": "^3.5.0", + "expand-tilde": "^1.2.0", + "graceful-fs": "^4.1.3", + "mkdirp": "^0.5.1", + "netrc": "^0.1.3", + "request": "^2.74.0", + "rimraf": "^2.6.1", + "semver": "^5.0.1", + "tar-fs": "^1.15.3", + "which": "^1.0.9" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "jspm-npm": { + "version": "0.30.5", + "resolved": "https://registry.npmjs.org/jspm-npm/-/jspm-npm-0.30.5.tgz", + "integrity": "sha512-3ewCGIScE4wXyqRNPg12O/qgs2rrRiLqhD4aJpRySpr+5pyNFIQuBTSbyAwTqAjjBjYEMX1f1KkuUP99Yxz+Xg==", + "dev": true, + "requires": { + "bluebird": "^3.0.5", + "buffer-peek-stream": "^1.0.1", + "graceful-fs": "^4.1.3", + "mkdirp": "^0.5.1", + "readdirp": "^2.0.0", + "request": "^2.58.0", + "semver": "^5.0.1", + "tar-fs": "^1.13.0", + "traceur": "0.0.105", + "which": "^1.1.1" + }, + "dependencies": { + "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": { + "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" + } + } + } + }, + "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" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "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" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "jspm-registry": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/jspm-registry/-/jspm-registry-0.4.4.tgz", + "integrity": "sha1-1TFmA1qHzc5YXWK6o5dWhUaZbXA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.3", + "rimraf": "^2.3.2", + "rsvp": "^3.0.18", + "semver": "^4.3.3" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "semver": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", + "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", + "dev": true + } + } + }, + "jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + } + }, + "karma": { + "version": "6.3.17", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.17.tgz", + "integrity": "sha512-2TfjHwrRExC8yHoWlPBULyaLwAFmXmxQrcuFImt/JsAsSZu1uOWTZ1ZsWjqQtWpHLiatJOHL5jFjXSJIgCd01g==", + "dev": true, + "requires": { + "@colors/colors": "1.5.0", + "body-parser": "^1.19.0", + "braces": "^3.0.2", + "chokidar": "^3.5.1", + "connect": "^3.7.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.1", + "glob": "^7.1.7", + "graceful-fs": "^4.2.6", + "http-proxy": "^1.18.1", + "isbinaryfile": "^4.0.8", + "lodash": "^4.17.21", + "log4js": "^6.4.1", + "mime": "^2.5.2", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.5", + "qjobs": "^1.2.0", + "range-parser": "^1.2.1", + "rimraf": "^3.0.2", + "socket.io": "^4.2.0", + "source-map": "^0.6.1", + "tmp": "^0.2.1", + "ua-parser-js": "^0.7.30", + "yargs": "^16.1.1" + }, + "dependencies": { + "connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dev": true, + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + } + }, + "mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, + "ua-parser-js": { + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz", + "integrity": "sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==", + "dev": true + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + } + } + }, + "karma-jasmine": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-4.0.2.tgz", + "integrity": "sha512-ggi84RMNQffSDmWSyyt4zxzh2CQGwsxvYYsprgyR1j8ikzIduEdOlcLvXjZGwXG/0j41KUXOWsUCBfbEHPWP9g==", + "dev": true, + "requires": { + "jasmine-core": "^3.6.0" + }, + "dependencies": { + "jasmine-core": { + "version": "3.99.1", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.99.1.tgz", + "integrity": "sha512-Hu1dmuoGcZ7AfyynN3LsfruwMbxMALMka+YtZeGoLuDEySVmVAPaonkNoBRIw/ectu8b9tVQCJNgp4a4knp+tg==", + "dev": true + } + } + }, + "karma-jspm": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/karma-jspm/-/karma-jspm-2.2.3.tgz", + "integrity": "sha1-uxXNDIwJAkgBE9OWICFXBBWdVQM=", + "dev": true, + "requires": { + "glob": "~7.0.5" + }, + "dependencies": { + "glob": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", + "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.2", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "karma-nyan-reporter": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/karma-nyan-reporter/-/karma-nyan-reporter-0.2.5.tgz", + "integrity": "sha1-qreSXzQWbrzvkwi77hFnn1jdqjE=", + "dev": true, + "requires": { + "cli-color": "^0.3.2" + } + }, + "karma-phantomjs-launcher": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/karma-phantomjs-launcher/-/karma-phantomjs-launcher-1.0.4.tgz", + "integrity": "sha1-0jyjSAG9qYY60xjju0vUBisTrNI=", + "dev": true, + "requires": { + "lodash": "^4.0.1", + "phantomjs-prebuilt": "^2.1.7" + } + }, + "kew": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz", + "integrity": "sha1-edk9LTM2PW/dKXCzNdkUGtWR15s=", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "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.9" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "dev": true + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "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.0", + "findup-sync": "^2.0.0", + "fined": "^1.0.1", + "flagged-respawn": "^1.0.0", + "is-plain-object": "^2.0.4", + "object.map": "^1.0.0", + "rechoir": "^0.6.2", + "resolve": "^1.1.7" + } + }, + "lilconfig": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz", + "integrity": "sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==", + "dev": true + }, + "limiter": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", + "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==", + "dev": true + }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "localtunnel": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/localtunnel/-/localtunnel-2.0.2.tgz", + "integrity": "sha512-n418Cn5ynvJd7m/N1d9WVJISLJF/ellZnfsLnx8WBWGzxv/ntNcFkJ1o6se5quUhCplfLGBNL5tYHiq5WF3Nug==", + "dev": true, + "requires": { + "axios": "0.21.4", + "debug": "4.3.2", + "openurl": "1.1.1", + "yargs": "17.1.1" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "yargs": { + "version": "17.1.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.1.1.tgz", + "integrity": "sha512-c2k48R0PwKIqKhPMWjeiF6y2xY/gPMUlro0sgxqXpbOIohWiLNXWslsootttv7E1e73QPAMQSg5FeySbVcpsPQ==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + } + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "lodash.isfinite": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz", + "integrity": "sha1-+4m2WpqAKBgz8LdHizpRBPiY67M=", + "dev": true + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "lodash.pickby": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.pickby/-/lodash.pickby-4.6.0.tgz", + "integrity": "sha1-feoh2MGNdwOifHBMFdO4SmfjOv8=", + "dev": true + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true + }, + "log4js": { + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.4.4.tgz", + "integrity": "sha512-ncaWPsuw9Vl1CKA406hVnJLGQKy1OHx6buk8J4rE2lVW+NW5Y82G5/DIloO7NkqLOUtNPEANaWC1kZYVjXssPw==", + "dev": true, + "requires": { + "date-format": "^4.0.6", + "debug": "^4.3.4", + "flatted": "^3.2.5", + "rfdc": "^1.3.0", + "streamroller": "^3.0.6" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "lru-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", + "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=", + "dev": true, + "requires": { + "es5-ext": "~0.10.2" + } + }, + "make-fetch-happen": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", + "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", + "dev": true, + "requires": { + "agentkeepalive": "^4.1.3", + "cacache": "^15.2.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.2", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^6.0.0", + "ssri": "^8.0.0" + } + }, + "make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, + "makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "requires": { + "tmpl": "1.0.5" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "math-random": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", + "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", + "dev": true + }, + "mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "memoizee": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.3.10.tgz", + "integrity": "sha1-TsoNiu057J0Bf0xcLy9kMvQuXI8=", + "dev": true, + "requires": { + "d": "~0.1.1", + "es5-ext": "~0.10.11", + "es6-weak-map": "~0.1.4", + "event-emitter": "~0.3.4", + "lru-queue": "0.1", + "next-tick": "~0.2.2", + "timers-ext": "0.1" + }, + "dependencies": { + "d": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/d/-/d-0.1.1.tgz", + "integrity": "sha1-2hhMU10Y2O57oqoim5FACfrhEwk=", + "dev": true, + "requires": { + "es5-ext": "~0.10.2" + } + }, + "next-tick": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-0.2.2.tgz", + "integrity": "sha1-ddpKkn7liH45BliABltzNkE7MQ0=", + "dev": true + } + } + }, + "meow": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", + "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", + "dev": true, + "requires": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize": "^1.2.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "dependencies": { + "type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true + } + } + }, + "merge": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz", + "integrity": "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "dev": true + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "requires": { + "mime-db": "1.52.0" + } + }, + "min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + }, + "minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + } + }, + "minipass": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", + "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-fetch": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", + "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", + "dev": true, + "requires": { + "encoding": "^0.1.12", + "minipass": "^3.1.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" + } + }, + "minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "mitt": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.2.0.tgz", + "integrity": "sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==", + "dev": true + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "requires": { + "minimist": "^1.2.6" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "requires": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "nan": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", + "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", + "dev": true + }, + "nanoid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.2.tgz", + "integrity": "sha512-CuHBogktKwpm5g2sRgv83jEy2ijFzBwMoYA60orPDR7ynsLijJDqgsi4RDGj3OJpy3Ieb+LYwiRmIOGyytgITA==", + "dev": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "ncp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", + "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", + "dev": true + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true + }, + "netrc": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/netrc/-/netrc-0.1.4.tgz", + "integrity": "sha1-a+lPysqNd63gqWcNxGCRTJRHJEQ=", + "dev": true + }, + "next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", + "dev": true + }, + "node-gyp": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", + "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", + "dev": true, + "requires": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^9.1.0", + "nopt": "^5.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "dependencies": { + "npmlog": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.1.tgz", + "integrity": "sha512-BTHDvY6nrRHuRfyjt1MAufLxYdVXZfd099H4+i1f0lPywNQyI4foeNXJRObB/uy+TYqUW0vAD9gbdSOXPst7Eg==", + "dev": true, + "requires": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.0", + "set-blocking": "^2.0.0" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "dev": true + }, + "node-releases": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", + "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==", + "dev": true + }, + "node-sass": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-7.0.1.tgz", + "integrity": "sha512-uMy+Xt29NlqKCFdFRZyXKOTqGt+QaKHexv9STj2WeLottnlqZEEWx6Bj0MXNthmFRRdM/YwyNo/8Tr46TOM0jQ==", + "dev": true, + "requires": { + "async-foreach": "^0.1.3", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.3", + "gaze": "^1.0.0", + "get-stdin": "^4.0.1", + "glob": "^7.0.3", + "lodash": "^4.17.15", + "meow": "^9.0.0", + "nan": "^2.13.2", + "node-gyp": "^8.4.1", + "npmlog": "^5.0.0", + "request": "^2.88.0", + "sass-graph": "4.0.0", + "stdout-stream": "^1.4.0", + "true-case-path": "^1.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "requires": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "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 + }, + "normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true + }, + "npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "dev": true, + "requires": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + } + }, + "gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "dev": true, + "requires": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "nth-check": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", + "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", + "dev": true, + "requires": { + "boolbase": "^1.0.0" + } + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "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.0" + } + }, + "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" + } + } + } + }, + "object-inspect": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", + "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.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.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "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" + } + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "requires": { + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" + }, + "dependencies": { + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + } + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "openurl": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/openurl/-/openurl-1.1.1.tgz", + "integrity": "sha1-OHW0sO96UsFW8NtB1GCduw+Us4c=", + "dev": true + }, + "opn": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", + "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", + "dev": true, + "requires": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + } + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "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 + }, + "parseqs": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", + "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==", + "dev": true + }, + "parseuri": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", + "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==", + "dev": true + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "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.0" + } + }, + "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=", + "dev": true + }, + "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": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "phantomjs-prebuilt": { + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.16.tgz", + "integrity": "sha1-79ISpKOWbTZHaE6ouniFSb4q7+8=", + "dev": true, + "requires": { + "es6-promise": "^4.0.3", + "extract-zip": "^1.6.5", + "fs-extra": "^1.0.0", + "hasha": "^2.2.0", + "kew": "^0.7.0", + "progress": "^1.1.8", + "request": "^2.81.0", + "request-progress": "^2.0.1", + "which": "^1.2.10" + }, + "dependencies": { + "fs-extra": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", + "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0" + } + }, + "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.6" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "portscanner": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.1.1.tgz", + "integrity": "sha1-6rtAnk3iSVD1oqUW01rnaTQ/u5Y=", + "dev": true, + "requires": { + "async": "1.5.2", + "is-number-like": "^1.0.3" + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "postcss": { + "version": "8.4.12", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.12.tgz", + "integrity": "sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg==", + "dev": true, + "requires": { + "nanoid": "^3.3.1", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "postcss-calc": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", + "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.9", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-colormin": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz", + "integrity": "sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==", + "dev": true, + "requires": { + "browserslist": "^4.16.6", + "caniuse-api": "^3.0.0", + "colord": "^2.9.1", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-convert-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.0.tgz", + "integrity": "sha512-GkyPbZEYJiWtQB0KZ0X6qusqFHUepguBCNFi9t5JJc7I2OTXG7C0twbTLvCfaKOLl3rSXmpAwV7W5txd91V84g==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-discard-comments": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.1.tgz", + "integrity": "sha512-5JscyFmvkUxz/5/+TB3QTTT9Gi9jHkcn8dcmmuN68JQcv3aQg4y88yEHHhwFB52l/NkaJ43O0dbksGMAo49nfQ==", + "dev": true + }, + "postcss-discard-duplicates": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", + "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", + "dev": true + }, + "postcss-discard-empty": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", + "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", + "dev": true + }, + "postcss-discard-overridden": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", + "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", + "dev": true + }, + "postcss-merge-longhand": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.4.tgz", + "integrity": "sha512-hbqRRqYfmXoGpzYKeW0/NCZhvNyQIlQeWVSao5iKWdyx7skLvCfQFGIUsP9NUs3dSbPac2IC4Go85/zG+7MlmA==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^5.1.0" + } + }, + "postcss-merge-rules": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.1.tgz", + "integrity": "sha512-8wv8q2cXjEuCcgpIB1Xx1pIy8/rhMPIQqYKNzEdyx37m6gpq83mQQdCxgIkFgliyEnKvdwJf/C61vN4tQDq4Ww==", + "dev": true, + "requires": { + "browserslist": "^4.16.6", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^3.1.0", + "postcss-selector-parser": "^6.0.5" + } + }, + "postcss-minify-font-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", + "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-minify-gradients": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", + "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", + "dev": true, + "requires": { + "colord": "^2.9.1", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-minify-params": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.2.tgz", + "integrity": "sha512-aEP+p71S/urY48HWaRHasyx4WHQJyOYaKpQ6eXl8k0kxg66Wt/30VR6/woh8THgcpRbonJD5IeD+CzNhPi1L8g==", + "dev": true, + "requires": { + "browserslist": "^4.16.6", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-minify-selectors": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.0.tgz", + "integrity": "sha512-vYxvHkW+iULstA+ctVNx0VoRAR4THQQRkG77o0oa4/mBS0OzGvvzLIvHDv/nNEM0crzN2WIyFU5X7wZhaUK3RA==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.5" + } + }, + "postcss-normalize-charset": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", + "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", + "dev": true + }, + "postcss-normalize-display-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", + "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-positions": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.0.tgz", + "integrity": "sha512-8gmItgA4H5xiUxgN/3TVvXRoJxkAWLW6f/KKhdsH03atg0cB8ilXnrB5PpSshwVu/dD2ZsRFQcR1OEmSBDAgcQ==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-repeat-style": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.0.tgz", + "integrity": "sha512-IR3uBjc+7mcWGL6CtniKNQ4Rr5fTxwkaDHwMBDGGs1x9IVRkYIT/M4NelZWkAOBdV6v3Z9S46zqaKGlyzHSchw==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-string": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", + "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-timing-functions": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", + "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-unicode": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz", + "integrity": "sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ==", + "dev": true, + "requires": { + "browserslist": "^4.16.6", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", + "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", + "dev": true, + "requires": { + "normalize-url": "^6.0.1", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-whitespace": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", + "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-ordered-values": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.1.tgz", + "integrity": "sha512-7lxgXF0NaoMIgyihL/2boNAEZKiW0+HkMhdKMTD93CjW8TdCy2hSdj8lsAo+uwm7EDG16Da2Jdmtqpedl0cMfw==", + "dev": true, + "requires": { + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-reduce-initial": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz", + "integrity": "sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw==", + "dev": true, + "requires": { + "browserslist": "^4.16.6", + "caniuse-api": "^3.0.0" + } + }, + "postcss-reduce-transforms": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", + "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-selector-parser": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "postcss-svgo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", + "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0", + "svgo": "^2.7.0" + } + }, + "postcss-unique-selectors": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", + "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.5" + } + }, + "postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "progress": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", + "dev": true + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "requires": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "dependencies": { + "err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "dev": true + } + } + }, + "proper-lockfile": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-1.2.0.tgz", + "integrity": "sha1-zv9d2J0+XxD7deHo52vHWAGlnDQ=", + "dev": true, + "requires": { + "err-code": "^1.0.0", + "extend": "^3.0.0", + "graceful-fs": "^4.1.2", + "retry": "^0.10.0" + } + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true + }, + "pump": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", + "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "qjobs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", + "dev": true + }, + "qs": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.3.tgz", + "integrity": "sha1-HPyyXBCpsrSDBT/zn138kjOQjP4=", + "dev": true + }, + "quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true + }, + "randomatic": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", + "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", + "dev": true, + "requires": { + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" + }, + "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 + } + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "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": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "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.6" + } + }, + "redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "requires": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + } + }, + "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-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "requires": { + "is-equal-shallow": "^0.1.3" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "requires": { + "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.3", + "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.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "dev": true + } + } + }, + "request-progress": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-2.0.1.tgz", + "integrity": "sha1-XTa7V5YcZzqlt4jbyBQf3yO0Tgg=", + "dev": true, + "requires": { + "throttleit": "^1.0.0" + } + }, + "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 + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "dev": true, + "requires": { + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "dependencies": { + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + } + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "resp-modifier": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/resp-modifier/-/resp-modifier-6.0.2.tgz", + "integrity": "sha1-sSTeXE+6/LpUH0j/pzlw9KpFa08=", + "dev": true, + "requires": { + "debug": "^2.2.0", + "minimatch": "^3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "retry": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz", + "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=", + "dev": true + }, + "rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "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.1" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "rollup": { + "version": "0.58.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.58.2.tgz", + "integrity": "sha512-RZVvCWm9BHOYloaE6LLiE/ibpjv1CmI8F8k0B0Cp+q1eezo3cswszJH1DN0djgzSlo0hjuuCmyeI+1XOYLl4wg==", + "dev": true, + "requires": { + "@types/estree": "0.0.38", + "@types/node": "*" + } + }, + "rsvp": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", + "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==", + "dev": true + }, + "rx": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", + "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=", + "dev": true + }, + "rxjs": { + "version": "5.5.12", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", + "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", + "dev": true, + "requires": { + "symbol-observable": "1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sane": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-1.7.0.tgz", + "integrity": "sha1-s1ebzLRclM8gNVzIESSZDf00bjA=", + "dev": true, + "requires": { + "anymatch": "^1.3.0", + "exec-sh": "^0.2.0", + "fb-watchman": "^2.0.0", + "minimatch": "^3.0.2", + "minimist": "^1.1.1", + "walker": "~1.0.5", + "watch": "~0.10.0" + }, + "dependencies": { + "anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "dev": true, + "requires": { + "micromatch": "^2.1.5", + "normalize-path": "^2.0.0" + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "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" + } + }, + "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.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "sass-graph": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-4.0.0.tgz", + "integrity": "sha512-WSO/MfXqKH7/TS8RdkCX3lVkPFQzCgbqdGsmSKq6tlPU+GpGEsa/5aW18JqItnqh+lPtcjifqdZ/VmiILkKckQ==", + "dev": true, + "requires": { + "glob": "^7.0.0", + "lodash": "^4.17.11", + "scss-tokenizer": "^0.3.0", + "yargs": "^17.2.1" + } + }, + "scss-tokenizer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.3.0.tgz", + "integrity": "sha512-14Zl9GcbBvOT9057ZKjpz5yPOyUWG2ojd9D5io28wHRYsOrs7U95Q+KNL87+32p8rc+LvDpbu/i9ZYjM9Q+FsQ==", + "dev": true, + "requires": { + "js-base64": "^2.4.3", + "source-map": "^0.7.1" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" + }, + "dependencies": { + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "dev": true + } + } + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + } + } + }, + "serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", + "send": "0.16.2" + } + }, + "server-destroy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", + "integrity": "sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0=", + "dev": true + }, + "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-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "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" + } + } + } + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "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.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": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "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" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "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" + } + } + } + }, + "socket.io": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.4.1.tgz", + "integrity": "sha512-s04vrBswdQBUmuWJuuNTmXUVJhP0cVky8bBDhdkf8y0Ptsu7fKU2LuLbts9g+pdmAdyMMn8F/9Mf1/wbtUN0fg==", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.3.2", + "engine.io": "~6.1.0", + "socket.io-adapter": "~2.3.3", + "socket.io-parser": "~4.0.4" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "socket.io-parser": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz", + "integrity": "sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==", + "dev": true, + "requires": { + "@types/component-emitter": "^1.2.10", + "component-emitter": "~1.3.0", + "debug": "~4.3.1" + } + } + } + }, + "socket.io-adapter": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.3.3.tgz", + "integrity": "sha512-Qd/iwn3VskrpNO60BeRyCyr8ZWw9CPZyitW4AQwmRZ8zCiyDiL+znRnWX6tDHXnWn1sJrM1+b6Mn6wEDJJ4aYQ==", + "dev": true + }, + "socket.io-client": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.4.1.tgz", + "integrity": "sha512-N5C/L5fLNha5Ojd7Yeb/puKcPWWcoB/A09fEjjNsg91EDVr5twk/OEyO6VT9dlLSUNY85NpW6KBhVMvaLKQ3vQ==", + "dev": true, + "requires": { + "@socket.io/component-emitter": "~3.0.0", + "backo2": "~1.0.2", + "debug": "~4.3.2", + "engine.io-client": "~6.1.1", + "parseuri": "0.0.6", + "socket.io-parser": "~4.1.1" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "socket.io-parser": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.1.2.tgz", + "integrity": "sha512-j3kk71QLJuyQ/hh5F/L2t1goqzdTL0gvDzuhTuNSwihfuFUrcSji0qFZmJJPtG6Rmug153eOPsUizeirf1IIog==", + "dev": true, + "requires": { + "@socket.io/component-emitter": "~3.0.0", + "debug": "~4.3.1" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "socks": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz", + "integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==", + "dev": true, + "requires": { + "ip": "^1.1.5", + "smart-buffer": "^4.2.0" + } + }, + "socks-proxy-agent": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.1.1.tgz", + "integrity": "sha512-t8J0kG3csjA4g6FTbsMOWws+7R7vuRC8aQ/wy3/1OWmsgwA68zs/+cExQ0koSitUDXqhufF/YJr9wtNMZHw5Ew==", + "dev": true, + "requires": { + "agent-base": "^6.0.2", + "debug": "^4.3.1", + "socks": "^2.6.1" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "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.2.10", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.2.10.tgz", + "integrity": "sha1-6lo5AKHByyUJagrozFwrSxDe09w=", + "dev": true, + "requires": { + "source-map": "0.1.32" + }, + "dependencies": { + "source-map": { + "version": "0.1.32", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz", + "integrity": "sha1-yLbBZ3l7pHQKjqMyUhYv8IWRsmY=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "dev": true + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", + "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sshpk": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "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" + } + }, + "ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "dev": true, + "requires": { + "minipass": "^3.1.1" + } + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "dev": true + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "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.0" + } + } + } + }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "dev": true + }, + "stdout-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", + "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", + "dev": true, + "requires": { + "readable-stream": "^2.0.1" + } + }, + "stream-throttle": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/stream-throttle/-/stream-throttle-0.1.3.tgz", + "integrity": "sha1-rdV8jXzHOoFjDTHNVdOWHPr7qcM=", + "dev": true, + "requires": { + "commander": "^2.2.0", + "limiter": "^1.0.5" + } + }, + "streamroller": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.0.6.tgz", + "integrity": "sha512-Qz32plKq/MZywYyhEatxyYc8vs994Gz0Hu2MSYXXLD233UyPeIeRBZARIIGwFer4Mdb8r3Y2UqKkgyDghM6QCg==", + "dev": true, + "requires": { + "date-format": "^4.0.6", + "debug": "^4.3.4", + "fs-extra": "^10.0.1" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "fs-extra": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.1.tgz", + "integrity": "sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + } + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.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" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "requires": { + "min-indent": "^1.0.0" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "stylehacks": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz", + "integrity": "sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q==", + "dev": true, + "requires": { + "browserslist": "^4.16.6", + "postcss-selector-parser": "^6.0.4" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "dev": true, + "requires": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + }, + "dependencies": { + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true + } + } + }, + "symbol-observable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", + "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", + "dev": true + }, + "systemjs": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/systemjs/-/systemjs-0.21.4.tgz", + "integrity": "sha512-l1O8boHjAIY5UG74Xk4B63LK9QbFxv/FkQa//GGGWaTeQoMhTsWnFrYwPWBScSF4xQFMO/+v9QB4i633h8Oytw==", + "dev": true + }, + "systemjs-builder": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/systemjs-builder/-/systemjs-builder-0.16.13.tgz", + "integrity": "sha512-ual5RmcBt7yeXrmpEQIHmITZpNIf289hCTixo/gSOQpdVLLC5v7/W//qn3ZgK6YNdUBptS4szaGVrh7LxOqSHg==", + "dev": true, + "requires": { + "babel-core": "^6.24.1", + "babel-plugin-syntax-dynamic-import": "^6.18.0", + "babel-plugin-transform-amd-system-wrapper": "^0.3.7", + "babel-plugin-transform-cjs-system-wrapper": "^0.6.2", + "babel-plugin-transform-es2015-modules-systemjs": "^6.6.5", + "babel-plugin-transform-global-system-wrapper": "^0.3.4", + "babel-plugin-transform-system-register": "^0.0.1", + "bluebird": "^3.3.4", + "data-uri-to-buffer": "0.0.4", + "es6-template-strings": "^2.0.0", + "glob": "^7.0.3", + "mkdirp": "^0.5.1", + "rollup": "^0.58.2", + "source-map": "^0.5.3", + "systemjs": "^0.19.46", + "traceur": "0.0.105", + "uglify-js": "^2.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "systemjs": { + "version": "0.19.47", + "resolved": "https://registry.npmjs.org/systemjs/-/systemjs-0.19.47.tgz", + "integrity": "sha1-yMk5NxgPP1SBx2nNJyB2P7SjHG8=", + "dev": true, + "requires": { + "when": "^3.7.5" + } + } + } + }, + "tar": { + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "dev": true, + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "dependencies": { + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + } + } + }, + "tar-fs": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.3.tgz", + "integrity": "sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw==", + "dev": true, + "requires": { + "chownr": "^1.0.1", + "mkdirp": "^0.5.1", + "pump": "^1.0.0", + "tar-stream": "^1.1.2" + } + }, + "tar-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", + "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", + "dev": true, + "requires": { + "bl": "^1.0.0", + "buffer-alloc": "^1.2.0", + "end-of-stream": "^1.0.0", + "fs-constants": "^1.0.0", + "readable-stream": "^2.3.0", + "to-buffer": "^1.1.1", + "xtend": "^4.0.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 + }, + "tfunk": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tfunk/-/tfunk-4.0.0.tgz", + "integrity": "sha512-eJQ0dGfDIzWNiFNYFVjJ+Ezl/GmwHaFTBTjrtqNPW0S7cuVDBrZrmzUz6VkMeCR4DZFqhd4YtLwsw3i2wYHswQ==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "dlv": "^1.1.3" + } + }, + "thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "requires": { + "any-promise": "^1.0.0" + } + }, + "thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", + "dev": true, + "requires": { + "thenify": ">= 3.1.0 < 4" + } + }, + "throttleit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", + "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=", + "dev": true + }, + "timers-ext": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", + "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", + "dev": true, + "requires": { + "es5-ext": "~0.10.46", + "next-tick": "1" + } + }, + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "requires": { + "rimraf": "^3.0.0" + } + }, + "tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "to-buffer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", + "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", + "dev": true + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "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": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "traceur": { + "version": "0.0.105", + "resolved": "https://registry.npmjs.org/traceur/-/traceur-0.0.105.tgz", + "integrity": "sha1-XPne6D1rd4YcPWxE1ThZrterBHk=", + "dev": true, + "requires": { + "commander": "2.9.x", + "glob": "5.0.x", + "rsvp": "^3.0.13", + "semver": "^4.3.3", + "source-map-support": "~0.2.8" + }, + "dependencies": { + "commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "dev": true, + "requires": { + "graceful-readlink": ">= 1.0.0" + } + }, + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "semver": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", + "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", + "dev": true + } + } + }, + "trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "dev": true + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "true-case-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", + "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", + "dev": true, + "requires": { + "glob": "^7.1.2" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "dev": true + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "ua-parser-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.2.tgz", + "integrity": "sha512-00y/AXhx0/SsnI51fTc0rLRmafiGOM4/O+ny10Ps7f+j/b8p/ZY11ytMgznXkOVo4GQ+KwQG5UQLkLGirsACRg==", + "dev": true + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "dev": true, + "requires": { + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" + }, + "dependencies": { + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "requires": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "requires": { + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + } + } + } + }, + "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, + "optional": 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 + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "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" + } + }, + "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 + }, + "walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "requires": { + "makeerror": "1.0.12" + } + }, + "watch": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/watch/-/watch-0.10.0.tgz", + "integrity": "sha1-d3mLLaD5kQ1ZXxrOWwwiWFIfIdw=", + "dev": true + }, + "when": { + "version": "3.7.8", + "resolved": "https://registry.npmjs.org/when/-/when-3.7.8.tgz", + "integrity": "sha1-xxMLan6gRpPoQs3J56Hyqjmjn4I=", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "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 + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "ws": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", + "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", + "dev": true + }, + "xmlhttprequest-ssl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", + "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true + }, + "yargs": { + "version": "17.4.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.4.0.tgz", + "integrity": "sha512-WJudfrk81yWFSOkZYpAZx4Nt7V4xp7S/uJkX0CnxovMCt1wCE8LNftPpNuF9X/u9gN5nsD7ycYtRcDf2pL3UiA==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" + }, + "dependencies": { + "yargs-parser": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", + "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==", + "dev": true + } + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true + }, + "yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "dev": true, + "requires": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", + "dev": true + } + } +} diff --git a/package.json b/package.json index 9d8a8dcb..1a228360 100644 --- a/package.json +++ b/package.json @@ -41,24 +41,24 @@ ], "dependencies": {}, "devDependencies": { - "autoprefixer": "^6.5.1", + "autoprefixer": "^10.4.4", "babel-eslint": "^7.1.0", - "browser-sync": "^2.17.5", - "chokidar": "^1.6.1", - "cssnano": "^3.7.7", - "debounce": "^1.0.0", - "eslint": "^3.8.1", + "browser-sync": "^2.27.9", + "chokidar": "^3.5.3", + "cssnano": "^5.1.7", + "debounce": "^1.2.1", + "eslint": "^8.12.0", "fs-promise": "^0.5.0", "interpolate": "^0.1.0", - "jasmine-core": "^2.5.2", + "jasmine-core": "^4.0.1", "jspm": "beta", - "karma": "^1.3.0", - "karma-jasmine": "^1.0.2", - "karma-jspm": "^2.2.0", - "karma-nyan-reporter": "^0.2.4", - "karma-phantomjs-launcher": "^1.0.2", - "node-sass": "^3.10.1", - "postcss": "^5.2.5" + "karma": "^6.3.17", + "karma-jasmine": "^4.0.2", + "karma-jspm": "^2.2.3", + "karma-nyan-reporter": "^0.2.5", + "karma-phantomjs-launcher": "^1.0.4", + "node-sass": "^7.0.1", + "postcss": "^8.4.12" }, "engines": { "node": ">=6.9.0" @@ -80,7 +80,7 @@ "styles-watch": "./tooling/node/styles-watch.js", "server": "./node_modules/.bin/browser-sync start --config 'bs-config.js'", "lint": "./node_modules/.bin/eslint src", - "build": "yarn run lint && yarn run build-styles && yarn run test && yarn run build-umd && yarn run build-esm", + "build": "yarn run build-styles && yarn run build-umd && yarn run build-esm", "build-umd": "./node_modules/.bin/jspm build chartist dist/chartist.umd.js --format umd --global-name Chartist --minify --source-map-contents && ./tooling/node/banner.js dist/chartist.umd.js dist/chartist.umd.js", "build-esm": "./node_modules/.bin/jspm build chartist dist/chartist.esm.js --format esm && ./tooling/node/banner.js dist/chartist.esm.js dist/chartist.esm.js", "build-styles": "./tooling/node/styles.js src/styles/chartist.scss dist" diff --git a/src/core/globals.js b/src/core/globals.js index c365e880..7a86b285 100644 --- a/src/core/globals.js +++ b/src/core/globals.js @@ -1,4 +1,3 @@ -export {version} from 'package.json!version'; /** * This object contains all namespaces used within Chartist. From c892353e2d30cea9c7614da90b39450c87db7137 Mon Sep 17 00:00:00 2001 From: Dan Onoshko Date: Thu, 14 Apr 2022 00:07:23 +0700 Subject: [PATCH 09/44] chore: move to pnpm (#2) --- CONTRIBUTING.md | 6 +- README.md | 8 +- package-lock.json | 8327 --------------------------------------------- package.json | 16 +- pnpm-lock.yaml | 5864 +++++++++++++++++++++++++++++++ yarn.lock | 4605 ------------------------- 6 files changed, 5879 insertions(+), 12947 deletions(-) delete mode 100644 package-lock.json create mode 100644 pnpm-lock.yaml delete mode 100644 yarn.lock diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 8119c5e7..7a85d9a0 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -14,15 +14,15 @@ with a fix. You will need the following to run a local development enviroment. - Node.js & npm -- Yarn (`npm install yarn -g`) +- pnpm (`npm install -g pnpm`) - Text editor of your choice ## How to Run a Local Distribution 1. `cd` into your local copy of the repository. -2. Run `yarn install` to install dependencies located in `package.json`. -5. Run `yarn start` to start the watch task, and the web server should automatically open. Congrats, you should now be able to see your local copy of the Chartist testbed. +2. Run `pnpm i` to install dependencies located in `package.json`. +5. Run `pnpm start` to start the watch task, and the web server should automatically open. Congrats, you should now be able to see your local copy of the Chartist testbed. ## Submission Guidelines diff --git a/README.md b/README.md index fd92fa04..71fac4d3 100644 --- a/README.md +++ b/README.md @@ -5,11 +5,11 @@ Note: This is the readme of chartist 1 and should be rewritten for version 2 whi ## Developer information Version 2 WIP ``` -npm i -npx jspm i -npm run build +pnpm i +pnpm jspm i +pnpm build OR -npm start +pnpm start ``` [![Join the chat at https://gitter.im/gionkunz/chartist-js](https://badges.gitter.im/gionkunz/chartist-js.svg)](https://gitter.im/gionkunz/chartist-js?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index a024ed77..00000000 --- a/package-lock.json +++ /dev/null @@ -1,8327 +0,0 @@ -{ - "name": "chartist", - "version": "1.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "dev": true, - "requires": { - "@babel/highlight": "^7.16.7" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", - "dev": true - }, - "@babel/highlight": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", - "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "dev": true - }, - "@eslint/eslintrc": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.1.tgz", - "integrity": "sha512-bxvbYnBPN1Gibwyp6NrpnFzA3YtRL3BBAyEAFVIpNTm2Rn4Vy87GA5M4aSn3InRrlsbX5N0GW7XIx+U4SAEKdQ==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.3.1", - "globals": "^13.9.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "globals": { - "version": "13.13.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", - "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "@gar/promisify": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", - "dev": true - }, - "@humanwhocodes/config-array": { - "version": "0.9.5", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", - "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "@npmcli/fs": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", - "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", - "dev": true, - "requires": { - "@gar/promisify": "^1.0.1", - "semver": "^7.3.5" - }, - "dependencies": { - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "@npmcli/move-file": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", - "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", - "dev": true, - "requires": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "dependencies": { - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - } - } - }, - "@socket.io/base64-arraybuffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@socket.io/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", - "integrity": "sha512-dOlCBKnDw4iShaIsH/bxujKTM18+2TOAsYz+KSc11Am38H4q5Xw8Bbz97ZYdrVNM+um3p7w86Bvvmcn9q+5+eQ==", - "dev": true - }, - "@socket.io/component-emitter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.0.0.tgz", - "integrity": "sha512-2pTGuibAXJswAPJjaKisthqS/NOK5ypG4LYT6tEAV0S/mxW0zOIvYvGK0V8w8+SHxAm6vRMSjqSalFXeBAqs+Q==", - "dev": true - }, - "@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true - }, - "@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "dev": true - }, - "@types/component-emitter": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.11.tgz", - "integrity": "sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ==", - "dev": true - }, - "@types/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", - "dev": true - }, - "@types/cors": { - "version": "2.8.12", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", - "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==", - "dev": true - }, - "@types/estree": { - "version": "0.0.38", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.38.tgz", - "integrity": "sha512-F/v7t1LwS4vnXuPooJQGBRKRGIoxWUTmA4VHfqjOccFsNDThD5bfUNpITive6s352O7o384wcpEaDV8rHCehDA==", - "dev": true - }, - "@types/minimist": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", - "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", - "dev": true - }, - "@types/node": { - "version": "17.0.23", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", - "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==", - "dev": true - }, - "@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", - "dev": true - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "requires": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - } - }, - "acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", - "dev": true - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "requires": { - "debug": "4" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "agentkeepalive": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz", - "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "depd": "^1.1.2", - "humanize-ms": "^1.2.1" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "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.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.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" - } - } - } - }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", - "dev": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=", - "dev": true - }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "dev": true - }, - "are-we-there-yet": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.0.tgz", - "integrity": "sha512-0GWpv50YSOcLXaN6/FAKY3vfRbllXWV2xvfA/oKJF8pzFhWXPV+yjhJXDBbjscDYowv7Yw1A3uigpzn5iEGTyw==", - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "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-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", - "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", - "dev": true - }, - "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 - }, - "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 - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "async-each-series": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/async-each-series/-/async-each-series-0.1.1.tgz", - "integrity": "sha1-dhfBkXQB/Yykooqtzj266Yr+tDI=", - "dev": true - }, - "async-foreach": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", - "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, - "autoprefixer": { - "version": "10.4.4", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.4.tgz", - "integrity": "sha512-Tm8JxsB286VweiZ5F0anmbyGiNI3v3wGv3mz9W+cxEDYB/6jbnj6GM9H9mK3wIL8ftgl+C07Lcwb8PG5PCCPzA==", - "dev": true, - "requires": { - "browserslist": "^4.20.2", - "caniuse-lite": "^1.0.30001317", - "fraction.js": "^4.2.0", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - } - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", - "dev": true - }, - "axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", - "dev": true, - "requires": { - "follow-redirects": "^1.14.0" - } - }, - "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": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - } - }, - "babel-core": { - "version": "6.26.3", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", - "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", - "dev": true, - "requires": { - "babel-code-frame": "^6.26.0", - "babel-generator": "^6.26.0", - "babel-helpers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-register": "^6.26.0", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "convert-source-map": "^1.5.1", - "debug": "^2.6.9", - "json5": "^0.5.1", - "lodash": "^4.17.4", - "minimatch": "^3.0.4", - "path-is-absolute": "^1.0.1", - "private": "^0.1.8", - "slash": "^1.0.0", - "source-map": "^0.5.7" - }, - "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 - } - } - }, - "babel-eslint": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-7.1.0.tgz", - "integrity": "sha1-1QalF0uiJOJaLRfhKOK6iYcTndw=", - "dev": true, - "requires": { - "babel-traverse": "^6.15.0", - "babel-types": "^6.15.0", - "babylon": "^6.11.2", - "lodash.pickby": "^4.6.0" - } - }, - "babel-generator": { - "version": "6.26.1", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", - "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", - "dev": true, - "requires": { - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "detect-indent": "^4.0.0", - "jsesc": "^1.3.0", - "lodash": "^4.17.4", - "source-map": "^0.5.7", - "trim-right": "^1.0.1" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "babel-helper-hoist-variables": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", - "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helpers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", - "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-syntax-dynamic-import": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", - "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=", - "dev": true - }, - "babel-plugin-transform-amd-system-wrapper": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-amd-system-wrapper/-/babel-plugin-transform-amd-system-wrapper-0.3.7.tgz", - "integrity": "sha1-Uhx4LTVkRJHJeepoPopeHK/wukI=", - "dev": true, - "requires": { - "babel-template": "^6.9.0" - } - }, - "babel-plugin-transform-cjs-system-wrapper": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-cjs-system-wrapper/-/babel-plugin-transform-cjs-system-wrapper-0.6.2.tgz", - "integrity": "sha1-vXSUd1KJQk/0k7btRV3klb1xuh0=", - "dev": true, - "requires": { - "babel-template": "^6.9.0" - } - }, - "babel-plugin-transform-es2015-modules-systemjs": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", - "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", - "dev": true, - "requires": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-global-system-wrapper": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-global-system-wrapper/-/babel-plugin-transform-global-system-wrapper-0.3.4.tgz", - "integrity": "sha1-lI3X0p/CFEfjm9NEfy3rx/L3Oqw=", - "dev": true, - "requires": { - "babel-template": "^6.9.0" - } - }, - "babel-plugin-transform-system-register": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-system-register/-/babel-plugin-transform-system-register-0.0.1.tgz", - "integrity": "sha1-nf9AOQwnY6xRjwsq18XqT2WlviU=", - "dev": true - }, - "babel-register": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", - "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", - "dev": true, - "requires": { - "babel-core": "^6.26.0", - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "home-or-tmp": "^2.0.0", - "lodash": "^4.17.4", - "mkdirp": "^0.5.1", - "source-map-support": "^0.4.15" - }, - "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-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "dev": true, - "requires": { - "source-map": "^0.5.6" - } - } - } - }, - "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": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, - "babel-template": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "lodash": "^4.17.4" - } - }, - "babel-traverse": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", - "dev": true, - "requires": { - "babel-code-frame": "^6.26.0", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "debug": "^2.6.8", - "globals": "^9.18.0", - "invariant": "^2.2.2", - "lodash": "^4.17.4" - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - } - }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "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.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "base64id": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", - "dev": true - }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "bl": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", - "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", - "dev": true, - "requires": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - } - }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "body-parser": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", - "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", - "dev": true, - "requires": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.10.3", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "dependencies": { - "destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true - }, - "on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "qs": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", - "dev": true, - "requires": { - "side-channel": "^1.0.4" - } - } - } - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "browser-sync": { - "version": "2.27.9", - "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.27.9.tgz", - "integrity": "sha512-3zBtggcaZIeU9so4ja9yxk7/CZu9B3DOL6zkxFpzHCHsQmkGBPVXg61jItbeoa+WXgNLnr1sYES/2yQwyEZ2+w==", - "dev": true, - "requires": { - "browser-sync-client": "^2.27.9", - "browser-sync-ui": "^2.27.9", - "bs-recipes": "1.3.4", - "bs-snippet-injector": "^2.0.1", - "chokidar": "^3.5.1", - "connect": "3.6.6", - "connect-history-api-fallback": "^1", - "dev-ip": "^1.0.1", - "easy-extender": "^2.3.4", - "eazy-logger": "3.1.0", - "etag": "^1.8.1", - "fresh": "^0.5.2", - "fs-extra": "3.0.1", - "http-proxy": "^1.18.1", - "immutable": "^3", - "localtunnel": "^2.0.1", - "micromatch": "^4.0.2", - "opn": "5.3.0", - "portscanner": "2.1.1", - "qs": "6.2.3", - "raw-body": "^2.3.2", - "resp-modifier": "6.0.2", - "rx": "4.1.0", - "send": "0.16.2", - "serve-index": "1.9.1", - "serve-static": "1.13.2", - "server-destroy": "1.0.1", - "socket.io": "^4.4.1", - "ua-parser-js": "1.0.2", - "yargs": "^17.3.1" - } - }, - "browser-sync-client": { - "version": "2.27.9", - "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.27.9.tgz", - "integrity": "sha512-FHW8kydp7FXo6jnX3gXJCpHAHtWNLK0nx839nnK+boMfMI1n4KZd0+DmTxHBsHsF3OHud4V4jwoN8U5HExMIdQ==", - "dev": true, - "requires": { - "etag": "1.8.1", - "fresh": "0.5.2", - "mitt": "^1.1.3", - "rxjs": "^5.5.6" - } - }, - "browser-sync-ui": { - "version": "2.27.9", - "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-2.27.9.tgz", - "integrity": "sha512-rsduR2bRIwFvM8CX6iY/Nu5aWub0WB9zfSYg9Le/RV5N5DEyxJYey0VxdfWCnzDOoelassTDzYQo+r0iJno3qw==", - "dev": true, - "requires": { - "async-each-series": "0.1.1", - "connect-history-api-fallback": "^1", - "immutable": "^3", - "server-destroy": "1.0.1", - "socket.io-client": "^4.4.1", - "stream-throttle": "^0.1.3" - } - }, - "browserslist": { - "version": "4.20.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", - "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001317", - "electron-to-chromium": "^1.4.84", - "escalade": "^3.1.1", - "node-releases": "^2.0.2", - "picocolors": "^1.0.0" - } - }, - "bs-recipes": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/bs-recipes/-/bs-recipes-1.3.4.tgz", - "integrity": "sha1-DS1NSKcYyMBEdp/cT4lZLci2lYU=", - "dev": true - }, - "bs-snippet-injector": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/bs-snippet-injector/-/bs-snippet-injector-2.0.1.tgz", - "integrity": "sha1-YbU5PxH1JVntEgaTEANDtu2wTdU=", - "dev": true - }, - "bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "requires": { - "node-int64": "^0.4.0" - } - }, - "buffer-alloc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", - "dev": true, - "requires": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" - } - }, - "buffer-alloc-unsafe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", - "dev": true - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "dev": true - }, - "buffer-fill": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", - "dev": true - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "buffer-peek-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-peek-stream/-/buffer-peek-stream-1.1.0.tgz", - "integrity": "sha512-b3MXlJ52rPOL5xCAQsiCOy/tY9WXOP/hwATporJriUDxnT3MjJgVppDzTFegpg2Nw7NMS28MKC6IKvaXLnGr+Q==", - "dev": true - }, - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true - }, - "cacache": { - "version": "15.3.0", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", - "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", - "dev": true, - "requires": { - "@npmcli/fs": "^1.0.0", - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" - }, - "dependencies": { - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - } - } - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true - }, - "camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - } - } - }, - "caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "caniuse-lite": { - "version": "1.0.30001325", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001325.tgz", - "integrity": "sha512-sB1bZHjseSjDtijV1Hb7PB2Zd58Kyx+n/9EotvZ4Qcz2K3d0lWB8dB4nb8wN/TsOGFq3UuAm0zQZNQ4SoR7TrQ==", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "dev": true, - "requires": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" - } - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "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" - } - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "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": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.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": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, - "cli-color": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-0.3.3.tgz", - "integrity": "sha1-EtW90Vj/igsNtAEZiRPAPfBp9vU=", - "dev": true, - "requires": { - "d": "~0.1.1", - "es5-ext": "~0.10.6", - "memoizee": "~0.3.8", - "timers-ext": "0.1" - }, - "dependencies": { - "d": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/d/-/d-0.1.1.tgz", - "integrity": "sha1-2hhMU10Y2O57oqoim5FACfrhEwk=", - "dev": true, - "requires": { - "es5-ext": "~0.10.2" - } - } - } - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true - }, - "colord": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.2.tgz", - "integrity": "sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ==", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "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": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "connect": { - "version": "3.6.6", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", - "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=", - "dev": true, - "requires": { - "debug": "2.6.9", - "finalhandler": "1.1.0", - "parseurl": "~1.3.2", - "utils-merge": "1.0.1" - } - }, - "connect-history-api-fallback": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true - }, - "convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, - "cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", - "dev": true - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "core-js": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "dev": true, - "requires": { - "object-assign": "^4", - "vary": "^1" - } - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "css-declaration-sorter": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.2.2.tgz", - "integrity": "sha512-Ufadglr88ZLsrvS11gjeu/40Lw74D9Am/Jpr3LlYm5Q4ZP5KdlUhG+6u2EjyXeZcxmZ2h1ebCKngDjolpeLHpg==", - "dev": true - }, - "css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - } - }, - "css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "dev": true, - "requires": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - } - }, - "css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "dev": true - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true - }, - "cssnano": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.7.tgz", - "integrity": "sha512-pVsUV6LcTXif7lvKKW9ZrmX+rGRzxkEdJuVJcp5ftUjWITgwam5LMZOgaTvUrWPkcORBey6he7JKb4XAJvrpKg==", - "dev": true, - "requires": { - "cssnano-preset-default": "^5.2.7", - "lilconfig": "^2.0.3", - "yaml": "^1.10.2" - } - }, - "cssnano-preset-default": { - "version": "5.2.7", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.7.tgz", - "integrity": "sha512-JiKP38ymZQK+zVKevphPzNSGHSlTI+AOwlasoSRtSVMUU285O7/6uZyd5NbW92ZHp41m0sSHe6JoZosakj63uA==", - "dev": true, - "requires": { - "css-declaration-sorter": "^6.2.2", - "cssnano-utils": "^3.1.0", - "postcss-calc": "^8.2.3", - "postcss-colormin": "^5.3.0", - "postcss-convert-values": "^5.1.0", - "postcss-discard-comments": "^5.1.1", - "postcss-discard-duplicates": "^5.1.0", - "postcss-discard-empty": "^5.1.1", - "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.4", - "postcss-merge-rules": "^5.1.1", - "postcss-minify-font-values": "^5.1.0", - "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.2", - "postcss-minify-selectors": "^5.2.0", - "postcss-normalize-charset": "^5.1.0", - "postcss-normalize-display-values": "^5.1.0", - "postcss-normalize-positions": "^5.1.0", - "postcss-normalize-repeat-style": "^5.1.0", - "postcss-normalize-string": "^5.1.0", - "postcss-normalize-timing-functions": "^5.1.0", - "postcss-normalize-unicode": "^5.1.0", - "postcss-normalize-url": "^5.1.0", - "postcss-normalize-whitespace": "^5.1.1", - "postcss-ordered-values": "^5.1.1", - "postcss-reduce-initial": "^5.1.0", - "postcss-reduce-transforms": "^5.1.0", - "postcss-svgo": "^5.1.0", - "postcss-unique-selectors": "^5.1.1" - } - }, - "cssnano-utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", - "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", - "dev": true - }, - "csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", - "dev": true, - "requires": { - "css-tree": "^1.1.2" - } - }, - "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.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "dev": true, - "requires": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "data-uri-to-buffer": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-0.0.4.tgz", - "integrity": "sha1-RuE6udqOMJdFyNAc5UchPr2y/j8=", - "dev": true - }, - "date-format": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.6.tgz", - "integrity": "sha512-B9vvg5rHuQ8cbUXE/RMWMyX2YA5TecT3jKF5fLtGNlzPlU7zblSPmAm2OImDbWL+LDOQ6pUm+4LOFz+ywS41Zw==", - "dev": true - }, - "debounce": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", - "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", - "dev": true - }, - "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 - }, - "decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", - "dev": true, - "requires": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - } - } - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "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, - "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" - } - } - } - }, - "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 - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "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=", - "dev": true - }, - "detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", - "dev": true, - "requires": { - "repeating": "^2.0.0" - } - }, - "dev-ip": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dev-ip/-/dev-ip-1.0.1.tgz", - "integrity": "sha1-p2o+0YVb56ASu4rBbLgPPADcKPA=", - "dev": true - }, - "di": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", - "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", - "dev": true - }, - "dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "dom-serialize": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", - "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", - "dev": true, - "requires": { - "custom-event": "~1.0.0", - "ent": "~2.2.0", - "extend": "^3.0.0", - "void-elements": "^2.0.0" - } - }, - "dom-serializer": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", - "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - } - }, - "domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", - "dev": true - }, - "domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dev": true, - "requires": { - "domelementtype": "^2.2.0" - } - }, - "domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dev": true, - "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - } - }, - "easy-extender": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/easy-extender/-/easy-extender-2.3.4.tgz", - "integrity": "sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q==", - "dev": true, - "requires": { - "lodash": "^4.17.10" - } - }, - "eazy-logger": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eazy-logger/-/eazy-logger-3.1.0.tgz", - "integrity": "sha512-/snsn2JqBtUSSstEl4R0RKjkisGHAhvYj89i7r3ytNUKW12y178KDZwXLXIgwDqLW6E/VRMT9qfld7wvFae8bQ==", - "dev": true, - "requires": { - "tfunk": "^4.0.0" - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "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.4.104", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.104.tgz", - "integrity": "sha512-2kjoAyiG7uMyGRM9mx25s3HAzmQG2ayuYXxsFmYugHSDcwxREgLtscZvbL1JcW9S/OemeQ3f/SG6JhDwpnCclQ==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true - }, - "encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, - "optional": true, - "requires": { - "iconv-lite": "^0.6.2" - }, - "dependencies": { - "iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - } - } - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "engine.io": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.1.3.tgz", - "integrity": "sha512-rqs60YwkvWTLLnfazqgZqLa/aKo+9cueVfEi/dZ8PyGyaf8TLOxj++4QMIgeG3Gn0AhrWiFXvghsoY9L9h25GA==", - "dev": true, - "requires": { - "@types/cookie": "^0.4.1", - "@types/cors": "^2.8.12", - "@types/node": ">=10.0.0", - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "~0.4.1", - "cors": "~2.8.5", - "debug": "~4.3.1", - "engine.io-parser": "~5.0.3", - "ws": "~8.2.3" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "engine.io-client": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.1.1.tgz", - "integrity": "sha512-V05mmDo4gjimYW+FGujoGmmmxRaDsrVr7AXA3ZIfa04MWM1jOfZfUwou0oNqhNwy/votUDvGDt4JA4QF4e0b4g==", - "dev": true, - "requires": { - "@socket.io/component-emitter": "~3.0.0", - "debug": "~4.3.1", - "engine.io-parser": "~5.0.0", - "has-cors": "1.1.0", - "parseqs": "0.0.6", - "parseuri": "0.0.6", - "ws": "~8.2.3", - "xmlhttprequest-ssl": "~2.0.0", - "yeast": "0.1.2" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "engine.io-parser": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.3.tgz", - "integrity": "sha512-BtQxwF27XUNnSafQLvDi0dQ8s3i6VgzSoQMJacpIcGNrlUdfHSKbgm3jmjCVvQluGzqwujQMPAoMai3oYSTurg==", - "dev": true, - "requires": { - "@socket.io/base64-arraybuffer": "~1.0.2" - } - }, - "ent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", - "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", - "dev": true - }, - "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true - }, - "env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true - }, - "err-code": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz", - "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=", - "dev": true - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es5-ext": { - "version": "0.10.59", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.59.tgz", - "integrity": "sha512-cOgyhW0tIJyQY1Kfw6Kr0viu9ZlUctVchRMZ7R0HiH3dxTSp5zJDLecwxUqPUrGKMsgBI1wd1FL+d9Jxfi4cLw==", - "dev": true, - "requires": { - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.3", - "next-tick": "^1.1.0" - } - }, - "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": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", - "dev": true - }, - "es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "dev": true, - "requires": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, - "es6-template-strings": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es6-template-strings/-/es6-template-strings-2.0.1.tgz", - "integrity": "sha1-sWbGpiVi9Hi7d3X2ypYQOlmbSyw=", - "dev": true, - "requires": { - "es5-ext": "^0.10.12", - "esniff": "^1.1" - } - }, - "es6-weak-map": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-0.1.4.tgz", - "integrity": "sha1-cGzvnpmqI2undmwjnIueKG6n0ig=", - "dev": true, - "requires": { - "d": "~0.1.1", - "es5-ext": "~0.10.6", - "es6-iterator": "~0.1.3", - "es6-symbol": "~2.0.1" - }, - "dependencies": { - "d": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/d/-/d-0.1.1.tgz", - "integrity": "sha1-2hhMU10Y2O57oqoim5FACfrhEwk=", - "dev": true, - "requires": { - "es5-ext": "~0.10.2" - } - }, - "es6-iterator": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-0.1.3.tgz", - "integrity": "sha1-1vWLjE/EE8JJtLqhl2j45NfIlE4=", - "dev": true, - "requires": { - "d": "~0.1.1", - "es5-ext": "~0.10.5", - "es6-symbol": "~2.0.1" - } - }, - "es6-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-2.0.1.tgz", - "integrity": "sha1-dhtcZ8/U8dGK+yNPaR1nhoLLO/M=", - "dev": true, - "requires": { - "d": "~0.1.1", - "es5-ext": "~0.10.5" - } - } - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "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 - }, - "eslint": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.12.0.tgz", - "integrity": "sha512-it1oBL9alZg1S8UycLm5YDMAkIhtH6FtAzuZs6YvoGVldWjbS08BkAdb/ymP9LlAyq8koANu32U7Ib/w+UNh8Q==", - "dev": true, - "requires": { - "@eslint/eslintrc": "^1.2.1", - "@humanwhocodes/config-array": "^0.9.2", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.1", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.6.0", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "globals": { - "version": "13.13.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", - "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - } - } - }, - "eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true - }, - "esniff": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/esniff/-/esniff-1.1.0.tgz", - "integrity": "sha1-xmhJIp+RRk3t4uDUAgHtar9l8qw=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.12" - } - }, - "espree": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz", - "integrity": "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==", - "dev": true, - "requires": { - "acorn": "^8.7.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^3.3.0" - } - }, - "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "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-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, - "exec-sh": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.2.tgz", - "integrity": "sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw==", - "dev": true, - "requires": { - "merge": "^1.2.0" - } - }, - "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": { - "is-descriptor": "^0.1.0" - } - }, - "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" - } - } - } - }, - "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=", - "dev": true, - "requires": { - "fill-range": "^2.1.0" - }, - "dependencies": { - "fill-range": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", - "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", - "dev": true, - "requires": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^3.0.0", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" - } - }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "expand-tilde": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz", - "integrity": "sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=", - "dev": true, - "requires": { - "os-homedir": "^1.0.1" - } - }, - "ext": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.6.0.tgz", - "integrity": "sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==", - "dev": true, - "requires": { - "type": "^2.5.0" - }, - "dependencies": { - "type": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.6.0.tgz", - "integrity": "sha512-eiDBDOmkih5pMbo9OqsqPRGMljLodLcwd5XD5JbtNB0o89xZAwynY9EdCDsJU7LtcVCClu9DvM7/0Ep1hYX3EQ==", - "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": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "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" - } - }, - "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" - } - } - } - }, - "extract-zip": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", - "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", - "dev": true, - "requires": { - "concat-stream": "^1.6.2", - "debug": "^2.6.9", - "mkdirp": "^0.5.4", - "yauzl": "^2.10.0" - } - }, - "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": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "fb-watchman": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", - "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", - "dev": true, - "requires": { - "bser": "2.1.1" - } - }, - "fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", - "dev": true, - "requires": { - "pend": "~1.2.0" - } - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "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" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "findup-sync": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", - "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", - "dev": true, - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^3.1.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - }, - "dependencies": { - "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": { - "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" - } - } - } - }, - "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" - } - } - } - }, - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "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" - } - } - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } - } - }, - "fined": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", - "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "is-plain-object": "^2.0.3", - "object.defaults": "^1.1.0", - "object.pick": "^1.2.0", - "parse-filepath": "^1.0.1" - }, - "dependencies": { - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - } - } - }, - "flagged-respawn": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", - "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", - "dev": true - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", - "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", - "dev": true - }, - "follow-redirects": { - "version": "1.14.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", - "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==", - "dev": true - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "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.1" - } - }, - "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.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "fraction.js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", - "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", - "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 - }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true - }, - "fs-extra": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", - "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^3.0.0", - "universalify": "^0.1.0" - } - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "fs-promise": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/fs-promise/-/fs-promise-0.5.0.tgz", - "integrity": "sha1-Q0fWv2JGVacGGkMZITw5MnatPvM=", - "dev": true, - "requires": { - "any-promise": "^1.0.0", - "fs-extra": "^0.26.5", - "mz": "^2.3.1", - "thenify-all": "^1.6.0" - }, - "dependencies": { - "fs-extra": { - "version": "0.26.7", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.26.7.tgz", - "integrity": "sha1-muH92UiXeY7at20JGM9C0MMYT6k=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" - } - }, - "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.6" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "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": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "gauge": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", - "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", - "dev": true, - "requires": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "gaze": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", - "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", - "dev": true, - "requires": { - "globule": "^1.0.0" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - } - }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "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-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "requires": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" - }, - "dependencies": { - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "requires": { - "is-glob": "^2.0.0" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - } - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.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.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - } - }, - "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.1", - "which": "^1.2.14" - }, - "dependencies": { - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", - "dev": true - }, - "globule": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.3.tgz", - "integrity": "sha512-mb1aYtDbIjTu4ShMB85m3UzjX9BVKe9WCzsnfMSZk+K5GpIbBOexgg4PPCt5eHDEG5/ZQAUX2Kct02zfiPLsKg==", - "dev": true, - "requires": { - "glob": "~7.1.1", - "lodash": "~4.17.10", - "minimatch": "~3.0.2" - }, - "dependencies": { - "glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "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" - } - }, - "minimatch": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", - "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "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 - }, - "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.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "dev": true, - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - } - }, - "hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true - }, - "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": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "has-cors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "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" - } - } - } - }, - "hasha": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-2.2.0.tgz", - "integrity": "sha1-eNfL/B5tZjA/55g3NlmEUXsvbuE=", - "dev": true, - "requires": { - "is-stream": "^1.0.1", - "pinkie-promise": "^2.0.0" - } - }, - "home-or-tmp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.1" - } - }, - "homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "dev": true, - "requires": { - "parse-passwd": "^1.0.0" - } - }, - "hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", - "dev": true - }, - "http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "dependencies": { - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true - } - } - }, - "http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, - "requires": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - } - }, - "http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", - "dev": true, - "requires": { - "ms": "^2.0.0" - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true - }, - "immutable": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", - "integrity": "sha1-wkOZUUVbs5kT2vKBN28VMOEErfM=", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "interpolate": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/interpolate/-/interpolate-0.1.0.tgz", - "integrity": "sha1-tgF3pLqUH7NyTIIZBdmareE9Hfk=", - "dev": true - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dev": true, - "requires": { - "loose-envify": "^1.0.0" - } - }, - "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.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.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-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-core-module": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", - "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "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.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "is-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", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-finite": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", - "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-number-like": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz", - "integrity": "sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==", - "dev": true, - "requires": { - "lodash.isfinite": "^3.3.2" - } - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-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-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==", - "dev": true, - "requires": { - "is-unc-path": "^1.0.0" - } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "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-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "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", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isbinaryfile": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", - "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "jasmine-core": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.0.1.tgz", - "integrity": "sha512-w+JDABxQCkxbGGxg+a2hUVZyqUS2JKngvIyLGu/xiw2ZwgsoSB0iiecLQsQORSeaKQ6iGrCyWG86RfNDuoA7Lg==", - "dev": true - }, - "js-base64": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", - "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==", - "dev": true - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, - "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", - "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "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 - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "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 - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true - }, - "jsonfile": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", - "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "jspm": { - "version": "0.17.0-beta.49", - "resolved": "https://registry.npmjs.org/jspm/-/jspm-0.17.0-beta.49.tgz", - "integrity": "sha512-66Kr63r7VqpwSrmCzpFn0FAwmWH2AmwIkU6Y8rB0ET16zoJo73wxoDfBNPtgT1ONOG7l5gvoUqmT3K4rHtX2Xg==", - "dev": true, - "requires": { - "bluebird": "^3.0.5", - "chalk": "^1.1.1", - "core-js": "^1.2.6", - "glob": "^6.0.1", - "graceful-fs": "^4.1.2", - "jspm-github": "^0.14.11", - "jspm-npm": "^0.30.3", - "jspm-registry": "^0.4.1", - "liftoff": "^2.2.0", - "minimatch": "^3.0.0", - "mkdirp": "~0.5.1", - "ncp": "^2.0.0", - "proper-lockfile": "^1.1.2", - "request": "^2.67.0", - "rimraf": "^2.4.4", - "sane": "^1.3.3", - "semver": "^5.1.0", - "systemjs": "0.21.4", - "systemjs-builder": "0.16.13", - "traceur": "0.0.105", - "uglify-js": "^2.6.1" - }, - "dependencies": { - "core-js": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", - "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=", - "dev": true - }, - "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.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - }, - "dependencies": { - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "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" - } - } - } - } - } - }, - "jspm-github": { - "version": "0.14.14", - "resolved": "https://registry.npmjs.org/jspm-github/-/jspm-github-0.14.14.tgz", - "integrity": "sha512-KqSUVqbyiZAlQ+EPDmRzZ1QUdFs5X8hlvo/bKU9/vyv4MsYcGGD6rOEHzcya0nETinRXQrlCRPfnZt1SzrPotQ==", - "dev": true, - "requires": { - "bluebird": "^3.5.0", - "expand-tilde": "^1.2.0", - "graceful-fs": "^4.1.3", - "mkdirp": "^0.5.1", - "netrc": "^0.1.3", - "request": "^2.74.0", - "rimraf": "^2.6.1", - "semver": "^5.0.1", - "tar-fs": "^1.15.3", - "which": "^1.0.9" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "jspm-npm": { - "version": "0.30.5", - "resolved": "https://registry.npmjs.org/jspm-npm/-/jspm-npm-0.30.5.tgz", - "integrity": "sha512-3ewCGIScE4wXyqRNPg12O/qgs2rrRiLqhD4aJpRySpr+5pyNFIQuBTSbyAwTqAjjBjYEMX1f1KkuUP99Yxz+Xg==", - "dev": true, - "requires": { - "bluebird": "^3.0.5", - "buffer-peek-stream": "^1.0.1", - "graceful-fs": "^4.1.3", - "mkdirp": "^0.5.1", - "readdirp": "^2.0.0", - "request": "^2.58.0", - "semver": "^5.0.1", - "tar-fs": "^1.13.0", - "traceur": "0.0.105", - "which": "^1.1.1" - }, - "dependencies": { - "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": { - "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" - } - } - } - }, - "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" - } - } - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "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" - } - } - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "jspm-registry": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/jspm-registry/-/jspm-registry-0.4.4.tgz", - "integrity": "sha1-1TFmA1qHzc5YXWK6o5dWhUaZbXA=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.3", - "rimraf": "^2.3.2", - "rsvp": "^3.0.18", - "semver": "^4.3.3" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", - "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", - "dev": true - } - } - }, - "jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - } - }, - "karma": { - "version": "6.3.17", - "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.17.tgz", - "integrity": "sha512-2TfjHwrRExC8yHoWlPBULyaLwAFmXmxQrcuFImt/JsAsSZu1uOWTZ1ZsWjqQtWpHLiatJOHL5jFjXSJIgCd01g==", - "dev": true, - "requires": { - "@colors/colors": "1.5.0", - "body-parser": "^1.19.0", - "braces": "^3.0.2", - "chokidar": "^3.5.1", - "connect": "^3.7.0", - "di": "^0.0.1", - "dom-serialize": "^2.2.1", - "glob": "^7.1.7", - "graceful-fs": "^4.2.6", - "http-proxy": "^1.18.1", - "isbinaryfile": "^4.0.8", - "lodash": "^4.17.21", - "log4js": "^6.4.1", - "mime": "^2.5.2", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.5", - "qjobs": "^1.2.0", - "range-parser": "^1.2.1", - "rimraf": "^3.0.2", - "socket.io": "^4.2.0", - "source-map": "^0.6.1", - "tmp": "^0.2.1", - "ua-parser-js": "^0.7.30", - "yargs": "^16.1.1" - }, - "dependencies": { - "connect": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", - "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", - "dev": true, - "requires": { - "debug": "2.6.9", - "finalhandler": "1.1.2", - "parseurl": "~1.3.3", - "utils-merge": "1.0.1" - } - }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - } - }, - "mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "dev": true - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true - }, - "ua-parser-js": { - "version": "0.7.31", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz", - "integrity": "sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==", - "dev": true - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - } - } - }, - "karma-jasmine": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-4.0.2.tgz", - "integrity": "sha512-ggi84RMNQffSDmWSyyt4zxzh2CQGwsxvYYsprgyR1j8ikzIduEdOlcLvXjZGwXG/0j41KUXOWsUCBfbEHPWP9g==", - "dev": true, - "requires": { - "jasmine-core": "^3.6.0" - }, - "dependencies": { - "jasmine-core": { - "version": "3.99.1", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.99.1.tgz", - "integrity": "sha512-Hu1dmuoGcZ7AfyynN3LsfruwMbxMALMka+YtZeGoLuDEySVmVAPaonkNoBRIw/ectu8b9tVQCJNgp4a4knp+tg==", - "dev": true - } - } - }, - "karma-jspm": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/karma-jspm/-/karma-jspm-2.2.3.tgz", - "integrity": "sha1-uxXNDIwJAkgBE9OWICFXBBWdVQM=", - "dev": true, - "requires": { - "glob": "~7.0.5" - }, - "dependencies": { - "glob": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", - "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.2", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } - } - }, - "karma-nyan-reporter": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/karma-nyan-reporter/-/karma-nyan-reporter-0.2.5.tgz", - "integrity": "sha1-qreSXzQWbrzvkwi77hFnn1jdqjE=", - "dev": true, - "requires": { - "cli-color": "^0.3.2" - } - }, - "karma-phantomjs-launcher": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/karma-phantomjs-launcher/-/karma-phantomjs-launcher-1.0.4.tgz", - "integrity": "sha1-0jyjSAG9qYY60xjju0vUBisTrNI=", - "dev": true, - "requires": { - "lodash": "^4.0.1", - "phantomjs-prebuilt": "^2.1.7" - } - }, - "kew": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz", - "integrity": "sha1-edk9LTM2PW/dKXCzNdkUGtWR15s=", - "dev": true - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "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.9" - } - }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "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.0", - "findup-sync": "^2.0.0", - "fined": "^1.0.1", - "flagged-respawn": "^1.0.0", - "is-plain-object": "^2.0.4", - "object.map": "^1.0.0", - "rechoir": "^0.6.2", - "resolve": "^1.1.7" - } - }, - "lilconfig": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz", - "integrity": "sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==", - "dev": true - }, - "limiter": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", - "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==", - "dev": true - }, - "lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "localtunnel": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/localtunnel/-/localtunnel-2.0.2.tgz", - "integrity": "sha512-n418Cn5ynvJd7m/N1d9WVJISLJF/ellZnfsLnx8WBWGzxv/ntNcFkJ1o6se5quUhCplfLGBNL5tYHiq5WF3Nug==", - "dev": true, - "requires": { - "axios": "0.21.4", - "debug": "4.3.2", - "openurl": "1.1.1", - "yargs": "17.1.1" - }, - "dependencies": { - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "yargs": { - "version": "17.1.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.1.1.tgz", - "integrity": "sha512-c2k48R0PwKIqKhPMWjeiF6y2xY/gPMUlro0sgxqXpbOIohWiLNXWslsootttv7E1e73QPAMQSg5FeySbVcpsPQ==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - } - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "lodash.isfinite": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz", - "integrity": "sha1-+4m2WpqAKBgz8LdHizpRBPiY67M=", - "dev": true - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", - "dev": true - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "lodash.pickby": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.pickby/-/lodash.pickby-4.6.0.tgz", - "integrity": "sha1-feoh2MGNdwOifHBMFdO4SmfjOv8=", - "dev": true - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", - "dev": true - }, - "log4js": { - "version": "6.4.4", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.4.4.tgz", - "integrity": "sha512-ncaWPsuw9Vl1CKA406hVnJLGQKy1OHx6buk8J4rE2lVW+NW5Y82G5/DIloO7NkqLOUtNPEANaWC1kZYVjXssPw==", - "dev": true, - "requires": { - "date-format": "^4.0.6", - "debug": "^4.3.4", - "flatted": "^3.2.5", - "rfdc": "^1.3.0", - "streamroller": "^3.0.6" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "lru-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", - "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=", - "dev": true, - "requires": { - "es5-ext": "~0.10.2" - } - }, - "make-fetch-happen": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", - "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", - "dev": true, - "requires": { - "agentkeepalive": "^4.1.3", - "cacache": "^15.2.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^6.0.0", - "minipass": "^3.1.3", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^1.3.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.2", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^6.0.0", - "ssri": "^8.0.0" - } - }, - "make-iterator": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", - "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - } - }, - "makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "requires": { - "tmpl": "1.0.5" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "math-random": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", - "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", - "dev": true - }, - "mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "dev": true - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true - }, - "memoizee": { - "version": "0.3.10", - "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.3.10.tgz", - "integrity": "sha1-TsoNiu057J0Bf0xcLy9kMvQuXI8=", - "dev": true, - "requires": { - "d": "~0.1.1", - "es5-ext": "~0.10.11", - "es6-weak-map": "~0.1.4", - "event-emitter": "~0.3.4", - "lru-queue": "0.1", - "next-tick": "~0.2.2", - "timers-ext": "0.1" - }, - "dependencies": { - "d": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/d/-/d-0.1.1.tgz", - "integrity": "sha1-2hhMU10Y2O57oqoim5FACfrhEwk=", - "dev": true, - "requires": { - "es5-ext": "~0.10.2" - } - }, - "next-tick": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-0.2.2.tgz", - "integrity": "sha1-ddpKkn7liH45BliABltzNkE7MQ0=", - "dev": true - } - } - }, - "meow": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", - "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", - "dev": true, - "requires": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize": "^1.2.0", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - }, - "dependencies": { - "type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true - } - } - }, - "merge": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz", - "integrity": "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", - "dev": true - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "requires": { - "mime-db": "1.52.0" - } - }, - "min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - }, - "minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - } - }, - "minipass": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", - "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-fetch": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", - "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", - "dev": true, - "requires": { - "encoding": "^0.1.12", - "minipass": "^3.1.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.0.0" - } - }, - "minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - } - }, - "mitt": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.2.0.tgz", - "integrity": "sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==", - "dev": true - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "requires": { - "minimist": "^1.2.6" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, - "requires": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "nan": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", - "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", - "dev": true - }, - "nanoid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.2.tgz", - "integrity": "sha512-CuHBogktKwpm5g2sRgv83jEy2ijFzBwMoYA60orPDR7ynsLijJDqgsi4RDGj3OJpy3Ieb+LYwiRmIOGyytgITA==", - "dev": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "ncp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", - "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", - "dev": true - }, - "negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true - }, - "netrc": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/netrc/-/netrc-0.1.4.tgz", - "integrity": "sha1-a+lPysqNd63gqWcNxGCRTJRHJEQ=", - "dev": true - }, - "next-tick": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", - "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", - "dev": true - }, - "node-gyp": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", - "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", - "dev": true, - "requires": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^9.1.0", - "nopt": "^5.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "dependencies": { - "npmlog": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.1.tgz", - "integrity": "sha512-BTHDvY6nrRHuRfyjt1MAufLxYdVXZfd099H4+i1f0lPywNQyI4foeNXJRObB/uy+TYqUW0vAD9gbdSOXPst7Eg==", - "dev": true, - "requires": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.0", - "set-blocking": "^2.0.0" - } - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", - "dev": true - }, - "node-releases": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", - "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==", - "dev": true - }, - "node-sass": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-7.0.1.tgz", - "integrity": "sha512-uMy+Xt29NlqKCFdFRZyXKOTqGt+QaKHexv9STj2WeLottnlqZEEWx6Bj0MXNthmFRRdM/YwyNo/8Tr46TOM0jQ==", - "dev": true, - "requires": { - "async-foreach": "^0.1.3", - "chalk": "^4.1.2", - "cross-spawn": "^7.0.3", - "gaze": "^1.0.0", - "get-stdin": "^4.0.1", - "glob": "^7.0.3", - "lodash": "^4.17.15", - "meow": "^9.0.0", - "nan": "^2.13.2", - "node-gyp": "^8.4.1", - "npmlog": "^5.0.0", - "request": "^2.88.0", - "sass-graph": "4.0.0", - "stdout-stream": "^1.4.0", - "true-case-path": "^1.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "dev": true, - "requires": { - "abbrev": "1" - } - }, - "normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", - "dev": true, - "requires": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "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 - }, - "normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true - }, - "npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "dev": true, - "requires": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - } - }, - "gauge": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", - "dev": true, - "requires": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - } - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "nth-check": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", - "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", - "dev": true, - "requires": { - "boolbase": "^1.0.0" - } - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "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.0" - } - }, - "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" - } - } - } - }, - "object-inspect": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", - "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", - "dev": true - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, - "object.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.0.0", - "for-own": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "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" - } - }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "dev": true, - "requires": { - "for-own": "^0.1.4", - "is-extendable": "^0.1.1" - }, - "dependencies": { - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - } - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "openurl": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/openurl/-/openurl-1.1.1.tgz", - "integrity": "sha1-OHW0sO96UsFW8NtB1GCduw+Us4c=", - "dev": true - }, - "opn": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", - "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", - "dev": true, - "requires": { - "is-wsl": "^1.1.0" - } - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-filepath": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", - "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", - "dev": true, - "requires": { - "is-absolute": "^1.0.0", - "map-cache": "^0.2.0", - "path-root": "^0.1.1" - } - }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, - "requires": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - } - } - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "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 - }, - "parseqs": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", - "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==", - "dev": true - }, - "parseuri": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", - "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==", - "dev": true - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "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.0" - } - }, - "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=", - "dev": true - }, - "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": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "phantomjs-prebuilt": { - "version": "2.1.16", - "resolved": "https://registry.npmjs.org/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.16.tgz", - "integrity": "sha1-79ISpKOWbTZHaE6ouniFSb4q7+8=", - "dev": true, - "requires": { - "es6-promise": "^4.0.3", - "extract-zip": "^1.6.5", - "fs-extra": "^1.0.0", - "hasha": "^2.2.0", - "kew": "^0.7.0", - "progress": "^1.1.8", - "request": "^2.81.0", - "request-progress": "^2.0.1", - "which": "^1.2.10" - }, - "dependencies": { - "fs-extra": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", - "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0" - } - }, - "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.6" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, - "portscanner": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.1.1.tgz", - "integrity": "sha1-6rtAnk3iSVD1oqUW01rnaTQ/u5Y=", - "dev": true, - "requires": { - "async": "1.5.2", - "is-number-like": "^1.0.3" - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "postcss": { - "version": "8.4.12", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.12.tgz", - "integrity": "sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg==", - "dev": true, - "requires": { - "nanoid": "^3.3.1", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - } - }, - "postcss-calc": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", - "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.9", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-colormin": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz", - "integrity": "sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==", - "dev": true, - "requires": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0", - "colord": "^2.9.1", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-convert-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.0.tgz", - "integrity": "sha512-GkyPbZEYJiWtQB0KZ0X6qusqFHUepguBCNFi9t5JJc7I2OTXG7C0twbTLvCfaKOLl3rSXmpAwV7W5txd91V84g==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-discard-comments": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.1.tgz", - "integrity": "sha512-5JscyFmvkUxz/5/+TB3QTTT9Gi9jHkcn8dcmmuN68JQcv3aQg4y88yEHHhwFB52l/NkaJ43O0dbksGMAo49nfQ==", - "dev": true - }, - "postcss-discard-duplicates": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", - "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", - "dev": true - }, - "postcss-discard-empty": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", - "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", - "dev": true - }, - "postcss-discard-overridden": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", - "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", - "dev": true - }, - "postcss-merge-longhand": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.4.tgz", - "integrity": "sha512-hbqRRqYfmXoGpzYKeW0/NCZhvNyQIlQeWVSao5iKWdyx7skLvCfQFGIUsP9NUs3dSbPac2IC4Go85/zG+7MlmA==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.1.0" - } - }, - "postcss-merge-rules": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.1.tgz", - "integrity": "sha512-8wv8q2cXjEuCcgpIB1Xx1pIy8/rhMPIQqYKNzEdyx37m6gpq83mQQdCxgIkFgliyEnKvdwJf/C61vN4tQDq4Ww==", - "dev": true, - "requires": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0", - "cssnano-utils": "^3.1.0", - "postcss-selector-parser": "^6.0.5" - } - }, - "postcss-minify-font-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", - "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-minify-gradients": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", - "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", - "dev": true, - "requires": { - "colord": "^2.9.1", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-minify-params": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.2.tgz", - "integrity": "sha512-aEP+p71S/urY48HWaRHasyx4WHQJyOYaKpQ6eXl8k0kxg66Wt/30VR6/woh8THgcpRbonJD5IeD+CzNhPi1L8g==", - "dev": true, - "requires": { - "browserslist": "^4.16.6", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-minify-selectors": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.0.tgz", - "integrity": "sha512-vYxvHkW+iULstA+ctVNx0VoRAR4THQQRkG77o0oa4/mBS0OzGvvzLIvHDv/nNEM0crzN2WIyFU5X7wZhaUK3RA==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.5" - } - }, - "postcss-normalize-charset": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", - "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", - "dev": true - }, - "postcss-normalize-display-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", - "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-positions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.0.tgz", - "integrity": "sha512-8gmItgA4H5xiUxgN/3TVvXRoJxkAWLW6f/KKhdsH03atg0cB8ilXnrB5PpSshwVu/dD2ZsRFQcR1OEmSBDAgcQ==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-repeat-style": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.0.tgz", - "integrity": "sha512-IR3uBjc+7mcWGL6CtniKNQ4Rr5fTxwkaDHwMBDGGs1x9IVRkYIT/M4NelZWkAOBdV6v3Z9S46zqaKGlyzHSchw==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-string": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", - "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-timing-functions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", - "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-unicode": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz", - "integrity": "sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ==", - "dev": true, - "requires": { - "browserslist": "^4.16.6", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", - "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", - "dev": true, - "requires": { - "normalize-url": "^6.0.1", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-whitespace": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", - "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-ordered-values": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.1.tgz", - "integrity": "sha512-7lxgXF0NaoMIgyihL/2boNAEZKiW0+HkMhdKMTD93CjW8TdCy2hSdj8lsAo+uwm7EDG16Da2Jdmtqpedl0cMfw==", - "dev": true, - "requires": { - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-reduce-initial": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz", - "integrity": "sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw==", - "dev": true, - "requires": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0" - } - }, - "postcss-reduce-transforms": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", - "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-selector-parser": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", - "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - } - }, - "postcss-svgo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", - "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0", - "svgo": "^2.7.0" - } - }, - "postcss-unique-selectors": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", - "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.5" - } - }, - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true - }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "progress": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", - "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", - "dev": true - }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true - }, - "promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", - "dev": true, - "requires": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "dependencies": { - "err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "dev": true - }, - "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", - "dev": true - } - } - }, - "proper-lockfile": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-1.2.0.tgz", - "integrity": "sha1-zv9d2J0+XxD7deHo52vHWAGlnDQ=", - "dev": true, - "requires": { - "err-code": "^1.0.0", - "extend": "^3.0.0", - "graceful-fs": "^4.1.2", - "retry": "^0.10.0" - } - }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", - "dev": true - }, - "pump": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", - "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "qjobs": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", - "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", - "dev": true - }, - "qs": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.3.tgz", - "integrity": "sha1-HPyyXBCpsrSDBT/zn138kjOQjP4=", - "dev": true - }, - "quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "dev": true - }, - "randomatic": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", - "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", - "dev": true, - "requires": { - "is-number": "^4.0.0", - "kind-of": "^6.0.0", - "math-random": "^1.0.1" - }, - "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 - } - } - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true - }, - "raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dev": true, - "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "dependencies": { - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - } - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "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": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "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.6" - } - }, - "redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "requires": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - } - }, - "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-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", - "dev": true, - "requires": { - "is-equal-shallow": "^0.1.3" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "repeat-element": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", - "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "^1.0.0" - } - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "dev": true, - "requires": { - "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.3", - "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.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "dev": true - } - } - }, - "request-progress": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-2.0.1.tgz", - "integrity": "sha1-XTa7V5YcZzqlt4jbyBQf3yO0Tgg=", - "dev": true, - "requires": { - "throttleit": "^1.0.0" - } - }, - "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 - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", - "dev": true - }, - "resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", - "dev": true, - "requires": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - }, - "dependencies": { - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - } - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "resp-modifier": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/resp-modifier/-/resp-modifier-6.0.2.tgz", - "integrity": "sha1-sSTeXE+6/LpUH0j/pzlw9KpFa08=", - "dev": true, - "requires": { - "debug": "^2.2.0", - "minimatch": "^3.0.2" - } - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "retry": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz", - "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=", - "dev": true - }, - "rfdc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", - "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", - "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.1" - } - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "rollup": { - "version": "0.58.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.58.2.tgz", - "integrity": "sha512-RZVvCWm9BHOYloaE6LLiE/ibpjv1CmI8F8k0B0Cp+q1eezo3cswszJH1DN0djgzSlo0hjuuCmyeI+1XOYLl4wg==", - "dev": true, - "requires": { - "@types/estree": "0.0.38", - "@types/node": "*" - } - }, - "rsvp": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", - "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==", - "dev": true - }, - "rx": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", - "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=", - "dev": true - }, - "rxjs": { - "version": "5.5.12", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", - "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", - "dev": true, - "requires": { - "symbol-observable": "1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "sane": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-1.7.0.tgz", - "integrity": "sha1-s1ebzLRclM8gNVzIESSZDf00bjA=", - "dev": true, - "requires": { - "anymatch": "^1.3.0", - "exec-sh": "^0.2.0", - "fb-watchman": "^2.0.0", - "minimatch": "^3.0.2", - "minimist": "^1.1.1", - "walker": "~1.0.5", - "watch": "~0.10.0" - }, - "dependencies": { - "anymatch": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", - "dev": true, - "requires": { - "micromatch": "^2.1.5", - "normalize-path": "^2.0.0" - } - }, - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "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" - } - }, - "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.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "sass-graph": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-4.0.0.tgz", - "integrity": "sha512-WSO/MfXqKH7/TS8RdkCX3lVkPFQzCgbqdGsmSKq6tlPU+GpGEsa/5aW18JqItnqh+lPtcjifqdZ/VmiILkKckQ==", - "dev": true, - "requires": { - "glob": "^7.0.0", - "lodash": "^4.17.11", - "scss-tokenizer": "^0.3.0", - "yargs": "^17.2.1" - } - }, - "scss-tokenizer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.3.0.tgz", - "integrity": "sha512-14Zl9GcbBvOT9057ZKjpz5yPOyUWG2ojd9D5io28wHRYsOrs7U95Q+KNL87+32p8rc+LvDpbu/i9ZYjM9Q+FsQ==", - "dev": true, - "requires": { - "js-base64": "^2.4.3", - "source-map": "^0.7.1" - }, - "dependencies": { - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - } - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "send": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", - "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", - "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.6.2", - "mime": "1.4.1", - "ms": "2.0.0", - "on-finished": "~2.3.0", - "range-parser": "~1.2.0", - "statuses": "~1.4.0" - }, - "dependencies": { - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - }, - "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", - "dev": true - } - } - }, - "serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "dependencies": { - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true - } - } - }, - "serve-static": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", - "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", - "dev": true, - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.2", - "send": "0.16.2" - } - }, - "server-destroy": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", - "integrity": "sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0=", - "dev": true - }, - "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-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "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" - } - } - } - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - }, - "smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "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.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": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "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" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - }, - "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" - } - } - } - }, - "socket.io": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.4.1.tgz", - "integrity": "sha512-s04vrBswdQBUmuWJuuNTmXUVJhP0cVky8bBDhdkf8y0Ptsu7fKU2LuLbts9g+pdmAdyMMn8F/9Mf1/wbtUN0fg==", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "base64id": "~2.0.0", - "debug": "~4.3.2", - "engine.io": "~6.1.0", - "socket.io-adapter": "~2.3.3", - "socket.io-parser": "~4.0.4" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "socket.io-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz", - "integrity": "sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==", - "dev": true, - "requires": { - "@types/component-emitter": "^1.2.10", - "component-emitter": "~1.3.0", - "debug": "~4.3.1" - } - } - } - }, - "socket.io-adapter": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.3.3.tgz", - "integrity": "sha512-Qd/iwn3VskrpNO60BeRyCyr8ZWw9CPZyitW4AQwmRZ8zCiyDiL+znRnWX6tDHXnWn1sJrM1+b6Mn6wEDJJ4aYQ==", - "dev": true - }, - "socket.io-client": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.4.1.tgz", - "integrity": "sha512-N5C/L5fLNha5Ojd7Yeb/puKcPWWcoB/A09fEjjNsg91EDVr5twk/OEyO6VT9dlLSUNY85NpW6KBhVMvaLKQ3vQ==", - "dev": true, - "requires": { - "@socket.io/component-emitter": "~3.0.0", - "backo2": "~1.0.2", - "debug": "~4.3.2", - "engine.io-client": "~6.1.1", - "parseuri": "0.0.6", - "socket.io-parser": "~4.1.1" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "socket.io-parser": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.1.2.tgz", - "integrity": "sha512-j3kk71QLJuyQ/hh5F/L2t1goqzdTL0gvDzuhTuNSwihfuFUrcSji0qFZmJJPtG6Rmug153eOPsUizeirf1IIog==", - "dev": true, - "requires": { - "@socket.io/component-emitter": "~3.0.0", - "debug": "~4.3.1" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "socks": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz", - "integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==", - "dev": true, - "requires": { - "ip": "^1.1.5", - "smart-buffer": "^4.2.0" - } - }, - "socks-proxy-agent": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.1.1.tgz", - "integrity": "sha512-t8J0kG3csjA4g6FTbsMOWws+7R7vuRC8aQ/wy3/1OWmsgwA68zs/+cExQ0koSitUDXqhufF/YJr9wtNMZHw5Ew==", - "dev": true, - "requires": { - "agent-base": "^6.0.2", - "debug": "^4.3.1", - "socks": "^2.6.1" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true - }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "dev": true, - "requires": { - "atob": "^2.1.2", - "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.2.10", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.2.10.tgz", - "integrity": "sha1-6lo5AKHByyUJagrozFwrSxDe09w=", - "dev": true, - "requires": { - "source-map": "0.1.32" - }, - "dependencies": { - "source-map": { - "version": "0.1.32", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz", - "integrity": "sha1-yLbBZ3l7pHQKjqMyUhYv8IWRsmY=", - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - } - } - } - }, - "source-map-url": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", - "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", - "dev": true - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", - "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", - "dev": true - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", - "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" - } - }, - "ssri": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", - "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", - "dev": true, - "requires": { - "minipass": "^3.1.1" - } - }, - "stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "dev": true - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "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.0" - } - } - } - }, - "statuses": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", - "dev": true - }, - "stdout-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", - "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", - "dev": true, - "requires": { - "readable-stream": "^2.0.1" - } - }, - "stream-throttle": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/stream-throttle/-/stream-throttle-0.1.3.tgz", - "integrity": "sha1-rdV8jXzHOoFjDTHNVdOWHPr7qcM=", - "dev": true, - "requires": { - "commander": "^2.2.0", - "limiter": "^1.0.5" - } - }, - "streamroller": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.0.6.tgz", - "integrity": "sha512-Qz32plKq/MZywYyhEatxyYc8vs994Gz0Hu2MSYXXLD233UyPeIeRBZARIIGwFer4Mdb8r3Y2UqKkgyDghM6QCg==", - "dev": true, - "requires": { - "date-format": "^4.0.6", - "debug": "^4.3.4", - "fs-extra": "^10.0.1" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "fs-extra": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.1.tgz", - "integrity": "sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - } - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.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" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "requires": { - "min-indent": "^1.0.0" - } - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "stylehacks": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz", - "integrity": "sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q==", - "dev": true, - "requires": { - "browserslist": "^4.16.6", - "postcss-selector-parser": "^6.0.4" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", - "dev": true, - "requires": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" - }, - "dependencies": { - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true - } - } - }, - "symbol-observable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", - "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", - "dev": true - }, - "systemjs": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/systemjs/-/systemjs-0.21.4.tgz", - "integrity": "sha512-l1O8boHjAIY5UG74Xk4B63LK9QbFxv/FkQa//GGGWaTeQoMhTsWnFrYwPWBScSF4xQFMO/+v9QB4i633h8Oytw==", - "dev": true - }, - "systemjs-builder": { - "version": "0.16.13", - "resolved": "https://registry.npmjs.org/systemjs-builder/-/systemjs-builder-0.16.13.tgz", - "integrity": "sha512-ual5RmcBt7yeXrmpEQIHmITZpNIf289hCTixo/gSOQpdVLLC5v7/W//qn3ZgK6YNdUBptS4szaGVrh7LxOqSHg==", - "dev": true, - "requires": { - "babel-core": "^6.24.1", - "babel-plugin-syntax-dynamic-import": "^6.18.0", - "babel-plugin-transform-amd-system-wrapper": "^0.3.7", - "babel-plugin-transform-cjs-system-wrapper": "^0.6.2", - "babel-plugin-transform-es2015-modules-systemjs": "^6.6.5", - "babel-plugin-transform-global-system-wrapper": "^0.3.4", - "babel-plugin-transform-system-register": "^0.0.1", - "bluebird": "^3.3.4", - "data-uri-to-buffer": "0.0.4", - "es6-template-strings": "^2.0.0", - "glob": "^7.0.3", - "mkdirp": "^0.5.1", - "rollup": "^0.58.2", - "source-map": "^0.5.3", - "systemjs": "^0.19.46", - "traceur": "0.0.105", - "uglify-js": "^2.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "systemjs": { - "version": "0.19.47", - "resolved": "https://registry.npmjs.org/systemjs/-/systemjs-0.19.47.tgz", - "integrity": "sha1-yMk5NxgPP1SBx2nNJyB2P7SjHG8=", - "dev": true, - "requires": { - "when": "^3.7.5" - } - } - } - }, - "tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", - "dev": true, - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "dependencies": { - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - } - } - }, - "tar-fs": { - "version": "1.16.3", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.3.tgz", - "integrity": "sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw==", - "dev": true, - "requires": { - "chownr": "^1.0.1", - "mkdirp": "^0.5.1", - "pump": "^1.0.0", - "tar-stream": "^1.1.2" - } - }, - "tar-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", - "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", - "dev": true, - "requires": { - "bl": "^1.0.0", - "buffer-alloc": "^1.2.0", - "end-of-stream": "^1.0.0", - "fs-constants": "^1.0.0", - "readable-stream": "^2.3.0", - "to-buffer": "^1.1.1", - "xtend": "^4.0.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 - }, - "tfunk": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tfunk/-/tfunk-4.0.0.tgz", - "integrity": "sha512-eJQ0dGfDIzWNiFNYFVjJ+Ezl/GmwHaFTBTjrtqNPW0S7cuVDBrZrmzUz6VkMeCR4DZFqhd4YtLwsw3i2wYHswQ==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "dlv": "^1.1.3" - } - }, - "thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, - "requires": { - "any-promise": "^1.0.0" - } - }, - "thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", - "dev": true, - "requires": { - "thenify": ">= 3.1.0 < 4" - } - }, - "throttleit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", - "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=", - "dev": true - }, - "timers-ext": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", - "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", - "dev": true, - "requires": { - "es5-ext": "~0.10.46", - "next-tick": "1" - } - }, - "tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "dev": true, - "requires": { - "rimraf": "^3.0.0" - } - }, - "tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true - }, - "to-buffer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", - "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", - "dev": true - }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "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": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "traceur": { - "version": "0.0.105", - "resolved": "https://registry.npmjs.org/traceur/-/traceur-0.0.105.tgz", - "integrity": "sha1-XPne6D1rd4YcPWxE1ThZrterBHk=", - "dev": true, - "requires": { - "commander": "2.9.x", - "glob": "5.0.x", - "rsvp": "^3.0.13", - "semver": "^4.3.3", - "source-map-support": "~0.2.8" - }, - "dependencies": { - "commander": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", - "dev": true, - "requires": { - "graceful-readlink": ">= 1.0.0" - } - }, - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "semver": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", - "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", - "dev": true - } - } - }, - "trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", - "dev": true - }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true - }, - "true-case-path": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", - "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", - "dev": true, - "requires": { - "glob": "^7.1.2" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, - "type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", - "dev": true - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "ua-parser-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.2.tgz", - "integrity": "sha512-00y/AXhx0/SsnI51fTc0rLRmafiGOM4/O+ny10Ps7f+j/b8p/ZY11ytMgznXkOVo4GQ+KwQG5UQLkLGirsACRg==", - "dev": true - }, - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", - "dev": true, - "requires": { - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" - }, - "dependencies": { - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "dev": true, - "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "dev": true, - "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" - } - } - } - }, - "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, - "optional": 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 - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - } - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "dev": true - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "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" - } - }, - "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 - }, - "walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "requires": { - "makeerror": "1.0.12" - } - }, - "watch": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/watch/-/watch-0.10.0.tgz", - "integrity": "sha1-d3mLLaD5kQ1ZXxrOWwwiWFIfIdw=", - "dev": true - }, - "when": { - "version": "3.7.8", - "resolved": "https://registry.npmjs.org/when/-/when-3.7.8.tgz", - "integrity": "sha1-xxMLan6gRpPoQs3J56Hyqjmjn4I=", - "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dev": true, - "requires": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "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 - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "ws": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", - "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", - "dev": true - }, - "xmlhttprequest-ssl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", - "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==", - "dev": true - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true - }, - "yargs": { - "version": "17.4.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.4.0.tgz", - "integrity": "sha512-WJudfrk81yWFSOkZYpAZx4Nt7V4xp7S/uJkX0CnxovMCt1wCE8LNftPpNuF9X/u9gN5nsD7ycYtRcDf2pL3UiA==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" - }, - "dependencies": { - "yargs-parser": { - "version": "21.0.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", - "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==", - "dev": true - } - } - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true - }, - "yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", - "dev": true, - "requires": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "yeast": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", - "dev": true - } - } -} diff --git a/package.json b/package.json index 1a228360..1014ffe6 100644 --- a/package.json +++ b/package.json @@ -74,15 +74,15 @@ } }, "scripts": { - "start": "yarn run test-watch & yarn run server & yarn run styles-watch", - "test": "./node_modules/.bin/karma start karma.ci.config.js", - "test-watch": "./node_modules/.bin/karma start karma.watch.config.js", + "start": "pnpm test-watch & pnpm run server & pnpm styles-watch", + "test": "karma start karma.ci.config.js", + "test-watch": "karma start karma.watch.config.js", "styles-watch": "./tooling/node/styles-watch.js", - "server": "./node_modules/.bin/browser-sync start --config 'bs-config.js'", - "lint": "./node_modules/.bin/eslint src", - "build": "yarn run build-styles && yarn run build-umd && yarn run build-esm", - "build-umd": "./node_modules/.bin/jspm build chartist dist/chartist.umd.js --format umd --global-name Chartist --minify --source-map-contents && ./tooling/node/banner.js dist/chartist.umd.js dist/chartist.umd.js", - "build-esm": "./node_modules/.bin/jspm build chartist dist/chartist.esm.js --format esm && ./tooling/node/banner.js dist/chartist.esm.js dist/chartist.esm.js", + "server": "browser-sync start --config 'bs-config.js'", + "lint": "eslint src", + "build": "pnpm build-styles && pnpm build-umd && pnpm build-esm", + "build-umd": "jspm build chartist dist/chartist.umd.js --format umd --global-name Chartist --minify --source-map-contents && ./tooling/node/banner.js dist/chartist.umd.js dist/chartist.umd.js", + "build-esm": "jspm build chartist dist/chartist.esm.js --format esm && ./tooling/node/banner.js dist/chartist.esm.js dist/chartist.esm.js", "build-styles": "./tooling/node/styles.js src/styles/chartist.scss dist" }, "config": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 00000000..8c7f0890 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,5864 @@ +lockfileVersion: 5.3 + +specifiers: + autoprefixer: ^10.4.4 + babel-eslint: ^7.1.0 + browser-sync: ^2.27.9 + chokidar: ^3.5.3 + cssnano: ^5.1.7 + debounce: ^1.2.1 + eslint: ^8.12.0 + fs-promise: ^0.5.0 + interpolate: ^0.1.0 + jasmine-core: ^4.0.1 + jspm: beta + karma: ^6.3.17 + karma-jasmine: ^4.0.2 + karma-jspm: ^2.2.3 + karma-nyan-reporter: ^0.2.5 + karma-phantomjs-launcher: ^1.0.4 + node-sass: ^7.0.1 + postcss: ^8.4.12 + +devDependencies: + autoprefixer: 10.4.4_postcss@8.4.12 + babel-eslint: 7.2.3 + browser-sync: 2.27.9 + chokidar: 3.5.3 + cssnano: 5.1.7_postcss@8.4.12 + debounce: 1.2.1 + eslint: 8.13.0 + fs-promise: 0.5.0 + interpolate: 0.1.0 + jasmine-core: 4.1.0 + jspm: 0.17.0-beta.49 + karma: 6.3.18 + karma-jasmine: 4.0.2_karma@6.3.18 + karma-jspm: 2.2.3 + karma-nyan-reporter: 0.2.5_karma@6.3.18 + karma-phantomjs-launcher: 1.0.4_karma@6.3.18 + node-sass: 7.0.1 + postcss: 8.4.12 + +packages: + + /@babel/code-frame/7.16.7: + resolution: {integrity: sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.17.9 + dev: true + + /@babel/helper-validator-identifier/7.16.7: + resolution: {integrity: sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/highlight/7.17.9: + resolution: {integrity: sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.16.7 + chalk: 2.4.2 + js-tokens: 4.0.0 + dev: true + + /@colors/colors/1.5.0: + resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} + engines: {node: '>=0.1.90'} + dev: true + + /@eslint/eslintrc/1.2.1: + resolution: {integrity: sha512-bxvbYnBPN1Gibwyp6NrpnFzA3YtRL3BBAyEAFVIpNTm2Rn4Vy87GA5M4aSn3InRrlsbX5N0GW7XIx+U4SAEKdQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.3.1 + globals: 13.13.0 + ignore: 5.2.0 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@gar/promisify/1.1.3: + resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} + dev: true + + /@humanwhocodes/config-array/0.9.5: + resolution: {integrity: sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 1.2.1 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/object-schema/1.2.1: + resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + dev: true + + /@npmcli/fs/1.1.1: + resolution: {integrity: sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==} + dependencies: + '@gar/promisify': 1.1.3 + semver: 7.3.7 + dev: true + + /@npmcli/move-file/1.1.2: + resolution: {integrity: sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==} + engines: {node: '>=10'} + dependencies: + mkdirp: 1.0.4 + rimraf: 3.0.2 + dev: true + + /@socket.io/base64-arraybuffer/1.0.2: + resolution: {integrity: sha512-dOlCBKnDw4iShaIsH/bxujKTM18+2TOAsYz+KSc11Am38H4q5Xw8Bbz97ZYdrVNM+um3p7w86Bvvmcn9q+5+eQ==} + engines: {node: '>= 0.6.0'} + dev: true + + /@socket.io/component-emitter/3.0.0: + resolution: {integrity: sha512-2pTGuibAXJswAPJjaKisthqS/NOK5ypG4LYT6tEAV0S/mxW0zOIvYvGK0V8w8+SHxAm6vRMSjqSalFXeBAqs+Q==} + dev: true + + /@tootallnate/once/1.1.2: + resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} + engines: {node: '>= 6'} + dev: true + + /@trysound/sax/0.2.0: + resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} + engines: {node: '>=10.13.0'} + dev: true + + /@types/component-emitter/1.2.11: + resolution: {integrity: sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ==} + dev: true + + /@types/cookie/0.4.1: + resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==} + dev: true + + /@types/cors/2.8.12: + resolution: {integrity: sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==} + dev: true + + /@types/estree/0.0.38: + resolution: {integrity: sha512-F/v7t1LwS4vnXuPooJQGBRKRGIoxWUTmA4VHfqjOccFsNDThD5bfUNpITive6s352O7o384wcpEaDV8rHCehDA==} + dev: true + + /@types/minimist/1.2.2: + resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} + dev: true + + /@types/node/17.0.23: + resolution: {integrity: sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==} + dev: true + + /@types/normalize-package-data/2.4.1: + resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} + dev: true + + /abbrev/1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + dev: true + + /accepts/1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + dev: true + + /acorn-jsx/5.3.2_acorn@8.7.0: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.7.0 + dev: true + + /acorn/8.7.0: + resolution: {integrity: sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /agent-base/6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + dependencies: + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /agentkeepalive/4.2.1: + resolution: {integrity: sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==} + engines: {node: '>= 8.0.0'} + dependencies: + debug: 4.3.4 + depd: 1.1.2 + humanize-ms: 1.2.1 + transitivePeerDependencies: + - supports-color + dev: true + + /aggregate-error/3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + dev: true + + /ajv/6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: true + + /align-text/0.1.4: + resolution: {integrity: sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + longest: 1.0.1 + repeat-string: 1.6.1 + dev: true + + /amdefine/1.0.1: + resolution: {integrity: sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=} + engines: {node: '>=0.4.2'} + dev: true + + /ansi-regex/2.1.1: + resolution: {integrity: sha1-w7M6te42DYbg5ijwRorn7yfWVN8=} + engines: {node: '>=0.10.0'} + dev: true + + /ansi-regex/5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: true + + /ansi-styles/2.2.1: + resolution: {integrity: sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=} + engines: {node: '>=0.10.0'} + dev: true + + /ansi-styles/3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + dev: true + + /ansi-styles/4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: true + + /any-promise/1.3.0: + resolution: {integrity: sha1-q8av7tzqUugJzcA3au0845Y10X8=} + dev: true + + /anymatch/1.3.2: + resolution: {integrity: sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==} + dependencies: + micromatch: 2.3.11 + normalize-path: 2.1.1 + dev: true + + /anymatch/3.1.2: + resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /aproba/2.0.0: + resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} + dev: true + + /are-we-there-yet/2.0.0: + resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} + engines: {node: '>=10'} + dependencies: + delegates: 1.0.0 + readable-stream: 3.6.0 + dev: true + + /are-we-there-yet/3.0.0: + resolution: {integrity: sha512-0GWpv50YSOcLXaN6/FAKY3vfRbllXWV2xvfA/oKJF8pzFhWXPV+yjhJXDBbjscDYowv7Yw1A3uigpzn5iEGTyw==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16} + dependencies: + delegates: 1.0.0 + readable-stream: 3.6.0 + dev: true + + /argparse/2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: true + + /arr-diff/2.0.0: + resolution: {integrity: sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=} + engines: {node: '>=0.10.0'} + dependencies: + arr-flatten: 1.1.0 + dev: true + + /arr-diff/4.0.0: + resolution: {integrity: sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=} + engines: {node: '>=0.10.0'} + dev: true + + /arr-flatten/1.1.0: + resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==} + engines: {node: '>=0.10.0'} + dev: true + + /arr-union/3.1.0: + resolution: {integrity: sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=} + engines: {node: '>=0.10.0'} + dev: true + + /array-each/1.0.1: + resolution: {integrity: sha1-p5SvDAWrF1KEbudTofIRoFugxE8=} + engines: {node: '>=0.10.0'} + dev: true + + /array-slice/1.1.0: + resolution: {integrity: sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==} + engines: {node: '>=0.10.0'} + dev: true + + /array-unique/0.2.1: + resolution: {integrity: sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=} + engines: {node: '>=0.10.0'} + dev: true + + /array-unique/0.3.2: + resolution: {integrity: sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=} + engines: {node: '>=0.10.0'} + dev: true + + /arrify/1.0.1: + resolution: {integrity: sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=} + engines: {node: '>=0.10.0'} + dev: true + + /asn1/0.2.6: + resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} + dependencies: + safer-buffer: 2.1.2 + dev: true + + /assert-plus/1.0.0: + resolution: {integrity: sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=} + engines: {node: '>=0.8'} + dev: true + + /assign-symbols/1.0.0: + resolution: {integrity: sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=} + engines: {node: '>=0.10.0'} + dev: true + + /async-each-series/0.1.1: + resolution: {integrity: sha1-dhfBkXQB/Yykooqtzj266Yr+tDI=} + engines: {node: '>=0.8.0'} + dev: true + + /async-foreach/0.1.3: + resolution: {integrity: sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=} + dev: true + + /async/1.5.2: + resolution: {integrity: sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=} + dev: true + + /asynckit/0.4.0: + resolution: {integrity: sha1-x57Zf380y48robyXkLzDZkdLS3k=} + dev: true + + /atob/2.1.2: + resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} + engines: {node: '>= 4.5.0'} + hasBin: true + dev: true + + /autoprefixer/10.4.4_postcss@8.4.12: + resolution: {integrity: sha512-Tm8JxsB286VweiZ5F0anmbyGiNI3v3wGv3mz9W+cxEDYB/6jbnj6GM9H9mK3wIL8ftgl+C07Lcwb8PG5PCCPzA==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + dependencies: + browserslist: 4.20.2 + caniuse-lite: 1.0.30001331 + fraction.js: 4.2.0 + normalize-range: 0.1.2 + picocolors: 1.0.0 + postcss: 8.4.12 + postcss-value-parser: 4.2.0 + dev: true + + /aws-sign2/0.7.0: + resolution: {integrity: sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=} + dev: true + + /aws4/1.11.0: + resolution: {integrity: sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==} + dev: true + + /axios/0.21.4_debug@4.3.2: + resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} + dependencies: + follow-redirects: 1.14.9_debug@4.3.2 + transitivePeerDependencies: + - debug + dev: true + + /babel-code-frame/6.26.0: + resolution: {integrity: sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=} + dependencies: + chalk: 1.1.3 + esutils: 2.0.3 + js-tokens: 3.0.2 + dev: true + + /babel-core/6.26.3: + resolution: {integrity: sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==} + dependencies: + babel-code-frame: 6.26.0 + babel-generator: 6.26.1 + babel-helpers: 6.24.1 + babel-messages: 6.23.0 + babel-register: 6.26.0 + babel-runtime: 6.26.0 + babel-template: 6.26.0 + babel-traverse: 6.26.0 + babel-types: 6.26.0 + babylon: 6.18.0 + convert-source-map: 1.8.0 + debug: 2.6.9 + json5: 0.5.1 + lodash: 4.17.21 + minimatch: 3.1.2 + path-is-absolute: 1.0.1 + private: 0.1.8 + slash: 1.0.0 + source-map: 0.5.7 + dev: true + + /babel-eslint/7.2.3: + resolution: {integrity: sha1-sv4tgBJkcPXBlELcdXJTqJdxCCc=} + engines: {node: '>=4'} + deprecated: babel-eslint is now @babel/eslint-parser. This package will no longer receive updates. + dependencies: + babel-code-frame: 6.26.0 + babel-traverse: 6.26.0 + babel-types: 6.26.0 + babylon: 6.18.0 + dev: true + + /babel-generator/6.26.1: + resolution: {integrity: sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==} + dependencies: + babel-messages: 6.23.0 + babel-runtime: 6.26.0 + babel-types: 6.26.0 + detect-indent: 4.0.0 + jsesc: 1.3.0 + lodash: 4.17.21 + source-map: 0.5.7 + trim-right: 1.0.1 + dev: true + + /babel-helper-hoist-variables/6.24.1: + resolution: {integrity: sha1-HssnaJydJVE+rbyZFKc/VAi+enY=} + dependencies: + babel-runtime: 6.26.0 + babel-types: 6.26.0 + dev: true + + /babel-helpers/6.24.1: + resolution: {integrity: sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=} + dependencies: + babel-runtime: 6.26.0 + babel-template: 6.26.0 + dev: true + + /babel-messages/6.23.0: + resolution: {integrity: sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=} + dependencies: + babel-runtime: 6.26.0 + dev: true + + /babel-plugin-syntax-dynamic-import/6.18.0: + resolution: {integrity: sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=} + dev: true + + /babel-plugin-transform-amd-system-wrapper/0.3.7: + resolution: {integrity: sha1-Uhx4LTVkRJHJeepoPopeHK/wukI=} + dependencies: + babel-template: 6.26.0 + dev: true + + /babel-plugin-transform-cjs-system-wrapper/0.6.2: + resolution: {integrity: sha1-vXSUd1KJQk/0k7btRV3klb1xuh0=} + dependencies: + babel-template: 6.26.0 + dev: true + + /babel-plugin-transform-es2015-modules-systemjs/6.24.1: + resolution: {integrity: sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=} + dependencies: + babel-helper-hoist-variables: 6.24.1 + babel-runtime: 6.26.0 + babel-template: 6.26.0 + dev: true + + /babel-plugin-transform-global-system-wrapper/0.3.4: + resolution: {integrity: sha1-lI3X0p/CFEfjm9NEfy3rx/L3Oqw=} + dependencies: + babel-template: 6.26.0 + dev: true + + /babel-plugin-transform-system-register/0.0.1: + resolution: {integrity: sha1-nf9AOQwnY6xRjwsq18XqT2WlviU=} + dev: true + + /babel-register/6.26.0: + resolution: {integrity: sha1-btAhFz4vy0htestFxgCahW9kcHE=} + dependencies: + babel-core: 6.26.3 + babel-runtime: 6.26.0 + core-js: 2.6.12 + home-or-tmp: 2.0.0 + lodash: 4.17.21 + mkdirp: 0.5.6 + source-map-support: 0.4.18 + dev: true + + /babel-runtime/6.26.0: + resolution: {integrity: sha1-llxwWGaOgrVde/4E/yM3vItWR/4=} + dependencies: + core-js: 2.6.12 + regenerator-runtime: 0.11.1 + dev: true + + /babel-template/6.26.0: + resolution: {integrity: sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=} + dependencies: + babel-runtime: 6.26.0 + babel-traverse: 6.26.0 + babel-types: 6.26.0 + babylon: 6.18.0 + lodash: 4.17.21 + dev: true + + /babel-traverse/6.26.0: + resolution: {integrity: sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=} + dependencies: + babel-code-frame: 6.26.0 + babel-messages: 6.23.0 + babel-runtime: 6.26.0 + babel-types: 6.26.0 + babylon: 6.18.0 + debug: 2.6.9 + globals: 9.18.0 + invariant: 2.2.4 + lodash: 4.17.21 + dev: true + + /babel-types/6.26.0: + resolution: {integrity: sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=} + dependencies: + babel-runtime: 6.26.0 + esutils: 2.0.3 + lodash: 4.17.21 + to-fast-properties: 1.0.3 + dev: true + + /babylon/6.18.0: + resolution: {integrity: sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==} + hasBin: true + dev: true + + /backo2/1.0.2: + resolution: {integrity: sha1-MasayLEpNjRj41s+u2n038+6eUc=} + dev: true + + /balanced-match/1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /base/0.11.2: + resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==} + engines: {node: '>=0.10.0'} + dependencies: + cache-base: 1.0.1 + class-utils: 0.3.6 + component-emitter: 1.3.0 + define-property: 1.0.0 + isobject: 3.0.1 + mixin-deep: 1.3.2 + pascalcase: 0.1.1 + dev: true + + /base64id/2.0.0: + resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} + engines: {node: ^4.5.0 || >= 5.9} + dev: true + + /batch/0.6.1: + resolution: {integrity: sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=} + dev: true + + /bcrypt-pbkdf/1.0.2: + resolution: {integrity: sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=} + dependencies: + tweetnacl: 0.14.5 + dev: true + + /binary-extensions/2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: true + + /bl/1.2.3: + resolution: {integrity: sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==} + dependencies: + readable-stream: 2.3.7 + safe-buffer: 5.2.1 + dev: true + + /bluebird/3.7.2: + resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + dev: true + + /body-parser/1.20.0: + resolution: {integrity: sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dependencies: + bytes: 3.1.2 + content-type: 1.0.4 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.10.3 + raw-body: 2.5.1 + type-is: 1.6.18 + unpipe: 1.0.0 + dev: true + + /boolbase/1.0.0: + resolution: {integrity: sha1-aN/1++YMUes3cl6p4+0xDcwed24=} + dev: true + + /brace-expansion/1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /braces/1.8.5: + resolution: {integrity: sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=} + engines: {node: '>=0.10.0'} + dependencies: + expand-range: 1.8.2 + preserve: 0.2.0 + repeat-element: 1.1.4 + dev: true + + /braces/2.3.2: + resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} + engines: {node: '>=0.10.0'} + dependencies: + 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.4 + snapdragon: 0.8.2 + snapdragon-node: 2.1.1 + split-string: 3.1.0 + to-regex: 3.0.2 + dev: true + + /braces/3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /browser-sync-client/2.27.9: + resolution: {integrity: sha512-FHW8kydp7FXo6jnX3gXJCpHAHtWNLK0nx839nnK+boMfMI1n4KZd0+DmTxHBsHsF3OHud4V4jwoN8U5HExMIdQ==} + engines: {node: '>=8.0.0'} + dependencies: + etag: 1.8.1 + fresh: 0.5.2 + mitt: 1.2.0 + rxjs: 5.5.12 + dev: true + + /browser-sync-ui/2.27.9: + resolution: {integrity: sha512-rsduR2bRIwFvM8CX6iY/Nu5aWub0WB9zfSYg9Le/RV5N5DEyxJYey0VxdfWCnzDOoelassTDzYQo+r0iJno3qw==} + dependencies: + async-each-series: 0.1.1 + connect-history-api-fallback: 1.6.0 + immutable: 3.8.2 + server-destroy: 1.0.1 + socket.io-client: 4.4.1 + stream-throttle: 0.1.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + /browser-sync/2.27.9: + resolution: {integrity: sha512-3zBtggcaZIeU9so4ja9yxk7/CZu9B3DOL6zkxFpzHCHsQmkGBPVXg61jItbeoa+WXgNLnr1sYES/2yQwyEZ2+w==} + engines: {node: '>= 8.0.0'} + hasBin: true + dependencies: + browser-sync-client: 2.27.9 + browser-sync-ui: 2.27.9 + bs-recipes: 1.3.4 + bs-snippet-injector: 2.0.1 + chokidar: 3.5.3 + connect: 3.6.6 + connect-history-api-fallback: 1.6.0 + dev-ip: 1.0.1 + easy-extender: 2.3.4 + eazy-logger: 3.1.0 + etag: 1.8.1 + fresh: 0.5.2 + fs-extra: 3.0.1 + http-proxy: 1.18.1 + immutable: 3.8.2 + localtunnel: 2.0.2 + micromatch: 4.0.5 + opn: 5.3.0 + portscanner: 2.1.1 + qs: 6.2.3 + raw-body: 2.5.1 + resp-modifier: 6.0.2 + rx: 4.1.0 + send: 0.16.2 + serve-index: 1.9.1 + serve-static: 1.13.2 + server-destroy: 1.0.1 + socket.io: 4.4.1 + ua-parser-js: 1.0.2 + yargs: 17.4.1 + transitivePeerDependencies: + - bufferutil + - debug + - supports-color + - utf-8-validate + dev: true + + /browserslist/4.20.2: + resolution: {integrity: sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001331 + electron-to-chromium: 1.4.107 + escalade: 3.1.1 + node-releases: 2.0.3 + picocolors: 1.0.0 + dev: true + + /bs-recipes/1.3.4: + resolution: {integrity: sha1-DS1NSKcYyMBEdp/cT4lZLci2lYU=} + dev: true + + /bs-snippet-injector/2.0.1: + resolution: {integrity: sha1-YbU5PxH1JVntEgaTEANDtu2wTdU=} + dev: true + + /bser/2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + dependencies: + node-int64: 0.4.0 + dev: true + + /buffer-alloc-unsafe/1.1.0: + resolution: {integrity: sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==} + dev: true + + /buffer-alloc/1.2.0: + resolution: {integrity: sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==} + dependencies: + buffer-alloc-unsafe: 1.1.0 + buffer-fill: 1.0.0 + dev: true + + /buffer-crc32/0.2.13: + resolution: {integrity: sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=} + dev: true + + /buffer-fill/1.0.0: + resolution: {integrity: sha1-+PeLdniYiO858gXNY39o5wISKyw=} + dev: true + + /buffer-from/1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + dev: true + + /buffer-peek-stream/1.1.0: + resolution: {integrity: sha512-b3MXlJ52rPOL5xCAQsiCOy/tY9WXOP/hwATporJriUDxnT3MjJgVppDzTFegpg2Nw7NMS28MKC6IKvaXLnGr+Q==} + dev: true + + /bytes/3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + dev: true + + /cacache/15.3.0: + resolution: {integrity: sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==} + engines: {node: '>= 10'} + dependencies: + '@npmcli/fs': 1.1.1 + '@npmcli/move-file': 1.1.2 + chownr: 2.0.0 + fs-minipass: 2.1.0 + glob: 7.2.0 + infer-owner: 1.0.4 + lru-cache: 6.0.0 + minipass: 3.1.6 + minipass-collect: 1.0.2 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + mkdirp: 1.0.4 + p-map: 4.0.0 + promise-inflight: 1.0.1 + rimraf: 3.0.2 + ssri: 8.0.1 + tar: 6.1.11 + unique-filename: 1.1.1 + dev: true + + /cache-base/1.0.1: + resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} + engines: {node: '>=0.10.0'} + dependencies: + collection-visit: 1.0.0 + component-emitter: 1.3.0 + get-value: 2.0.6 + has-value: 1.0.0 + isobject: 3.0.1 + set-value: 2.0.1 + to-object-path: 0.3.0 + union-value: 1.0.1 + unset-value: 1.0.0 + dev: true + + /call-bind/1.0.2: + resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + dependencies: + function-bind: 1.1.1 + get-intrinsic: 1.1.1 + dev: true + + /callsites/3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: true + + /camelcase-keys/6.2.2: + resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} + engines: {node: '>=8'} + dependencies: + camelcase: 5.3.1 + map-obj: 4.3.0 + quick-lru: 4.0.1 + dev: true + + /camelcase/1.2.1: + resolution: {integrity: sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=} + engines: {node: '>=0.10.0'} + dev: true + + /camelcase/5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + dev: true + + /caniuse-api/3.0.0: + resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} + dependencies: + browserslist: 4.20.2 + caniuse-lite: 1.0.30001331 + lodash.memoize: 4.1.2 + lodash.uniq: 4.5.0 + dev: true + + /caniuse-lite/1.0.30001331: + resolution: {integrity: sha512-Y1xk6paHpUXKP/P6YjQv1xqyTbgAP05ycHBcRdQjTcyXlWol868sJJPlmk5ylOekw2BrucWes5jk+LvVd7WZ5Q==} + dev: true + + /caseless/0.12.0: + resolution: {integrity: sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=} + dev: true + + /center-align/0.1.3: + resolution: {integrity: sha1-qg0yYptu6XIgBBHL1EYckHvCt60=} + engines: {node: '>=0.10.0'} + dependencies: + align-text: 0.1.4 + lazy-cache: 1.0.4 + dev: true + + /chalk/1.1.3: + resolution: {integrity: sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=} + engines: {node: '>=0.10.0'} + dependencies: + 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 + dev: true + + /chalk/2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + dev: true + + /chalk/4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /chokidar/3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.2 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /chownr/1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + dev: true + + /chownr/2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + dev: true + + /class-utils/0.3.6: + resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==} + engines: {node: '>=0.10.0'} + dependencies: + arr-union: 3.1.0 + define-property: 0.2.5 + isobject: 3.0.1 + static-extend: 0.1.2 + dev: true + + /clean-stack/2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + dev: true + + /cli-color/0.3.3: + resolution: {integrity: sha1-EtW90Vj/igsNtAEZiRPAPfBp9vU=} + dependencies: + d: 0.1.1 + es5-ext: 0.10.60 + memoizee: 0.3.10 + timers-ext: 0.1.7 + dev: true + + /cliui/2.1.0: + resolution: {integrity: sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=} + dependencies: + center-align: 0.1.3 + right-align: 0.1.3 + wordwrap: 0.0.2 + dev: true + + /cliui/7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /collection-visit/1.0.0: + resolution: {integrity: sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=} + engines: {node: '>=0.10.0'} + dependencies: + map-visit: 1.0.0 + object-visit: 1.0.1 + dev: true + + /color-convert/1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + dev: true + + /color-convert/2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: true + + /color-name/1.1.3: + resolution: {integrity: sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=} + dev: true + + /color-name/1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: true + + /color-support/1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true + dev: true + + /colord/2.9.2: + resolution: {integrity: sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ==} + dev: true + + /combined-stream/1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + dev: true + + /commander/2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + dev: true + + /commander/2.9.0: + resolution: {integrity: sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=} + engines: {node: '>= 0.6.x'} + dependencies: + graceful-readlink: 1.0.1 + dev: true + + /commander/7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + dev: true + + /component-emitter/1.3.0: + resolution: {integrity: sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==} + dev: true + + /concat-map/0.0.1: + resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} + dev: true + + /concat-stream/1.6.2: + resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} + engines: {'0': node >= 0.8} + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 2.3.7 + typedarray: 0.0.6 + dev: true + + /connect-history-api-fallback/1.6.0: + resolution: {integrity: sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==} + engines: {node: '>=0.8'} + dev: true + + /connect/3.6.6: + resolution: {integrity: sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=} + engines: {node: '>= 0.10.0'} + dependencies: + debug: 2.6.9 + finalhandler: 1.1.0 + parseurl: 1.3.3 + utils-merge: 1.0.1 + dev: true + + /connect/3.7.0: + resolution: {integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==} + engines: {node: '>= 0.10.0'} + dependencies: + debug: 2.6.9 + finalhandler: 1.1.2 + parseurl: 1.3.3 + utils-merge: 1.0.1 + dev: true + + /console-control-strings/1.1.0: + resolution: {integrity: sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=} + dev: true + + /content-type/1.0.4: + resolution: {integrity: sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==} + engines: {node: '>= 0.6'} + dev: true + + /convert-source-map/1.8.0: + resolution: {integrity: sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==} + dependencies: + safe-buffer: 5.1.2 + dev: true + + /cookie/0.4.2: + resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} + engines: {node: '>= 0.6'} + dev: true + + /copy-descriptor/0.1.1: + resolution: {integrity: sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=} + engines: {node: '>=0.10.0'} + dev: true + + /core-js/1.2.7: + resolution: {integrity: sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=} + deprecated: core-js@<3.4 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Please, upgrade your dependencies to the actual version of core-js. + dev: true + + /core-js/2.6.12: + resolution: {integrity: sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==} + deprecated: core-js@<3.4 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Please, upgrade your dependencies to the actual version of core-js. + requiresBuild: true + dev: true + + /core-util-is/1.0.2: + resolution: {integrity: sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=} + dev: true + + /core-util-is/1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + dev: true + + /cors/2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + dev: true + + /cross-spawn/7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + + /css-declaration-sorter/6.2.2_postcss@8.4.12: + resolution: {integrity: sha512-Ufadglr88ZLsrvS11gjeu/40Lw74D9Am/Jpr3LlYm5Q4ZP5KdlUhG+6u2EjyXeZcxmZ2h1ebCKngDjolpeLHpg==} + engines: {node: ^10 || ^12 || >=14} + peerDependencies: + postcss: ^8.0.9 + dependencies: + postcss: 8.4.12 + dev: true + + /css-select/4.3.0: + resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 4.3.1 + domutils: 2.8.0 + nth-check: 2.0.1 + dev: true + + /css-tree/1.1.3: + resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} + engines: {node: '>=8.0.0'} + dependencies: + mdn-data: 2.0.14 + source-map: 0.6.1 + dev: true + + /css-what/6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + dev: true + + /cssesc/3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /cssnano-preset-default/5.2.7_postcss@8.4.12: + resolution: {integrity: sha512-JiKP38ymZQK+zVKevphPzNSGHSlTI+AOwlasoSRtSVMUU285O7/6uZyd5NbW92ZHp41m0sSHe6JoZosakj63uA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + css-declaration-sorter: 6.2.2_postcss@8.4.12 + cssnano-utils: 3.1.0_postcss@8.4.12 + postcss: 8.4.12 + postcss-calc: 8.2.4_postcss@8.4.12 + postcss-colormin: 5.3.0_postcss@8.4.12 + postcss-convert-values: 5.1.0_postcss@8.4.12 + postcss-discard-comments: 5.1.1_postcss@8.4.12 + postcss-discard-duplicates: 5.1.0_postcss@8.4.12 + postcss-discard-empty: 5.1.1_postcss@8.4.12 + postcss-discard-overridden: 5.1.0_postcss@8.4.12 + postcss-merge-longhand: 5.1.4_postcss@8.4.12 + postcss-merge-rules: 5.1.1_postcss@8.4.12 + postcss-minify-font-values: 5.1.0_postcss@8.4.12 + postcss-minify-gradients: 5.1.1_postcss@8.4.12 + postcss-minify-params: 5.1.2_postcss@8.4.12 + postcss-minify-selectors: 5.2.0_postcss@8.4.12 + postcss-normalize-charset: 5.1.0_postcss@8.4.12 + postcss-normalize-display-values: 5.1.0_postcss@8.4.12 + postcss-normalize-positions: 5.1.0_postcss@8.4.12 + postcss-normalize-repeat-style: 5.1.0_postcss@8.4.12 + postcss-normalize-string: 5.1.0_postcss@8.4.12 + postcss-normalize-timing-functions: 5.1.0_postcss@8.4.12 + postcss-normalize-unicode: 5.1.0_postcss@8.4.12 + postcss-normalize-url: 5.1.0_postcss@8.4.12 + postcss-normalize-whitespace: 5.1.1_postcss@8.4.12 + postcss-ordered-values: 5.1.1_postcss@8.4.12 + postcss-reduce-initial: 5.1.0_postcss@8.4.12 + postcss-reduce-transforms: 5.1.0_postcss@8.4.12 + postcss-svgo: 5.1.0_postcss@8.4.12 + postcss-unique-selectors: 5.1.1_postcss@8.4.12 + dev: true + + /cssnano-utils/3.1.0_postcss@8.4.12: + resolution: {integrity: sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.12 + dev: true + + /cssnano/5.1.7_postcss@8.4.12: + resolution: {integrity: sha512-pVsUV6LcTXif7lvKKW9ZrmX+rGRzxkEdJuVJcp5ftUjWITgwam5LMZOgaTvUrWPkcORBey6he7JKb4XAJvrpKg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + cssnano-preset-default: 5.2.7_postcss@8.4.12 + lilconfig: 2.0.5 + postcss: 8.4.12 + yaml: 1.10.2 + dev: true + + /csso/4.2.0: + resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==} + engines: {node: '>=8.0.0'} + dependencies: + css-tree: 1.1.3 + dev: true + + /custom-event/1.0.1: + resolution: {integrity: sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=} + dev: true + + /d/0.1.1: + resolution: {integrity: sha1-2hhMU10Y2O57oqoim5FACfrhEwk=} + dependencies: + es5-ext: 0.10.60 + dev: true + + /d/1.0.1: + resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==} + dependencies: + es5-ext: 0.10.60 + type: 1.2.0 + dev: true + + /dashdash/1.14.1: + resolution: {integrity: sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=} + engines: {node: '>=0.10'} + dependencies: + assert-plus: 1.0.0 + dev: true + + /data-uri-to-buffer/0.0.4: + resolution: {integrity: sha1-RuE6udqOMJdFyNAc5UchPr2y/j8=} + dev: true + + /date-format/4.0.6: + resolution: {integrity: sha512-B9vvg5rHuQ8cbUXE/RMWMyX2YA5TecT3jKF5fLtGNlzPlU7zblSPmAm2OImDbWL+LDOQ6pUm+4LOFz+ywS41Zw==} + engines: {node: '>=4.0'} + dev: true + + /debounce/1.2.1: + resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} + dev: true + + /debug/2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + dependencies: + ms: 2.0.0 + dev: true + + /debug/4.3.2: + resolution: {integrity: sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: true + + /debug/4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: true + + /decamelize-keys/1.1.0: + resolution: {integrity: sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=} + engines: {node: '>=0.10.0'} + dependencies: + decamelize: 1.2.0 + map-obj: 1.0.1 + dev: true + + /decamelize/1.2.0: + resolution: {integrity: sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=} + engines: {node: '>=0.10.0'} + dev: true + + /decode-uri-component/0.2.0: + resolution: {integrity: sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=} + engines: {node: '>=0.10'} + dev: true + + /deep-is/0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true + + /define-property/0.2.5: + resolution: {integrity: sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=} + engines: {node: '>=0.10.0'} + dependencies: + is-descriptor: 0.1.6 + dev: true + + /define-property/1.0.0: + resolution: {integrity: sha1-dp66rz9KY6rTr56NMEybvnm/sOY=} + engines: {node: '>=0.10.0'} + dependencies: + is-descriptor: 1.0.2 + dev: true + + /define-property/2.0.2: + resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==} + engines: {node: '>=0.10.0'} + dependencies: + is-descriptor: 1.0.2 + isobject: 3.0.1 + dev: true + + /delayed-stream/1.0.0: + resolution: {integrity: sha1-3zrhmayt+31ECqrgsp4icrJOxhk=} + engines: {node: '>=0.4.0'} + dev: true + + /delegates/1.0.0: + resolution: {integrity: sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=} + dev: true + + /depd/1.1.2: + resolution: {integrity: sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=} + engines: {node: '>= 0.6'} + dev: true + + /depd/2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + dev: true + + /destroy/1.0.4: + resolution: {integrity: sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=} + dev: true + + /destroy/1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dev: true + + /detect-file/1.0.0: + resolution: {integrity: sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=} + engines: {node: '>=0.10.0'} + dev: true + + /detect-indent/4.0.0: + resolution: {integrity: sha1-920GQ1LN9Docts5hnE7jqUdd4gg=} + engines: {node: '>=0.10.0'} + dependencies: + repeating: 2.0.1 + dev: true + + /dev-ip/1.0.1: + resolution: {integrity: sha1-p2o+0YVb56ASu4rBbLgPPADcKPA=} + engines: {node: '>= 0.8.0'} + hasBin: true + dev: true + + /di/0.0.1: + resolution: {integrity: sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=} + dev: true + + /dlv/1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + dev: true + + /doctrine/3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /dom-serialize/2.2.1: + resolution: {integrity: sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=} + dependencies: + custom-event: 1.0.1 + ent: 2.2.0 + extend: 3.0.2 + void-elements: 2.0.1 + dev: true + + /dom-serializer/1.4.1: + resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + entities: 2.2.0 + dev: true + + /domelementtype/2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + dev: true + + /domhandler/4.3.1: + resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} + engines: {node: '>= 4'} + dependencies: + domelementtype: 2.3.0 + dev: true + + /domutils/2.8.0: + resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} + dependencies: + dom-serializer: 1.4.1 + domelementtype: 2.3.0 + domhandler: 4.3.1 + dev: true + + /easy-extender/2.3.4: + resolution: {integrity: sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q==} + engines: {node: '>= 4.0.0'} + dependencies: + lodash: 4.17.21 + dev: true + + /eazy-logger/3.1.0: + resolution: {integrity: sha512-/snsn2JqBtUSSstEl4R0RKjkisGHAhvYj89i7r3ytNUKW12y178KDZwXLXIgwDqLW6E/VRMT9qfld7wvFae8bQ==} + engines: {node: '>= 0.8.0'} + dependencies: + tfunk: 4.0.0 + dev: true + + /ecc-jsbn/0.1.2: + resolution: {integrity: sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=} + dependencies: + jsbn: 0.1.1 + safer-buffer: 2.1.2 + dev: true + + /ee-first/1.1.1: + resolution: {integrity: sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=} + dev: true + + /electron-to-chromium/1.4.107: + resolution: {integrity: sha512-Huen6taaVrUrSy8o7mGStByba8PfOWWluHNxSHGBrCgEdFVLtvdQDBr9LBCF9Uci8SYxh28QNNMO0oC17wbGAg==} + dev: true + + /emoji-regex/8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: true + + /encodeurl/1.0.2: + resolution: {integrity: sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=} + engines: {node: '>= 0.8'} + dev: true + + /encoding/0.1.13: + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + requiresBuild: true + dependencies: + iconv-lite: 0.6.3 + dev: true + optional: true + + /end-of-stream/1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + dev: true + + /engine.io-client/6.1.1: + resolution: {integrity: sha512-V05mmDo4gjimYW+FGujoGmmmxRaDsrVr7AXA3ZIfa04MWM1jOfZfUwou0oNqhNwy/votUDvGDt4JA4QF4e0b4g==} + dependencies: + '@socket.io/component-emitter': 3.0.0 + debug: 4.3.4 + engine.io-parser: 5.0.3 + has-cors: 1.1.0 + parseqs: 0.0.6 + parseuri: 0.0.6 + ws: 8.2.3 + xmlhttprequest-ssl: 2.0.0 + yeast: 0.1.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + /engine.io-parser/5.0.3: + resolution: {integrity: sha512-BtQxwF27XUNnSafQLvDi0dQ8s3i6VgzSoQMJacpIcGNrlUdfHSKbgm3jmjCVvQluGzqwujQMPAoMai3oYSTurg==} + engines: {node: '>=10.0.0'} + dependencies: + '@socket.io/base64-arraybuffer': 1.0.2 + dev: true + + /engine.io/6.1.3: + resolution: {integrity: sha512-rqs60YwkvWTLLnfazqgZqLa/aKo+9cueVfEi/dZ8PyGyaf8TLOxj++4QMIgeG3Gn0AhrWiFXvghsoY9L9h25GA==} + engines: {node: '>=10.0.0'} + dependencies: + '@types/cookie': 0.4.1 + '@types/cors': 2.8.12 + '@types/node': 17.0.23 + accepts: 1.3.8 + base64id: 2.0.0 + cookie: 0.4.2 + cors: 2.8.5 + debug: 4.3.4 + engine.io-parser: 5.0.3 + ws: 8.2.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + /ent/2.2.0: + resolution: {integrity: sha1-6WQhkyWiHQX0RGai9obtbOX13R0=} + dev: true + + /entities/2.2.0: + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + dev: true + + /env-paths/2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + dev: true + + /err-code/1.1.2: + resolution: {integrity: sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=} + dev: true + + /err-code/2.0.3: + resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + dev: true + + /error-ex/1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + dependencies: + is-arrayish: 0.2.1 + dev: true + + /es5-ext/0.10.60: + resolution: {integrity: sha512-jpKNXIt60htYG59/9FGf2PYT3pwMpnEbNKysU+k/4FGwyGtMotOvcZOuW+EmXXYASRqYSXQfGL5cVIthOTgbkg==} + engines: {node: '>=0.10'} + requiresBuild: true + dependencies: + es6-iterator: 2.0.3 + es6-symbol: 3.1.3 + next-tick: 1.1.0 + dev: true + + /es6-iterator/0.1.3: + resolution: {integrity: sha1-1vWLjE/EE8JJtLqhl2j45NfIlE4=} + dependencies: + d: 0.1.1 + es5-ext: 0.10.60 + es6-symbol: 2.0.1 + dev: true + + /es6-iterator/2.0.3: + resolution: {integrity: sha1-p96IkUGgWpSwhUQDstCg+/qY87c=} + dependencies: + d: 1.0.1 + es5-ext: 0.10.60 + es6-symbol: 3.1.3 + dev: true + + /es6-promise/4.2.8: + resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} + dev: true + + /es6-symbol/2.0.1: + resolution: {integrity: sha1-dhtcZ8/U8dGK+yNPaR1nhoLLO/M=} + dependencies: + d: 0.1.1 + es5-ext: 0.10.60 + dev: true + + /es6-symbol/3.1.3: + resolution: {integrity: sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==} + dependencies: + d: 1.0.1 + ext: 1.6.0 + dev: true + + /es6-template-strings/2.0.1: + resolution: {integrity: sha1-sWbGpiVi9Hi7d3X2ypYQOlmbSyw=} + dependencies: + es5-ext: 0.10.60 + esniff: 1.1.0 + dev: true + + /es6-weak-map/0.1.4: + resolution: {integrity: sha1-cGzvnpmqI2undmwjnIueKG6n0ig=} + dependencies: + d: 0.1.1 + es5-ext: 0.10.60 + es6-iterator: 0.1.3 + es6-symbol: 2.0.1 + dev: true + + /escalade/3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + dev: true + + /escape-html/1.0.3: + resolution: {integrity: sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=} + dev: true + + /escape-string-regexp/1.0.5: + resolution: {integrity: sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=} + engines: {node: '>=0.8.0'} + dev: true + + /escape-string-regexp/4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + dev: true + + /eslint-scope/7.1.1: + resolution: {integrity: sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true + + /eslint-utils/3.0.0_eslint@8.13.0: + resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} + engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} + peerDependencies: + eslint: '>=5' + dependencies: + eslint: 8.13.0 + eslint-visitor-keys: 2.1.0 + dev: true + + /eslint-visitor-keys/2.1.0: + resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} + engines: {node: '>=10'} + dev: true + + /eslint-visitor-keys/3.3.0: + resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /eslint/8.13.0: + resolution: {integrity: sha512-D+Xei61eInqauAyTJ6C0q6x9mx7kTUC1KZ0m0LSEexR0V+e94K12LmWX076ZIsldwfQ2RONdaJe0re0TRGQbRQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint/eslintrc': 1.2.1 + '@humanwhocodes/config-array': 0.9.5 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.1.1 + eslint-utils: 3.0.0_eslint@8.13.0 + eslint-visitor-keys: 3.3.0 + espree: 9.3.1 + esquery: 1.4.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + functional-red-black-tree: 1.0.1 + glob-parent: 6.0.2 + globals: 13.13.0 + ignore: 5.2.0 + import-fresh: 3.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.1 + regexpp: 3.2.0 + strip-ansi: 6.0.1 + strip-json-comments: 3.1.1 + text-table: 0.2.0 + v8-compile-cache: 2.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /esniff/1.1.0: + resolution: {integrity: sha1-xmhJIp+RRk3t4uDUAgHtar9l8qw=} + dependencies: + d: 1.0.1 + es5-ext: 0.10.60 + dev: true + + /espree/9.3.1: + resolution: {integrity: sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.7.0 + acorn-jsx: 5.3.2_acorn@8.7.0 + eslint-visitor-keys: 3.3.0 + dev: true + + /esquery/1.4.0: + resolution: {integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + dev: true + + /esrecurse/4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + dev: true + + /estraverse/5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + dev: true + + /esutils/2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: true + + /etag/1.8.1: + resolution: {integrity: sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=} + engines: {node: '>= 0.6'} + dev: true + + /event-emitter/0.3.5: + resolution: {integrity: sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=} + dependencies: + d: 1.0.1 + es5-ext: 0.10.60 + dev: true + + /eventemitter3/4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + dev: true + + /exec-sh/0.2.2: + resolution: {integrity: sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw==} + dependencies: + merge: 1.2.1 + dev: true + + /expand-brackets/0.1.5: + resolution: {integrity: sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=} + engines: {node: '>=0.10.0'} + dependencies: + is-posix-bracket: 0.1.1 + dev: true + + /expand-brackets/2.1.4: + resolution: {integrity: sha1-t3c14xXOMPa27/D4OwQVGiJEliI=} + engines: {node: '>=0.10.0'} + dependencies: + debug: 2.6.9 + 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 + dev: true + + /expand-range/1.8.2: + resolution: {integrity: sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=} + engines: {node: '>=0.10.0'} + dependencies: + fill-range: 2.2.4 + dev: true + + /expand-tilde/1.2.2: + resolution: {integrity: sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=} + engines: {node: '>=0.10.0'} + dependencies: + os-homedir: 1.0.2 + dev: true + + /expand-tilde/2.0.2: + resolution: {integrity: sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=} + engines: {node: '>=0.10.0'} + dependencies: + homedir-polyfill: 1.0.3 + dev: true + + /ext/1.6.0: + resolution: {integrity: sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==} + dependencies: + type: 2.6.0 + dev: true + + /extend-shallow/2.0.1: + resolution: {integrity: sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=} + engines: {node: '>=0.10.0'} + dependencies: + is-extendable: 0.1.1 + dev: true + + /extend-shallow/3.0.2: + resolution: {integrity: sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=} + engines: {node: '>=0.10.0'} + dependencies: + assign-symbols: 1.0.0 + is-extendable: 1.0.1 + dev: true + + /extend/3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + dev: true + + /extglob/0.3.2: + resolution: {integrity: sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 1.0.0 + dev: true + + /extglob/2.0.4: + resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==} + engines: {node: '>=0.10.0'} + dependencies: + 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 + dev: true + + /extract-zip/1.7.0: + resolution: {integrity: sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==} + hasBin: true + dependencies: + concat-stream: 1.6.2 + debug: 2.6.9 + mkdirp: 0.5.6 + yauzl: 2.10.0 + dev: true + + /extsprintf/1.3.0: + resolution: {integrity: sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=} + engines: {'0': node >=0.6.0} + dev: true + + /fast-deep-equal/3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + dev: true + + /fast-json-stable-stringify/2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true + + /fast-levenshtein/2.0.6: + resolution: {integrity: sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=} + dev: true + + /fb-watchman/2.0.1: + resolution: {integrity: sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==} + dependencies: + bser: 2.1.1 + dev: true + + /fd-slicer/1.1.0: + resolution: {integrity: sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=} + dependencies: + pend: 1.2.0 + dev: true + + /file-entry-cache/6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flat-cache: 3.0.4 + dev: true + + /filename-regex/2.0.1: + resolution: {integrity: sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=} + engines: {node: '>=0.10.0'} + dev: true + + /fill-range/2.2.4: + resolution: {integrity: sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==} + engines: {node: '>=0.10.0'} + dependencies: + is-number: 2.1.0 + isobject: 2.1.0 + randomatic: 3.1.1 + repeat-element: 1.1.4 + repeat-string: 1.6.1 + dev: true + + /fill-range/4.0.0: + resolution: {integrity: sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 2.0.1 + is-number: 3.0.0 + repeat-string: 1.6.1 + to-regex-range: 2.1.1 + dev: true + + /fill-range/7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /finalhandler/1.1.0: + resolution: {integrity: sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=} + engines: {node: '>= 0.8'} + dependencies: + debug: 2.6.9 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.3.0 + parseurl: 1.3.3 + statuses: 1.3.1 + unpipe: 1.0.0 + dev: true + + /finalhandler/1.1.2: + resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==} + engines: {node: '>= 0.8'} + dependencies: + debug: 2.6.9 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.3.0 + parseurl: 1.3.3 + statuses: 1.5.0 + unpipe: 1.0.0 + dev: true + + /find-up/4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + dev: true + + /findup-sync/2.0.0: + resolution: {integrity: sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=} + engines: {node: '>= 0.10'} + dependencies: + detect-file: 1.0.0 + is-glob: 3.1.0 + micromatch: 3.1.10 + resolve-dir: 1.0.1 + dev: true + + /fined/1.2.0: + resolution: {integrity: sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==} + engines: {node: '>= 0.10'} + dependencies: + 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 + dev: true + + /flagged-respawn/1.0.1: + resolution: {integrity: sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==} + engines: {node: '>= 0.10'} + dev: true + + /flat-cache/3.0.4: + resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flatted: 3.2.5 + rimraf: 3.0.2 + dev: true + + /flatted/3.2.5: + resolution: {integrity: sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==} + dev: true + + /follow-redirects/1.14.9_debug@4.3.2: + resolution: {integrity: sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dependencies: + debug: 4.3.2 + dev: true + + /for-in/1.0.2: + resolution: {integrity: sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=} + engines: {node: '>=0.10.0'} + dev: true + + /for-own/0.1.5: + resolution: {integrity: sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=} + engines: {node: '>=0.10.0'} + dependencies: + for-in: 1.0.2 + dev: true + + /for-own/1.0.0: + resolution: {integrity: sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=} + engines: {node: '>=0.10.0'} + dependencies: + for-in: 1.0.2 + dev: true + + /forever-agent/0.6.1: + resolution: {integrity: sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=} + dev: true + + /form-data/2.3.3: + resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} + engines: {node: '>= 0.12'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: true + + /fraction.js/4.2.0: + resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==} + dev: true + + /fragment-cache/0.2.1: + resolution: {integrity: sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=} + engines: {node: '>=0.10.0'} + dependencies: + map-cache: 0.2.2 + dev: true + + /fresh/0.5.2: + resolution: {integrity: sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=} + engines: {node: '>= 0.6'} + dev: true + + /fs-constants/1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + dev: true + + /fs-extra/0.26.7: + resolution: {integrity: sha1-muH92UiXeY7at20JGM9C0MMYT6k=} + dependencies: + graceful-fs: 4.2.10 + jsonfile: 2.4.0 + klaw: 1.3.1 + path-is-absolute: 1.0.1 + rimraf: 2.7.1 + dev: true + + /fs-extra/1.0.0: + resolution: {integrity: sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=} + dependencies: + graceful-fs: 4.2.10 + jsonfile: 2.4.0 + klaw: 1.3.1 + dev: true + + /fs-extra/10.0.1: + resolution: {integrity: sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag==} + engines: {node: '>=12'} + dependencies: + graceful-fs: 4.2.10 + jsonfile: 6.1.0 + universalify: 2.0.0 + dev: true + + /fs-extra/3.0.1: + resolution: {integrity: sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=} + dependencies: + graceful-fs: 4.2.10 + jsonfile: 3.0.1 + universalify: 0.1.2 + dev: true + + /fs-minipass/2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.1.6 + dev: true + + /fs-promise/0.5.0: + resolution: {integrity: sha1-Q0fWv2JGVacGGkMZITw5MnatPvM=} + deprecated: Use mz or fs-extra^3.0 with Promise Support + dependencies: + any-promise: 1.3.0 + fs-extra: 0.26.7 + mz: 2.7.0 + thenify-all: 1.6.0 + dev: true + + /fs.realpath/1.0.0: + resolution: {integrity: sha1-FQStJSMVjKpA20onh8sBQRmU6k8=} + dev: true + + /fsevents/2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind/1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + dev: true + + /functional-red-black-tree/1.0.1: + resolution: {integrity: sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=} + dev: true + + /gauge/3.0.2: + resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} + engines: {node: '>=10'} + dependencies: + aproba: 2.0.0 + color-support: 1.1.3 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + object-assign: 4.1.1 + signal-exit: 3.0.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wide-align: 1.1.5 + dev: true + + /gauge/4.0.4: + resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + aproba: 2.0.0 + color-support: 1.1.3 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + signal-exit: 3.0.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wide-align: 1.1.5 + dev: true + + /gaze/1.1.3: + resolution: {integrity: sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==} + engines: {node: '>= 4.0.0'} + dependencies: + globule: 1.3.3 + dev: true + + /get-caller-file/2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: true + + /get-intrinsic/1.1.1: + resolution: {integrity: sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==} + dependencies: + function-bind: 1.1.1 + has: 1.0.3 + has-symbols: 1.0.3 + dev: true + + /get-stdin/4.0.1: + resolution: {integrity: sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=} + engines: {node: '>=0.10.0'} + dev: true + + /get-value/2.0.6: + resolution: {integrity: sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=} + engines: {node: '>=0.10.0'} + dev: true + + /getpass/0.1.7: + resolution: {integrity: sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=} + dependencies: + assert-plus: 1.0.0 + dev: true + + /glob-base/0.3.0: + resolution: {integrity: sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=} + engines: {node: '>=0.10.0'} + dependencies: + glob-parent: 2.0.0 + is-glob: 2.0.1 + dev: true + + /glob-parent/2.0.0: + resolution: {integrity: sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=} + dependencies: + is-glob: 2.0.1 + dev: true + + /glob-parent/5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-parent/6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob/5.0.15: + resolution: {integrity: sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=} + dependencies: + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /glob/6.0.4: + resolution: {integrity: sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=} + dependencies: + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /glob/7.0.6: + resolution: {integrity: sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /glob/7.1.7: + resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.0.8 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /glob/7.2.0: + resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /global-modules/1.0.0: + resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} + engines: {node: '>=0.10.0'} + dependencies: + global-prefix: 1.0.2 + is-windows: 1.0.2 + resolve-dir: 1.0.1 + dev: true + + /global-prefix/1.0.2: + resolution: {integrity: sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=} + engines: {node: '>=0.10.0'} + dependencies: + expand-tilde: 2.0.2 + homedir-polyfill: 1.0.3 + ini: 1.3.8 + is-windows: 1.0.2 + which: 1.3.1 + dev: true + + /globals/13.13.0: + resolution: {integrity: sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + dev: true + + /globals/9.18.0: + resolution: {integrity: sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==} + engines: {node: '>=0.10.0'} + dev: true + + /globule/1.3.3: + resolution: {integrity: sha512-mb1aYtDbIjTu4ShMB85m3UzjX9BVKe9WCzsnfMSZk+K5GpIbBOexgg4PPCt5eHDEG5/ZQAUX2Kct02zfiPLsKg==} + engines: {node: '>= 0.10'} + dependencies: + glob: 7.1.7 + lodash: 4.17.21 + minimatch: 3.0.8 + dev: true + + /graceful-fs/4.2.10: + resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} + dev: true + + /graceful-readlink/1.0.1: + resolution: {integrity: sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=} + dev: true + + /har-schema/2.0.0: + resolution: {integrity: sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=} + engines: {node: '>=4'} + dev: true + + /har-validator/5.1.5: + resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==} + engines: {node: '>=6'} + deprecated: this library is no longer supported + dependencies: + ajv: 6.12.6 + har-schema: 2.0.0 + dev: true + + /hard-rejection/2.1.0: + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} + engines: {node: '>=6'} + dev: true + + /has-ansi/2.0.0: + resolution: {integrity: sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=} + engines: {node: '>=0.10.0'} + dependencies: + ansi-regex: 2.1.1 + dev: true + + /has-cors/1.1.0: + resolution: {integrity: sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=} + dev: true + + /has-flag/3.0.0: + resolution: {integrity: sha1-tdRU3CGZriJWmfNGfloH87lVuv0=} + engines: {node: '>=4'} + dev: true + + /has-flag/4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /has-symbols/1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + dev: true + + /has-unicode/2.0.1: + resolution: {integrity: sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=} + dev: true + + /has-value/0.3.1: + resolution: {integrity: sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=} + engines: {node: '>=0.10.0'} + dependencies: + get-value: 2.0.6 + has-values: 0.1.4 + isobject: 2.1.0 + dev: true + + /has-value/1.0.0: + resolution: {integrity: sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=} + engines: {node: '>=0.10.0'} + dependencies: + get-value: 2.0.6 + has-values: 1.0.0 + isobject: 3.0.1 + dev: true + + /has-values/0.1.4: + resolution: {integrity: sha1-bWHeldkd/Km5oCCJrThL/49it3E=} + engines: {node: '>=0.10.0'} + dev: true + + /has-values/1.0.0: + resolution: {integrity: sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=} + engines: {node: '>=0.10.0'} + dependencies: + is-number: 3.0.0 + kind-of: 4.0.0 + dev: true + + /has/1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + dev: true + + /hasha/2.2.0: + resolution: {integrity: sha1-eNfL/B5tZjA/55g3NlmEUXsvbuE=} + engines: {node: '>=0.10.0'} + dependencies: + is-stream: 1.1.0 + pinkie-promise: 2.0.1 + dev: true + + /home-or-tmp/2.0.0: + resolution: {integrity: sha1-42w/LSyufXRqhX440Y1fMqeILbg=} + engines: {node: '>=0.10.0'} + dependencies: + os-homedir: 1.0.2 + os-tmpdir: 1.0.2 + dev: true + + /homedir-polyfill/1.0.3: + resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} + engines: {node: '>=0.10.0'} + dependencies: + parse-passwd: 1.0.0 + dev: true + + /hosted-git-info/2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + dev: true + + /hosted-git-info/4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + dependencies: + lru-cache: 6.0.0 + dev: true + + /http-cache-semantics/4.1.0: + resolution: {integrity: sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==} + dev: true + + /http-errors/1.6.3: + resolution: {integrity: sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=} + engines: {node: '>= 0.6'} + dependencies: + depd: 1.1.2 + inherits: 2.0.3 + setprototypeof: 1.1.0 + statuses: 1.4.0 + dev: true + + /http-errors/2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + dev: true + + /http-proxy-agent/4.0.1: + resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} + engines: {node: '>= 6'} + dependencies: + '@tootallnate/once': 1.1.2 + agent-base: 6.0.2 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /http-proxy/1.18.1: + resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} + engines: {node: '>=8.0.0'} + dependencies: + eventemitter3: 4.0.7 + follow-redirects: 1.14.9_debug@4.3.2 + requires-port: 1.0.0 + transitivePeerDependencies: + - debug + dev: true + + /http-signature/1.2.0: + resolution: {integrity: sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=} + engines: {node: '>=0.8', npm: '>=1.3.7'} + dependencies: + assert-plus: 1.0.0 + jsprim: 1.4.2 + sshpk: 1.17.0 + dev: true + + /https-proxy-agent/5.0.0: + resolution: {integrity: sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==} + engines: {node: '>= 6'} + dependencies: + agent-base: 6.0.2 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /humanize-ms/1.2.1: + resolution: {integrity: sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=} + dependencies: + ms: 2.1.3 + dev: true + + /iconv-lite/0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: true + + /iconv-lite/0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: true + optional: true + + /ignore/5.2.0: + resolution: {integrity: sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==} + engines: {node: '>= 4'} + dev: true + + /immutable/3.8.2: + resolution: {integrity: sha1-wkOZUUVbs5kT2vKBN28VMOEErfM=} + engines: {node: '>=0.10.0'} + dev: true + + /import-fresh/3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: true + + /imurmurhash/0.1.4: + resolution: {integrity: sha1-khi5srkoojixPcT7a21XbyMUU+o=} + engines: {node: '>=0.8.19'} + dev: true + + /indent-string/4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + dev: true + + /infer-owner/1.0.4: + resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} + dev: true + + /inflight/1.0.6: + resolution: {integrity: sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits/2.0.3: + resolution: {integrity: sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=} + dev: true + + /inherits/2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: true + + /ini/1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: true + + /interpolate/0.1.0: + resolution: {integrity: sha1-tgF3pLqUH7NyTIIZBdmareE9Hfk=} + engines: {node: '>= 0.6.0'} + dev: true + + /invariant/2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + dependencies: + loose-envify: 1.4.0 + dev: true + + /ip/1.1.5: + resolution: {integrity: sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=} + dev: true + + /is-absolute/1.0.0: + resolution: {integrity: sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==} + engines: {node: '>=0.10.0'} + dependencies: + is-relative: 1.0.0 + is-windows: 1.0.2 + dev: true + + /is-accessor-descriptor/0.1.6: + resolution: {integrity: sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + dev: true + + /is-accessor-descriptor/1.0.0: + resolution: {integrity: sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 6.0.3 + dev: true + + /is-arrayish/0.2.1: + resolution: {integrity: sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=} + dev: true + + /is-binary-path/2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: true + + /is-buffer/1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + dev: true + + /is-core-module/2.8.1: + resolution: {integrity: sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==} + dependencies: + has: 1.0.3 + dev: true + + /is-data-descriptor/0.1.4: + resolution: {integrity: sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + dev: true + + /is-data-descriptor/1.0.0: + resolution: {integrity: sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 6.0.3 + dev: true + + /is-descriptor/0.1.6: + resolution: {integrity: sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==} + engines: {node: '>=0.10.0'} + dependencies: + is-accessor-descriptor: 0.1.6 + is-data-descriptor: 0.1.4 + kind-of: 5.1.0 + dev: true + + /is-descriptor/1.0.2: + resolution: {integrity: sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==} + engines: {node: '>=0.10.0'} + dependencies: + is-accessor-descriptor: 1.0.0 + is-data-descriptor: 1.0.0 + kind-of: 6.0.3 + dev: true + + /is-dotfile/1.0.3: + resolution: {integrity: sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=} + engines: {node: '>=0.10.0'} + dev: true + + /is-equal-shallow/0.1.3: + resolution: {integrity: sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=} + engines: {node: '>=0.10.0'} + dependencies: + is-primitive: 2.0.0 + dev: true + + /is-extendable/0.1.1: + resolution: {integrity: sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=} + engines: {node: '>=0.10.0'} + dev: true + + /is-extendable/1.0.1: + resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} + engines: {node: '>=0.10.0'} + dependencies: + is-plain-object: 2.0.4 + dev: true + + /is-extglob/1.0.0: + resolution: {integrity: sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=} + engines: {node: '>=0.10.0'} + dev: true + + /is-extglob/2.1.1: + resolution: {integrity: sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=} + engines: {node: '>=0.10.0'} + dev: true + + /is-finite/1.1.0: + resolution: {integrity: sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==} + engines: {node: '>=0.10.0'} + dev: true + + /is-fullwidth-code-point/3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: true + + /is-glob/2.0.1: + resolution: {integrity: sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 1.0.0 + dev: true + + /is-glob/3.1.0: + resolution: {integrity: sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-glob/4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-lambda/1.0.1: + resolution: {integrity: sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=} + dev: true + + /is-number-like/1.0.8: + resolution: {integrity: sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==} + dependencies: + lodash.isfinite: 3.3.2 + dev: true + + /is-number/2.1.0: + resolution: {integrity: sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + dev: true + + /is-number/3.0.0: + resolution: {integrity: sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + dev: true + + /is-number/4.0.0: + resolution: {integrity: sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-number/7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /is-plain-obj/1.1.0: + resolution: {integrity: sha1-caUMhCnfync8kqOQpKA7OfzVHT4=} + engines: {node: '>=0.10.0'} + dev: true + + /is-plain-object/2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + dev: true + + /is-posix-bracket/0.1.1: + resolution: {integrity: sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=} + engines: {node: '>=0.10.0'} + dev: true + + /is-primitive/2.0.0: + resolution: {integrity: sha1-IHurkWOEmcB7Kt8kCkGochADRXU=} + engines: {node: '>=0.10.0'} + dev: true + + /is-relative/1.0.0: + resolution: {integrity: sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==} + engines: {node: '>=0.10.0'} + dependencies: + is-unc-path: 1.0.0 + dev: true + + /is-stream/1.1.0: + resolution: {integrity: sha1-EtSj3U5o4Lec6428hBc66A2RykQ=} + engines: {node: '>=0.10.0'} + dev: true + + /is-typedarray/1.0.0: + resolution: {integrity: sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=} + dev: true + + /is-unc-path/1.0.0: + resolution: {integrity: sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==} + engines: {node: '>=0.10.0'} + dependencies: + unc-path-regex: 0.1.2 + dev: true + + /is-windows/1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + dev: true + + /is-wsl/1.1.0: + resolution: {integrity: sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=} + engines: {node: '>=4'} + dev: true + + /isarray/1.0.0: + resolution: {integrity: sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=} + dev: true + + /isbinaryfile/4.0.10: + resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==} + engines: {node: '>= 8.0.0'} + dev: true + + /isexe/2.0.0: + resolution: {integrity: sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=} + dev: true + + /isobject/2.1.0: + resolution: {integrity: sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=} + engines: {node: '>=0.10.0'} + dependencies: + isarray: 1.0.0 + dev: true + + /isobject/3.0.1: + resolution: {integrity: sha1-TkMekrEalzFjaqH5yNHMvP2reN8=} + engines: {node: '>=0.10.0'} + dev: true + + /isstream/0.1.2: + resolution: {integrity: sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=} + dev: true + + /jasmine-core/3.99.1: + resolution: {integrity: sha512-Hu1dmuoGcZ7AfyynN3LsfruwMbxMALMka+YtZeGoLuDEySVmVAPaonkNoBRIw/ectu8b9tVQCJNgp4a4knp+tg==} + dev: true + + /jasmine-core/4.1.0: + resolution: {integrity: sha512-8E8BiffCL8sBwK1zU9cbavLe8xpJAgOduSJ6N8PJVv8VosQ/nxVTuXj2kUeHxTlZBVvh24G19ga7xdiaxlceKg==} + dev: true + + /js-base64/2.6.4: + resolution: {integrity: sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==} + dev: true + + /js-tokens/3.0.2: + resolution: {integrity: sha1-mGbfOVECEw449/mWvOtlRDIJwls=} + dev: true + + /js-tokens/4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + dev: true + + /js-yaml/4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: true + + /jsbn/0.1.1: + resolution: {integrity: sha1-peZUwuWi3rXyAdls77yoDA7y9RM=} + dev: true + + /jsesc/1.3.0: + resolution: {integrity: sha1-RsP+yMGJKxKwgz25vHYiF226s0s=} + hasBin: true + dev: true + + /json-parse-even-better-errors/2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + dev: true + + /json-schema-traverse/0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true + + /json-schema/0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + dev: true + + /json-stable-stringify-without-jsonify/1.0.1: + resolution: {integrity: sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=} + dev: true + + /json-stringify-safe/5.0.1: + resolution: {integrity: sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=} + dev: true + + /json5/0.5.1: + resolution: {integrity: sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=} + hasBin: true + dev: true + + /jsonfile/2.4.0: + resolution: {integrity: sha1-NzaitCi4e72gzIO1P6PWM6NcKug=} + optionalDependencies: + graceful-fs: 4.2.10 + dev: true + + /jsonfile/3.0.1: + resolution: {integrity: sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=} + optionalDependencies: + graceful-fs: 4.2.10 + dev: true + + /jsonfile/6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.0 + optionalDependencies: + graceful-fs: 4.2.10 + dev: true + + /jspm-github/0.14.14: + resolution: {integrity: sha512-KqSUVqbyiZAlQ+EPDmRzZ1QUdFs5X8hlvo/bKU9/vyv4MsYcGGD6rOEHzcya0nETinRXQrlCRPfnZt1SzrPotQ==} + dependencies: + bluebird: 3.7.2 + expand-tilde: 1.2.2 + graceful-fs: 4.2.10 + mkdirp: 0.5.6 + netrc: 0.1.4 + request: 2.88.2 + rimraf: 2.7.1 + semver: 5.7.1 + tar-fs: 1.16.3 + which: 1.3.1 + dev: true + + /jspm-npm/0.30.5: + resolution: {integrity: sha512-3ewCGIScE4wXyqRNPg12O/qgs2rrRiLqhD4aJpRySpr+5pyNFIQuBTSbyAwTqAjjBjYEMX1f1KkuUP99Yxz+Xg==} + dependencies: + bluebird: 3.7.2 + buffer-peek-stream: 1.1.0 + graceful-fs: 4.2.10 + mkdirp: 0.5.6 + readdirp: 2.2.1 + request: 2.88.2 + semver: 5.7.1 + tar-fs: 1.16.3 + traceur: 0.0.105 + which: 1.3.1 + dev: true + + /jspm-registry/0.4.4: + resolution: {integrity: sha1-1TFmA1qHzc5YXWK6o5dWhUaZbXA=} + dependencies: + graceful-fs: 4.2.10 + rimraf: 2.7.1 + rsvp: 3.6.2 + semver: 4.3.6 + dev: true + + /jspm/0.17.0-beta.49: + resolution: {integrity: sha512-66Kr63r7VqpwSrmCzpFn0FAwmWH2AmwIkU6Y8rB0ET16zoJo73wxoDfBNPtgT1ONOG7l5gvoUqmT3K4rHtX2Xg==} + hasBin: true + dependencies: + bluebird: 3.7.2 + chalk: 1.1.3 + core-js: 1.2.7 + glob: 6.0.4 + graceful-fs: 4.2.10 + jspm-github: 0.14.14 + jspm-npm: 0.30.5 + jspm-registry: 0.4.4 + liftoff: 2.5.0 + minimatch: 3.1.2 + mkdirp: 0.5.6 + ncp: 2.0.0 + proper-lockfile: 1.2.0 + request: 2.88.2 + rimraf: 2.7.1 + sane: 1.7.0 + semver: 5.7.1 + systemjs: 0.21.4 + systemjs-builder: 0.16.13 + traceur: 0.0.105 + uglify-js: 2.8.29 + dev: true + + /jsprim/1.4.2: + resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} + engines: {node: '>=0.6.0'} + dependencies: + assert-plus: 1.0.0 + extsprintf: 1.3.0 + json-schema: 0.4.0 + verror: 1.10.0 + dev: true + + /karma-jasmine/4.0.2_karma@6.3.18: + resolution: {integrity: sha512-ggi84RMNQffSDmWSyyt4zxzh2CQGwsxvYYsprgyR1j8ikzIduEdOlcLvXjZGwXG/0j41KUXOWsUCBfbEHPWP9g==} + engines: {node: '>= 10'} + peerDependencies: + karma: '*' + dependencies: + jasmine-core: 3.99.1 + karma: 6.3.18 + dev: true + + /karma-jspm/2.2.3: + resolution: {integrity: sha1-uxXNDIwJAkgBE9OWICFXBBWdVQM=} + dependencies: + glob: 7.0.6 + dev: true + + /karma-nyan-reporter/0.2.5_karma@6.3.18: + resolution: {integrity: sha1-qreSXzQWbrzvkwi77hFnn1jdqjE=} + peerDependencies: + karma: '>=0.9' + dependencies: + cli-color: 0.3.3 + karma: 6.3.18 + dev: true + + /karma-phantomjs-launcher/1.0.4_karma@6.3.18: + resolution: {integrity: sha1-0jyjSAG9qYY60xjju0vUBisTrNI=} + peerDependencies: + karma: '>=0.9' + dependencies: + karma: 6.3.18 + lodash: 4.17.21 + phantomjs-prebuilt: 2.1.16 + dev: true + + /karma/6.3.18: + resolution: {integrity: sha512-YEwXVHRILKWKN7uEW9IkgTPjnYGb3YA3MDvlp04xpSRAyrNPoRmsBayLDgHykKAwBm6/mAOckj4xi/1JdQfhzQ==} + engines: {node: '>= 10'} + hasBin: true + dependencies: + '@colors/colors': 1.5.0 + body-parser: 1.20.0 + braces: 3.0.2 + chokidar: 3.5.3 + connect: 3.7.0 + di: 0.0.1 + dom-serialize: 2.2.1 + glob: 7.2.0 + graceful-fs: 4.2.10 + http-proxy: 1.18.1 + isbinaryfile: 4.0.10 + lodash: 4.17.21 + log4js: 6.4.4 + mime: 2.6.0 + minimatch: 3.1.2 + mkdirp: 0.5.6 + qjobs: 1.2.0 + range-parser: 1.2.1 + rimraf: 3.0.2 + socket.io: 4.4.1 + source-map: 0.6.1 + tmp: 0.2.1 + ua-parser-js: 0.7.31 + yargs: 16.2.0 + transitivePeerDependencies: + - bufferutil + - debug + - supports-color + - utf-8-validate + dev: true + + /kew/0.7.0: + resolution: {integrity: sha1-edk9LTM2PW/dKXCzNdkUGtWR15s=} + dev: true + + /kind-of/3.2.2: + resolution: {integrity: sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=} + engines: {node: '>=0.10.0'} + dependencies: + is-buffer: 1.1.6 + dev: true + + /kind-of/4.0.0: + resolution: {integrity: sha1-IIE989cSkosgc3hpGkUGb65y3Vc=} + engines: {node: '>=0.10.0'} + dependencies: + is-buffer: 1.1.6 + dev: true + + /kind-of/5.1.0: + resolution: {integrity: sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==} + engines: {node: '>=0.10.0'} + dev: true + + /kind-of/6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + dev: true + + /klaw/1.3.1: + resolution: {integrity: sha1-QIhDO0azsbolnXh4XY6W9zugJDk=} + optionalDependencies: + graceful-fs: 4.2.10 + dev: true + + /lazy-cache/1.0.4: + resolution: {integrity: sha1-odePw6UEdMuAhF07O24dpJpEbo4=} + engines: {node: '>=0.10.0'} + dev: true + + /levn/0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /liftoff/2.5.0: + resolution: {integrity: sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=} + engines: {node: '>= 0.8'} + dependencies: + extend: 3.0.2 + findup-sync: 2.0.0 + fined: 1.2.0 + flagged-respawn: 1.0.1 + is-plain-object: 2.0.4 + object.map: 1.0.1 + rechoir: 0.6.2 + resolve: 1.22.0 + dev: true + + /lilconfig/2.0.5: + resolution: {integrity: sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==} + engines: {node: '>=10'} + dev: true + + /limiter/1.1.5: + resolution: {integrity: sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==} + dev: true + + /lines-and-columns/1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + dev: true + + /localtunnel/2.0.2: + resolution: {integrity: sha512-n418Cn5ynvJd7m/N1d9WVJISLJF/ellZnfsLnx8WBWGzxv/ntNcFkJ1o6se5quUhCplfLGBNL5tYHiq5WF3Nug==} + engines: {node: '>=8.3.0'} + hasBin: true + dependencies: + axios: 0.21.4_debug@4.3.2 + debug: 4.3.2 + openurl: 1.1.1 + yargs: 17.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /locate-path/5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + dependencies: + p-locate: 4.1.0 + dev: true + + /lodash.isfinite/3.3.2: + resolution: {integrity: sha1-+4m2WpqAKBgz8LdHizpRBPiY67M=} + dev: true + + /lodash.memoize/4.1.2: + resolution: {integrity: sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=} + dev: true + + /lodash.merge/4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true + + /lodash.uniq/4.5.0: + resolution: {integrity: sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=} + dev: true + + /lodash/4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: true + + /log4js/6.4.4: + resolution: {integrity: sha512-ncaWPsuw9Vl1CKA406hVnJLGQKy1OHx6buk8J4rE2lVW+NW5Y82G5/DIloO7NkqLOUtNPEANaWC1kZYVjXssPw==} + engines: {node: '>=8.0'} + dependencies: + date-format: 4.0.6 + debug: 4.3.4 + flatted: 3.2.5 + rfdc: 1.3.0 + streamroller: 3.0.6 + transitivePeerDependencies: + - supports-color + dev: true + + /longest/1.0.1: + resolution: {integrity: sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=} + engines: {node: '>=0.10.0'} + dev: true + + /loose-envify/1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + dependencies: + js-tokens: 4.0.0 + dev: true + + /lru-cache/6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: true + + /lru-queue/0.1.0: + resolution: {integrity: sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=} + dependencies: + es5-ext: 0.10.60 + dev: true + + /make-fetch-happen/9.1.0: + resolution: {integrity: sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==} + engines: {node: '>= 10'} + dependencies: + agentkeepalive: 4.2.1 + cacache: 15.3.0 + http-cache-semantics: 4.1.0 + http-proxy-agent: 4.0.1 + https-proxy-agent: 5.0.0 + is-lambda: 1.0.1 + lru-cache: 6.0.0 + minipass: 3.1.6 + minipass-collect: 1.0.2 + minipass-fetch: 1.4.1 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + negotiator: 0.6.3 + promise-retry: 2.0.1 + socks-proxy-agent: 6.1.1 + ssri: 8.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /make-iterator/1.0.1: + resolution: {integrity: sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 6.0.3 + dev: true + + /makeerror/1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + dependencies: + tmpl: 1.0.5 + dev: true + + /map-cache/0.2.2: + resolution: {integrity: sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=} + engines: {node: '>=0.10.0'} + dev: true + + /map-obj/1.0.1: + resolution: {integrity: sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=} + engines: {node: '>=0.10.0'} + dev: true + + /map-obj/4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + dev: true + + /map-visit/1.0.0: + resolution: {integrity: sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=} + engines: {node: '>=0.10.0'} + dependencies: + object-visit: 1.0.1 + dev: true + + /math-random/1.0.4: + resolution: {integrity: sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==} + dev: true + + /mdn-data/2.0.14: + resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} + dev: true + + /media-typer/0.3.0: + resolution: {integrity: sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=} + engines: {node: '>= 0.6'} + dev: true + + /memoizee/0.3.10: + resolution: {integrity: sha1-TsoNiu057J0Bf0xcLy9kMvQuXI8=} + dependencies: + d: 0.1.1 + es5-ext: 0.10.60 + es6-weak-map: 0.1.4 + event-emitter: 0.3.5 + lru-queue: 0.1.0 + next-tick: 0.2.2 + timers-ext: 0.1.7 + dev: true + + /meow/9.0.0: + resolution: {integrity: sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==} + engines: {node: '>=10'} + dependencies: + '@types/minimist': 1.2.2 + camelcase-keys: 6.2.2 + decamelize: 1.2.0 + decamelize-keys: 1.1.0 + hard-rejection: 2.1.0 + minimist-options: 4.1.0 + normalize-package-data: 3.0.3 + read-pkg-up: 7.0.1 + redent: 3.0.0 + trim-newlines: 3.0.1 + type-fest: 0.18.1 + yargs-parser: 20.2.9 + dev: true + + /merge/1.2.1: + resolution: {integrity: sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==} + dev: true + + /micromatch/2.3.11: + resolution: {integrity: sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=} + engines: {node: '>=0.10.0'} + dependencies: + 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.4 + dev: true + + /micromatch/3.1.10: + resolution: {integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==} + engines: {node: '>=0.10.0'} + dependencies: + arr-diff: 4.0.0 + array-unique: 0.3.2 + braces: 2.3.2 + define-property: 2.0.2 + extend-shallow: 3.0.2 + extglob: 2.0.4 + fragment-cache: 0.2.1 + kind-of: 6.0.3 + nanomatch: 1.2.13 + object.pick: 1.3.0 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + dev: true + + /micromatch/4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: true + + /mime-db/1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + dev: true + + /mime-types/2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + dev: true + + /mime/1.4.1: + resolution: {integrity: sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==} + hasBin: true + dev: true + + /mime/2.6.0: + resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} + engines: {node: '>=4.0.0'} + hasBin: true + dev: true + + /min-indent/1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + dev: true + + /minimatch/3.0.8: + resolution: {integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /minimatch/3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /minimist-options/4.1.0: + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} + dependencies: + arrify: 1.0.1 + is-plain-obj: 1.1.0 + kind-of: 6.0.3 + dev: true + + /minimist/1.2.6: + resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==} + dev: true + + /minipass-collect/1.0.2: + resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.1.6 + dev: true + + /minipass-fetch/1.4.1: + resolution: {integrity: sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==} + engines: {node: '>=8'} + dependencies: + minipass: 3.1.6 + minipass-sized: 1.0.3 + minizlib: 2.1.2 + optionalDependencies: + encoding: 0.1.13 + dev: true + + /minipass-flush/1.0.5: + resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.1.6 + dev: true + + /minipass-pipeline/1.2.4: + resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} + engines: {node: '>=8'} + dependencies: + minipass: 3.1.6 + dev: true + + /minipass-sized/1.0.3: + resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} + engines: {node: '>=8'} + dependencies: + minipass: 3.1.6 + dev: true + + /minipass/3.1.6: + resolution: {integrity: sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==} + engines: {node: '>=8'} + dependencies: + yallist: 4.0.0 + dev: true + + /minizlib/2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.1.6 + yallist: 4.0.0 + dev: true + + /mitt/1.2.0: + resolution: {integrity: sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==} + dev: true + + /mixin-deep/1.3.2: + resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} + engines: {node: '>=0.10.0'} + dependencies: + for-in: 1.0.2 + is-extendable: 1.0.1 + dev: true + + /mkdirp/0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + dependencies: + minimist: 1.2.6 + dev: true + + /mkdirp/1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + dev: true + + /ms/2.0.0: + resolution: {integrity: sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=} + dev: true + + /ms/2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: true + + /ms/2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: true + + /mz/2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + dev: true + + /nan/2.15.0: + resolution: {integrity: sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==} + dev: true + + /nanoid/3.3.2: + resolution: {integrity: sha512-CuHBogktKwpm5g2sRgv83jEy2ijFzBwMoYA60orPDR7ynsLijJDqgsi4RDGj3OJpy3Ieb+LYwiRmIOGyytgITA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + /nanomatch/1.2.13: + resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} + engines: {node: '>=0.10.0'} + dependencies: + 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.3 + object.pick: 1.3.0 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + dev: true + + /natural-compare/1.4.0: + resolution: {integrity: sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=} + dev: true + + /ncp/2.0.0: + resolution: {integrity: sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=} + hasBin: true + dev: true + + /negotiator/0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + dev: true + + /netrc/0.1.4: + resolution: {integrity: sha1-a+lPysqNd63gqWcNxGCRTJRHJEQ=} + dev: true + + /next-tick/0.2.2: + resolution: {integrity: sha1-ddpKkn7liH45BliABltzNkE7MQ0=} + dev: true + + /next-tick/1.1.0: + resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} + dev: true + + /node-gyp/8.4.1: + resolution: {integrity: sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==} + engines: {node: '>= 10.12.0'} + hasBin: true + dependencies: + env-paths: 2.2.1 + glob: 7.2.0 + graceful-fs: 4.2.10 + make-fetch-happen: 9.1.0 + nopt: 5.0.0 + npmlog: 6.0.1 + rimraf: 3.0.2 + semver: 7.3.7 + tar: 6.1.11 + which: 2.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /node-int64/0.4.0: + resolution: {integrity: sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=} + dev: true + + /node-releases/2.0.3: + resolution: {integrity: sha512-maHFz6OLqYxz+VQyCAtA3PTX4UP/53pa05fyDNc9CwjvJ0yEh6+xBwKsgCxMNhS8taUKBFYxfuiaD9U/55iFaw==} + dev: true + + /node-sass/7.0.1: + resolution: {integrity: sha512-uMy+Xt29NlqKCFdFRZyXKOTqGt+QaKHexv9STj2WeLottnlqZEEWx6Bj0MXNthmFRRdM/YwyNo/8Tr46TOM0jQ==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + dependencies: + async-foreach: 0.1.3 + chalk: 4.1.2 + cross-spawn: 7.0.3 + gaze: 1.1.3 + get-stdin: 4.0.1 + glob: 7.2.0 + lodash: 4.17.21 + meow: 9.0.0 + nan: 2.15.0 + node-gyp: 8.4.1 + npmlog: 5.0.1 + request: 2.88.2 + sass-graph: 4.0.0 + stdout-stream: 1.4.1 + true-case-path: 1.0.3 + transitivePeerDependencies: + - supports-color + dev: true + + /nopt/5.0.0: + resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} + engines: {node: '>=6'} + hasBin: true + dependencies: + abbrev: 1.1.1 + dev: true + + /normalize-package-data/2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.0 + semver: 5.7.1 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-package-data/3.0.3: + resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} + engines: {node: '>=10'} + dependencies: + hosted-git-info: 4.1.0 + is-core-module: 2.8.1 + semver: 7.3.7 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-path/2.1.1: + resolution: {integrity: sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=} + engines: {node: '>=0.10.0'} + dependencies: + remove-trailing-separator: 1.1.0 + dev: true + + /normalize-path/3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /normalize-range/0.1.2: + resolution: {integrity: sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=} + engines: {node: '>=0.10.0'} + dev: true + + /normalize-url/6.1.0: + resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} + engines: {node: '>=10'} + dev: true + + /npmlog/5.0.1: + resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} + dependencies: + are-we-there-yet: 2.0.0 + console-control-strings: 1.1.0 + gauge: 3.0.2 + set-blocking: 2.0.0 + dev: true + + /npmlog/6.0.1: + resolution: {integrity: sha512-BTHDvY6nrRHuRfyjt1MAufLxYdVXZfd099H4+i1f0lPywNQyI4foeNXJRObB/uy+TYqUW0vAD9gbdSOXPst7Eg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16} + dependencies: + are-we-there-yet: 3.0.0 + console-control-strings: 1.1.0 + gauge: 4.0.4 + set-blocking: 2.0.0 + dev: true + + /nth-check/2.0.1: + resolution: {integrity: sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==} + dependencies: + boolbase: 1.0.0 + dev: true + + /oauth-sign/0.9.0: + resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} + dev: true + + /object-assign/4.1.1: + resolution: {integrity: sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=} + engines: {node: '>=0.10.0'} + dev: true + + /object-copy/0.1.0: + resolution: {integrity: sha1-fn2Fi3gb18mRpBupde04EnVOmYw=} + engines: {node: '>=0.10.0'} + dependencies: + copy-descriptor: 0.1.1 + define-property: 0.2.5 + kind-of: 3.2.2 + dev: true + + /object-inspect/1.12.0: + resolution: {integrity: sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==} + dev: true + + /object-visit/1.0.1: + resolution: {integrity: sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + dev: true + + /object.defaults/1.1.0: + resolution: {integrity: sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=} + engines: {node: '>=0.10.0'} + dependencies: + array-each: 1.0.1 + array-slice: 1.1.0 + for-own: 1.0.0 + isobject: 3.0.1 + dev: true + + /object.map/1.0.1: + resolution: {integrity: sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=} + engines: {node: '>=0.10.0'} + dependencies: + for-own: 1.0.0 + make-iterator: 1.0.1 + dev: true + + /object.omit/2.0.1: + resolution: {integrity: sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=} + engines: {node: '>=0.10.0'} + dependencies: + for-own: 0.1.5 + is-extendable: 0.1.1 + dev: true + + /object.pick/1.3.0: + resolution: {integrity: sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + dev: true + + /on-finished/2.3.0: + resolution: {integrity: sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=} + engines: {node: '>= 0.8'} + dependencies: + ee-first: 1.1.1 + dev: true + + /on-finished/2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + dependencies: + ee-first: 1.1.1 + dev: true + + /once/1.4.0: + resolution: {integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E=} + dependencies: + wrappy: 1.0.2 + dev: true + + /openurl/1.1.1: + resolution: {integrity: sha1-OHW0sO96UsFW8NtB1GCduw+Us4c=} + dev: true + + /opn/5.3.0: + resolution: {integrity: sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==} + engines: {node: '>=4'} + dependencies: + is-wsl: 1.1.0 + dev: true + + /optionator/0.9.1: + resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} + engines: {node: '>= 0.8.0'} + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.3 + dev: true + + /os-homedir/1.0.2: + resolution: {integrity: sha1-/7xJiDNuDoM94MFox+8VISGqf7M=} + engines: {node: '>=0.10.0'} + dev: true + + /os-tmpdir/1.0.2: + resolution: {integrity: sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=} + engines: {node: '>=0.10.0'} + dev: true + + /p-limit/2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + dependencies: + p-try: 2.2.0 + dev: true + + /p-locate/4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + dependencies: + p-limit: 2.3.0 + dev: true + + /p-map/4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + dependencies: + aggregate-error: 3.1.0 + dev: true + + /p-try/2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + dev: true + + /parent-module/1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + dev: true + + /parse-filepath/1.0.2: + resolution: {integrity: sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=} + engines: {node: '>=0.8'} + dependencies: + is-absolute: 1.0.0 + map-cache: 0.2.2 + path-root: 0.1.1 + dev: true + + /parse-glob/3.0.4: + resolution: {integrity: sha1-ssN2z7EfNVE7rdFz7wu246OIORw=} + engines: {node: '>=0.10.0'} + dependencies: + glob-base: 0.3.0 + is-dotfile: 1.0.3 + is-extglob: 1.0.0 + is-glob: 2.0.1 + dev: true + + /parse-json/5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + dependencies: + '@babel/code-frame': 7.16.7 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + dev: true + + /parse-passwd/1.0.0: + resolution: {integrity: sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=} + engines: {node: '>=0.10.0'} + dev: true + + /parseqs/0.0.6: + resolution: {integrity: sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==} + dev: true + + /parseuri/0.0.6: + resolution: {integrity: sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==} + dev: true + + /parseurl/1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + dev: true + + /pascalcase/0.1.1: + resolution: {integrity: sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=} + engines: {node: '>=0.10.0'} + dev: true + + /path-exists/4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: true + + /path-is-absolute/1.0.1: + resolution: {integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18=} + engines: {node: '>=0.10.0'} + dev: true + + /path-key/3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true + + /path-parse/1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /path-root-regex/0.1.2: + resolution: {integrity: sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=} + engines: {node: '>=0.10.0'} + dev: true + + /path-root/0.1.1: + resolution: {integrity: sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=} + engines: {node: '>=0.10.0'} + dependencies: + path-root-regex: 0.1.2 + dev: true + + /pend/1.2.0: + resolution: {integrity: sha1-elfrVQpng/kRUzH89GY9XI4AelA=} + dev: true + + /performance-now/2.1.0: + resolution: {integrity: sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=} + dev: true + + /phantomjs-prebuilt/2.1.16: + resolution: {integrity: sha1-79ISpKOWbTZHaE6ouniFSb4q7+8=} + deprecated: this package is now deprecated + hasBin: true + requiresBuild: true + dependencies: + es6-promise: 4.2.8 + extract-zip: 1.7.0 + fs-extra: 1.0.0 + hasha: 2.2.0 + kew: 0.7.0 + progress: 1.1.8 + request: 2.88.2 + request-progress: 2.0.1 + which: 1.3.1 + dev: true + + /picocolors/1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: true + + /picomatch/2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + + /pinkie-promise/2.0.1: + resolution: {integrity: sha1-ITXW36ejWMBprJsXh3YogihFD/o=} + engines: {node: '>=0.10.0'} + dependencies: + pinkie: 2.0.4 + dev: true + + /pinkie/2.0.4: + resolution: {integrity: sha1-clVrgM+g1IqXToDnckjoDtT3+HA=} + engines: {node: '>=0.10.0'} + dev: true + + /portscanner/2.1.1: + resolution: {integrity: sha1-6rtAnk3iSVD1oqUW01rnaTQ/u5Y=} + engines: {node: '>=0.4', npm: '>=1.0.0'} + dependencies: + async: 1.5.2 + is-number-like: 1.0.8 + dev: true + + /posix-character-classes/0.1.1: + resolution: {integrity: sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=} + engines: {node: '>=0.10.0'} + dev: true + + /postcss-calc/8.2.4_postcss@8.4.12: + resolution: {integrity: sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==} + peerDependencies: + postcss: ^8.2.2 + dependencies: + postcss: 8.4.12 + postcss-selector-parser: 6.0.10 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-colormin/5.3.0_postcss@8.4.12: + resolution: {integrity: sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.20.2 + caniuse-api: 3.0.0 + colord: 2.9.2 + postcss: 8.4.12 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-convert-values/5.1.0_postcss@8.4.12: + resolution: {integrity: sha512-GkyPbZEYJiWtQB0KZ0X6qusqFHUepguBCNFi9t5JJc7I2OTXG7C0twbTLvCfaKOLl3rSXmpAwV7W5txd91V84g==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.12 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-discard-comments/5.1.1_postcss@8.4.12: + resolution: {integrity: sha512-5JscyFmvkUxz/5/+TB3QTTT9Gi9jHkcn8dcmmuN68JQcv3aQg4y88yEHHhwFB52l/NkaJ43O0dbksGMAo49nfQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.12 + dev: true + + /postcss-discard-duplicates/5.1.0_postcss@8.4.12: + resolution: {integrity: sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.12 + dev: true + + /postcss-discard-empty/5.1.1_postcss@8.4.12: + resolution: {integrity: sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.12 + dev: true + + /postcss-discard-overridden/5.1.0_postcss@8.4.12: + resolution: {integrity: sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.12 + dev: true + + /postcss-merge-longhand/5.1.4_postcss@8.4.12: + resolution: {integrity: sha512-hbqRRqYfmXoGpzYKeW0/NCZhvNyQIlQeWVSao5iKWdyx7skLvCfQFGIUsP9NUs3dSbPac2IC4Go85/zG+7MlmA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.12 + postcss-value-parser: 4.2.0 + stylehacks: 5.1.0_postcss@8.4.12 + dev: true + + /postcss-merge-rules/5.1.1_postcss@8.4.12: + resolution: {integrity: sha512-8wv8q2cXjEuCcgpIB1Xx1pIy8/rhMPIQqYKNzEdyx37m6gpq83mQQdCxgIkFgliyEnKvdwJf/C61vN4tQDq4Ww==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.20.2 + caniuse-api: 3.0.0 + cssnano-utils: 3.1.0_postcss@8.4.12 + postcss: 8.4.12 + postcss-selector-parser: 6.0.10 + dev: true + + /postcss-minify-font-values/5.1.0_postcss@8.4.12: + resolution: {integrity: sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.12 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-minify-gradients/5.1.1_postcss@8.4.12: + resolution: {integrity: sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + colord: 2.9.2 + cssnano-utils: 3.1.0_postcss@8.4.12 + postcss: 8.4.12 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-minify-params/5.1.2_postcss@8.4.12: + resolution: {integrity: sha512-aEP+p71S/urY48HWaRHasyx4WHQJyOYaKpQ6eXl8k0kxg66Wt/30VR6/woh8THgcpRbonJD5IeD+CzNhPi1L8g==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.20.2 + cssnano-utils: 3.1.0_postcss@8.4.12 + postcss: 8.4.12 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-minify-selectors/5.2.0_postcss@8.4.12: + resolution: {integrity: sha512-vYxvHkW+iULstA+ctVNx0VoRAR4THQQRkG77o0oa4/mBS0OzGvvzLIvHDv/nNEM0crzN2WIyFU5X7wZhaUK3RA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.12 + postcss-selector-parser: 6.0.10 + dev: true + + /postcss-normalize-charset/5.1.0_postcss@8.4.12: + resolution: {integrity: sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.12 + dev: true + + /postcss-normalize-display-values/5.1.0_postcss@8.4.12: + resolution: {integrity: sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.12 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-normalize-positions/5.1.0_postcss@8.4.12: + resolution: {integrity: sha512-8gmItgA4H5xiUxgN/3TVvXRoJxkAWLW6f/KKhdsH03atg0cB8ilXnrB5PpSshwVu/dD2ZsRFQcR1OEmSBDAgcQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.12 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-normalize-repeat-style/5.1.0_postcss@8.4.12: + resolution: {integrity: sha512-IR3uBjc+7mcWGL6CtniKNQ4Rr5fTxwkaDHwMBDGGs1x9IVRkYIT/M4NelZWkAOBdV6v3Z9S46zqaKGlyzHSchw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.12 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-normalize-string/5.1.0_postcss@8.4.12: + resolution: {integrity: sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.12 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-normalize-timing-functions/5.1.0_postcss@8.4.12: + resolution: {integrity: sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.12 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-normalize-unicode/5.1.0_postcss@8.4.12: + resolution: {integrity: sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.20.2 + postcss: 8.4.12 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-normalize-url/5.1.0_postcss@8.4.12: + resolution: {integrity: sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + normalize-url: 6.1.0 + postcss: 8.4.12 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-normalize-whitespace/5.1.1_postcss@8.4.12: + resolution: {integrity: sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.12 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-ordered-values/5.1.1_postcss@8.4.12: + resolution: {integrity: sha512-7lxgXF0NaoMIgyihL/2boNAEZKiW0+HkMhdKMTD93CjW8TdCy2hSdj8lsAo+uwm7EDG16Da2Jdmtqpedl0cMfw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + cssnano-utils: 3.1.0_postcss@8.4.12 + postcss: 8.4.12 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-reduce-initial/5.1.0_postcss@8.4.12: + resolution: {integrity: sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.20.2 + caniuse-api: 3.0.0 + postcss: 8.4.12 + dev: true + + /postcss-reduce-transforms/5.1.0_postcss@8.4.12: + resolution: {integrity: sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.12 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-selector-parser/6.0.10: + resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} + engines: {node: '>=4'} + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + dev: true + + /postcss-svgo/5.1.0_postcss@8.4.12: + resolution: {integrity: sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.12 + postcss-value-parser: 4.2.0 + svgo: 2.8.0 + dev: true + + /postcss-unique-selectors/5.1.1_postcss@8.4.12: + resolution: {integrity: sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.12 + postcss-selector-parser: 6.0.10 + dev: true + + /postcss-value-parser/4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + dev: true + + /postcss/8.4.12: + resolution: {integrity: sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.2 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + + /prelude-ls/1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + dev: true + + /preserve/0.2.0: + resolution: {integrity: sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=} + engines: {node: '>=0.10.0'} + dev: true + + /private/0.1.8: + resolution: {integrity: sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==} + engines: {node: '>= 0.6'} + dev: true + + /process-nextick-args/2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + dev: true + + /progress/1.1.8: + resolution: {integrity: sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=} + engines: {node: '>=0.4.0'} + dev: true + + /promise-inflight/1.0.1: + resolution: {integrity: sha1-mEcocL8igTL8vdhoEputEsPAKeM=} + dev: true + + /promise-retry/2.0.1: + resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} + engines: {node: '>=10'} + dependencies: + err-code: 2.0.3 + retry: 0.12.0 + dev: true + + /proper-lockfile/1.2.0: + resolution: {integrity: sha1-zv9d2J0+XxD7deHo52vHWAGlnDQ=} + dependencies: + err-code: 1.1.2 + extend: 3.0.2 + graceful-fs: 4.2.10 + retry: 0.10.1 + dev: true + + /psl/1.8.0: + resolution: {integrity: sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==} + dev: true + + /pump/1.0.3: + resolution: {integrity: sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: true + + /punycode/2.1.1: + resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==} + engines: {node: '>=6'} + dev: true + + /qjobs/1.2.0: + resolution: {integrity: sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==} + engines: {node: '>=0.9'} + dev: true + + /qs/6.10.3: + resolution: {integrity: sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.4 + dev: true + + /qs/6.2.3: + resolution: {integrity: sha1-HPyyXBCpsrSDBT/zn138kjOQjP4=} + engines: {node: '>=0.6'} + dev: true + + /qs/6.5.3: + resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} + engines: {node: '>=0.6'} + dev: true + + /quick-lru/4.0.1: + resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} + engines: {node: '>=8'} + dev: true + + /randomatic/3.1.1: + resolution: {integrity: sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==} + engines: {node: '>= 0.10.0'} + dependencies: + is-number: 4.0.0 + kind-of: 6.0.3 + math-random: 1.0.4 + dev: true + + /range-parser/1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + dev: true + + /raw-body/2.5.1: + resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} + engines: {node: '>= 0.8'} + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + dev: true + + /read-pkg-up/7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 + dev: true + + /read-pkg/5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + dependencies: + '@types/normalize-package-data': 2.4.1 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 + dev: true + + /readable-stream/2.3.7: + resolution: {integrity: sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + dev: true + + /readable-stream/3.6.0: + resolution: {integrity: sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: true + + /readdirp/2.2.1: + resolution: {integrity: sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==} + engines: {node: '>=0.10'} + dependencies: + graceful-fs: 4.2.10 + micromatch: 3.1.10 + readable-stream: 2.3.7 + dev: true + + /readdirp/3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + + /rechoir/0.6.2: + resolution: {integrity: sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=} + engines: {node: '>= 0.10'} + dependencies: + resolve: 1.22.0 + dev: true + + /redent/3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + dev: true + + /regenerator-runtime/0.11.1: + resolution: {integrity: sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==} + dev: true + + /regex-cache/0.4.4: + resolution: {integrity: sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==} + engines: {node: '>=0.10.0'} + dependencies: + is-equal-shallow: 0.1.3 + dev: true + + /regex-not/1.0.2: + resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 3.0.2 + safe-regex: 1.1.0 + dev: true + + /regexpp/3.2.0: + resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} + engines: {node: '>=8'} + dev: true + + /remove-trailing-separator/1.1.0: + resolution: {integrity: sha1-wkvOKig62tW8P1jg1IJJuSN52O8=} + dev: true + + /repeat-element/1.1.4: + resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==} + engines: {node: '>=0.10.0'} + dev: true + + /repeat-string/1.6.1: + resolution: {integrity: sha1-jcrkcOHIirwtYA//Sndihtp15jc=} + engines: {node: '>=0.10'} + dev: true + + /repeating/2.0.1: + resolution: {integrity: sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=} + engines: {node: '>=0.10.0'} + dependencies: + is-finite: 1.1.0 + dev: true + + /request-progress/2.0.1: + resolution: {integrity: sha1-XTa7V5YcZzqlt4jbyBQf3yO0Tgg=} + dependencies: + throttleit: 1.0.0 + dev: true + + /request/2.88.2: + resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==} + engines: {node: '>= 6'} + deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 + dependencies: + aws-sign2: 0.7.0 + aws4: 1.11.0 + caseless: 0.12.0 + combined-stream: 1.0.8 + extend: 3.0.2 + forever-agent: 0.6.1 + form-data: 2.3.3 + har-validator: 5.1.5 + http-signature: 1.2.0 + is-typedarray: 1.0.0 + isstream: 0.1.2 + json-stringify-safe: 5.0.1 + mime-types: 2.1.35 + oauth-sign: 0.9.0 + performance-now: 2.1.0 + qs: 6.5.3 + safe-buffer: 5.2.1 + tough-cookie: 2.5.0 + tunnel-agent: 0.6.0 + uuid: 3.4.0 + dev: true + + /require-directory/2.1.1: + resolution: {integrity: sha1-jGStX9MNqxyXbiNE/+f3kqam30I=} + engines: {node: '>=0.10.0'} + dev: true + + /requires-port/1.0.0: + resolution: {integrity: sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=} + dev: true + + /resolve-dir/1.0.1: + resolution: {integrity: sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=} + engines: {node: '>=0.10.0'} + dependencies: + expand-tilde: 2.0.2 + global-modules: 1.0.0 + dev: true + + /resolve-from/4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: true + + /resolve-url/0.2.1: + resolution: {integrity: sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=} + deprecated: https://github.com/lydell/resolve-url#deprecated + dev: true + + /resolve/1.22.0: + resolution: {integrity: sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==} + hasBin: true + dependencies: + is-core-module: 2.8.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /resp-modifier/6.0.2: + resolution: {integrity: sha1-sSTeXE+6/LpUH0j/pzlw9KpFa08=} + engines: {node: '>= 0.8.0'} + dependencies: + debug: 2.6.9 + minimatch: 3.1.2 + dev: true + + /ret/0.1.15: + resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} + engines: {node: '>=0.12'} + dev: true + + /retry/0.10.1: + resolution: {integrity: sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=} + dev: true + + /retry/0.12.0: + resolution: {integrity: sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=} + engines: {node: '>= 4'} + dev: true + + /rfdc/1.3.0: + resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} + dev: true + + /right-align/0.1.3: + resolution: {integrity: sha1-YTObci/mo1FWiSENJOFMlhSGE+8=} + engines: {node: '>=0.10.0'} + dependencies: + align-text: 0.1.4 + dev: true + + /rimraf/2.7.1: + resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + hasBin: true + dependencies: + glob: 7.2.0 + dev: true + + /rimraf/3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.0 + dev: true + + /rollup/0.58.2: + resolution: {integrity: sha512-RZVvCWm9BHOYloaE6LLiE/ibpjv1CmI8F8k0B0Cp+q1eezo3cswszJH1DN0djgzSlo0hjuuCmyeI+1XOYLl4wg==} + hasBin: true + dependencies: + '@types/estree': 0.0.38 + '@types/node': 17.0.23 + dev: true + + /rsvp/3.6.2: + resolution: {integrity: sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==} + engines: {node: 0.12.* || 4.* || 6.* || >= 7.*} + dev: true + + /rx/4.1.0: + resolution: {integrity: sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=} + dev: true + + /rxjs/5.5.12: + resolution: {integrity: sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==} + engines: {npm: '>=2.0.0'} + dependencies: + symbol-observable: 1.0.1 + dev: true + + /safe-buffer/5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + dev: true + + /safe-buffer/5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: true + + /safe-regex/1.1.0: + resolution: {integrity: sha1-QKNmnzsHfR6UPURinhV91IAjvy4=} + dependencies: + ret: 0.1.15 + dev: true + + /safer-buffer/2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + dev: true + + /sane/1.7.0: + resolution: {integrity: sha1-s1ebzLRclM8gNVzIESSZDf00bjA=} + engines: {node: '>=0.6.0'} + deprecated: some dependency vulnerabilities fixed, support for node < 10 dropped, and newer ECMAScript syntax/features added + hasBin: true + dependencies: + anymatch: 1.3.2 + exec-sh: 0.2.2 + fb-watchman: 2.0.1 + minimatch: 3.1.2 + minimist: 1.2.6 + walker: 1.0.8 + watch: 0.10.0 + dev: true + + /sass-graph/4.0.0: + resolution: {integrity: sha512-WSO/MfXqKH7/TS8RdkCX3lVkPFQzCgbqdGsmSKq6tlPU+GpGEsa/5aW18JqItnqh+lPtcjifqdZ/VmiILkKckQ==} + engines: {node: '>=12'} + hasBin: true + dependencies: + glob: 7.2.0 + lodash: 4.17.21 + scss-tokenizer: 0.3.0 + yargs: 17.4.1 + dev: true + + /scss-tokenizer/0.3.0: + resolution: {integrity: sha512-14Zl9GcbBvOT9057ZKjpz5yPOyUWG2ojd9D5io28wHRYsOrs7U95Q+KNL87+32p8rc+LvDpbu/i9ZYjM9Q+FsQ==} + dependencies: + js-base64: 2.6.4 + source-map: 0.7.3 + dev: true + + /semver/4.3.6: + resolution: {integrity: sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=} + hasBin: true + dev: true + + /semver/5.7.1: + resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} + hasBin: true + dev: true + + /semver/7.3.7: + resolution: {integrity: sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /send/0.16.2: + resolution: {integrity: sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==} + engines: {node: '>= 0.8.0'} + dependencies: + 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.3 + mime: 1.4.1 + ms: 2.0.0 + on-finished: 2.3.0 + range-parser: 1.2.1 + statuses: 1.4.0 + dev: true + + /serve-index/1.9.1: + resolution: {integrity: sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=} + engines: {node: '>= 0.8.0'} + dependencies: + accepts: 1.3.8 + batch: 0.6.1 + debug: 2.6.9 + escape-html: 1.0.3 + http-errors: 1.6.3 + mime-types: 2.1.35 + parseurl: 1.3.3 + dev: true + + /serve-static/1.13.2: + resolution: {integrity: sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==} + engines: {node: '>= 0.8.0'} + dependencies: + encodeurl: 1.0.2 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.16.2 + dev: true + + /server-destroy/1.0.1: + resolution: {integrity: sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0=} + dev: true + + /set-blocking/2.0.0: + resolution: {integrity: sha1-BF+XgtARrppoA93TgrJDkrPYkPc=} + dev: true + + /set-value/2.0.1: + resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 2.0.1 + is-extendable: 0.1.1 + is-plain-object: 2.0.4 + split-string: 3.1.0 + dev: true + + /setprototypeof/1.1.0: + resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} + dev: true + + /setprototypeof/1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + dev: true + + /shebang-command/2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: true + + /shebang-regex/3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: true + + /side-channel/1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.1.1 + object-inspect: 1.12.0 + dev: true + + /signal-exit/3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: true + + /slash/1.0.0: + resolution: {integrity: sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=} + engines: {node: '>=0.10.0'} + dev: true + + /smart-buffer/4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + dev: true + + /snapdragon-node/2.1.1: + resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==} + engines: {node: '>=0.10.0'} + dependencies: + define-property: 1.0.0 + isobject: 3.0.1 + snapdragon-util: 3.0.1 + dev: true + + /snapdragon-util/3.0.1: + resolution: {integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + dev: true + + /snapdragon/0.8.2: + resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==} + engines: {node: '>=0.10.0'} + dependencies: + base: 0.11.2 + debug: 2.6.9 + define-property: 0.2.5 + extend-shallow: 2.0.1 + map-cache: 0.2.2 + source-map: 0.5.7 + source-map-resolve: 0.5.3 + use: 3.1.1 + dev: true + + /socket.io-adapter/2.3.3: + resolution: {integrity: sha512-Qd/iwn3VskrpNO60BeRyCyr8ZWw9CPZyitW4AQwmRZ8zCiyDiL+znRnWX6tDHXnWn1sJrM1+b6Mn6wEDJJ4aYQ==} + dev: true + + /socket.io-client/4.4.1: + resolution: {integrity: sha512-N5C/L5fLNha5Ojd7Yeb/puKcPWWcoB/A09fEjjNsg91EDVr5twk/OEyO6VT9dlLSUNY85NpW6KBhVMvaLKQ3vQ==} + engines: {node: '>=10.0.0'} + dependencies: + '@socket.io/component-emitter': 3.0.0 + backo2: 1.0.2 + debug: 4.3.4 + engine.io-client: 6.1.1 + parseuri: 0.0.6 + socket.io-parser: 4.1.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + /socket.io-parser/4.0.4: + resolution: {integrity: sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==} + engines: {node: '>=10.0.0'} + dependencies: + '@types/component-emitter': 1.2.11 + component-emitter: 1.3.0 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /socket.io-parser/4.1.2: + resolution: {integrity: sha512-j3kk71QLJuyQ/hh5F/L2t1goqzdTL0gvDzuhTuNSwihfuFUrcSji0qFZmJJPtG6Rmug153eOPsUizeirf1IIog==} + engines: {node: '>=10.0.0'} + dependencies: + '@socket.io/component-emitter': 3.0.0 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /socket.io/4.4.1: + resolution: {integrity: sha512-s04vrBswdQBUmuWJuuNTmXUVJhP0cVky8bBDhdkf8y0Ptsu7fKU2LuLbts9g+pdmAdyMMn8F/9Mf1/wbtUN0fg==} + engines: {node: '>=10.0.0'} + dependencies: + accepts: 1.3.8 + base64id: 2.0.0 + debug: 4.3.4 + engine.io: 6.1.3 + socket.io-adapter: 2.3.3 + socket.io-parser: 4.0.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + /socks-proxy-agent/6.1.1: + resolution: {integrity: sha512-t8J0kG3csjA4g6FTbsMOWws+7R7vuRC8aQ/wy3/1OWmsgwA68zs/+cExQ0koSitUDXqhufF/YJr9wtNMZHw5Ew==} + engines: {node: '>= 10'} + dependencies: + agent-base: 6.0.2 + debug: 4.3.4 + socks: 2.6.2 + transitivePeerDependencies: + - supports-color + dev: true + + /socks/2.6.2: + resolution: {integrity: sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==} + engines: {node: '>= 10.13.0', npm: '>= 3.0.0'} + dependencies: + ip: 1.1.5 + smart-buffer: 4.2.0 + dev: true + + /source-map-js/1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: true + + /source-map-resolve/0.5.3: + resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} + deprecated: See https://github.com/lydell/source-map-resolve#deprecated + dependencies: + atob: 2.1.2 + decode-uri-component: 0.2.0 + resolve-url: 0.2.1 + source-map-url: 0.4.1 + urix: 0.1.0 + dev: true + + /source-map-support/0.2.10: + resolution: {integrity: sha1-6lo5AKHByyUJagrozFwrSxDe09w=} + dependencies: + source-map: 0.1.32 + dev: true + + /source-map-support/0.4.18: + resolution: {integrity: sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==} + dependencies: + source-map: 0.5.7 + dev: true + + /source-map-url/0.4.1: + resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==} + deprecated: See https://github.com/lydell/source-map-url#deprecated + dev: true + + /source-map/0.1.32: + resolution: {integrity: sha1-yLbBZ3l7pHQKjqMyUhYv8IWRsmY=} + engines: {node: '>=0.8.0'} + dependencies: + amdefine: 1.0.1 + dev: true + + /source-map/0.5.7: + resolution: {integrity: sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=} + engines: {node: '>=0.10.0'} + dev: true + + /source-map/0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + dev: true + + /source-map/0.7.3: + resolution: {integrity: sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==} + engines: {node: '>= 8'} + dev: true + + /spdx-correct/3.1.1: + resolution: {integrity: sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==} + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.11 + dev: true + + /spdx-exceptions/2.3.0: + resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + dev: true + + /spdx-expression-parse/3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + dependencies: + spdx-exceptions: 2.3.0 + spdx-license-ids: 3.0.11 + dev: true + + /spdx-license-ids/3.0.11: + resolution: {integrity: sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==} + dev: true + + /split-string/3.1.0: + resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 3.0.2 + dev: true + + /sshpk/1.17.0: + resolution: {integrity: sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==} + engines: {node: '>=0.10.0'} + hasBin: true + dependencies: + asn1: 0.2.6 + assert-plus: 1.0.0 + bcrypt-pbkdf: 1.0.2 + dashdash: 1.14.1 + ecc-jsbn: 0.1.2 + getpass: 0.1.7 + jsbn: 0.1.1 + safer-buffer: 2.1.2 + tweetnacl: 0.14.5 + dev: true + + /ssri/8.0.1: + resolution: {integrity: sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.1.6 + dev: true + + /stable/0.1.8: + resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} + dev: true + + /static-extend/0.1.2: + resolution: {integrity: sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=} + engines: {node: '>=0.10.0'} + dependencies: + define-property: 0.2.5 + object-copy: 0.1.0 + dev: true + + /statuses/1.3.1: + resolution: {integrity: sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=} + engines: {node: '>= 0.6'} + dev: true + + /statuses/1.4.0: + resolution: {integrity: sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==} + engines: {node: '>= 0.6'} + dev: true + + /statuses/1.5.0: + resolution: {integrity: sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=} + engines: {node: '>= 0.6'} + dev: true + + /statuses/2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + dev: true + + /stdout-stream/1.4.1: + resolution: {integrity: sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==} + dependencies: + readable-stream: 2.3.7 + dev: true + + /stream-throttle/0.1.3: + resolution: {integrity: sha1-rdV8jXzHOoFjDTHNVdOWHPr7qcM=} + engines: {node: '>= 0.10.0'} + hasBin: true + dependencies: + commander: 2.20.3 + limiter: 1.1.5 + dev: true + + /streamroller/3.0.6: + resolution: {integrity: sha512-Qz32plKq/MZywYyhEatxyYc8vs994Gz0Hu2MSYXXLD233UyPeIeRBZARIIGwFer4Mdb8r3Y2UqKkgyDghM6QCg==} + engines: {node: '>=8.0'} + dependencies: + date-format: 4.0.6 + debug: 4.3.4 + fs-extra: 10.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /string-width/4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: true + + /string_decoder/1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + dependencies: + safe-buffer: 5.1.2 + dev: true + + /string_decoder/1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /strip-ansi/3.0.1: + resolution: {integrity: sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=} + engines: {node: '>=0.10.0'} + dependencies: + ansi-regex: 2.1.1 + dev: true + + /strip-ansi/6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: true + + /strip-indent/3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + dependencies: + min-indent: 1.0.1 + dev: true + + /strip-json-comments/3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + dev: true + + /stylehacks/5.1.0_postcss@8.4.12: + resolution: {integrity: sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.20.2 + postcss: 8.4.12 + postcss-selector-parser: 6.0.10 + dev: true + + /supports-color/2.0.0: + resolution: {integrity: sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=} + engines: {node: '>=0.8.0'} + dev: true + + /supports-color/5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + dev: true + + /supports-color/7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-preserve-symlinks-flag/1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /svgo/2.8.0: + resolution: {integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==} + engines: {node: '>=10.13.0'} + hasBin: true + dependencies: + '@trysound/sax': 0.2.0 + commander: 7.2.0 + css-select: 4.3.0 + css-tree: 1.1.3 + csso: 4.2.0 + picocolors: 1.0.0 + stable: 0.1.8 + dev: true + + /symbol-observable/1.0.1: + resolution: {integrity: sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=} + engines: {node: '>=0.10.0'} + dev: true + + /systemjs-builder/0.16.13: + resolution: {integrity: sha512-ual5RmcBt7yeXrmpEQIHmITZpNIf289hCTixo/gSOQpdVLLC5v7/W//qn3ZgK6YNdUBptS4szaGVrh7LxOqSHg==} + dependencies: + babel-core: 6.26.3 + babel-plugin-syntax-dynamic-import: 6.18.0 + babel-plugin-transform-amd-system-wrapper: 0.3.7 + babel-plugin-transform-cjs-system-wrapper: 0.6.2 + babel-plugin-transform-es2015-modules-systemjs: 6.24.1 + babel-plugin-transform-global-system-wrapper: 0.3.4 + babel-plugin-transform-system-register: 0.0.1 + bluebird: 3.7.2 + data-uri-to-buffer: 0.0.4 + es6-template-strings: 2.0.1 + glob: 7.2.0 + mkdirp: 0.5.6 + rollup: 0.58.2 + source-map: 0.5.7 + systemjs: 0.19.47 + traceur: 0.0.105 + uglify-js: 2.8.29 + dev: true + + /systemjs/0.19.47: + resolution: {integrity: sha1-yMk5NxgPP1SBx2nNJyB2P7SjHG8=} + dependencies: + when: 3.7.8 + dev: true + + /systemjs/0.21.4: + resolution: {integrity: sha512-l1O8boHjAIY5UG74Xk4B63LK9QbFxv/FkQa//GGGWaTeQoMhTsWnFrYwPWBScSF4xQFMO/+v9QB4i633h8Oytw==} + dev: true + + /tar-fs/1.16.3: + resolution: {integrity: sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw==} + dependencies: + chownr: 1.1.4 + mkdirp: 0.5.6 + pump: 1.0.3 + tar-stream: 1.6.2 + dev: true + + /tar-stream/1.6.2: + resolution: {integrity: sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==} + engines: {node: '>= 0.8.0'} + dependencies: + bl: 1.2.3 + buffer-alloc: 1.2.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + readable-stream: 2.3.7 + to-buffer: 1.1.1 + xtend: 4.0.2 + dev: true + + /tar/6.1.11: + resolution: {integrity: sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==} + engines: {node: '>= 10'} + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 3.1.6 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + dev: true + + /text-table/0.2.0: + resolution: {integrity: sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=} + dev: true + + /tfunk/4.0.0: + resolution: {integrity: sha512-eJQ0dGfDIzWNiFNYFVjJ+Ezl/GmwHaFTBTjrtqNPW0S7cuVDBrZrmzUz6VkMeCR4DZFqhd4YtLwsw3i2wYHswQ==} + dependencies: + chalk: 1.1.3 + dlv: 1.1.3 + dev: true + + /thenify-all/1.6.0: + resolution: {integrity: sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=} + engines: {node: '>=0.8'} + dependencies: + thenify: 3.3.1 + dev: true + + /thenify/3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + dependencies: + any-promise: 1.3.0 + dev: true + + /throttleit/1.0.0: + resolution: {integrity: sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=} + dev: true + + /timers-ext/0.1.7: + resolution: {integrity: sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==} + dependencies: + es5-ext: 0.10.60 + next-tick: 1.1.0 + dev: true + + /tmp/0.2.1: + resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==} + engines: {node: '>=8.17.0'} + dependencies: + rimraf: 3.0.2 + dev: true + + /tmpl/1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + dev: true + + /to-buffer/1.1.1: + resolution: {integrity: sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==} + dev: true + + /to-fast-properties/1.0.3: + resolution: {integrity: sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=} + engines: {node: '>=0.10.0'} + dev: true + + /to-object-path/0.3.0: + resolution: {integrity: sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + dev: true + + /to-regex-range/2.1.1: + resolution: {integrity: sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=} + engines: {node: '>=0.10.0'} + dependencies: + is-number: 3.0.0 + repeat-string: 1.6.1 + dev: true + + /to-regex-range/5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: true + + /to-regex/3.0.2: + resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==} + engines: {node: '>=0.10.0'} + dependencies: + define-property: 2.0.2 + extend-shallow: 3.0.2 + regex-not: 1.0.2 + safe-regex: 1.1.0 + dev: true + + /toidentifier/1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + dev: true + + /tough-cookie/2.5.0: + resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} + engines: {node: '>=0.8'} + dependencies: + psl: 1.8.0 + punycode: 2.1.1 + dev: true + + /traceur/0.0.105: + resolution: {integrity: sha1-XPne6D1rd4YcPWxE1ThZrterBHk=} + engines: {node: '>=0.10'} + hasBin: true + dependencies: + commander: 2.9.0 + glob: 5.0.15 + rsvp: 3.6.2 + semver: 4.3.6 + source-map-support: 0.2.10 + dev: true + + /trim-newlines/3.0.1: + resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} + engines: {node: '>=8'} + dev: true + + /trim-right/1.0.1: + resolution: {integrity: sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=} + engines: {node: '>=0.10.0'} + dev: true + + /true-case-path/1.0.3: + resolution: {integrity: sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==} + dependencies: + glob: 7.2.0 + dev: true + + /tunnel-agent/0.6.0: + resolution: {integrity: sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /tweetnacl/0.14.5: + resolution: {integrity: sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=} + dev: true + + /type-check/0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + dev: true + + /type-fest/0.18.1: + resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} + engines: {node: '>=10'} + dev: true + + /type-fest/0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + dev: true + + /type-fest/0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + dev: true + + /type-fest/0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + dev: true + + /type-is/1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + dev: true + + /type/1.2.0: + resolution: {integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==} + dev: true + + /type/2.6.0: + resolution: {integrity: sha512-eiDBDOmkih5pMbo9OqsqPRGMljLodLcwd5XD5JbtNB0o89xZAwynY9EdCDsJU7LtcVCClu9DvM7/0Ep1hYX3EQ==} + dev: true + + /typedarray/0.0.6: + resolution: {integrity: sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=} + dev: true + + /ua-parser-js/0.7.31: + resolution: {integrity: sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==} + dev: true + + /ua-parser-js/1.0.2: + resolution: {integrity: sha512-00y/AXhx0/SsnI51fTc0rLRmafiGOM4/O+ny10Ps7f+j/b8p/ZY11ytMgznXkOVo4GQ+KwQG5UQLkLGirsACRg==} + dev: true + + /uglify-js/2.8.29: + resolution: {integrity: sha1-KcVzMUgFe7Th913zW3qcty5qWd0=} + engines: {node: '>=0.8.0'} + hasBin: true + dependencies: + source-map: 0.5.7 + yargs: 3.10.0 + optionalDependencies: + uglify-to-browserify: 1.0.2 + dev: true + + /uglify-to-browserify/1.0.2: + resolution: {integrity: sha1-bgkk1r2mta/jSeOabWMoUKD4grc=} + requiresBuild: true + dev: true + optional: true + + /unc-path-regex/0.1.2: + resolution: {integrity: sha1-5z3T17DXxe2G+6xrCufYxqadUPo=} + engines: {node: '>=0.10.0'} + dev: true + + /union-value/1.0.1: + resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} + engines: {node: '>=0.10.0'} + dependencies: + arr-union: 3.1.0 + get-value: 2.0.6 + is-extendable: 0.1.1 + set-value: 2.0.1 + dev: true + + /unique-filename/1.1.1: + resolution: {integrity: sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==} + dependencies: + unique-slug: 2.0.2 + dev: true + + /unique-slug/2.0.2: + resolution: {integrity: sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==} + dependencies: + imurmurhash: 0.1.4 + dev: true + + /universalify/0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + dev: true + + /universalify/2.0.0: + resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} + engines: {node: '>= 10.0.0'} + dev: true + + /unpipe/1.0.0: + resolution: {integrity: sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=} + engines: {node: '>= 0.8'} + dev: true + + /unset-value/1.0.0: + resolution: {integrity: sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=} + engines: {node: '>=0.10.0'} + dependencies: + has-value: 0.3.1 + isobject: 3.0.1 + dev: true + + /uri-js/4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.1.1 + dev: true + + /urix/0.1.0: + resolution: {integrity: sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=} + deprecated: Please see https://github.com/lydell/urix#deprecated + dev: true + + /use/3.1.1: + resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} + engines: {node: '>=0.10.0'} + dev: true + + /util-deprecate/1.0.2: + resolution: {integrity: sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=} + dev: true + + /utils-merge/1.0.1: + resolution: {integrity: sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=} + engines: {node: '>= 0.4.0'} + dev: true + + /uuid/3.4.0: + resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} + deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. + hasBin: true + dev: true + + /v8-compile-cache/2.3.0: + resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==} + dev: true + + /validate-npm-package-license/3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + dependencies: + spdx-correct: 3.1.1 + spdx-expression-parse: 3.0.1 + dev: true + + /vary/1.1.2: + resolution: {integrity: sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=} + engines: {node: '>= 0.8'} + dev: true + + /verror/1.10.0: + resolution: {integrity: sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=} + engines: {'0': node >=0.6.0} + dependencies: + assert-plus: 1.0.0 + core-util-is: 1.0.2 + extsprintf: 1.3.0 + dev: true + + /void-elements/2.0.1: + resolution: {integrity: sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=} + engines: {node: '>=0.10.0'} + dev: true + + /walker/1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + dependencies: + makeerror: 1.0.12 + dev: true + + /watch/0.10.0: + resolution: {integrity: sha1-d3mLLaD5kQ1ZXxrOWwwiWFIfIdw=} + engines: {'0': node >=0.1.95} + dev: true + + /when/3.7.8: + resolution: {integrity: sha1-xxMLan6gRpPoQs3J56Hyqjmjn4I=} + dev: true + + /which/1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /which/2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /wide-align/1.1.5: + resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + dependencies: + string-width: 4.2.3 + dev: true + + /window-size/0.1.0: + resolution: {integrity: sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=} + engines: {node: '>= 0.8.0'} + dev: true + + /word-wrap/1.2.3: + resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} + engines: {node: '>=0.10.0'} + dev: true + + /wordwrap/0.0.2: + resolution: {integrity: sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=} + engines: {node: '>=0.4.0'} + dev: true + + /wrap-ansi/7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /wrappy/1.0.2: + resolution: {integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=} + dev: true + + /ws/8.2.3: + resolution: {integrity: sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: true + + /xmlhttprequest-ssl/2.0.0: + resolution: {integrity: sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==} + engines: {node: '>=0.4.0'} + dev: true + + /xtend/4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + dev: true + + /y18n/5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: true + + /yallist/4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: true + + /yaml/1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + dev: true + + /yargs-parser/20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + dev: true + + /yargs-parser/21.0.1: + resolution: {integrity: sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==} + engines: {node: '>=12'} + dev: true + + /yargs/16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + dependencies: + cliui: 7.0.4 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + dev: true + + /yargs/17.1.1: + resolution: {integrity: sha512-c2k48R0PwKIqKhPMWjeiF6y2xY/gPMUlro0sgxqXpbOIohWiLNXWslsootttv7E1e73QPAMQSg5FeySbVcpsPQ==} + engines: {node: '>=12'} + dependencies: + cliui: 7.0.4 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + dev: true + + /yargs/17.4.1: + resolution: {integrity: sha512-WSZD9jgobAg3ZKuCQZSa3g9QOJeCCqLoLAykiWgmXnDo9EPnn4RPf5qVTtzgOx66o6/oqhcA5tHtJXpG8pMt3g==} + engines: {node: '>=12'} + dependencies: + cliui: 7.0.4 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.0.1 + dev: true + + /yargs/3.10.0: + resolution: {integrity: sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=} + dependencies: + camelcase: 1.2.1 + cliui: 2.1.0 + decamelize: 1.2.0 + window-size: 0.1.0 + dev: true + + /yauzl/2.10.0: + resolution: {integrity: sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=} + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + dev: true + + /yeast/0.1.2: + resolution: {integrity: sha1-AI4G2AlDIMNy28L47XagymyKxBk=} + dev: true diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index 5a6b8e93..00000000 --- a/yarn.lock +++ /dev/null @@ -1,4605 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 -abbrev@1: - version "1.0.9" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" - -accepts@~1.3.3, accepts@1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca" - dependencies: - mime-types "~2.1.11" - negotiator "0.6.1" - -accepts@1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.1.4.tgz#d71c96f7d41d0feda2c38cd14e8a27c04158df4a" - dependencies: - mime-types "~2.0.4" - negotiator "0.4.9" - -acorn-jsx@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" - dependencies: - acorn "^3.0.4" - -acorn@^3.0.4: - version "3.3.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" - -acorn@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.3.tgz#1a3e850b428e73ba6b09d1cc527f5aaad4d03ef1" - -after@0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/after/-/after-0.8.1.tgz#ab5d4fb883f596816d3515f8f791c0af486dd627" - -ajv-keywords@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.1.1.tgz#02550bc605a3e576041565628af972e06c549d50" - -ajv@^4.7.0: - version "4.8.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.8.2.tgz#65486936ca36fea39a1504332a78bebd5d447bdc" - dependencies: - co "^4.6.0" - json-stable-stringify "^1.0.1" - -align-text@^0.1.1, align-text@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" - dependencies: - kind-of "^3.0.2" - longest "^1.0.1" - repeat-string "^1.5.2" - -alphanum-sort@^1.0.1, alphanum-sort@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" - -amdefine@>=0.0.4: - version "1.0.0" - resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.0.tgz#fd17474700cb5cc9c2b709f0be9d23ce3c198c33" - -ansi-escapes@^1.1.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" - -ansi-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.0.0.tgz#c5061b6e0ef8a81775e50f5d66151bf6bf371107" - -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - -any-promise@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" - -anymatch@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507" - dependencies: - arrify "^1.0.0" - micromatch "^2.1.5" - -aproba@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.0.4.tgz#2713680775e7614c8ba186c065d4e2e52d1072c0" - -are-we-there-yet@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.2.tgz#80e470e95a084794fe1899262c5667c6e88de1b3" - dependencies: - delegates "^1.0.0" - readable-stream "^2.0.0 || ^1.1.13" - -argparse@^1.0.7: - version "1.0.9" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" - dependencies: - sprintf-js "~1.0.2" - -arr-diff@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" - dependencies: - arr-flatten "^1.0.1" - -arr-flatten@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.1.tgz#e5ffe54d45e19f32f216e91eb99c8ce892bb604b" - -array-find-index@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" - -array-index@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-index/-/array-index-1.0.0.tgz#ec56a749ee103e4e08c790b9c353df16055b97f9" - dependencies: - debug "^2.2.0" - es6-symbol "^3.0.2" - -array-slice@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5" - -array-union@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" - dependencies: - array-uniq "^1.0.1" - -array-uniq@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" - -array-unique@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" - -arraybuffer.slice@0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz#f33b2159f0532a3f3107a272c0ccfbd1ad2979ca" - -arrify@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - -asn1@~0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" - -asn1@0.1.11: - version "0.1.11" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.1.11.tgz#559be18376d08a4ec4dbe80877d27818639b2df7" - -assert-plus@^0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.1.5.tgz#ee74009413002d84cec7219c6ac811812e723160" - -assert-plus@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" - -assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - -async-each-series@0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/async-each-series/-/async-each-series-0.1.1.tgz#7617c1917401fd8ca4a28aadce3dbae98afeb432" - -async-each@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" - -async-foreach@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" - -async@^2.0.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/async/-/async-2.1.2.tgz#612a4ab45ef42a70cde806bad86ee6db047e8385" - dependencies: - lodash "^4.14.0" - -async@~0.2.6: - version "0.2.10" - resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" - -async@0.1.15: - version "0.1.15" - resolved "https://registry.yarnpkg.com/async/-/async-0.1.15.tgz#2180eaca2cf2a6ca5280d41c0585bec9b3e49bd3" - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - -autoprefixer, autoprefixer@^6.3.1: - version "6.5.1" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.5.1.tgz#ae759a5221e709f3da17c2d656230e67c43cbb75" - dependencies: - browserslist "~1.4.0" - caniuse-db "^1.0.30000554" - normalize-range "^0.1.2" - num2fraction "^1.2.2" - postcss "^5.2.4" - postcss-value-parser "^3.2.3" - -aws-sign2@~0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" - -aws4@^1.2.1: - version "1.5.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.5.0.tgz#0a29ffb79c31c9e712eeb087e8e7a64b4a56d755" - -babel-code-frame@^6.16.0: - version "6.16.0" - resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.16.0.tgz#f90e60da0862909d3ce098733b5d3987c97cb8de" - dependencies: - chalk "^1.1.0" - esutils "^2.0.2" - js-tokens "^2.0.0" - -babel-core@^6.16.0, babel-core@^6.9.0: - version "6.17.0" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.17.0.tgz#6c4576447df479e241e58c807e4bc7da4db7f425" - dependencies: - babel-code-frame "^6.16.0" - babel-generator "^6.17.0" - babel-helpers "^6.16.0" - babel-messages "^6.8.0" - babel-register "^6.16.0" - babel-runtime "^6.9.1" - babel-template "^6.16.0" - babel-traverse "^6.16.0" - babel-types "^6.16.0" - babylon "^6.11.0" - convert-source-map "^1.1.0" - debug "^2.1.1" - json5 "^0.4.0" - lodash "^4.2.0" - minimatch "^3.0.2" - path-exists "^1.0.0" - path-is-absolute "^1.0.0" - private "^0.1.6" - shebang-regex "^1.0.0" - slash "^1.0.0" - source-map "^0.5.0" - -babel-eslint: - version "7.1.0" - resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-7.1.0.tgz#d506a5174ba224e25a2d17e128e2ba8987139ddc" - dependencies: - babel-traverse "^6.15.0" - babel-types "^6.15.0" - babylon "^6.11.2" - lodash.pickby "^4.6.0" - -babel-generator@^6.17.0: - version "6.17.0" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.17.0.tgz#b894e3808beef7800f2550635bfe024b6226cf33" - dependencies: - babel-messages "^6.8.0" - babel-runtime "^6.9.0" - babel-types "^6.16.0" - detect-indent "^3.0.1" - jsesc "^1.3.0" - lodash "^4.2.0" - source-map "^0.5.0" - -babel-helper-hoist-variables@^6.8.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.8.0.tgz#8b0766dc026ea9ea423bc2b34e665a4da7373aaf" - dependencies: - babel-runtime "^6.0.0" - babel-types "^6.8.0" - -babel-helpers@^6.16.0: - version "6.16.0" - resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.16.0.tgz#1095ec10d99279460553e67eb3eee9973d3867e3" - dependencies: - babel-runtime "^6.0.0" - babel-template "^6.16.0" - -babel-messages@^6.8.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.8.0.tgz#bf504736ca967e6d65ef0adb5a2a5f947c8e0eb9" - dependencies: - babel-runtime "^6.0.0" - -babel-plugin-transform-cjs-system-require@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-cjs-system-require/-/babel-plugin-transform-cjs-system-require-0.1.1.tgz#ffef26d31bc270e82bdbbd437db2777e85162a29" - -babel-plugin-transform-cjs-system-wrapper@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-cjs-system-wrapper/-/babel-plugin-transform-cjs-system-wrapper-0.2.1.tgz#e855078877b56d4d1b92b9f91b37f599db0200e3" - dependencies: - babel-plugin-transform-cjs-system-require "^0.1.1" - babel-template "^6.9.0" - -babel-plugin-transform-es2015-modules-systemjs@^6.6.5: - version "6.14.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.14.0.tgz#c519b5c73e32388e679c9b1edf41b2fc23dc3303" - dependencies: - babel-helper-hoist-variables "^6.8.0" - babel-runtime "^6.11.6" - babel-template "^6.14.0" - -babel-plugin-transform-global-system-wrapper@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-global-system-wrapper/-/babel-plugin-transform-global-system-wrapper-0.0.1.tgz#afb469cec0e04689b9fe7e8b1fd280fc94a6d8f2" - dependencies: - babel-template "^6.9.0" - -babel-plugin-transform-system-register@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-system-register/-/babel-plugin-transform-system-register-0.0.1.tgz#9dff40390c2763ac518f0b2ad7c5ea4f65a5be25" - -babel-register@^6.16.0: - version "6.16.3" - resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.16.3.tgz#7b0c0ca7bfdeb9188ba4c27e5fcb7599a497c624" - dependencies: - babel-core "^6.16.0" - babel-runtime "^6.11.6" - core-js "^2.4.0" - home-or-tmp "^1.0.0" - lodash "^4.2.0" - mkdirp "^0.5.1" - path-exists "^1.0.0" - source-map-support "^0.4.2" - -babel-runtime@^6.0.0, babel-runtime@^6.11.6, babel-runtime@^6.9.0, babel-runtime@^6.9.1: - version "6.11.6" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.11.6.tgz#6db707fef2d49c49bfa3cb64efdb436b518b8222" - dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.9.5" - -babel-template@^6.14.0, babel-template@^6.16.0, babel-template@^6.9.0: - version "6.16.0" - resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.16.0.tgz#e149dd1a9f03a35f817ddbc4d0481988e7ebc8ca" - dependencies: - babel-runtime "^6.9.0" - babel-traverse "^6.16.0" - babel-types "^6.16.0" - babylon "^6.11.0" - lodash "^4.2.0" - -babel-traverse@^6.15.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.18.0.tgz#5aeaa980baed2a07c8c47329cd90c3b90c80f05e" - dependencies: - babel-code-frame "^6.16.0" - babel-messages "^6.8.0" - babel-runtime "^6.9.0" - babel-types "^6.18.0" - babylon "^6.11.0" - debug "^2.2.0" - globals "^9.0.0" - invariant "^2.2.0" - lodash "^4.2.0" - -babel-traverse@^6.16.0: - version "6.16.0" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.16.0.tgz#fba85ae1fd4d107de9ce003149cc57f53bef0c4f" - dependencies: - babel-code-frame "^6.16.0" - babel-messages "^6.8.0" - babel-runtime "^6.9.0" - babel-types "^6.16.0" - babylon "^6.11.0" - debug "^2.2.0" - globals "^8.3.0" - invariant "^2.2.0" - lodash "^4.2.0" - -babel-types@^6.15.0, babel-types@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.18.0.tgz#1f7d5a73474c59eb9151b2417bbff4e4fce7c3f8" - dependencies: - babel-runtime "^6.9.1" - esutils "^2.0.2" - lodash "^4.2.0" - to-fast-properties "^1.0.1" - -babel-types@^6.16.0, babel-types@^6.8.0: - version "6.16.0" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.16.0.tgz#71cca1dbe5337766225c5c193071e8ebcbcffcfe" - dependencies: - babel-runtime "^6.9.1" - esutils "^2.0.2" - lodash "^4.2.0" - to-fast-properties "^1.0.1" - -babylon@^6.11.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.13.0.tgz#58ed40dd2a8120612be5f318c2c0bedbebde4a0b" - -babylon@^6.11.2: - version "6.13.1" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.13.1.tgz#adca350e088f0467647157652bafead6ddb8dfdb" - -backo2@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" - -balanced-match@^0.4.1, balanced-match@^0.4.2: - version "0.4.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" - -balanced-match@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.1.0.tgz#b504bd05869b39259dd0c5efc35d843176dccc4a" - -base64-arraybuffer@0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.2.tgz#474df4a9f2da24e05df3158c3b1db3c3cd46a154" - -base64-arraybuffer@0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8" - -base64id@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/base64id/-/base64id-0.1.0.tgz#02ce0fdeee0cef4f40080e1e73e834f0b1bfce3f" - -batch@0.5.3: - version "0.5.3" - resolved "https://registry.yarnpkg.com/batch/-/batch-0.5.3.tgz#3f3414f380321743bfc1042f9a83ff1d5824d464" - -bcrypt-pbkdf@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.0.tgz#3ca76b85241c7170bf7d9703e7b9aa74630040d4" - dependencies: - tweetnacl "^0.14.3" - -benchmark@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/benchmark/-/benchmark-1.0.0.tgz#2f1e2fa4c359f11122aa183082218e957e390c73" - -better-assert@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522" - dependencies: - callsite "1.0.0" - -binary-extensions@^1.0.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.7.0.tgz#6c1610db163abfb34edfe42fa423343a1e01185d" - -bl@^1.0.0, bl@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/bl/-/bl-1.1.2.tgz#fdca871a99713aa00d19e3bbba41c44787a65398" - dependencies: - readable-stream "~2.0.5" - -bl@~1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/bl/-/bl-1.0.3.tgz#fc5421a28fd4226036c3b3891a66a25bc64d226e" - dependencies: - readable-stream "~2.0.5" - -blob@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.4.tgz#bcf13052ca54463f30f9fc7e95b9a47630a94921" - -block-stream@*: - version "0.0.9" - resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" - dependencies: - inherits "~2.0.0" - -bluebird@^3.0.5, bluebird@^3.3.0, bluebird@^3.3.4: - version "3.4.6" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.6.tgz#01da8d821d87813d158967e743d5fe6c62cf8c0f" - -body-parser@^1.12.4: - version "1.15.2" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.15.2.tgz#d7578cf4f1d11d5f6ea804cef35dc7a7ff6dae67" - dependencies: - bytes "2.4.0" - content-type "~1.0.2" - debug "~2.2.0" - depd "~1.1.0" - http-errors "~1.5.0" - iconv-lite "0.4.13" - on-finished "~2.3.0" - qs "6.2.0" - raw-body "~2.1.7" - type-is "~1.6.13" - -boom@2.x.x: - version "2.10.1" - resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" - dependencies: - hoek "2.x.x" - -brace-expansion@^1.0.0: - version "1.1.6" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.6.tgz#7197d7eaa9b87e648390ea61fc66c84427420df9" - dependencies: - balanced-match "^0.4.1" - concat-map "0.0.1" - -braces@^0.1.2: - version "0.1.5" - resolved "https://registry.yarnpkg.com/braces/-/braces-0.1.5.tgz#c085711085291d8b75fdd74eab0f8597280711e6" - dependencies: - expand-range "^0.1.0" - -braces@^1.8.2: - version "1.8.5" - resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" - dependencies: - expand-range "^1.8.1" - preserve "^0.2.0" - repeat-element "^1.1.2" - -browser-sync: - version "2.17.5" - resolved "https://registry.yarnpkg.com/browser-sync/-/browser-sync-2.17.5.tgz#8e0a9ddfc2e162e7aada085f76181c57b6dbdf7a" - dependencies: - browser-sync-client "^2.3.3" - browser-sync-ui "0.6.1" - bs-recipes "1.2.3" - chokidar "1.6.0" - connect "3.5.0" - dev-ip "^1.0.1" - easy-extender "2.3.2" - eazy-logger "3.0.2" - emitter-steward "^1.0.0" - fs-extra "0.30.0" - http-proxy "1.15.1" - immutable "3.8.1" - localtunnel "1.8.1" - micromatch "2.3.11" - opn "4.0.2" - portscanner "^1.0.0" - qs "6.2.1" - resp-modifier "6.0.2" - rx "4.1.0" - serve-index "1.8.0" - serve-static "1.11.1" - server-destroy "1.0.1" - socket.io "1.5.0" - ua-parser-js "0.7.10" - yargs "6.0.0" - -browser-sync-client@^2.3.3: - version "2.4.3" - resolved "https://registry.yarnpkg.com/browser-sync-client/-/browser-sync-client-2.4.3.tgz#e965033e0c83e5f06caacb516755b694836cea4f" - dependencies: - etag "^1.7.0" - fresh "^0.3.0" - -browser-sync-ui@0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/browser-sync-ui/-/browser-sync-ui-0.6.1.tgz#d8b98ea3b755632287350a37ee2eaaacabea28d2" - dependencies: - async-each-series "0.1.1" - connect-history-api-fallback "^1.1.0" - immutable "^3.7.6" - server-destroy "1.0.1" - stream-throttle "^0.1.3" - weinre "^2.0.0-pre-I0Z7U9OV" - -browserslist@~1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-1.4.0.tgz#9cfdcf5384d9158f5b70da2aa00b30e8ff019049" - dependencies: - caniuse-db "^1.0.30000539" - -bs-recipes@1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/bs-recipes/-/bs-recipes-1.2.3.tgz#0e4d17bb1cff92ef6c36608b8487d9a07571ac54" - -bser@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/bser/-/bser-1.0.2.tgz#381116970b2a6deea5646dd15dd7278444b56169" - dependencies: - node-int64 "^0.4.0" - -buffer-peek-stream@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/buffer-peek-stream/-/buffer-peek-stream-1.0.1.tgz#53b47570a1347787c5bad4ca2ca3021f9d8b3cfd" - -buffer-shims@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" - -builtin-modules@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" - -bytes@2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.4.0.tgz#7d97196f9d5baf7f6935e25985549edd2a6c2339" - -caller-path@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" - dependencies: - callsites "^0.2.0" - -callsite@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" - -callsites@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" - -camelcase-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" - dependencies: - camelcase "^2.0.0" - map-obj "^1.0.0" - -camelcase@^1.0.2, camelcase@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" - -camelcase@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" - -camelcase@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" - -caniuse-db@^1.0.30000539, caniuse-db@^1.0.30000554: - version "1.0.30000564" - resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000564.tgz#840a4d9e5c15dc9c6df84d7051f28e30514cc00b" - -caseless@~0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" - -center-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" - dependencies: - align-text "^0.1.3" - lazy-cache "^1.0.3" - -chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - dependencies: - 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" - -chokidar, chokidar@^1.4.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.6.1.tgz#2f4447ab5e96e50fb3d789fd90d4c72e0e4c70c2" - dependencies: - anymatch "^1.3.0" - async-each "^1.0.0" - glob-parent "^2.0.0" - inherits "^2.0.1" - is-binary-path "^1.0.0" - is-glob "^2.0.0" - path-is-absolute "^1.0.0" - readdirp "^2.0.0" - optionalDependencies: - fsevents "^1.0.0" - -chokidar@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.6.0.tgz#90c32ad4802901d7713de532dc284e96a63ad058" - dependencies: - anymatch "^1.3.0" - async-each "^1.0.0" - glob-parent "^2.0.0" - inherits "^2.0.1" - is-binary-path "^1.0.0" - is-glob "^2.0.0" - path-is-absolute "^1.0.0" - readdirp "^2.0.0" - optionalDependencies: - fsevents "^1.0.0" - -circular-json@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.1.tgz#be8b36aefccde8b3ca7aa2d6afc07a37242c0d2d" - -clap@^1.0.9: - version "1.1.1" - resolved "https://registry.yarnpkg.com/clap/-/clap-1.1.1.tgz#a8a93e0bfb7581ac199c4f001a5525a724ce696d" - dependencies: - chalk "^1.1.3" - -cli-color@^0.3.2: - version "0.3.3" - resolved "https://registry.yarnpkg.com/cli-color/-/cli-color-0.3.3.tgz#12d5bdd158ff8a0b0db401198913c03df069f6f5" - dependencies: - d "~0.1.1" - es5-ext "~0.10.6" - memoizee "~0.3.8" - timers-ext "0.1" - -cli-cursor@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" - dependencies: - restore-cursor "^1.0.1" - -cli-width@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.1.0.tgz#b234ca209b29ef66fc518d9b98d5847b00edf00a" - -cliui@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" - dependencies: - center-align "^0.1.1" - right-align "^0.1.1" - wordwrap "0.0.2" - -cliui@^3.0.3, cliui@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - wrap-ansi "^2.0.0" - -clone@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149" - -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - -coa@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/coa/-/coa-1.0.1.tgz#7f959346cfc8719e3f7233cd6852854a7c67d8a3" - dependencies: - q "^1.1.2" - -code-point-at@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.0.1.tgz#1104cd34f9b5b45d3eba88f1babc1924e1ce35fb" - dependencies: - number-is-nan "^1.0.0" - -color-convert@^1.3.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.5.0.tgz#7a2b4efb4488df85bca6443cb038b7100fbe7de1" - -color-name@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.1.tgz#4b1415304cf50028ea81643643bd82ea05803689" - -color-string@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-0.3.0.tgz#27d46fb67025c5c2fa25993bfbf579e47841b991" - dependencies: - color-name "^1.0.0" - -color@^0.11.0: - version "0.11.3" - resolved "https://registry.yarnpkg.com/color/-/color-0.11.3.tgz#4bad1d0d52499dd00dbd6f0868442467e49394e6" - dependencies: - clone "^1.0.2" - color-convert "^1.3.0" - color-string "^0.3.0" - -colormin@^1.0.5: - version "1.1.2" - resolved "https://registry.yarnpkg.com/colormin/-/colormin-1.1.2.tgz#ea2f7420a72b96881a38aae59ec124a6f7298133" - dependencies: - color "^0.11.0" - css-color-names "0.0.4" - has "^1.0.1" - -colors@^1.1.0, colors@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" - -combine-lists@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/combine-lists/-/combine-lists-1.0.1.tgz#458c07e09e0d900fc28b70a3fec2dacd1d2cb7f6" - dependencies: - lodash "^4.5.0" - -combined-stream@^1.0.5, combined-stream@~1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" - dependencies: - delayed-stream "~1.0.0" - -commander@^2.2.0, commander@^2.9.0, commander@2.9.x: - version "2.9.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" - dependencies: - graceful-readlink ">= 1.0.0" - -component-bind@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" - -component-emitter@1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.1.2.tgz#296594f2753daa63996d2af08d15a95116c9aec3" - -component-emitter@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.0.tgz#ccd113a86388d06482d03de3fc7df98526ba8efe" - -component-inherit@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - -concat-stream@^1.4.6: - version "1.5.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.5.2.tgz#708978624d856af41a5a741defdd261da752c266" - dependencies: - inherits "~2.0.1" - readable-stream "~2.0.0" - typedarray "~0.0.5" - -concat-stream@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.5.0.tgz#53f7d43c51c5e43f81c8fdd03321c631be68d611" - dependencies: - inherits "~2.0.1" - readable-stream "~2.0.0" - typedarray "~0.0.5" - -connect-history-api-fallback@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.3.0.tgz#e51d17f8f0ef0db90a64fdb47de3051556e9f169" - -connect@^3.3.5, connect@3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/connect/-/connect-3.5.0.tgz#b357525a0b4c1f50599cd983e1d9efeea9677198" - dependencies: - debug "~2.2.0" - finalhandler "0.5.0" - parseurl "~1.3.1" - utils-merge "1.0.0" - -connect@1.x: - version "1.9.2" - resolved "https://registry.yarnpkg.com/connect/-/connect-1.9.2.tgz#42880a22e9438ae59a8add74e437f58ae8e52807" - dependencies: - formidable "1.0.x" - mime ">= 0.0.1" - qs ">= 0.4.0" - -console-control-strings@^1.0.0, console-control-strings@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - -content-type@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.2.tgz#b7d113aee7a8dd27bd21133c4dc2529df1721eed" - -convert-source-map@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.3.0.tgz#e9f3e9c6e2728efc2676696a70eb382f73106a67" - -core-js@^1.2.6: - version "1.2.7" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" - -core-js@^2.2.0, core-js@^2.4.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" - -core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - -cross-spawn@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982" - dependencies: - lru-cache "^4.0.1" - which "^1.2.9" - -cryptiles@2.x.x: - version "2.0.5" - resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" - dependencies: - boom "2.x.x" - -css-color-names@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" - -cssnano: - version "3.7.7" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-3.7.7.tgz#27fac611380c6a49d6f722c0537e5a988a785010" - dependencies: - autoprefixer "^6.3.1" - decamelize "^1.1.2" - defined "^1.0.0" - has "^1.0.1" - object-assign "^4.0.1" - postcss "^5.0.14" - postcss-calc "^5.2.0" - postcss-colormin "^2.1.8" - postcss-convert-values "^2.3.4" - postcss-discard-comments "^2.0.4" - postcss-discard-duplicates "^2.0.1" - postcss-discard-empty "^2.0.1" - postcss-discard-overridden "^0.1.1" - postcss-discard-unused "^2.2.1" - postcss-filter-plugins "^2.0.0" - postcss-merge-idents "^2.1.5" - postcss-merge-longhand "^2.0.1" - postcss-merge-rules "^2.0.3" - postcss-minify-font-values "^1.0.2" - postcss-minify-gradients "^1.0.1" - postcss-minify-params "^1.0.4" - postcss-minify-selectors "^2.0.4" - postcss-normalize-charset "^1.1.0" - postcss-normalize-url "^3.0.7" - postcss-ordered-values "^2.1.0" - postcss-reduce-idents "^2.2.2" - postcss-reduce-initial "^1.0.0" - postcss-reduce-transforms "^1.0.3" - postcss-svgo "^2.1.1" - postcss-unique-selectors "^2.0.2" - postcss-value-parser "^3.2.3" - postcss-zindex "^2.0.1" - -csso@~2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/csso/-/csso-2.2.1.tgz#51fbb5347e50e81e6ed51668a48490ae6fe2afe2" - dependencies: - clap "^1.0.9" - source-map "^0.5.3" - -ctype@0.5.3: - version "0.5.3" - resolved "https://registry.yarnpkg.com/ctype/-/ctype-0.5.3.tgz#82c18c2461f74114ef16c135224ad0b9144ca12f" - -currently-unhandled@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" - dependencies: - array-find-index "^1.0.1" - -custom-event@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425" - -d@^0.1.1, d@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/d/-/d-0.1.1.tgz#da184c535d18d8ee7ba2aa229b914009fae11309" - dependencies: - es5-ext "~0.10.2" - -d@1: - version "1.0.0" - resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" - dependencies: - es5-ext "^0.10.9" - -dashdash@^1.12.0: - version "1.14.0" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.0.tgz#29e486c5418bf0f356034a993d51686a33e84141" - dependencies: - assert-plus "^1.0.0" - -data-uri-to-buffer@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-0.0.4.tgz#46e13ab9da8e309745c8d01ce547213ebdb2fe3f" - -date-now@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/date-now/-/date-now-1.0.1.tgz#bb7d086438debe4182a485fb3df3fbfb99d6153c" - -debounce: - version "1.0.0" - resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.0.0.tgz#0948af513d2e4ce407916f8506a423d3f9cf72d8" - dependencies: - date-now "1.0.1" - -debug@^2.1.1, debug@^2.2.0, debug@~2.2.0, debug@2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" - dependencies: - ms "0.7.1" - -debug@0.7.4: - version "0.7.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-0.7.4.tgz#06e1ea8082c2cb14e39806e22e2f6f757f92af39" - -decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - -deep-extend@~0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.1.tgz#efe4113d08085f4e6f9687759810f807469e2253" - -deep-is@~0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" - -defined@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" - -del@^2.0.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" - dependencies: - globby "^5.0.0" - is-path-cwd "^1.0.0" - is-path-in-cwd "^1.0.0" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - rimraf "^2.2.8" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - -depd@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.0.tgz#e1bd82c6aab6ced965b97b88b17ed3e528ca18c3" - -destroy@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" - -detect-file@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-0.1.0.tgz#4935dedfd9488648e006b0129566e9386711ea63" - dependencies: - fs-exists-sync "^0.1.0" - -detect-indent@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-3.0.1.tgz#9dc5e5ddbceef8325764b9451b02bc6d54084f75" - dependencies: - get-stdin "^4.0.1" - minimist "^1.1.0" - repeating "^1.1.0" - -dev-ip@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/dev-ip/-/dev-ip-1.0.1.tgz#a76a3ed1855be7a012bb8ac16cb80f3c00dc28f0" - -di@^0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" - -doctrine@^1.2.2: - version "1.5.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" - dependencies: - esutils "^2.0.2" - isarray "^1.0.0" - -dom-serialize@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b" - dependencies: - custom-event "~1.0.0" - ent "~2.2.0" - extend "^3.0.0" - void-elements "^2.0.0" - -easy-extender@2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/easy-extender/-/easy-extender-2.3.2.tgz#3d3248febe2b159607316d8f9cf491c16648221d" - dependencies: - lodash "^3.10.1" - -eazy-logger@3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/eazy-logger/-/eazy-logger-3.0.2.tgz#a325aa5e53d13a2225889b2ac4113b2b9636f4fc" - dependencies: - tfunk "^3.0.1" - -ecc-jsbn@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" - dependencies: - jsbn "~0.1.0" - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - -emitter-steward@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/emitter-steward/-/emitter-steward-1.0.0.tgz#f3411ade9758a7565df848b2da0cbbd1b46cbd64" - -encodeurl@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20" - -end-of-stream@^1.0.0, end-of-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.1.0.tgz#e9353258baa9108965efc41cb0ef8ade2f3cfb07" - dependencies: - once "~1.3.0" - -engine.io-client@1.6.9: - version "1.6.9" - resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-1.6.9.tgz#1d6ad48048a5083c95096943b29d36efdb212401" - dependencies: - 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" - -engine.io-client@1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-1.7.0.tgz#0bb81d3563ab7afb668f1e1b400c9403b03006ee" - dependencies: - component-emitter "1.1.2" - component-inherit "0.0.3" - debug "2.2.0" - engine.io-parser "1.3.0" - has-cors "1.1.0" - indexof "0.0.1" - parsejson "0.0.1" - parseqs "0.0.2" - parseuri "0.0.4" - ws "1.1.1" - xmlhttprequest-ssl "1.5.1" - yeast "0.1.2" - -engine.io-parser@1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-1.2.4.tgz#e0897b0bf14e792d4cd2a5950553919c56948c42" - dependencies: - 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" - -engine.io-parser@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-1.3.0.tgz#61a35c7f3a3ccd1b179e4f52257a7a8cfacaeb21" - dependencies: - after "0.8.1" - arraybuffer.slice "0.0.6" - base64-arraybuffer "0.1.5" - blob "0.0.4" - has-binary "0.1.6" - wtf-8 "1.0.0" - -engine.io@1.6.10: - version "1.6.10" - resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-1.6.10.tgz#f87d84e1bd21d1a2ec7f8deef0c62054acdfb27a" - dependencies: - accepts "1.1.4" - base64id "0.1.0" - debug "2.2.0" - engine.io-parser "1.2.4" - ws "1.0.1" - -engine.io@1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-1.7.0.tgz#a417857af4995d9bbdf8a0e03a87e473ebe64fbe" - dependencies: - accepts "1.3.3" - base64id "0.1.0" - debug "2.2.0" - engine.io-parser "1.3.0" - ws "1.1.1" - -ent@~2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d" - -err-code@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/err-code/-/err-code-1.1.1.tgz#739d71b6851f24d050ea18c79a5b722420771d59" - -error-ex@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.0.tgz#e67b43f3e82c96ea3a584ffee0b9fc3325d802d9" - dependencies: - is-arrayish "^0.2.1" - -es5-ext@^0.10.12, es5-ext@^0.10.7, es5-ext@^0.10.8, es5-ext@^0.10.9, es5-ext@~0.10.11, es5-ext@~0.10.2, es5-ext@~0.10.5, es5-ext@~0.10.6, es5-ext@~0.10.7: - version "0.10.12" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.12.tgz#aa84641d4db76b62abba5e45fd805ecbab140047" - dependencies: - es6-iterator "2" - es6-symbol "~3.1" - -es6-iterator@~0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-0.1.3.tgz#d6f58b8c4fc413c249b4baa19768f8e4d7c8944e" - dependencies: - d "~0.1.1" - es5-ext "~0.10.5" - es6-symbol "~2.0.1" - -es6-iterator@2: - version "2.0.0" - resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.0.tgz#bd968567d61635e33c0b80727613c9cb4b096bac" - dependencies: - d "^0.1.1" - es5-ext "^0.10.7" - es6-symbol "3" - -es6-map@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.4.tgz#a34b147be224773a4d7da8072794cefa3632b897" - dependencies: - d "~0.1.1" - es5-ext "~0.10.11" - es6-iterator "2" - es6-set "~0.1.3" - es6-symbol "~3.1.0" - event-emitter "~0.3.4" - -es6-promise@~4.0.3: - version "4.0.5" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.0.5.tgz#7882f30adde5b240ccfa7f7d78c548330951ae42" - -es6-set@~0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.4.tgz#9516b6761c2964b92ff479456233a247dc707ce8" - dependencies: - d "~0.1.1" - es5-ext "~0.10.11" - es6-iterator "2" - es6-symbol "3" - event-emitter "~0.3.4" - -es6-symbol@^3.0.2, es6-symbol@~3.1, es6-symbol@~3.1.0, es6-symbol@3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.0.tgz#94481c655e7a7cad82eba832d97d5433496d7ffa" - dependencies: - d "~0.1.1" - es5-ext "~0.10.11" - -es6-symbol@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-2.0.1.tgz#761b5c67cfd4f1d18afb234f691d678682cb3bf3" - dependencies: - d "~0.1.1" - es5-ext "~0.10.5" - -es6-template-strings@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/es6-template-strings/-/es6-template-strings-2.0.1.tgz#b166c6a62562f478bb7775f6ca96103a599b4b2c" - dependencies: - es5-ext "^0.10.12" - esniff "^1.1" - -es6-weak-map@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.1.tgz#0d2bbd8827eb5fb4ba8f97fbfea50d43db21ea81" - dependencies: - d "^0.1.1" - es5-ext "^0.10.8" - es6-iterator "2" - es6-symbol "3" - -es6-weak-map@~0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-0.1.4.tgz#706cef9e99aa236ba7766c239c8b9e286ea7d228" - dependencies: - d "~0.1.1" - es5-ext "~0.10.6" - es6-iterator "~0.1.3" - es6-symbol "~2.0.1" - -escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - -escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - -escope@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" - dependencies: - es6-map "^0.1.3" - es6-weak-map "^2.0.1" - esrecurse "^4.1.0" - estraverse "^4.1.1" - -eslint: - version "3.8.1" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-3.8.1.tgz#7d02db44cd5aaf4fa7aa489e1f083baa454342ba" - dependencies: - chalk "^1.1.3" - concat-stream "^1.4.6" - debug "^2.1.1" - doctrine "^1.2.2" - escope "^3.6.0" - espree "^3.3.1" - estraverse "^4.2.0" - esutils "^2.0.2" - file-entry-cache "^2.0.0" - glob "^7.0.3" - globals "^9.2.0" - ignore "^3.1.5" - imurmurhash "^0.1.4" - inquirer "^0.12.0" - is-my-json-valid "^2.10.0" - is-resolvable "^1.0.0" - js-yaml "^3.5.1" - json-stable-stringify "^1.0.0" - levn "^0.3.0" - lodash "^4.0.0" - mkdirp "^0.5.0" - natural-compare "^1.4.0" - optionator "^0.8.2" - path-is-inside "^1.0.1" - pluralize "^1.2.1" - progress "^1.1.8" - require-uncached "^1.0.2" - shelljs "^0.6.0" - strip-bom "^3.0.0" - strip-json-comments "~1.0.1" - table "^3.7.8" - text-table "~0.2.0" - user-home "^2.0.0" - -esniff@^1.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/esniff/-/esniff-1.1.0.tgz#c66849229f91464dede2e0d40201ed6abf65f2ac" - dependencies: - d "1" - es5-ext "^0.10.12" - -espree@^3.3.1: - version "3.3.2" - resolved "https://registry.yarnpkg.com/espree/-/espree-3.3.2.tgz#dbf3fadeb4ecb4d4778303e50103b3d36c88b89c" - dependencies: - acorn "^4.0.1" - acorn-jsx "^3.0.0" - -esprima@^2.6.0: - version "2.7.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" - -esrecurse@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.1.0.tgz#4713b6536adf7f2ac4f327d559e7756bff648220" - dependencies: - estraverse "~4.1.0" - object-assign "^4.0.1" - -estraverse@^4.1.1, estraverse@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" - -estraverse@~4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.1.1.tgz#f6caca728933a850ef90661d0e17982ba47111a2" - -esutils@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" - -etag@^1.7.0, etag@~1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.7.0.tgz#03d30b5f67dd6e632d2945d30d6652731a34d5d8" - -event-emitter@~0.3.4: - version "0.3.4" - resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.4.tgz#8d63ddfb4cfe1fae3b32ca265c4c720222080bb5" - dependencies: - d "~0.1.1" - es5-ext "~0.10.7" - -eventemitter3@1.x.x: - version "1.2.0" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508" - -exec-sh@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.0.tgz#14f75de3f20d286ef933099b2ce50a90359cef10" - dependencies: - merge "^1.1.3" - -exit-hook@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" - -expand-braces@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/expand-braces/-/expand-braces-0.1.2.tgz#488b1d1d2451cb3d3a6b192cfc030f44c5855fea" - dependencies: - array-slice "^0.2.3" - array-unique "^0.2.1" - braces "^0.1.2" - -expand-brackets@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" - dependencies: - is-posix-bracket "^0.1.0" - -expand-range@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-0.1.1.tgz#4cb8eda0993ca56fa4f41fc42f3cbb4ccadff044" - dependencies: - is-number "^0.1.1" - repeat-string "^0.2.2" - -expand-range@^1.8.1: - version "1.8.2" - resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" - dependencies: - fill-range "^2.1.0" - -expand-tilde@^1.2.0, expand-tilde@^1.2.1, expand-tilde@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-1.2.2.tgz#0b81eba897e5a3d31d1c3d102f8f01441e559449" - dependencies: - os-homedir "^1.0.1" - -express@2.5.x: - version "2.5.11" - resolved "https://registry.yarnpkg.com/express/-/express-2.5.11.tgz#4ce8ea1f3635e69e49f0ebb497b6a4b0a51ce6f0" - dependencies: - connect "1.x" - mime "1.2.4" - mkdirp "0.3.0" - qs "0.4.x" - -extend@^3.0.0, extend@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4" - -extglob@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" - dependencies: - is-extglob "^1.0.0" - -extract-zip@~1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.5.0.tgz#92ccf6d81ef70a9fa4c1747114ccef6d8688a6c4" - dependencies: - concat-stream "1.5.0" - debug "0.7.4" - mkdirp "0.5.0" - yauzl "2.4.1" - -extsprintf@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" - -fast-levenshtein@~2.0.4: - version "2.0.5" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.5.tgz#bd33145744519ab1c36c3ee9f31f08e9079b67f2" - -fb-watchman@^1.8.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-1.9.0.tgz#6f268f1f347a6b3c875d1e89da7e1ed79adfc0ec" - dependencies: - bser "^1.0.2" - -fd-slicer@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65" - dependencies: - pend "~1.2.0" - -figures@^1.3.5: - version "1.7.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" - dependencies: - escape-string-regexp "^1.0.5" - object-assign "^4.1.0" - -file-entry-cache@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" - dependencies: - flat-cache "^1.2.1" - object-assign "^4.0.1" - -filename-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.0.tgz#996e3e80479b98b9897f15a8a58b3d084e926775" - -fill-range@^2.1.0: - version "2.2.3" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" - dependencies: - is-number "^2.1.0" - isobject "^2.0.0" - randomatic "^1.1.3" - repeat-element "^1.1.2" - repeat-string "^1.5.2" - -finalhandler@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-0.5.0.tgz#e9508abece9b6dba871a6942a1d7911b91911ac7" - dependencies: - debug "~2.2.0" - escape-html "~1.0.3" - on-finished "~2.3.0" - statuses "~1.3.0" - unpipe "~1.0.0" - -find-up@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" - dependencies: - path-exists "^2.0.0" - pinkie-promise "^2.0.0" - -findup-sync@^0.4.2: - version "0.4.3" - resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.4.3.tgz#40043929e7bc60adf0b7f4827c4c6e75a0deca12" - dependencies: - detect-file "^0.1.0" - is-glob "^2.0.1" - micromatch "^2.3.7" - resolve-dir "^0.1.0" - -fined@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/fined/-/fined-1.0.2.tgz#5b28424b760d7598960b7ef8480dff8ad3660e97" - dependencies: - expand-tilde "^1.2.1" - lodash.assignwith "^4.0.7" - lodash.isempty "^4.2.1" - lodash.isplainobject "^4.0.4" - lodash.isstring "^4.0.1" - lodash.pick "^4.2.1" - parse-filepath "^1.0.1" - -flagged-respawn@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-0.3.2.tgz#ff191eddcd7088a675b2610fffc976be9b8074b5" - -flat-cache@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.2.1.tgz#6c837d6225a7de5659323740b36d5361f71691ff" - dependencies: - circular-json "^0.3.0" - del "^2.0.2" - graceful-fs "^4.1.2" - write "^0.2.1" - -flatten@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782" - -for-in@^0.1.5: - version "0.1.6" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.6.tgz#c9f96e89bfad18a545af5ec3ed352a1d9e5b4dc8" - -for-own@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.4.tgz#0149b41a39088c7515f51ebe1c1386d45f935072" - dependencies: - for-in "^0.1.5" - -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - -form-data@~1.0.0-rc3, form-data@~1.0.0-rc4: - version "1.0.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-1.0.1.tgz#ae315db9a4907fa065502304a66d7733475ee37c" - dependencies: - async "^2.0.1" - combined-stream "^1.0.5" - mime-types "^2.1.11" - -form-data@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.0.0.tgz#6f0aebadcc5da16c13e1ecc11137d85f9b883b25" - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.5" - mime-types "^2.1.11" - -formidable@1.0.x: - version "1.0.17" - resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.0.17.tgz#ef5491490f9433b705faa77249c99029ae348559" - -fresh@^0.3.0, fresh@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.3.0.tgz#651f838e22424e7566de161d8358caa199f83d4f" - -fs-exists-sync@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add" - -fs-extra@^0.26.5: - version "0.26.7" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.26.7.tgz#9ae1fdd94897798edab76d0918cf42d0c3184fa9" - dependencies: - graceful-fs "^4.1.2" - jsonfile "^2.1.0" - klaw "^1.0.0" - path-is-absolute "^1.0.0" - rimraf "^2.2.8" - -fs-extra@~0.30.0, fs-extra@0.30.0: - version "0.30.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" - dependencies: - graceful-fs "^4.1.2" - jsonfile "^2.1.0" - klaw "^1.0.0" - path-is-absolute "^1.0.0" - rimraf "^2.2.8" - -fs-promise: - version "0.5.0" - resolved "https://registry.yarnpkg.com/fs-promise/-/fs-promise-0.5.0.tgz#4347d6bf624655a7061a4319213c393276ad3ef3" - dependencies: - any-promise "^1.0.0" - fs-extra "^0.26.5" - mz "^2.3.1" - thenify-all "^1.6.0" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - -fsevents@^1.0.0: - version "1.0.14" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.0.14.tgz#558e8cc38643d8ef40fe45158486d0d25758eee4" - dependencies: - nan "^2.3.0" - node-pre-gyp "^0.6.29" - -fstream-ignore@~1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" - dependencies: - fstream "^1.0.0" - inherits "2" - minimatch "^3.0.0" - -fstream@^1.0.0, fstream@^1.0.2, fstream@~1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.10.tgz#604e8a92fe26ffd9f6fae30399d4984e1ab22822" - dependencies: - graceful-fs "^4.1.2" - inherits "~2.0.0" - mkdirp ">=0.5 0" - rimraf "2" - -function-bind@^1.0.2: - version "1.1.0" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.0.tgz#16176714c801798e4e8f2cf7f7529467bb4a5771" - -gauge@~2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.6.0.tgz#d35301ad18e96902b4751dcbbe40f4218b942a46" - dependencies: - aproba "^1.0.3" - console-control-strings "^1.0.0" - has-color "^0.1.7" - 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" - -gaze@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.2.tgz#847224677adb8870d679257ed3388fdb61e40105" - dependencies: - globule "^1.0.0" - -generate-function@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" - -generate-object-property@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" - dependencies: - is-property "^1.0.0" - -get-caller-file@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" - -get-stdin@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" - -getpass@^0.1.1: - version "0.1.6" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.6.tgz#283ffd9fc1256840875311c1b60e8c40187110e6" - dependencies: - assert-plus "^1.0.0" - -glob-base@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" - dependencies: - glob-parent "^2.0.0" - is-glob "^2.0.0" - -glob-parent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" - dependencies: - is-glob "^2.0.0" - -glob@^6.0.1: - version "6.0.4" - resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" - dependencies: - inflight "^1.0.4" - inherits "2" - minimatch "2 || 3" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^7.0.0, glob@^7.0.3, glob@^7.0.5: - version "7.1.1" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.2" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@~3.2: - version "3.2.11" - resolved "https://registry.yarnpkg.com/glob/-/glob-3.2.11.tgz#4a973f635b9190f715d10987d5c00fd2815ebe3d" - dependencies: - inherits "2" - minimatch "0.3" - -glob@~7.0.3: - version "7.0.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.6.tgz#211bafaf49e525b8cd93260d14ab136152b3f57a" - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.2" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@5.0.x: - version "5.0.15" - resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" - dependencies: - inflight "^1.0.4" - inherits "2" - minimatch "2 || 3" - once "^1.3.0" - path-is-absolute "^1.0.0" - -global-modules@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-0.2.3.tgz#ea5a3bed42c6d6ce995a4f8a1269b5dae223828d" - dependencies: - global-prefix "^0.1.4" - is-windows "^0.2.0" - -global-prefix@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-0.1.4.tgz#05158db1cde2dd491b455e290eb3ab8bfc45c6e1" - dependencies: - ini "^1.3.4" - is-windows "^0.2.0" - osenv "^0.1.3" - which "^1.2.10" - -globals@^8.3.0: - version "8.18.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-8.18.0.tgz#93d4a62bdcac38cfafafc47d6b034768cb0ffcb4" - -globals@^9.0.0, globals@^9.2.0: - version "9.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-9.12.0.tgz#992ce90828c3a55fa8f16fada177adb64664cf9d" - -globby@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" - dependencies: - array-union "^1.0.1" - arrify "^1.0.0" - glob "^7.0.3" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - -globule@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/globule/-/globule-1.0.0.tgz#f22aebaacce02be492453e979c3ae9b6983f1c6c" - dependencies: - glob "~7.0.3" - lodash "~4.9.0" - minimatch "~3.0.0" - -graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6: - version "4.1.9" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.9.tgz#baacba37d19d11f9d146d3578bc99958c3787e29" - -"graceful-readlink@>= 1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" - -har-validator@~2.0.2, har-validator@~2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d" - dependencies: - chalk "^1.1.1" - commander "^2.9.0" - is-my-json-valid "^2.12.4" - pinkie-promise "^2.0.0" - -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - dependencies: - ansi-regex "^2.0.0" - -has-binary@0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/has-binary/-/has-binary-0.1.6.tgz#25326f39cfa4f616ad8787894e3af2cfbc7b6e10" - dependencies: - isarray "0.0.1" - -has-binary@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/has-binary/-/has-binary-0.1.7.tgz#68e61eb16210c9545a0a5cce06a873912fe1e68c" - dependencies: - isarray "0.0.1" - -has-color@^0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/has-color/-/has-color-0.1.7.tgz#67144a5260c34fc3cca677d041daf52fe7b78b2f" - -has-cors@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" - -has-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" - -has-unicode@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - -has@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" - dependencies: - function-bind "^1.0.2" - -hasha@~2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/hasha/-/hasha-2.2.0.tgz#78d7cbfc1e6d66303fe79837365984517b2f6ee1" - dependencies: - is-stream "^1.0.1" - pinkie-promise "^2.0.0" - -hawk@~3.1.0, hawk@~3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" - dependencies: - boom "2.x.x" - cryptiles "2.x.x" - hoek "2.x.x" - sntp "1.x.x" - -hoek@2.x.x: - version "2.16.3" - resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" - -home-or-tmp@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-1.0.0.tgz#4b9f1e40800c3e50c6c27f781676afcce71f3985" - dependencies: - os-tmpdir "^1.0.1" - user-home "^1.1.1" - -hosted-git-info@^2.1.4: - version "2.1.5" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.1.5.tgz#0ba81d90da2e25ab34a332e6ec77936e1598118b" - -html-comment-regex@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.1.tgz#668b93776eaae55ebde8f3ad464b307a4963625e" - -http-errors@~1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.5.0.tgz#b1cb3d8260fd8e2386cad3189045943372d48211" - dependencies: - inherits "2.0.1" - setprototypeof "1.0.1" - statuses ">= 1.3.0 < 2" - -http-proxy@^1.13.0: - version "1.15.2" - resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.15.2.tgz#642fdcaffe52d3448d2bda3b0079e9409064da31" - dependencies: - eventemitter3 "1.x.x" - requires-port "1.x.x" - -http-proxy@1.15.1: - version "1.15.1" - resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.15.1.tgz#91a6088172e79bc0e821d5eb04ce702f32446393" - dependencies: - eventemitter3 "1.x.x" - requires-port "1.x.x" - -http-signature@~0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-0.11.0.tgz#1796cf67a001ad5cd6849dca0991485f09089fe6" - dependencies: - asn1 "0.1.11" - assert-plus "^0.1.5" - ctype "0.5.3" - -http-signature@~1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" - dependencies: - assert-plus "^0.2.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - -iconv-lite@0.4.13: - version "0.4.13" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2" - -ignore@^3.1.5: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.2.0.tgz#8d88f03c3002a0ac52114db25d2c673b0bf1e435" - -immutable@^3.7.6, immutable@3.8.1: - version "3.8.1" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.1.tgz#200807f11ab0f72710ea485542de088075f68cd2" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - -in-publish@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51" - -indent-string@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" - dependencies: - repeating "^2.0.0" - -indexes-of@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" - -indexof@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.1, inherits@2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - -inherits@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" - -ini@^1.3.4, ini@~1.3.0: - version "1.3.4" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" - -inquirer@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.12.0.tgz#1ef2bfd63504df0bc75785fff8c2c41df12f077e" - dependencies: - ansi-escapes "^1.1.0" - ansi-regex "^2.0.0" - chalk "^1.0.0" - cli-cursor "^1.0.1" - cli-width "^2.0.0" - figures "^1.3.5" - lodash "^4.3.0" - readline2 "^1.0.1" - run-async "^0.1.0" - rx-lite "^3.1.2" - string-width "^1.0.1" - strip-ansi "^3.0.0" - through "^2.3.6" - -interpolate: - version "0.1.0" - resolved "https://registry.yarnpkg.com/interpolate/-/interpolate-0.1.0.tgz#b60177a4ba941fb3724c821905d99aade13d1df9" - -invariant@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.1.tgz#b097010547668c7e337028ebe816ebe36c8a8d54" - dependencies: - loose-envify "^1.0.0" - -invert-kv@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" - -is-absolute-url@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.0.0.tgz#9c4b20b0e5c0cbef9a479a367ede6f991679f359" - -is-absolute@^0.2.3: - version "0.2.6" - resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-0.2.6.tgz#20de69f3db942ef2d87b9c2da36f172235b1b5eb" - dependencies: - is-relative "^0.2.1" - is-windows "^0.2.0" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - -is-binary-path@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" - dependencies: - binary-extensions "^1.0.0" - -is-buffer@^1.0.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.4.tgz#cfc86ccd5dc5a52fa80489111c6920c457e2d98b" - -is-builtin-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" - dependencies: - builtin-modules "^1.0.0" - -is-dotfile@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d" - -is-equal-shallow@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" - dependencies: - is-primitive "^2.0.0" - -is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - -is-extglob@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" - -is-finite@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - -is-glob@^2.0.0, is-glob@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" - dependencies: - is-extglob "^1.0.0" - -is-my-json-valid@^2.10.0, is-my-json-valid@^2.12.4: - version "2.15.0" - resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.15.0.tgz#936edda3ca3c211fd98f3b2d3e08da43f7b2915b" - dependencies: - generate-function "^2.0.0" - generate-object-property "^1.1.0" - jsonpointer "^4.0.0" - xtend "^4.0.0" - -is-number@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-0.1.1.tgz#69a7af116963d47206ec9bd9b48a14216f1e3806" - -is-number@^2.0.2, is-number@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" - dependencies: - kind-of "^3.0.2" - -is-path-cwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" - -is-path-in-cwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" - dependencies: - is-path-inside "^1.0.0" - -is-path-inside@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f" - dependencies: - path-is-inside "^1.0.1" - -is-plain-obj@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - -is-posix-bracket@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" - -is-primitive@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" - -is-property@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" - -is-relative@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-0.2.1.tgz#d27f4c7d516d175fb610db84bbeef23c3bc97aa5" - dependencies: - is-unc-path "^0.1.1" - -is-resolvable@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.0.0.tgz#8df57c61ea2e3c501408d100fb013cf8d6e0cc62" - dependencies: - tryit "^1.0.1" - -is-stream@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - -is-svg@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-2.0.1.tgz#f93ab3bf1d6bbca30e9753cd3485b1300eebc013" - dependencies: - html-comment-regex "^1.1.0" - -is-typedarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - -is-unc-path@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-0.1.1.tgz#ab2533d77ad733561124c3dc0f5cd8b90054c86b" - dependencies: - unc-path-regex "^0.1.0" - -is-utf8@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" - -is-windows@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c" - -is@~0.2.6: - version "0.2.7" - resolved "https://registry.yarnpkg.com/is/-/is-0.2.7.tgz#3b34a2c48f359972f35042849193ae7264b63562" - -isarray@^1.0.0, isarray@~1.0.0, isarray@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - -isbinaryfile@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.1.tgz#6e99573675372e841a0520c036b41513d783e79e" - -isexe@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-1.1.2.tgz#36f3e22e60750920f5e7241a476a8c6a42275ad0" - -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - dependencies: - isarray "1.0.0" - -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - -jasmine-core: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-2.5.2.tgz#6f61bd79061e27f43e6f9355e44b3c6cab6ff297" - -jodid25519@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967" - dependencies: - jsbn "~0.1.0" - -js-base64@^2.1.9: - version "2.1.9" - resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.1.9.tgz#f0e80ae039a4bd654b5f281fc93f04a914a7fcce" - -js-tokens@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-1.0.3.tgz#14e56eb68c8f1a92c43d59f5014ec29dc20f2ae1" - -js-tokens@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-2.0.0.tgz#79903f5563ee778cc1162e6dcf1a0027c97f9cb5" - -js-yaml@^3.5.1, js-yaml@~3.6.1: - version "3.6.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.6.1.tgz#6e5fe67d8b205ce4d22fad05b7781e8dadcc4b30" - dependencies: - argparse "^1.0.7" - esprima "^2.6.0" - -jsbn@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.0.tgz#650987da0dd74f4ebf5a11377a2aa2d273e97dfd" - -jsesc@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" - -json-schema@0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" - -json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" - dependencies: - jsonify "~0.0.0" - -json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - -json3@3.2.6: - version "3.2.6" - resolved "https://registry.yarnpkg.com/json3/-/json3-3.2.6.tgz#f6efc93c06a04de9aec53053df2559bb19e2038b" - -json3@3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" - -json5@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/json5/-/json5-0.4.0.tgz#054352e4c4c80c86c0923877d449de176a732c8d" - -jsonfile@^2.1.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" - optionalDependencies: - graceful-fs "^4.1.6" - -jsonify@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" - -jsonpointer@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.0.tgz#6661e161d2fc445f19f98430231343722e1fcbd5" - -jspm-github@^0.14.11: - version "0.14.11" - resolved "https://registry.yarnpkg.com/jspm-github/-/jspm-github-0.14.11.tgz#5093b3a79289d63ff6e3982f3b527878ac808d5c" - dependencies: - bluebird "^3.0.5" - expand-tilde "^1.2.0" - graceful-fs "^4.1.3" - mkdirp "^0.5.1" - netrc "^0.1.3" - request "^2.74.0" - rimraf "^2.5.4" - semver "^5.0.1" - tar-fs "^1.13.0" - which "^1.0.9" - -jspm-npm@^0.29.5: - version "0.29.7" - resolved "https://registry.yarnpkg.com/jspm-npm/-/jspm-npm-0.29.7.tgz#029159c3fe210d20f6965821697082e9a2be40ce" - dependencies: - bluebird "^3.0.5" - buffer-peek-stream "^1.0.1" - graceful-fs "^4.1.3" - mkdirp "^0.5.1" - readdirp "^2.0.0" - request "^2.58.0" - rmdir "^1.1.0" - semver "^5.0.1" - systemjs-builder "^0.15.20" - tar-fs "^1.13.0" - traceur "0.0.105" - which "^1.1.1" - -jspm-registry@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/jspm-registry/-/jspm-registry-0.4.1.tgz#2a30c419906ad71d4da692d1532009dd201c5b14" - dependencies: - graceful-fs "^4.1.3" - rimraf "^2.3.2" - rsvp "^3.0.18" - semver "^4.3.3" - -jspm@beta: - version "0.17.0-beta.29" - resolved "https://registry.yarnpkg.com/jspm/-/jspm-0.17.0-beta.29.tgz#b75f13db7734ba492285409bb57499fb6956e7b2" - dependencies: - bluebird "^3.0.5" - chalk "^1.1.1" - core-js "^1.2.6" - glob "^6.0.1" - graceful-fs "^4.1.2" - jspm-github "^0.14.11" - jspm-npm "^0.29.5" - jspm-registry "^0.4.1" - liftoff "^2.2.0" - minimatch "^3.0.0" - mkdirp "~0.5.1" - ncp "^2.0.0" - proper-lockfile "^1.1.2" - request "^2.67.0" - rimraf "^2.4.4" - sane "^1.3.3" - semver "^5.1.0" - systemjs "0.19.39" - systemjs-builder "0.15.32" - traceur "0.0.105" - uglify-js "^2.6.1" - -jsprim@^1.2.2: - version "1.3.1" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.3.1.tgz#2a7256f70412a29ee3670aaca625994c4dcff252" - dependencies: - extsprintf "1.0.2" - json-schema "0.2.3" - verror "1.3.6" - -karma: - version "1.3.0" - resolved "https://registry.yarnpkg.com/karma/-/karma-1.3.0.tgz#b2b94e8f499fadd0069d54f9aef4a4d48ec5cc1f" - dependencies: - bluebird "^3.3.0" - body-parser "^1.12.4" - chokidar "^1.4.1" - colors "^1.1.0" - combine-lists "^1.0.0" - connect "^3.3.5" - core-js "^2.2.0" - di "^0.0.1" - dom-serialize "^2.2.0" - expand-braces "^0.1.1" - glob "^7.0.3" - graceful-fs "^4.1.2" - http-proxy "^1.13.0" - isbinaryfile "^3.0.0" - lodash "^3.8.0" - log4js "^0.6.31" - mime "^1.3.4" - minimatch "^3.0.0" - optimist "^0.6.1" - qjobs "^1.1.4" - range-parser "^1.2.0" - rimraf "^2.3.3" - socket.io "1.4.7" - source-map "^0.5.3" - tmp "0.0.28" - useragent "^2.1.9" - -karma-jasmine: - version "1.0.2" - resolved "https://registry.yarnpkg.com/karma-jasmine/-/karma-jasmine-1.0.2.tgz#c0b3ab327bf207db60e17fa27db37cfdef5d8e6c" - -karma-jspm: - version "2.2.0" - resolved "https://registry.yarnpkg.com/karma-jspm/-/karma-jspm-2.2.0.tgz#ce8eaa730896e0b95ab3645b9b8ec5b3a1c419a7" - dependencies: - glob "~3.2" - -karma-nyan-reporter: - version "0.2.4" - resolved "https://registry.yarnpkg.com/karma-nyan-reporter/-/karma-nyan-reporter-0.2.4.tgz#361bc4135002cbe504a36e38f3506e866d6a852c" - dependencies: - cli-color "^0.3.2" - -karma-phantomjs-launcher: - version "1.0.2" - resolved "https://registry.yarnpkg.com/karma-phantomjs-launcher/-/karma-phantomjs-launcher-1.0.2.tgz#19e1041498fd75563ed86730a22c1fe579fa8fb1" - dependencies: - lodash "^4.0.1" - phantomjs-prebuilt "^2.1.7" - -kew@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/kew/-/kew-0.7.0.tgz#79d93d2d33363d6fdd2970b335d9141ad591d79b" - -kind-of@^3.0.2: - version "3.0.4" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.0.4.tgz#7b8ecf18a4e17f8269d73b501c9f232c96887a74" - dependencies: - is-buffer "^1.0.2" - -klaw@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.0.tgz#8857bfbc1d824badf13d3d0241d8bbe46fb12f73" - -lazy-cache@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" - -lcid@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" - dependencies: - invert-kv "^1.0.0" - -levn@^0.3.0, levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - -liftoff@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-2.3.0.tgz#a98f2ff67183d8ba7cfaca10548bd7ff0550b385" - dependencies: - extend "^3.0.0" - findup-sync "^0.4.2" - fined "^1.0.1" - flagged-respawn "^0.3.2" - lodash.isplainobject "^4.0.4" - lodash.isstring "^4.0.1" - lodash.mapvalues "^4.4.0" - rechoir "^0.6.2" - resolve "^1.1.7" - -limiter@^1.0.5: - version "1.1.0" - resolved "https://registry.yarnpkg.com/limiter/-/limiter-1.1.0.tgz#6e2bd12ca3fcdaa11f224e2e53c896df3f08d913" - -load-json-file@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - pinkie-promise "^2.0.0" - strip-bom "^2.0.0" - -localtunnel@1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/localtunnel/-/localtunnel-1.8.1.tgz#d51b2bb7a7066afb05b57fc9db844015098f2e17" - dependencies: - debug "2.2.0" - openurl "1.1.0" - request "2.65.0" - yargs "3.29.0" - -lodash.assign@^4.0.3, lodash.assign@^4.0.6, lodash.assign@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" - -lodash.assignwith@^4.0.7: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.assignwith/-/lodash.assignwith-4.2.0.tgz#127a97f02adc41751a954d24b0de17e100e038eb" - -lodash.clonedeep@^4.3.2: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" - -lodash.indexof@^4.0.5: - version "4.0.5" - resolved "https://registry.yarnpkg.com/lodash.indexof/-/lodash.indexof-4.0.5.tgz#53714adc2cddd6ed87638f893aa9b6c24e31ef3c" - -lodash.isempty@^4.2.1: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.isempty/-/lodash.isempty-4.4.0.tgz#6f86cbedd8be4ec987be9aaf33c9684db1b31e7e" - -lodash.isplainobject@^4.0.4: - version "4.0.6" - resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" - -lodash.isstring@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" - -lodash.mapvalues@^4.4.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz#1bafa5005de9dd6f4f26668c30ca37230cc9689c" - -lodash.pick@^4.2.1: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" - -lodash.pickby@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.pickby/-/lodash.pickby-4.6.0.tgz#7dea21d8c18d7703a27c704c15d3b84a67e33aff" - -lodash@^3.10.1, lodash@^3.8.0: - version "3.10.1" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" - -lodash@^4.0.0, lodash@^4.0.1, lodash@^4.14.0, lodash@^4.2.0, lodash@^4.3.0, lodash@^4.5.0: - version "4.16.4" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.16.4.tgz#01ce306b9bad1319f2a5528674f88297aeb70127" - -lodash@~4.9.0: - version "4.9.0" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.9.0.tgz#4c20d742f03ce85dc700e0dd7ab9bcab85e6fc14" - -log4js@^0.6.31: - version "0.6.38" - resolved "https://registry.yarnpkg.com/log4js/-/log4js-0.6.38.tgz#2c494116695d6fb25480943d3fc872e662a522fd" - dependencies: - readable-stream "~1.0.2" - semver "~4.3.3" - -longest@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" - -loose-envify@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.2.0.tgz#69a65aad3de542cf4ee0f4fe74e8e33c709ccb0f" - dependencies: - js-tokens "^1.0.1" - -loud-rejection@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" - dependencies: - currently-unhandled "^0.4.1" - signal-exit "^3.0.0" - -lru-cache@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.0.1.tgz#1343955edaf2e37d9b9e7ee7241e27c4b9fb72be" - dependencies: - pseudomap "^1.0.1" - yallist "^2.0.0" - -lru-cache@2: - version "2.7.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" - -lru-cache@2.2.x: - version "2.2.4" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.2.4.tgz#6c658619becf14031d0d0b594b16042ce4dc063d" - -lru-queue@0.1: - version "0.1.0" - resolved "https://registry.yarnpkg.com/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3" - dependencies: - es5-ext "~0.10.2" - -macaddress@^0.2.8: - version "0.2.8" - resolved "https://registry.yarnpkg.com/macaddress/-/macaddress-0.2.8.tgz#5904dc537c39ec6dbefeae902327135fa8511f12" - -makeerror@1.0.x: - version "1.0.11" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" - dependencies: - tmpl "1.0.x" - -map-cache@^0.2.0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - -map-obj@^1.0.0, map-obj@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" - -math-expression-evaluator@^1.2.14: - version "1.2.14" - resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.14.tgz#39511771ed9602405fba9affff17eb4d2a3843ab" - dependencies: - lodash.indexof "^4.0.5" - -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - -memoizee@~0.3.8: - version "0.3.10" - resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.3.10.tgz#4eca0d8aed39ec9d017f4c5c2f2f6432f42e5c8f" - dependencies: - d "~0.1.1" - es5-ext "~0.10.11" - es6-weak-map "~0.1.4" - event-emitter "~0.3.4" - lru-queue "0.1" - next-tick "~0.2.2" - timers-ext "0.1" - -meow@^3.7.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" - dependencies: - 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@^1.1.3: - version "1.2.0" - resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da" - -micromatch@^2.1.5, micromatch@^2.3.7, micromatch@2.3.11: - version "2.3.11" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" - dependencies: - arr-diff "^2.0.0" - array-unique "^0.2.1" - braces "^1.8.2" - expand-brackets "^0.1.4" - extglob "^0.3.1" - filename-regex "^2.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.1" - kind-of "^3.0.2" - normalize-path "^2.0.1" - object.omit "^2.0.0" - parse-glob "^3.0.4" - regex-cache "^0.4.2" - -mime-db@~1.12.0: - version "1.12.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.12.0.tgz#3d0c63180f458eb10d325aaa37d7c58ae312e9d7" - -mime-db@~1.24.0: - version "1.24.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.24.0.tgz#e2d13f939f0016c6e4e9ad25a8652f126c467f0c" - -mime-types@^2.1.11, mime-types@~2.1.11, mime-types@~2.1.7: - version "2.1.12" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.12.tgz#152ba256777020dd4663f54c2e7bc26381e71729" - dependencies: - mime-db "~1.24.0" - -mime-types@~2.0.4: - version "2.0.14" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.0.14.tgz#310e159db23e077f8bb22b748dabfa4957140aa6" - dependencies: - mime-db "~1.12.0" - -mime@^1.3.4, "mime@>= 0.0.1", mime@1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" - -mime@1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.2.4.tgz#11b5fdaf29c2509255176b80ad520294f5de92b7" - -minimatch@^3.0.0, minimatch@^3.0.2, minimatch@~3.0.0, "minimatch@2 || 3": - version "3.0.3" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" - dependencies: - brace-expansion "^1.0.0" - -minimatch@0.3: - version "0.3.0" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.3.0.tgz#275d8edaac4f1bb3326472089e7949c8394699dd" - dependencies: - lru-cache "2" - sigmund "~1.0.0" - -minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" - -minimist@~0.0.1: - version "0.0.10" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" - -minimist@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - -mkdirp@^0.5.0, mkdirp@^0.5.1, "mkdirp@>=0.5 0", mkdirp@~0.5.0, mkdirp@~0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - dependencies: - minimist "0.0.8" - -mkdirp@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.0.tgz#1bbf5ab1ba827af23575143490426455f481fe1e" - -mkdirp@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.0.tgz#1d73076a6df986cd9344e15e71fcc05a4c9abf12" - dependencies: - minimist "0.0.8" - -ms@0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" - -mute-stream@0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0" - -mz@^2.3.1: - version "2.4.0" - resolved "https://registry.yarnpkg.com/mz/-/mz-2.4.0.tgz#987ba9624d89395388c37cb4741e2caf4dd13b1a" - dependencies: - any-promise "^1.0.0" - object-assign "^4.0.1" - thenify-all "^1.0.0" - -nan@^2.3.0, nan@^2.3.2: - version "2.4.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.4.0.tgz#fb3c59d45fe4effe215f0b890f8adf6eb32d2232" - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - -ncp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ncp/-/ncp-2.0.0.tgz#195a21d6c46e361d2fb1281ba38b91e9df7bdbb3" - -negotiator@0.4.9: - version "0.4.9" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.4.9.tgz#92e46b6db53c7e421ed64a2bc94f08be7630df3f" - -negotiator@0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" - -netrc@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/netrc/-/netrc-0.1.4.tgz#6be94fcaca8d77ade0a9670dc460914c94472444" - -next-tick@~0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-0.2.2.tgz#75da4a927ee5887e39065880065b7336413b310d" - -node-gyp@^3.3.1: - version "3.4.0" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.4.0.tgz#dda558393b3ecbbe24c9e6b8703c71194c63fa36" - dependencies: - fstream "^1.0.0" - glob "^7.0.3" - graceful-fs "^4.1.2" - minimatch "^3.0.2" - mkdirp "^0.5.0" - nopt "2 || 3" - npmlog "0 || 1 || 2 || 3" - osenv "0" - path-array "^1.0.0" - request "2" - rimraf "2" - semver "2.x || 3.x || 4 || 5" - tar "^2.0.0" - which "1" - -node-int64@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - -node-pre-gyp@^0.6.29: - version "0.6.30" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.30.tgz#64d3073a6f573003717ccfe30c89023297babba1" - dependencies: - mkdirp "~0.5.0" - nopt "~3.0.1" - npmlog "4.x" - rc "~1.1.0" - request "2.x" - rimraf "~2.5.0" - semver "~5.3.0" - tar "~2.2.0" - tar-pack "~3.1.0" - -node-sass: - version "3.10.1" - resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-3.10.1.tgz#c535b2e1a5439240591e06d7308cb663820d616c" - dependencies: - async-foreach "^0.1.3" - chalk "^1.1.1" - cross-spawn "^3.0.0" - gaze "^1.0.0" - get-stdin "^4.0.1" - glob "^7.0.3" - in-publish "^2.0.0" - lodash.assign "^4.2.0" - lodash.clonedeep "^4.3.2" - meow "^3.7.0" - mkdirp "^0.5.1" - nan "^2.3.2" - node-gyp "^3.3.1" - npmlog "^4.0.0" - request "^2.61.0" - sass-graph "^2.1.1" - -node-uuid@~1.4.3, node-uuid@~1.4.7: - version "1.4.7" - resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.7.tgz#6da5a17668c4b3dd59623bda11cf7fa4c1f60a6f" - -node.extend@1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/node.extend/-/node.extend-1.0.8.tgz#bab04379f7383f4587990c9df07b6a7f65db772b" - dependencies: - is "~0.2.6" - object-keys "~0.4.0" - -node.flow@1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/node.flow/-/node.flow-1.2.3.tgz#e1c44a82aeca8d78b458a77fb3dc642f2eba2649" - dependencies: - node.extend "1.0.8" - -nopt@~3.0.1, "nopt@2 || 3", nopt@3.0.x: - version "3.0.6" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" - dependencies: - abbrev "1" - -normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: - version "2.3.5" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.5.tgz#8d924f142960e1777e7ffe170543631cc7cb02df" - dependencies: - 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@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.0.1.tgz#47886ac1662760d4261b7d979d241709d3ce3f7a" - -normalize-range@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" - -normalize-url@^1.4.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.7.0.tgz#d82452d98d38821cffddab4d77a5f8d20ce66db0" - dependencies: - object-assign "^4.0.1" - prepend-http "^1.0.0" - query-string "^4.1.0" - sort-keys "^1.0.0" - -npmlog@^4.0.0, npmlog@4.x: - version "4.0.0" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.0.0.tgz#e094503961c70c1774eb76692080e8d578a9f88f" - dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.6.0" - set-blocking "~2.0.0" - -"npmlog@0 || 1 || 2 || 3": - version "3.1.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-3.1.2.tgz#2d46fa874337af9498a2f12bb43d8d0be4a36873" - dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.6.0" - set-blocking "~2.0.0" - -num2fraction@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - -oauth-sign@~0.8.0, oauth-sign@~0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" - -object-assign@^4.0.1, object-assign@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" - -object-component@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291" - -object-keys@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" - -object-path@^0.9.0: - version "0.9.2" - resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.9.2.tgz#0fd9a74fc5fad1ae3968b586bda5c632bd6c05a5" - -object.omit@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.0.tgz#868597333d54e60662940bb458605dd6ae12fe94" - dependencies: - for-own "^0.1.3" - is-extendable "^0.1.1" - -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - dependencies: - ee-first "1.1.1" - -once@^1.3.0, once@^1.3.1: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - dependencies: - wrappy "1" - -once@~1.3.0, once@~1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" - dependencies: - wrappy "1" - -onetime@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" - -openurl@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/openurl/-/openurl-1.1.0.tgz#e2f2189d999c04823201f083f0f1a7cd8903187a" - -opn@4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/opn/-/opn-4.0.2.tgz#7abc22e644dff63b0a96d5ab7f2790c0f01abc95" - dependencies: - object-assign "^4.0.1" - pinkie-promise "^2.0.0" - -optimist@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" - dependencies: - minimist "~0.0.1" - wordwrap "~0.0.2" - -optionator@^0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" - dependencies: - 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" - -options@>=0.0.5: - version "0.0.6" - resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f" - -os-homedir@^1.0.0, os-homedir@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - -os-locale@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" - dependencies: - lcid "^1.0.0" - -os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - -osenv@^0.1.3, osenv@0: - version "0.1.3" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.3.tgz#83cf05c6d6458fc4d5ac6362ea325d92f2754217" - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" - -parse-filepath@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.1.tgz#159d6155d43904d16c10ef698911da1e91969b73" - dependencies: - is-absolute "^0.2.3" - map-cache "^0.2.0" - path-root "^0.1.1" - -parse-glob@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" - dependencies: - glob-base "^0.3.0" - is-dotfile "^1.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.0" - -parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - dependencies: - error-ex "^1.2.0" - -parsejson@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/parsejson/-/parsejson-0.0.1.tgz#9b10c6c0d825ab589e685153826de0a3ba278bcc" - dependencies: - better-assert "~1.0.0" - -parseqs@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.2.tgz#9dfe70b2cddac388bde4f35b1f240fa58adbe6c7" - dependencies: - better-assert "~1.0.0" - -parseuri@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.4.tgz#806582a39887e1ea18dd5e2fe0e01902268e9350" - dependencies: - better-assert "~1.0.0" - -parseurl@~1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.1.tgz#c8ab8c9223ba34888aa64a297b28853bec18da56" - -path-array@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-array/-/path-array-1.0.1.tgz#7e2f0f35f07a2015122b868b7eac0eb2c4fec271" - dependencies: - array-index "^1.0.0" - -path-exists@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-1.0.0.tgz#d5a8998eb71ef37a74c34eb0d9eba6e878eea081" - -path-exists@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" - dependencies: - pinkie-promise "^2.0.0" - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - -path-is-inside@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - -path-root-regex@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d" - -path-root@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7" - dependencies: - path-root-regex "^0.1.0" - -path-type@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" - dependencies: - graceful-fs "^4.1.2" - pify "^2.0.0" - pinkie-promise "^2.0.0" - -pend@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" - -phantomjs-prebuilt@^2.1.7: - version "2.1.13" - resolved "https://registry.yarnpkg.com/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.13.tgz#66556ad9e965d893ca5a7dc9e763df7e8697f76d" - dependencies: - es6-promise "~4.0.3" - extract-zip "~1.5.0" - fs-extra "~0.30.0" - hasha "~2.2.0" - kew "~0.7.0" - progress "~1.1.8" - request "~2.74.0" - request-progress "~2.0.1" - which "~1.2.10" - -pify@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - -pinkie-promise@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - dependencies: - pinkie "^2.0.0" - -pinkie@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - -pluralize@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45" - -portscanner@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/portscanner/-/portscanner-1.0.0.tgz#3b5cfe393828b5160abc600e6270ebc2f1590558" - dependencies: - async "0.1.15" - -postcss, postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0.14, postcss@^5.0.16, postcss@^5.0.2, postcss@^5.0.4, postcss@^5.0.5, postcss@^5.0.8, postcss@^5.2.4: - version "5.2.5" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.5.tgz#ec428c27dffc7fac65961340a9b022fa4af5f056" - dependencies: - chalk "^1.1.3" - js-base64 "^2.1.9" - source-map "^0.5.6" - supports-color "^3.1.2" - -postcss-calc@^5.2.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-5.3.1.tgz#77bae7ca928ad85716e2fda42f261bf7c1d65b5e" - dependencies: - postcss "^5.0.2" - postcss-message-helpers "^2.0.0" - reduce-css-calc "^1.2.6" - -postcss-colormin@^2.1.8: - version "2.2.1" - resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-2.2.1.tgz#dc5421b6ae6f779ef6bfd47352b94abe59d0316b" - dependencies: - colormin "^1.0.5" - postcss "^5.0.13" - postcss-value-parser "^3.2.3" - -postcss-convert-values@^2.3.4: - version "2.4.1" - resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-2.4.1.tgz#45dce4d4e33b7d967b97a4d937f270ea98d2fe7a" - dependencies: - postcss "^5.0.11" - postcss-value-parser "^3.1.2" - -postcss-discard-comments@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz#befe89fafd5b3dace5ccce51b76b81514be00e3d" - dependencies: - postcss "^5.0.14" - -postcss-discard-duplicates@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-2.0.1.tgz#5fae3f1a71df3e19cffb37309d1a7dba56c4589c" - dependencies: - postcss "^5.0.4" - -postcss-discard-empty@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz#d2b4bd9d5ced5ebd8dcade7640c7d7cd7f4f92b5" - dependencies: - postcss "^5.0.14" - -postcss-discard-overridden@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz#8b1eaf554f686fb288cd874c55667b0aa3668d58" - dependencies: - postcss "^5.0.16" - -postcss-discard-unused@^2.2.1: - version "2.2.2" - resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-2.2.2.tgz#5d72f7d05d11de0a9589e001958067ccae1b4931" - dependencies: - postcss "^5.0.14" - uniqs "^2.0.0" - -postcss-filter-plugins@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/postcss-filter-plugins/-/postcss-filter-plugins-2.0.2.tgz#6d85862534d735ac420e4a85806e1f5d4286d84c" - dependencies: - postcss "^5.0.4" - uniqid "^4.0.0" - -postcss-merge-idents@^2.1.5: - version "2.1.7" - resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz#4c5530313c08e1d5b3bbf3d2bbc747e278eea270" - dependencies: - has "^1.0.1" - postcss "^5.0.10" - postcss-value-parser "^3.1.1" - -postcss-merge-longhand@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-2.0.1.tgz#ff59b5dec6d586ce2cea183138f55c5876fa9cdc" - dependencies: - postcss "^5.0.4" - -postcss-merge-rules@^2.0.3: - version "2.0.10" - resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-2.0.10.tgz#54b360be804e7e69a5c7222635247b92a3569e9b" - dependencies: - postcss "^5.0.4" - vendors "^1.0.0" - -postcss-message-helpers@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz#a4f2f4fab6e4fe002f0aed000478cdf52f9ba60e" - -postcss-minify-font-values@^1.0.2: - version "1.0.5" - resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz#4b58edb56641eba7c8474ab3526cafd7bbdecb69" - dependencies: - object-assign "^4.0.1" - postcss "^5.0.4" - postcss-value-parser "^3.0.2" - -postcss-minify-gradients@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-1.0.4.tgz#47d4fef7efbcc64e541fae6115c9a3cc84d47006" - dependencies: - postcss "^5.0.12" - postcss-value-parser "^3.3.0" - -postcss-minify-params@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-1.0.5.tgz#82d602643b8616a61fb3634d7ede0289836d67f9" - dependencies: - alphanum-sort "^1.0.1" - postcss "^5.0.2" - postcss-value-parser "^3.0.2" - uniqs "^2.0.0" - -postcss-minify-selectors@^2.0.4: - version "2.0.5" - resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-2.0.5.tgz#4e1f966fb49c95266804016ba9a3c6645bb601e0" - dependencies: - alphanum-sort "^1.0.2" - postcss "^5.0.14" - postcss-selector-parser "^2.0.0" - -postcss-normalize-charset@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-1.1.0.tgz#2fbd30e12248c442981d31ea2484d46fd0628970" - dependencies: - postcss "^5.0.5" - -postcss-normalize-url@^3.0.7: - version "3.0.7" - resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-3.0.7.tgz#6bd90d0a4bc5a1df22c26ea65c53257dc3829f4e" - dependencies: - is-absolute-url "^2.0.0" - normalize-url "^1.4.0" - postcss "^5.0.14" - postcss-value-parser "^3.2.3" - -postcss-ordered-values@^2.1.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-2.2.2.tgz#be8b511741fab2dac8e614a2302e9d10267b0771" - dependencies: - postcss "^5.0.4" - postcss-value-parser "^3.0.1" - -postcss-reduce-idents@^2.2.2: - version "2.3.1" - resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-2.3.1.tgz#024e8e219f52773313408573db9645ba62d2d2fe" - dependencies: - postcss "^5.0.4" - postcss-value-parser "^3.0.2" - -postcss-reduce-initial@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-1.0.0.tgz#8f739b938289ef2e48936d7101783e4741ca9bbb" - dependencies: - postcss "^5.0.4" - -postcss-reduce-transforms@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.3.tgz#fc193e435a973c10f9801c74700a830f79643343" - dependencies: - postcss "^5.0.8" - postcss-value-parser "^3.0.1" - -postcss-selector-parser@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-2.2.1.tgz#fdbf696103b12b0a64060e5610507f410491f7c8" - dependencies: - flatten "^1.0.2" - indexes-of "^1.0.1" - uniq "^1.0.1" - -postcss-svgo@^2.1.1: - version "2.1.5" - resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-2.1.5.tgz#46fc0363f01bab6a36a9abb01c229fcc45363094" - dependencies: - is-svg "^2.0.0" - postcss "^5.0.14" - postcss-value-parser "^3.2.3" - svgo "^0.7.0" - -postcss-unique-selectors@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz#981d57d29ddcb33e7b1dfe1fd43b8649f933ca1d" - dependencies: - alphanum-sort "^1.0.1" - postcss "^5.0.4" - uniqs "^2.0.0" - -postcss-value-parser@^3.0.1, postcss-value-parser@^3.0.2, postcss-value-parser@^3.1.1, postcss-value-parser@^3.1.2, postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz#87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15" - -postcss-zindex@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-2.1.1.tgz#ea3fbe656c9738aa8729e2ee96ec2a46089b720f" - dependencies: - postcss "^5.0.4" - uniqs "^2.0.0" - -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - -prepend-http@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" - -preserve@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" - -private@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/private/-/private-0.1.6.tgz#55c6a976d0f9bafb9924851350fe47b9b5fbb7c1" - -process-nextick-args@~1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" - -progress@^1.1.8, progress@~1.1.8: - version "1.1.8" - resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" - -proper-lockfile@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/proper-lockfile/-/proper-lockfile-1.2.0.tgz#ceff5dd89d3e5f10fb75e1e8e76bc75801a59c34" - dependencies: - err-code "^1.0.0" - extend "^3.0.0" - graceful-fs "^4.1.2" - retry "^0.10.0" - -pseudomap@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - -pump@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/pump/-/pump-1.0.1.tgz#f1f1409fb9bd1085bbdb576b43b84ec4b5eadc1a" - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -q@^1.1.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/q/-/q-1.4.1.tgz#55705bcd93c5f3673530c2c2cbc0c2b3addc286e" - -qjobs@^1.1.4: - version "1.1.5" - resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.1.5.tgz#659de9f2cf8dcc27a1481276f205377272382e73" - -"qs@>= 0.4.0": - version "6.3.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.0.tgz#f403b264f23bc01228c74131b407f18d5ea5d442" - -qs@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/qs/-/qs-5.2.1.tgz#801fee030e0b9450d6385adc48a4cc55b44aedfc" - -qs@~6.2.0, qs@6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.1.tgz#ce03c5ff0935bc1d9d69a9f14cbd18e568d67625" - -qs@0.4.x: - version "0.4.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-0.4.2.tgz#3cac4c861e371a8c9c4770ac23cda8de639b8e5f" - -qs@6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.0.tgz#3b7848c03c2dece69a9522b0fae8c4126d745f3b" - -query-string@^4.1.0: - version "4.2.3" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.2.3.tgz#9f27273d207a25a8ee4c7b8c74dcd45d556db822" - dependencies: - object-assign "^4.1.0" - strict-uri-encode "^1.0.0" - -randomatic@^1.1.3: - version "1.1.5" - resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.5.tgz#5e9ef5f2d573c67bd2b8124ae90b5156e457840b" - dependencies: - is-number "^2.0.2" - kind-of "^3.0.2" - -range-parser@^1.2.0, range-parser@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" - -raw-body@~2.1.7: - version "2.1.7" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.1.7.tgz#adfeace2e4fb3098058014d08c072dcc59758774" - dependencies: - bytes "2.4.0" - iconv-lite "0.4.13" - unpipe "1.0.0" - -rc@~1.1.0: - version "1.1.6" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.1.6.tgz#43651b76b6ae53b5c802f1151fa3fc3b059969c9" - dependencies: - deep-extend "~0.4.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~1.0.4" - -read-pkg-up@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" - dependencies: - find-up "^1.0.0" - read-pkg "^1.0.0" - -read-pkg@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" - dependencies: - load-json-file "^1.0.0" - normalize-package-data "^2.3.2" - path-type "^1.0.0" - -readable-stream@^2.0.0, "readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.0.2, readable-stream@~2.1.4: - version "2.1.5" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.1.5.tgz#66fa8b720e1438b364681f2ad1a63c618448c9d0" - dependencies: - buffer-shims "^1.0.0" - 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" - -readable-stream@~1.0.2: - version "1.0.34" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -readable-stream@~2.0.0, readable-stream@~2.0.5: - version "2.0.6" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" - dependencies: - 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@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" - dependencies: - graceful-fs "^4.1.2" - minimatch "^3.0.2" - readable-stream "^2.0.2" - set-immediate-shim "^1.0.1" - -readline2@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35" - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - mute-stream "0.0.5" - -rechoir@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" - dependencies: - resolve "^1.1.6" - -redent@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" - dependencies: - indent-string "^2.1.0" - strip-indent "^1.0.1" - -reduce-css-calc@^1.2.6: - version "1.3.0" - resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz#747c914e049614a4c9cfbba629871ad1d2927716" - dependencies: - balanced-match "^0.4.2" - math-expression-evaluator "^1.2.14" - reduce-function-call "^1.0.1" - -reduce-function-call@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/reduce-function-call/-/reduce-function-call-1.0.1.tgz#fa02e126e695824263cab91d3a5b0fdc1dd27a9a" - dependencies: - balanced-match "~0.1.0" - -regenerator-runtime@^0.9.5: - version "0.9.5" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.9.5.tgz#403d6d40a4bdff9c330dd9392dcbb2d9a8bba1fc" - -regex-cache@^0.4.2: - version "0.4.3" - resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" - dependencies: - is-equal-shallow "^0.1.3" - is-primitive "^2.0.0" - -repeat-element@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" - -repeat-string@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-0.2.2.tgz#c7a8d3236068362059a7e4651fc6884e8b1fb4ae" - -repeat-string@^1.5.2: - version "1.5.4" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.5.4.tgz#64ec0c91e0f4b475f90d5b643651e3e6e5b6c2d5" - -repeating@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-1.1.3.tgz#3d4114218877537494f97f77f9785fab810fa4ac" - dependencies: - is-finite "^1.0.0" - -repeating@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" - dependencies: - is-finite "^1.0.0" - -request-progress@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-2.0.1.tgz#5d36bb57961c673aa5b788dbc8141fdf23b44e08" - dependencies: - throttleit "^1.0.0" - -request@^2.58.0, request@^2.61.0, request@^2.67.0, request@^2.74.0, request@2, request@2.x: - version "2.75.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.75.0.tgz#d2b8268a286da13eaa5d01adf5d18cc90f657d93" - dependencies: - 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" - -request@~2.74.0: - version "2.74.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.74.0.tgz#7693ca768bbb0ea5c8ce08c084a45efa05b892ab" - dependencies: - 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 "~1.0.0-rc4" - 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" - -request@2.65.0: - version "2.65.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.65.0.tgz#cc1a3bc72b96254734fc34296da322f9486ddeba" - dependencies: - aws-sign2 "~0.6.0" - bl "~1.0.0" - caseless "~0.11.0" - combined-stream "~1.0.5" - extend "~3.0.0" - forever-agent "~0.6.1" - form-data "~1.0.0-rc3" - har-validator "~2.0.2" - hawk "~3.1.0" - http-signature "~0.11.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.7" - node-uuid "~1.4.3" - oauth-sign "~0.8.0" - qs "~5.2.0" - stringstream "~0.0.4" - tough-cookie "~2.2.0" - tunnel-agent "~0.4.1" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - -require-main-filename@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" - -require-uncached@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.2.tgz#67dad3b733089e77030124678a459589faf6a7ec" - dependencies: - caller-path "^0.1.0" - resolve-from "^1.0.0" - -requires-port@1.x.x: - version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - -resolve-dir@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-0.1.1.tgz#b219259a5602fac5c5c496ad894a6e8cc430261e" - dependencies: - expand-tilde "^1.2.2" - global-modules "^0.2.3" - -resolve-from@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" - -resolve@^1.1.6, resolve@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" - -resp-modifier@6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/resp-modifier/-/resp-modifier-6.0.2.tgz#b124de5c4fbafcba541f48ffa73970f4aa456b4f" - dependencies: - debug "^2.2.0" - minimatch "^3.0.2" - -restore-cursor@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" - dependencies: - exit-hook "^1.0.0" - onetime "^1.0.0" - -retry@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.0.tgz#649e15ca408422d98318161935e7f7d652d435dd" - -right-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" - dependencies: - align-text "^0.1.1" - -rimraf@^2.2.8, rimraf@^2.3.2, rimraf@^2.3.3, rimraf@^2.4.4, rimraf@^2.5.4, rimraf@~2.5.0, rimraf@~2.5.1, rimraf@2: - version "2.5.4" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04" - dependencies: - glob "^7.0.5" - -rmdir@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/rmdir/-/rmdir-1.2.0.tgz#4fe0357cb06168c258e73e968093dc4e8a0f3253" - dependencies: - node.flow "1.2.3" - -rollup@^0.36.0: - version "0.36.3" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.36.3.tgz#c89ac479828924ff8f69c1d44541cb4ea2fc11fc" - dependencies: - source-map-support "^0.4.0" - -rsvp@^3.0.13, rsvp@^3.0.18: - version "3.3.3" - resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.3.3.tgz#34633caaf8bc66ceff4be3c2e1dffd032538a813" - -run-async@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389" - dependencies: - once "^1.3.0" - -rx-lite@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102" - -rx@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" - -sane@^1.3.3: - version "1.4.1" - resolved "https://registry.yarnpkg.com/sane/-/sane-1.4.1.tgz#88f763d74040f5f0c256b6163db399bf110ac715" - dependencies: - exec-sh "^0.2.0" - fb-watchman "^1.8.0" - minimatch "^3.0.2" - minimist "^1.1.1" - walker "~1.0.5" - watch "~0.10.0" - -sass-graph@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.1.2.tgz#965104be23e8103cb7e5f710df65935b317da57b" - dependencies: - glob "^7.0.0" - lodash "^4.0.0" - yargs "^4.7.1" - -sax@~1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.1.tgz#7b8e656190b228e81a66aea748480d828cd2d37a" - -semver@^4.3.3, semver@~4.3.3: - version "4.3.6" - resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" - -semver@^5.0.1, semver@^5.1.0, semver@~5.3.0, "semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5": - version "5.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" - -send@0.14.1: - version "0.14.1" - resolved "https://registry.yarnpkg.com/send/-/send-0.14.1.tgz#a954984325392f51532a7760760e459598c89f7a" - dependencies: - debug "~2.2.0" - depd "~1.1.0" - destroy "~1.0.4" - encodeurl "~1.0.1" - escape-html "~1.0.3" - etag "~1.7.0" - fresh "0.3.0" - http-errors "~1.5.0" - mime "1.3.4" - ms "0.7.1" - on-finished "~2.3.0" - range-parser "~1.2.0" - statuses "~1.3.0" - -serve-index@1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.8.0.tgz#7c5d96c13fb131101f93c1c5774f8516a1e78d3b" - dependencies: - accepts "~1.3.3" - batch "0.5.3" - debug "~2.2.0" - escape-html "~1.0.3" - http-errors "~1.5.0" - mime-types "~2.1.11" - parseurl "~1.3.1" - -serve-static@1.11.1: - version "1.11.1" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.11.1.tgz#d6cce7693505f733c759de57befc1af76c0f0805" - dependencies: - encodeurl "~1.0.1" - escape-html "~1.0.3" - parseurl "~1.3.1" - send "0.14.1" - -server-destroy@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/server-destroy/-/server-destroy-1.0.1.tgz#f13bf928e42b9c3e79383e61cc3998b5d14e6cdd" - -set-blocking@^2.0.0, set-blocking@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - -set-immediate-shim@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" - -setprototypeof@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.1.tgz#52009b27888c4dc48f591949c0a8275834c1ca7e" - -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - -shelljs@^0.6.0: - version "0.6.1" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.6.1.tgz#ec6211bed1920442088fe0f70b2837232ed2c8a8" - -sigmund@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" - -signal-exit@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.1.tgz#5a4c884992b63a7acd9badb7894c3ee9cfccad81" - -slash@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" - -slice-ansi@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" - -sntp@1.x.x: - version "1.0.9" - resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" - dependencies: - hoek "2.x.x" - -socket.io-adapter@0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-0.4.0.tgz#fb9f82ab1aa65290bf72c3657955b930a991a24f" - dependencies: - debug "2.2.0" - socket.io-parser "2.2.2" - -socket.io-client@1.4.6: - version "1.4.6" - resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-1.4.6.tgz#49b0ba537efd15b8297c84016e642e1c7c752c3d" - dependencies: - backo2 "1.0.2" - 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" - indexof "0.0.1" - object-component "0.0.3" - parseuri "0.0.4" - socket.io-parser "2.2.6" - to-array "0.1.4" - -socket.io-client@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-1.5.0.tgz#08232d0adb5a665a7c24bd9796557a33f58f38ae" - dependencies: - backo2 "1.0.2" - component-bind "1.0.0" - component-emitter "1.2.0" - debug "2.2.0" - engine.io-client "1.7.0" - has-binary "0.1.7" - indexof "0.0.1" - object-component "0.0.3" - parseuri "0.0.4" - socket.io-parser "2.2.6" - to-array "0.1.4" - -socket.io-parser@2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-2.2.2.tgz#3d7af6b64497e956b7d9fe775f999716027f9417" - dependencies: - benchmark "1.0.0" - component-emitter "1.1.2" - debug "0.7.4" - isarray "0.0.1" - json3 "3.2.6" - -socket.io-parser@2.2.6: - version "2.2.6" - resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-2.2.6.tgz#38dfd61df50dcf8ab1d9e2091322bf902ba28b99" - dependencies: - benchmark "1.0.0" - component-emitter "1.1.2" - debug "2.2.0" - isarray "0.0.1" - json3 "3.3.2" - -socket.io@1.4.7: - version "1.4.7" - resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-1.4.7.tgz#92b7f7cb88c5797d4daee279fe8075dbe6d3fa1c" - dependencies: - 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" - -socket.io@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-1.5.0.tgz#024dd9719d9267d6a6984eebe2ab5ceb9a0b8a98" - dependencies: - debug "2.2.0" - engine.io "1.7.0" - has-binary "0.1.7" - socket.io-adapter "0.4.0" - socket.io-client "1.5.0" - socket.io-parser "2.2.6" - -sort-keys@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" - dependencies: - is-plain-obj "^1.0.0" - -source-map-support@^0.4.0, source-map-support@^0.4.2: - version "0.4.5" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.5.tgz#4438df4219e1b3c7feb674614b4c67f9722db1e4" - dependencies: - source-map "^0.5.3" - -source-map-support@~0.2.8: - version "0.2.10" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.2.10.tgz#ea5a3900a1c1cb25096a0ae8cc5c2b4b10ded3dc" - dependencies: - source-map "0.1.32" - -source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1: - version "0.5.6" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" - -source-map@0.1.32: - version "0.1.32" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.32.tgz#c8b6c167797ba4740a8ea33252162ff08591b266" - dependencies: - amdefine ">=0.0.4" - -spdx-correct@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" - dependencies: - spdx-license-ids "^1.0.2" - -spdx-expression-parse@~1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" - -spdx-license-ids@^1.0.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - -sshpk@^1.7.0: - version "1.10.1" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.10.1.tgz#30e1a5d329244974a1af61511339d595af6638b0" - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - dashdash "^1.12.0" - getpass "^0.1.1" - optionalDependencies: - bcrypt-pbkdf "^1.0.0" - ecc-jsbn "~0.1.1" - jodid25519 "^1.0.0" - jsbn "~0.1.0" - tweetnacl "~0.14.0" - -"statuses@>= 1.3.0 < 2", statuses@~1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.0.tgz#8e55758cb20e7682c1f4fce8dcab30bf01d1e07a" - -stream-throttle@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/stream-throttle/-/stream-throttle-0.1.3.tgz#add57c8d7cc73a81630d31cd55d3961cfafba9c3" - dependencies: - commander "^2.2.0" - limiter "^1.0.5" - -strict-uri-encode@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" - -string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - -string-width@^1.0.1, string-width@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - -string-width@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.0.0.tgz#635c5436cc72a6e0c387ceca278d4e2eec52687e" - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^3.0.0" - -stringstream@~0.0.4: - version "0.0.5" - resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" - -strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - dependencies: - ansi-regex "^2.0.0" - -strip-bom@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" - dependencies: - is-utf8 "^0.2.0" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - -strip-indent@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" - dependencies: - get-stdin "^4.0.1" - -strip-json-comments@~1.0.1, strip-json-comments@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91" - -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - -supports-color@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5" - dependencies: - has-flag "^1.0.0" - -svgo@^0.7.0: - version "0.7.1" - resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.1.tgz#287320fed972cb097e72c2bb1685f96fe08f8034" - dependencies: - coa "~1.0.1" - colors "~1.1.2" - csso "~2.2.1" - js-yaml "~3.6.1" - mkdirp "~0.5.1" - sax "~1.2.1" - whet.extend "~0.9.9" - -systemjs-builder@^0.15.20, systemjs-builder@0.15.32: - version "0.15.32" - resolved "https://registry.yarnpkg.com/systemjs-builder/-/systemjs-builder-0.15.32.tgz#66795f104792b0302eba40950f29ed53a791cc3e" - dependencies: - babel-core "^6.9.0" - babel-plugin-transform-cjs-system-wrapper "^0.2.1" - babel-plugin-transform-es2015-modules-systemjs "^6.6.5" - babel-plugin-transform-global-system-wrapper "0.0.1" - babel-plugin-transform-system-register "0.0.1" - bluebird "^3.3.4" - data-uri-to-buffer "0.0.4" - es6-template-strings "^2.0.0" - glob "^7.0.3" - mkdirp "^0.5.1" - rollup "^0.36.0" - source-map "^0.5.3" - systemjs "^0.19.39" - traceur "0.0.105" - uglify-js "^2.6.1" - -systemjs@^0.19.39, systemjs@0.19.39: - version "0.19.39" - resolved "https://registry.yarnpkg.com/systemjs/-/systemjs-0.19.39.tgz#e513e6f91a25a37b8b607c51c7989ee0d67b9356" - dependencies: - when "^3.7.5" - -table@^3.7.8: - version "3.8.3" - resolved "https://registry.yarnpkg.com/table/-/table-3.8.3.tgz#2bbc542f0fda9861a755d3947fefd8b3f513855f" - dependencies: - ajv "^4.7.0" - ajv-keywords "^1.0.0" - chalk "^1.1.1" - lodash "^4.0.0" - slice-ansi "0.0.4" - string-width "^2.0.0" - -tar-fs@^1.13.0: - version "1.14.0" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-1.14.0.tgz#f99cc074bf33bed21cd921a21720797bb18e6c96" - dependencies: - mkdirp "^0.5.0" - pump "^1.0.0" - tar-stream "^1.1.2" - -tar-pack@~3.1.0: - version "3.1.4" - resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.1.4.tgz#bc8cf9a22f5832739f12f3910dac1eb97b49708c" - dependencies: - debug "~2.2.0" - fstream "~1.0.10" - fstream-ignore "~1.0.5" - once "~1.3.3" - readable-stream "~2.1.4" - rimraf "~2.5.1" - tar "~2.2.1" - uid-number "~0.0.6" - -tar-stream@^1.1.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.5.2.tgz#fbc6c6e83c1a19d4cb48c7d96171fc248effc7bf" - dependencies: - bl "^1.0.0" - end-of-stream "^1.0.0" - readable-stream "^2.0.0" - xtend "^4.0.0" - -tar@^2.0.0, tar@~2.2.0, tar@~2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" - dependencies: - block-stream "*" - fstream "^1.0.2" - inherits "2" - -text-table@~0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - -tfunk@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/tfunk/-/tfunk-3.0.2.tgz#327ebc6176af2680c6cd0d6d22297c79d7f96efd" - dependencies: - chalk "^1.1.1" - object-path "^0.9.0" - -thenify-all@^1.0.0, thenify-all@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" - dependencies: - thenify ">= 3.1.0 < 4" - -"thenify@>= 3.1.0 < 4": - version "3.2.1" - resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.2.1.tgz#251fd1c80aff6e5cf57cb179ab1fcb724269bd11" - dependencies: - any-promise "^1.0.0" - -throttleit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c" - -through@^2.3.6: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - -timers-ext@0.1: - version "0.1.0" - resolved "https://registry.yarnpkg.com/timers-ext/-/timers-ext-0.1.0.tgz#00345a2ca93089d1251322054389d263e27b77e2" - dependencies: - es5-ext "~0.10.2" - next-tick "~0.2.2" - -tmp@0.0.28: - version "0.0.28" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.28.tgz#172735b7f614ea7af39664fa84cf0de4e515d120" - dependencies: - os-tmpdir "~1.0.1" - -tmpl@1.0.x: - version "1.0.4" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" - -to-array@0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" - -to-fast-properties@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.2.tgz#f3f5c0c3ba7299a7ef99427e44633257ade43320" - -tough-cookie@~2.2.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.2.2.tgz#c83a1830f4e5ef0b93ef2a3488e724f8de016ac7" - -tough-cookie@~2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.1.tgz#99c77dfbb7d804249e8a299d4cb0fd81fef083fd" - -traceur@0.0.105: - version "0.0.105" - resolved "https://registry.yarnpkg.com/traceur/-/traceur-0.0.105.tgz#5cf9dee83d6b77861c3d6c44d53859aed7ab0479" - dependencies: - commander "2.9.x" - glob "5.0.x" - rsvp "^3.0.13" - semver "^4.3.3" - source-map-support "~0.2.8" - -trim-newlines@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" - -tryit@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.2.tgz#c196b0073e6b1c595d93c9c830855b7acc32a453" - -tunnel-agent@~0.4.1: - version "0.4.3" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.3" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.3.tgz#3da382f670f25ded78d7b3d1792119bca0b7132d" - -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - dependencies: - prelude-ls "~1.1.2" - -type-is@~1.6.13: - version "1.6.13" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.13.tgz#6e83ba7bc30cd33a7bb0b7fb00737a2085bf9d08" - dependencies: - media-typer "0.3.0" - mime-types "~2.1.11" - -typedarray@~0.0.5: - version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - -ua-parser-js@0.7.10: - version "0.7.10" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.10.tgz#917559ddcce07cbc09ece7d80495e4c268f4ef9f" - -uglify-js@^2.6.1: - version "2.7.3" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.7.3.tgz#39b3a7329b89f5ec507e344c6e22568698ef4868" - dependencies: - async "~0.2.6" - source-map "~0.5.1" - uglify-to-browserify "~1.0.0" - yargs "~3.10.0" - -uglify-to-browserify@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" - -uid-number@~0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" - -ultron@1.0.x: - version "1.0.2" - resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa" - -unc-path-regex@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" - -underscore@1.7.x: - version "1.7.0" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.7.0.tgz#6bbaf0877500d36be34ecaa584e0db9fef035209" - -uniq@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" - -uniqid@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/uniqid/-/uniqid-4.1.0.tgz#33d9679f65022f48988a03fd24e7dcaf8f109eca" - dependencies: - macaddress "^0.2.8" - -uniqs@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" - -unpipe@~1.0.0, unpipe@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - -user-home@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" - -user-home@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f" - dependencies: - os-homedir "^1.0.0" - -useragent@^2.1.9: - version "2.1.9" - resolved "https://registry.yarnpkg.com/useragent/-/useragent-2.1.9.tgz#4dba2bc4dad1875777ab15de3ff8098b475000b7" - dependencies: - lru-cache "2.2.x" - -utf8@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/utf8/-/utf8-2.1.0.tgz#0cfec5c8052d44a23e3aaa908104e8075f95dfd5" - -util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - -utils-merge@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8" - -validate-npm-package-license@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" - dependencies: - spdx-correct "~1.0.0" - spdx-expression-parse "~1.0.0" - -vendors@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.1.tgz#37ad73c8ee417fb3d580e785312307d274847f22" - -verror@1.3.6: - version "1.3.6" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c" - dependencies: - extsprintf "1.0.2" - -void-elements@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" - -walker@~1.0.5: - version "1.0.7" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" - dependencies: - makeerror "1.0.x" - -watch@~0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/watch/-/watch-0.10.0.tgz#77798b2da0f9910d595f1ace5b0c2258521f21dc" - -weinre@^2.0.0-pre-I0Z7U9OV: - version "2.0.0-pre-I0Z7U9OV" - resolved "https://registry.yarnpkg.com/weinre/-/weinre-2.0.0-pre-I0Z7U9OV.tgz#fef8aa223921f7b40bbbbd4c3ed4302f6fd0a813" - dependencies: - express "2.5.x" - nopt "3.0.x" - underscore "1.7.x" - -when@^3.7.5: - version "3.7.7" - resolved "https://registry.yarnpkg.com/when/-/when-3.7.7.tgz#aba03fc3bb736d6c88b091d013d8a8e590d84718" - -whet.extend@~0.9.9: - version "0.9.9" - resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1" - -which-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" - -which@^1.0.9, which@^1.1.1, which@^1.2.10, which@^1.2.9, which@~1.2.10, which@1: - version "1.2.11" - resolved "https://registry.yarnpkg.com/which/-/which-1.2.11.tgz#c8b2eeea6b8c1659fa7c1dd4fdaabe9533dc5e8b" - dependencies: - isexe "^1.1.1" - -wide-align@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.0.tgz#40edde802a71fea1f070da3e62dcda2e7add96ad" - dependencies: - string-width "^1.0.1" - -window-size@^0.1.2: - version "0.1.4" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876" - -window-size@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075" - -window-size@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" - -wordwrap@~0.0.2: - version "0.0.3" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" - -wordwrap@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - -wordwrap@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" - -wrap-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.0.0.tgz#7d30f8f873f9a5bbc3a64dabc8d177e071ae426f" - dependencies: - string-width "^1.0.1" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - -write@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" - dependencies: - mkdirp "^0.5.1" - -ws@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-1.0.1.tgz#7d0b2a2e58cddd819039c29c9de65045e1b310e9" - dependencies: - options ">=0.0.5" - ultron "1.0.x" - -ws@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.1.tgz#082ddb6c641e85d4bb451f03d52f06eabdb1f018" - dependencies: - options ">=0.0.5" - ultron "1.0.x" - -wtf-8@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wtf-8/-/wtf-8-1.0.0.tgz#392d8ba2d0f1c34d1ee2d630f15d0efb68e1048a" - -xmlhttprequest-ssl@1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.1.tgz#3b7741fea4a86675976e908d296d4445961faa67" - -xtend@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" - -y18n@^3.2.0, y18n@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" - -yallist@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.0.0.tgz#306c543835f09ee1a4cb23b7bce9ab341c91cdd4" - -yargs-parser@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-2.4.1.tgz#85568de3cf150ff49fa51825f03a8c880ddcc5c4" - dependencies: - camelcase "^3.0.0" - lodash.assign "^4.0.6" - -yargs-parser@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.0.2.tgz#7f7173a8c7cca1d81dc7c18692fc07c2c2e2b1e0" - dependencies: - camelcase "^3.0.0" - -yargs@^4.7.1: - version "4.8.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-4.8.1.tgz#c0c42924ca4aaa6b0e6da1739dfb216439f9ddc0" - dependencies: - cliui "^3.2.0" - decamelize "^1.1.1" - get-caller-file "^1.0.1" - lodash.assign "^4.0.3" - os-locale "^1.4.0" - read-pkg-up "^1.0.1" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^1.0.1" - which-module "^1.0.0" - window-size "^0.2.0" - y18n "^3.2.1" - yargs-parser "^2.4.1" - -yargs@~3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" - dependencies: - camelcase "^1.0.2" - cliui "^2.1.0" - decamelize "^1.0.0" - window-size "0.1.0" - -yargs@3.29.0: - version "3.29.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.29.0.tgz#1aab9660eae79d8b8f675bcaeeab6ee34c2cf69c" - dependencies: - camelcase "^1.2.1" - cliui "^3.0.3" - decamelize "^1.0.0" - os-locale "^1.4.0" - window-size "^0.1.2" - y18n "^3.2.0" - -yargs@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.0.0.tgz#900479df4e8bf6ab0e87216f5ed2b2760b968345" - dependencies: - cliui "^3.2.0" - decamelize "^1.1.1" - get-caller-file "^1.0.1" - os-locale "^1.4.0" - read-pkg-up "^1.0.1" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^1.0.2" - which-module "^1.0.0" - window-size "^0.2.0" - y18n "^3.2.1" - yargs-parser "^4.0.2" - -yauzl@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005" - dependencies: - fd-slicer "~1.0.1" - -yeast@0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" - From 01d2d3d871da2b4f59c0c328953774641015a3fc Mon Sep 17 00:00:00 2001 From: Dan Onoshko Date: Thu, 14 Apr 2022 00:10:10 +0700 Subject: [PATCH 10/44] chore: conventional commits and commitlint (#3) --- .commitlintrc.json | 6 + .czrc | 3 + .simple-git-hooks.json | 3 + package.json | 13 +- pnpm-lock.yaml | 1010 +++++++++++++++++++++++++++++++++++++++- 5 files changed, 1031 insertions(+), 4 deletions(-) create mode 100644 .commitlintrc.json create mode 100644 .czrc create mode 100644 .simple-git-hooks.json diff --git a/.commitlintrc.json b/.commitlintrc.json new file mode 100644 index 00000000..23e26485 --- /dev/null +++ b/.commitlintrc.json @@ -0,0 +1,6 @@ +{ + "extends": ["@commitlint/config-conventional"], + "rules": { + "body-max-line-length": [0] + } +} diff --git a/.czrc b/.czrc new file mode 100644 index 00000000..11f04065 --- /dev/null +++ b/.czrc @@ -0,0 +1,3 @@ +{ + "path": "@commitlint/cz-commitlint" +} diff --git a/.simple-git-hooks.json b/.simple-git-hooks.json new file mode 100644 index 00000000..85a3769d --- /dev/null +++ b/.simple-git-hooks.json @@ -0,0 +1,3 @@ +{ + "commit-msg": "pnpm commitlint --edit \"$1\"" +} diff --git a/package.json b/package.json index 1014ffe6..134d6603 100644 --- a/package.json +++ b/package.json @@ -39,16 +39,20 @@ "url": "https://github.com/chartist-js/chartist/blob/master/LICENSE-MIT" } ], - "dependencies": {}, "devDependencies": { + "@commitlint/cli": "^16.2.3", + "@commitlint/config-conventional": "^16.2.1", + "@commitlint/cz-commitlint": "^16.2.3", "autoprefixer": "^10.4.4", "babel-eslint": "^7.1.0", "browser-sync": "^2.27.9", "chokidar": "^3.5.3", + "commitizen": "^4.2.4", "cssnano": "^5.1.7", "debounce": "^1.2.1", "eslint": "^8.12.0", "fs-promise": "^0.5.0", + "inquirer": "^8.0.0", "interpolate": "^0.1.0", "jasmine-core": "^4.0.1", "jspm": "beta", @@ -58,7 +62,8 @@ "karma-nyan-reporter": "^0.2.5", "karma-phantomjs-launcher": "^1.0.4", "node-sass": "^7.0.1", - "postcss": "^8.4.12" + "postcss": "^8.4.12", + "simple-git-hooks": "^2.7.0" }, "engines": { "node": ">=6.9.0" @@ -83,7 +88,9 @@ "build": "pnpm build-styles && pnpm build-umd && pnpm build-esm", "build-umd": "jspm build chartist dist/chartist.umd.js --format umd --global-name Chartist --minify --source-map-contents && ./tooling/node/banner.js dist/chartist.umd.js dist/chartist.umd.js", "build-esm": "jspm build chartist dist/chartist.esm.js --format esm && ./tooling/node/banner.js dist/chartist.esm.js dist/chartist.esm.js", - "build-styles": "./tooling/node/styles.js src/styles/chartist.scss dist" + "build-styles": "./tooling/node/styles.js src/styles/chartist.scss dist", + "commit": "cz", + "updateGitHooks": "simple-git-hooks" }, "config": { "banner": "/* Chartist.js {pkg.version}\n * Copyright © {year} Gion Kunz\n * Free to use under either the WTFPL license or the MIT license.\n * https://raw.githubusercontent.com/chartist-js/chartist/master/LICENSE-WTFPL\n * https://raw.githubusercontent.com/chartist-js/chartist/master/LICENSE-MIT\n */\n" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8c7f0890..98516f19 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,14 +1,19 @@ lockfileVersion: 5.3 specifiers: + '@commitlint/cli': ^16.2.3 + '@commitlint/config-conventional': ^16.2.1 + '@commitlint/cz-commitlint': ^16.2.3 autoprefixer: ^10.4.4 babel-eslint: ^7.1.0 browser-sync: ^2.27.9 chokidar: ^3.5.3 + commitizen: ^4.2.4 cssnano: ^5.1.7 debounce: ^1.2.1 eslint: ^8.12.0 fs-promise: ^0.5.0 + inquirer: ^8.0.0 interpolate: ^0.1.0 jasmine-core: ^4.0.1 jspm: beta @@ -19,16 +24,22 @@ specifiers: karma-phantomjs-launcher: ^1.0.4 node-sass: ^7.0.1 postcss: ^8.4.12 + simple-git-hooks: ^2.7.0 devDependencies: + '@commitlint/cli': 16.2.3 + '@commitlint/config-conventional': 16.2.1 + '@commitlint/cz-commitlint': 16.2.3_commitizen@4.2.4+inquirer@8.2.2 autoprefixer: 10.4.4_postcss@8.4.12 babel-eslint: 7.2.3 browser-sync: 2.27.9 chokidar: 3.5.3 + commitizen: 4.2.4 cssnano: 5.1.7_postcss@8.4.12 debounce: 1.2.1 eslint: 8.13.0 fs-promise: 0.5.0 + inquirer: 8.2.2 interpolate: 0.1.0 jasmine-core: 4.1.0 jspm: 0.17.0-beta.49 @@ -39,6 +50,7 @@ devDependencies: karma-phantomjs-launcher: 1.0.4_karma@6.3.18 node-sass: 7.0.1 postcss: 8.4.12 + simple-git-hooks: 2.7.0 packages: @@ -68,6 +80,197 @@ packages: engines: {node: '>=0.1.90'} dev: true + /@commitlint/cli/16.2.3: + resolution: {integrity: sha512-VsJBQLvhhlOgEfxs/Z5liYuK0dXqLE5hz1VJzLBxiOxG31kL/X5Q4OvK292BmO7IGZcm1yJE3XQPWSiFaEHbWA==} + engines: {node: '>=v12'} + hasBin: true + dependencies: + '@commitlint/format': 16.2.1 + '@commitlint/lint': 16.2.1 + '@commitlint/load': 16.2.3 + '@commitlint/read': 16.2.1 + '@commitlint/types': 16.2.1 + lodash: 4.17.21 + resolve-from: 5.0.0 + resolve-global: 1.0.0 + yargs: 17.4.1 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + dev: true + + /@commitlint/config-conventional/16.2.1: + resolution: {integrity: sha512-cP9gArx7gnaj4IqmtCIcHdRjTYdRUi6lmGE+lOzGGjGe45qGOS8nyQQNvkNy2Ey2VqoSWuXXkD8zCUh6EHf1Ww==} + engines: {node: '>=v12'} + dependencies: + conventional-changelog-conventionalcommits: 4.6.3 + dev: true + + /@commitlint/config-validator/16.2.1: + resolution: {integrity: sha512-hogSe0WGg7CKmp4IfNbdNES3Rq3UEI4XRPB8JL4EPgo/ORq5nrGTVzxJh78omibNuB8Ho4501Czb1Er1MoDWpw==} + engines: {node: '>=v12'} + dependencies: + '@commitlint/types': 16.2.1 + ajv: 6.12.6 + dev: true + + /@commitlint/cz-commitlint/16.2.3_commitizen@4.2.4+inquirer@8.2.2: + resolution: {integrity: sha512-G9rRnBJ/5te7RiOzp7EdqII9rQYvtsfsqwMxcoK4B7l0Rc57nFCOlf0e4Bn70E4aOsLeMzNe+PvVVrEsPStEHg==} + engines: {node: '>=v12'} + peerDependencies: + commitizen: ^4.0.3 + inquirer: ^8.0.0 + dependencies: + '@commitlint/ensure': 16.2.1 + '@commitlint/load': 16.2.3 + '@commitlint/types': 16.2.1 + chalk: 4.1.2 + commitizen: 4.2.4 + inquirer: 8.2.2 + lodash: 4.17.21 + word-wrap: 1.2.3 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + dev: true + + /@commitlint/ensure/16.2.1: + resolution: {integrity: sha512-/h+lBTgf1r5fhbDNHOViLuej38i3rZqTQnBTk+xEg+ehOwQDXUuissQ5GsYXXqI5uGy+261ew++sT4EA3uBJ+A==} + engines: {node: '>=v12'} + dependencies: + '@commitlint/types': 16.2.1 + lodash: 4.17.21 + dev: true + + /@commitlint/execute-rule/16.2.1: + resolution: {integrity: sha512-oSls82fmUTLM6cl5V3epdVo4gHhbmBFvCvQGHBRdQ50H/690Uq1Dyd7hXMuKITCIdcnr9umyDkr8r5C6HZDF3g==} + engines: {node: '>=v12'} + dev: true + + /@commitlint/format/16.2.1: + resolution: {integrity: sha512-Yyio9bdHWmNDRlEJrxHKglamIk3d6hC0NkEUW6Ti6ipEh2g0BAhy8Od6t4vLhdZRa1I2n+gY13foy+tUgk0i1Q==} + engines: {node: '>=v12'} + dependencies: + '@commitlint/types': 16.2.1 + chalk: 4.1.2 + dev: true + + /@commitlint/is-ignored/16.2.1: + resolution: {integrity: sha512-exl8HRzTIfb1YvDJp2b2HU5z1BT+9tmgxR2XF0YEzkMiCIuEKh+XLeocPr1VcvAKXv3Cmv5X/OfNRp+i+/HIhQ==} + engines: {node: '>=v12'} + dependencies: + '@commitlint/types': 16.2.1 + semver: 7.3.5 + dev: true + + /@commitlint/lint/16.2.1: + resolution: {integrity: sha512-fNINQ3X2ZqsCkNB3Z0Z8ElmhewqrS3gy2wgBTx97BkcjOWiyPAGwDJ752hwrsUnWAVBRztgw826n37xPzxsOgg==} + engines: {node: '>=v12'} + dependencies: + '@commitlint/is-ignored': 16.2.1 + '@commitlint/parse': 16.2.1 + '@commitlint/rules': 16.2.1 + '@commitlint/types': 16.2.1 + dev: true + + /@commitlint/load/16.2.3: + resolution: {integrity: sha512-Hb4OUlMnBUK6UxJEZ/VJ5k0LocIS7PtEMbRXEAA7eSpOgORIFexC4K/RaRpVd5UTtu3M0ST3ddPPijF9rdW6nw==} + engines: {node: '>=v12'} + dependencies: + '@commitlint/config-validator': 16.2.1 + '@commitlint/execute-rule': 16.2.1 + '@commitlint/resolve-extends': 16.2.1 + '@commitlint/types': 16.2.1 + '@types/node': 17.0.23 + chalk: 4.1.2 + cosmiconfig: 7.0.1 + cosmiconfig-typescript-loader: 1.0.9_ee885bc7281b682b6adbed6ae09ee090 + lodash: 4.17.21 + resolve-from: 5.0.0 + typescript: 4.6.3 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + dev: true + + /@commitlint/message/16.2.1: + resolution: {integrity: sha512-2eWX/47rftViYg7a3axYDdrgwKv32mxbycBJT6OQY/MJM7SUfYNYYvbMFOQFaA4xIVZt7t2Alyqslbl6blVwWw==} + engines: {node: '>=v12'} + dev: true + + /@commitlint/parse/16.2.1: + resolution: {integrity: sha512-2NP2dDQNL378VZYioLrgGVZhWdnJO4nAxQl5LXwYb08nEcN+cgxHN1dJV8OLJ5uxlGJtDeR8UZZ1mnQ1gSAD/g==} + engines: {node: '>=v12'} + dependencies: + '@commitlint/types': 16.2.1 + conventional-changelog-angular: 5.0.13 + conventional-commits-parser: 3.2.4 + dev: true + + /@commitlint/read/16.2.1: + resolution: {integrity: sha512-tViXGuaxLTrw2r7PiYMQOFA2fueZxnnt0lkOWqKyxT+n2XdEMGYcI9ID5ndJKXnfPGPppD0w/IItKsIXlZ+alw==} + engines: {node: '>=v12'} + dependencies: + '@commitlint/top-level': 16.2.1 + '@commitlint/types': 16.2.1 + fs-extra: 10.0.1 + git-raw-commits: 2.0.11 + dev: true + + /@commitlint/resolve-extends/16.2.1: + resolution: {integrity: sha512-NbbCMPKTFf2J805kwfP9EO+vV+XvnaHRcBy6ud5dF35dxMsvdJqke54W3XazXF1ZAxC4a3LBy4i/GNVBAthsEg==} + engines: {node: '>=v12'} + dependencies: + '@commitlint/config-validator': 16.2.1 + '@commitlint/types': 16.2.1 + import-fresh: 3.3.0 + lodash: 4.17.21 + resolve-from: 5.0.0 + resolve-global: 1.0.0 + dev: true + + /@commitlint/rules/16.2.1: + resolution: {integrity: sha512-ZFezJXQaBBso+BOTre/+1dGCuCzlWVaeLiVRGypI53qVgPMzQqZhkCcrxBFeqB87qeyzr4A4EoG++IvITwwpIw==} + engines: {node: '>=v12'} + dependencies: + '@commitlint/ensure': 16.2.1 + '@commitlint/message': 16.2.1 + '@commitlint/to-lines': 16.2.1 + '@commitlint/types': 16.2.1 + execa: 5.1.1 + dev: true + + /@commitlint/to-lines/16.2.1: + resolution: {integrity: sha512-9/VjpYj5j1QeY3eiog1zQWY6axsdWAc0AonUUfyZ7B0MVcRI0R56YsHAfzF6uK/g/WwPZaoe4Lb1QCyDVnpVaQ==} + engines: {node: '>=v12'} + dev: true + + /@commitlint/top-level/16.2.1: + resolution: {integrity: sha512-lS6GSieHW9y6ePL73ied71Z9bOKyK+Ib9hTkRsB8oZFAyQZcyRwq2w6nIa6Fngir1QW51oKzzaXfJL94qwImyw==} + engines: {node: '>=v12'} + dependencies: + find-up: 5.0.0 + dev: true + + /@commitlint/types/16.2.1: + resolution: {integrity: sha512-7/z7pA7BM0i8XvMSBynO7xsB3mVQPUZbVn6zMIlp/a091XJ3qAXRXc+HwLYhiIdzzS5fuxxNIHZMGHVD4HJxdA==} + engines: {node: '>=v12'} + dependencies: + chalk: 4.1.2 + dev: true + + /@cspotcode/source-map-consumer/0.8.0: + resolution: {integrity: sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==} + engines: {node: '>= 12'} + dev: true + + /@cspotcode/source-map-support/0.7.0: + resolution: {integrity: sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==} + engines: {node: '>=12'} + dependencies: + '@cspotcode/source-map-consumer': 0.8.0 + dev: true + /@eslint/eslintrc/1.2.1: resolution: {integrity: sha512-bxvbYnBPN1Gibwyp6NrpnFzA3YtRL3BBAyEAFVIpNTm2Rn4Vy87GA5M4aSn3InRrlsbX5N0GW7XIx+U4SAEKdQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -138,6 +341,22 @@ packages: engines: {node: '>=10.13.0'} dev: true + /@tsconfig/node10/1.0.8: + resolution: {integrity: sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==} + dev: true + + /@tsconfig/node12/1.0.9: + resolution: {integrity: sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==} + dev: true + + /@tsconfig/node14/1.0.1: + resolution: {integrity: sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==} + dev: true + + /@tsconfig/node16/1.0.2: + resolution: {integrity: sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==} + dev: true + /@types/component-emitter/1.2.11: resolution: {integrity: sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ==} dev: true @@ -166,6 +385,18 @@ packages: resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} dev: true + /@types/parse-json/4.0.0: + resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} + dev: true + + /JSONStream/1.3.5: + resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} + hasBin: true + dependencies: + jsonparse: 1.3.1 + through: 2.3.8 + dev: true + /abbrev/1.1.1: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} dev: true @@ -186,6 +417,11 @@ packages: acorn: 8.7.0 dev: true + /acorn-walk/8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} + dev: true + /acorn/8.7.0: resolution: {integrity: sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==} engines: {node: '>=0.4.0'} @@ -243,11 +479,33 @@ packages: engines: {node: '>=0.4.2'} dev: true + /ansi-escapes/3.2.0: + resolution: {integrity: sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==} + engines: {node: '>=4'} + dev: true + + /ansi-escapes/4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.21.3 + dev: true + /ansi-regex/2.1.1: resolution: {integrity: sha1-w7M6te42DYbg5ijwRorn7yfWVN8=} engines: {node: '>=0.10.0'} dev: true + /ansi-regex/3.0.1: + resolution: {integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==} + engines: {node: '>=4'} + dev: true + + /ansi-regex/4.1.1: + resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} + engines: {node: '>=6'} + dev: true + /ansi-regex/5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -311,6 +569,10 @@ packages: readable-stream: 3.6.0 dev: true + /arg/4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + dev: true + /argparse/2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} dev: true @@ -342,6 +604,10 @@ packages: engines: {node: '>=0.10.0'} dev: true + /array-ify/1.0.0: + resolution: {integrity: sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=} + dev: true + /array-slice/1.1.0: resolution: {integrity: sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==} engines: {node: '>=0.10.0'} @@ -621,6 +887,10 @@ packages: pascalcase: 0.1.1 dev: true + /base64-js/1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: true + /base64id/2.0.0: resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} engines: {node: ^4.5.0 || >= 5.9} @@ -648,6 +918,14 @@ packages: safe-buffer: 5.2.1 dev: true + /bl/4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.0 + dev: true + /bluebird/3.7.2: resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} dev: true @@ -833,6 +1111,13 @@ packages: resolution: {integrity: sha512-b3MXlJ52rPOL5xCAQsiCOy/tY9WXOP/hwATporJriUDxnT3MjJgVppDzTFegpg2Nw7NMS28MKC6IKvaXLnGr+Q==} dev: true + /buffer/5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: true + /bytes/3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} @@ -877,6 +1162,11 @@ packages: unset-value: 1.0.0 dev: true + /cachedir/2.2.0: + resolution: {integrity: sha512-VvxA0xhNqIIfg0V9AmJkDg91DaJwryutH5rVEZAhcNi4iJFj9f+QxmAjgK1LT9I8OgToX27fypX6/MeCXVbBjQ==} + engines: {node: '>=6'} + dev: true + /call-bind/1.0.2: resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} dependencies: @@ -961,6 +1251,10 @@ packages: supports-color: 7.2.0 dev: true + /chardet/0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + dev: true + /chokidar/3.5.3: resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} engines: {node: '>= 8.10.0'} @@ -1009,6 +1303,34 @@ packages: timers-ext: 0.1.7 dev: true + /cli-cursor/2.1.0: + resolution: {integrity: sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=} + engines: {node: '>=4'} + dependencies: + restore-cursor: 2.0.0 + dev: true + + /cli-cursor/3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + dependencies: + restore-cursor: 3.1.0 + dev: true + + /cli-spinners/2.6.1: + resolution: {integrity: sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==} + engines: {node: '>=6'} + dev: true + + /cli-width/2.2.1: + resolution: {integrity: sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==} + dev: true + + /cli-width/3.0.0: + resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} + engines: {node: '>= 10'} + dev: true + /cliui/2.1.0: resolution: {integrity: sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=} dependencies: @@ -1025,6 +1347,11 @@ packages: wrap-ansi: 7.0.0 dev: true + /clone/1.0.4: + resolution: {integrity: sha1-2jCcwmPfFZlMaIypAheco8fNfH4=} + engines: {node: '>=0.8'} + dev: true + /collection-visit/1.0.0: resolution: {integrity: sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=} engines: {node: '>=0.10.0'} @@ -1086,6 +1413,37 @@ packages: engines: {node: '>= 10'} dev: true + /commitizen/4.2.4: + resolution: {integrity: sha512-LlZChbDzg3Ir3O2S7jSo/cgWp5/QwylQVr59K4xayVq8S4/RdKzSyJkghAiZZHfhh5t4pxunUoyeg0ml1q/7aw==} + engines: {node: '>= 10'} + hasBin: true + dependencies: + cachedir: 2.2.0 + cz-conventional-changelog: 3.2.0 + dedent: 0.7.0 + detect-indent: 6.0.0 + find-node-modules: 2.1.3 + find-root: 1.1.0 + fs-extra: 8.1.0 + glob: 7.1.4 + inquirer: 6.5.2 + is-utf8: 0.2.1 + lodash: 4.17.21 + minimist: 1.2.5 + strip-bom: 4.0.0 + strip-json-comments: 3.0.1 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + dev: true + + /compare-func/2.0.0: + resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + dependencies: + array-ify: 1.0.0 + dot-prop: 5.3.0 + dev: true + /component-emitter/1.3.0: resolution: {integrity: sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==} dev: true @@ -1138,6 +1496,40 @@ packages: engines: {node: '>= 0.6'} dev: true + /conventional-changelog-angular/5.0.13: + resolution: {integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==} + engines: {node: '>=10'} + dependencies: + compare-func: 2.0.0 + q: 1.5.1 + dev: true + + /conventional-changelog-conventionalcommits/4.6.3: + resolution: {integrity: sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==} + engines: {node: '>=10'} + dependencies: + compare-func: 2.0.0 + lodash: 4.17.21 + q: 1.5.1 + dev: true + + /conventional-commit-types/3.0.0: + resolution: {integrity: sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg==} + dev: true + + /conventional-commits-parser/3.2.4: + resolution: {integrity: sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==} + engines: {node: '>=10'} + hasBin: true + dependencies: + is-text-path: 1.0.1 + JSONStream: 1.3.5 + lodash: 4.17.21 + meow: 8.1.2 + split2: 3.2.2 + through2: 4.0.2 + dev: true + /convert-source-map/1.8.0: resolution: {integrity: sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==} dependencies: @@ -1181,6 +1573,37 @@ packages: vary: 1.1.2 dev: true + /cosmiconfig-typescript-loader/1.0.9_ee885bc7281b682b6adbed6ae09ee090: + resolution: {integrity: sha512-tRuMRhxN4m1Y8hP9SNYfz7jRwt8lZdWxdjg/ohg5esKmsndJIn4yT96oJVcf5x0eA11taXl+sIp+ielu529k6g==} + engines: {node: '>=12', npm: '>=6'} + peerDependencies: + '@types/node': '*' + typescript: '>=3' + dependencies: + '@types/node': 17.0.23 + cosmiconfig: 7.0.1 + ts-node: 10.7.0_ee885bc7281b682b6adbed6ae09ee090 + typescript: 4.6.3 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + dev: true + + /cosmiconfig/7.0.1: + resolution: {integrity: sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==} + engines: {node: '>=10'} + dependencies: + '@types/parse-json': 4.0.0 + import-fresh: 3.3.0 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + dev: true + + /create-require/1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + dev: true + /cross-spawn/7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} @@ -1298,6 +1721,23 @@ packages: resolution: {integrity: sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=} dev: true + /cz-conventional-changelog/3.2.0: + resolution: {integrity: sha512-yAYxeGpVi27hqIilG1nh4A9Bnx4J3Ov+eXy4koL3drrR+IO9GaWPsKjik20ht608Asqi8TQPf0mczhEeyAtMzg==} + engines: {node: '>= 10'} + dependencies: + chalk: 2.4.2 + commitizen: 4.2.4 + conventional-commit-types: 3.0.0 + lodash.map: 4.6.0 + longest: 2.0.1 + word-wrap: 1.2.3 + optionalDependencies: + '@commitlint/load': 16.2.3 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + dev: true + /d/0.1.1: resolution: {integrity: sha1-2hhMU10Y2O57oqoim5FACfrhEwk=} dependencies: @@ -1311,6 +1751,11 @@ packages: type: 1.2.0 dev: true + /dargs/7.0.0: + resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} + engines: {node: '>=8'} + dev: true + /dashdash/1.14.1: resolution: {integrity: sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=} engines: {node: '>=0.10'} @@ -1379,10 +1824,20 @@ packages: engines: {node: '>=0.10'} dev: true + /dedent/0.7.0: + resolution: {integrity: sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=} + dev: true + /deep-is/0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} dev: true + /defaults/1.0.3: + resolution: {integrity: sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=} + dependencies: + clone: 1.0.4 + dev: true + /define-property/0.2.5: resolution: {integrity: sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=} engines: {node: '>=0.10.0'} @@ -1445,6 +1900,11 @@ packages: repeating: 2.0.1 dev: true + /detect-indent/6.0.0: + resolution: {integrity: sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA==} + engines: {node: '>=8'} + dev: true + /dev-ip/1.0.1: resolution: {integrity: sha1-p2o+0YVb56ASu4rBbLgPPADcKPA=} engines: {node: '>= 0.8.0'} @@ -1455,6 +1915,11 @@ packages: resolution: {integrity: sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=} dev: true + /diff/4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + dev: true + /dlv/1.1.3: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} dev: true @@ -1502,6 +1967,13 @@ packages: domhandler: 4.3.1 dev: true + /dot-prop/5.3.0: + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} + dependencies: + is-obj: 2.0.0 + dev: true + /easy-extender/2.3.4: resolution: {integrity: sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q==} engines: {node: '>= 4.0.0'} @@ -1839,6 +2311,21 @@ packages: merge: 1.2.1 dev: true + /execa/5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + /expand-brackets/0.1.5: resolution: {integrity: sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=} engines: {node: '>=0.10.0'} @@ -1905,6 +2392,15 @@ packages: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} dev: true + /external-editor/3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 + dev: true + /extglob/0.3.2: resolution: {integrity: sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=} engines: {node: '>=0.10.0'} @@ -1965,6 +2461,20 @@ packages: pend: 1.2.0 dev: true + /figures/2.0.0: + resolution: {integrity: sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=} + engines: {node: '>=4'} + dependencies: + escape-string-regexp: 1.0.5 + dev: true + + /figures/3.2.0: + resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} + engines: {node: '>=8'} + dependencies: + escape-string-regexp: 1.0.5 + dev: true + /file-entry-cache/6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} @@ -2031,6 +2541,17 @@ packages: unpipe: 1.0.0 dev: true + /find-node-modules/2.1.3: + resolution: {integrity: sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg==} + dependencies: + findup-sync: 4.0.0 + merge: 2.1.1 + dev: true + + /find-root/1.1.0: + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + dev: true + /find-up/4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} @@ -2039,6 +2560,14 @@ packages: path-exists: 4.0.0 dev: true + /find-up/5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: true + /findup-sync/2.0.0: resolution: {integrity: sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=} engines: {node: '>= 0.10'} @@ -2049,6 +2578,16 @@ packages: resolve-dir: 1.0.1 dev: true + /findup-sync/4.0.0: + resolution: {integrity: sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==} + engines: {node: '>= 8'} + dependencies: + detect-file: 1.0.0 + is-glob: 4.0.3 + micromatch: 4.0.5 + resolve-dir: 1.0.1 + dev: true + /fined/1.2.0: resolution: {integrity: sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==} engines: {node: '>= 0.10'} @@ -2176,6 +2715,15 @@ packages: universalify: 0.1.2 dev: true + /fs-extra/8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + dependencies: + graceful-fs: 4.2.10 + jsonfile: 4.0.0 + universalify: 0.1.2 + dev: true + /fs-minipass/2.1.0: resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} engines: {node: '>= 8'} @@ -2267,6 +2815,11 @@ packages: engines: {node: '>=0.10.0'} dev: true + /get-stream/6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: true + /get-value/2.0.6: resolution: {integrity: sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=} engines: {node: '>=0.10.0'} @@ -2278,6 +2831,18 @@ packages: assert-plus: 1.0.0 dev: true + /git-raw-commits/2.0.11: + resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} + engines: {node: '>=10'} + hasBin: true + dependencies: + dargs: 7.0.0 + lodash: 4.17.21 + meow: 8.1.2 + split2: 3.2.2 + through2: 4.0.2 + dev: true + /glob-base/0.3.0: resolution: {integrity: sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=} engines: {node: '>=0.10.0'} @@ -2337,13 +2902,24 @@ packages: path-is-absolute: 1.0.1 dev: true + /glob/7.1.4: + resolution: {integrity: sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + /glob/7.1.7: resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 inherits: 2.0.4 - minimatch: 3.0.8 + minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 dev: true @@ -2359,6 +2935,13 @@ packages: path-is-absolute: 1.0.1 dev: true + /global-dirs/0.1.1: + resolution: {integrity: sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=} + engines: {node: '>=4'} + dependencies: + ini: 1.3.8 + dev: true + /global-modules/1.0.0: resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} engines: {node: '>=0.10.0'} @@ -2595,6 +3178,11 @@ packages: - supports-color dev: true + /human-signals/2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + dev: true + /humanize-ms/1.2.1: resolution: {integrity: sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=} dependencies: @@ -2616,6 +3204,10 @@ packages: dev: true optional: true + /ieee754/1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: true + /ignore/5.2.0: resolution: {integrity: sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==} engines: {node: '>= 4'} @@ -2667,6 +3259,45 @@ packages: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} dev: true + /inquirer/6.5.2: + resolution: {integrity: sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==} + engines: {node: '>=6.0.0'} + dependencies: + ansi-escapes: 3.2.0 + chalk: 2.4.2 + cli-cursor: 2.1.0 + cli-width: 2.2.1 + external-editor: 3.1.0 + figures: 2.0.0 + lodash: 4.17.21 + mute-stream: 0.0.7 + run-async: 2.4.1 + rxjs: 6.6.7 + string-width: 2.1.1 + strip-ansi: 5.2.0 + through: 2.3.8 + dev: true + + /inquirer/8.2.2: + resolution: {integrity: sha512-pG7I/si6K/0X7p1qU+rfWnpTE1UIkTONN1wxtzh0d+dHXtT/JG6qBgLxoyHVsQa8cFABxAPh0pD6uUUHiAoaow==} + engines: {node: '>=12.0.0'} + dependencies: + ansi-escapes: 4.3.2 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-width: 3.0.0 + external-editor: 3.1.0 + figures: 3.2.0 + lodash: 4.17.21 + mute-stream: 0.0.8 + ora: 5.4.1 + run-async: 2.4.1 + rxjs: 7.5.5 + string-width: 4.2.3 + strip-ansi: 6.0.1 + through: 2.3.8 + dev: true + /interpolate/0.1.0: resolution: {integrity: sha1-tgF3pLqUH7NyTIIZBdmareE9Hfk=} engines: {node: '>= 0.6.0'} @@ -2796,6 +3427,11 @@ packages: engines: {node: '>=0.10.0'} dev: true + /is-fullwidth-code-point/2.0.0: + resolution: {integrity: sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=} + engines: {node: '>=4'} + dev: true + /is-fullwidth-code-point/3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} @@ -2822,6 +3458,11 @@ packages: is-extglob: 2.1.1 dev: true + /is-interactive/1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + dev: true + /is-lambda/1.0.1: resolution: {integrity: sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=} dev: true @@ -2856,6 +3497,11 @@ packages: engines: {node: '>=0.12.0'} dev: true + /is-obj/2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + dev: true + /is-plain-obj/1.1.0: resolution: {integrity: sha1-caUMhCnfync8kqOQpKA7OfzVHT4=} engines: {node: '>=0.10.0'} @@ -2890,6 +3536,18 @@ packages: engines: {node: '>=0.10.0'} dev: true + /is-stream/2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + dev: true + + /is-text-path/1.0.1: + resolution: {integrity: sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=} + engines: {node: '>=0.10.0'} + dependencies: + text-extensions: 1.9.0 + dev: true + /is-typedarray/1.0.0: resolution: {integrity: sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=} dev: true @@ -2901,6 +3559,15 @@ packages: unc-path-regex: 0.1.2 dev: true + /is-unicode-supported/0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + dev: true + + /is-utf8/0.2.1: + resolution: {integrity: sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=} + dev: true + /is-windows/1.0.2: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} @@ -3013,6 +3680,12 @@ packages: graceful-fs: 4.2.10 dev: true + /jsonfile/4.0.0: + resolution: {integrity: sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=} + optionalDependencies: + graceful-fs: 4.2.10 + dev: true + /jsonfile/6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} dependencies: @@ -3021,6 +3694,11 @@ packages: graceful-fs: 4.2.10 dev: true + /jsonparse/1.3.1: + resolution: {integrity: sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=} + engines: {'0': node >= 0.2.0} + dev: true + /jspm-github/0.14.14: resolution: {integrity: sha512-KqSUVqbyiZAlQ+EPDmRzZ1QUdFs5X8hlvo/bKU9/vyv4MsYcGGD6rOEHzcya0nETinRXQrlCRPfnZt1SzrPotQ==} dependencies: @@ -3262,10 +3940,21 @@ packages: p-locate: 4.1.0 dev: true + /locate-path/6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: true + /lodash.isfinite/3.3.2: resolution: {integrity: sha1-+4m2WpqAKBgz8LdHizpRBPiY67M=} dev: true + /lodash.map/4.6.0: + resolution: {integrity: sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=} + dev: true + /lodash.memoize/4.1.2: resolution: {integrity: sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=} dev: true @@ -3282,6 +3971,14 @@ packages: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} dev: true + /log-symbols/4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + dev: true + /log4js/6.4.4: resolution: {integrity: sha512-ncaWPsuw9Vl1CKA406hVnJLGQKy1OHx6buk8J4rE2lVW+NW5Y82G5/DIloO7NkqLOUtNPEANaWC1kZYVjXssPw==} engines: {node: '>=8.0'} @@ -3300,6 +3997,11 @@ packages: engines: {node: '>=0.10.0'} dev: true + /longest/2.0.1: + resolution: {integrity: sha1-eB4YMpaqlPbU2RbcM10NF676I/g=} + engines: {node: '>=0.10.0'} + dev: true + /loose-envify/1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true @@ -3320,6 +4022,10 @@ packages: es5-ext: 0.10.60 dev: true + /make-error/1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + dev: true + /make-fetch-happen/9.1.0: resolution: {integrity: sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==} engines: {node: '>= 10'} @@ -3404,6 +4110,23 @@ packages: timers-ext: 0.1.7 dev: true + /meow/8.1.2: + resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} + engines: {node: '>=10'} + dependencies: + '@types/minimist': 1.2.2 + camelcase-keys: 6.2.2 + decamelize-keys: 1.1.0 + hard-rejection: 2.1.0 + minimist-options: 4.1.0 + normalize-package-data: 3.0.3 + read-pkg-up: 7.0.1 + redent: 3.0.0 + trim-newlines: 3.0.1 + type-fest: 0.18.1 + yargs-parser: 20.2.9 + dev: true + /meow/9.0.0: resolution: {integrity: sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==} engines: {node: '>=10'} @@ -3422,10 +4145,18 @@ packages: yargs-parser: 20.2.9 dev: true + /merge-stream/2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: true + /merge/1.2.1: resolution: {integrity: sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==} dev: true + /merge/2.1.1: + resolution: {integrity: sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==} + dev: true + /micromatch/2.3.11: resolution: {integrity: sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=} engines: {node: '>=0.10.0'} @@ -3495,6 +4226,16 @@ packages: hasBin: true dev: true + /mimic-fn/1.2.0: + resolution: {integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==} + engines: {node: '>=4'} + dev: true + + /mimic-fn/2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + dev: true + /min-indent/1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} @@ -3521,6 +4262,10 @@ packages: kind-of: 6.0.3 dev: true + /minimist/1.2.5: + resolution: {integrity: sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==} + dev: true + /minimist/1.2.6: resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==} dev: true @@ -3616,6 +4361,14 @@ packages: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} dev: true + /mute-stream/0.0.7: + resolution: {integrity: sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=} + dev: true + + /mute-stream/0.0.8: + resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} + dev: true + /mz/2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} dependencies: @@ -3778,6 +4531,13 @@ packages: engines: {node: '>=10'} dev: true + /npm-run-path/4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + dev: true + /npmlog/5.0.1: resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} dependencies: @@ -3885,6 +4645,20 @@ packages: wrappy: 1.0.2 dev: true + /onetime/2.0.1: + resolution: {integrity: sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=} + engines: {node: '>=4'} + dependencies: + mimic-fn: 1.2.0 + dev: true + + /onetime/5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + dev: true + /openurl/1.1.1: resolution: {integrity: sha1-OHW0sO96UsFW8NtB1GCduw+Us4c=} dev: true @@ -3908,6 +4682,21 @@ packages: word-wrap: 1.2.3 dev: true + /ora/5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.6.1 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + dev: true + /os-homedir/1.0.2: resolution: {integrity: sha1-/7xJiDNuDoM94MFox+8VISGqf7M=} engines: {node: '>=0.10.0'} @@ -3925,6 +4714,13 @@ packages: p-try: 2.2.0 dev: true + /p-limit/3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: true + /p-locate/4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} @@ -3932,6 +4728,13 @@ packages: p-limit: 2.3.0 dev: true + /p-locate/5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: true + /p-map/4.0.0: resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} engines: {node: '>=10'} @@ -4034,6 +4837,11 @@ packages: path-root-regex: 0.1.2 dev: true + /path-type/4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: true + /pend/1.2.0: resolution: {integrity: sha1-elfrVQpng/kRUzH89GY9XI4AelA=} dev: true @@ -4456,6 +5264,11 @@ packages: engines: {node: '>=6'} dev: true + /q/1.5.1: + resolution: {integrity: sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=} + engines: {node: '>=0.6.0', teleport: '>=0.2.0'} + dev: true + /qjobs/1.2.0: resolution: {integrity: sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==} engines: {node: '>=0.9'} @@ -4678,6 +5491,18 @@ packages: engines: {node: '>=4'} dev: true + /resolve-from/5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + dev: true + + /resolve-global/1.0.0: + resolution: {integrity: sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==} + engines: {node: '>=8'} + dependencies: + global-dirs: 0.1.1 + dev: true + /resolve-url/0.2.1: resolution: {integrity: sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=} deprecated: https://github.com/lydell/resolve-url#deprecated @@ -4700,6 +5525,22 @@ packages: minimatch: 3.1.2 dev: true + /restore-cursor/2.0.0: + resolution: {integrity: sha1-n37ih/gv0ybU/RYpI9YhKe7g368=} + engines: {node: '>=4'} + dependencies: + onetime: 2.0.1 + signal-exit: 3.0.7 + dev: true + + /restore-cursor/3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + dev: true + /ret/0.1.15: resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} engines: {node: '>=0.12'} @@ -4752,6 +5593,11 @@ packages: engines: {node: 0.12.* || 4.* || 6.* || >= 7.*} dev: true + /run-async/2.4.1: + resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} + engines: {node: '>=0.12.0'} + dev: true + /rx/4.1.0: resolution: {integrity: sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=} dev: true @@ -4763,6 +5609,19 @@ packages: symbol-observable: 1.0.1 dev: true + /rxjs/6.6.7: + resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} + engines: {npm: '>=2.0.0'} + dependencies: + tslib: 1.14.1 + dev: true + + /rxjs/7.5.5: + resolution: {integrity: sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==} + dependencies: + tslib: 2.3.1 + dev: true + /safe-buffer/5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} dev: true @@ -4824,6 +5683,14 @@ packages: hasBin: true dev: true + /semver/7.3.5: + resolution: {integrity: sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + /semver/7.3.7: resolution: {integrity: sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==} engines: {node: '>=10'} @@ -4924,6 +5791,12 @@ packages: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} dev: true + /simple-git-hooks/2.7.0: + resolution: {integrity: sha512-nQe6ASMO9zn5/htIrU37xEIHGr9E6wikXelLbOeTcfsX2O++DHaVug7RSQoq+kO7DvZTH37WA5gW49hN9HTDmQ==} + hasBin: true + requiresBuild: true + dev: true + /slash/1.0.0: resolution: {integrity: sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=} engines: {node: '>=0.10.0'} @@ -5124,6 +5997,12 @@ packages: extend-shallow: 3.0.2 dev: true + /split2/3.2.2: + resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} + dependencies: + readable-stream: 3.6.0 + dev: true + /sshpk/1.17.0: resolution: {integrity: sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==} engines: {node: '>=0.10.0'} @@ -5205,6 +6084,14 @@ packages: - supports-color dev: true + /string-width/2.1.1: + resolution: {integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==} + engines: {node: '>=4'} + dependencies: + is-fullwidth-code-point: 2.0.0 + strip-ansi: 4.0.0 + dev: true + /string-width/4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -5233,6 +6120,20 @@ packages: ansi-regex: 2.1.1 dev: true + /strip-ansi/4.0.0: + resolution: {integrity: sha1-qEeQIusaw2iocTibY1JixQXuNo8=} + engines: {node: '>=4'} + dependencies: + ansi-regex: 3.0.1 + dev: true + + /strip-ansi/5.2.0: + resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} + engines: {node: '>=6'} + dependencies: + ansi-regex: 4.1.1 + dev: true + /strip-ansi/6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -5240,6 +6141,16 @@ packages: ansi-regex: 5.0.1 dev: true + /strip-bom/4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + dev: true + + /strip-final-newline/2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + dev: true + /strip-indent/3.0.0: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} @@ -5247,6 +6158,11 @@ packages: min-indent: 1.0.1 dev: true + /strip-json-comments/3.0.1: + resolution: {integrity: sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==} + engines: {node: '>=8'} + dev: true + /strip-json-comments/3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} @@ -5372,6 +6288,11 @@ packages: yallist: 4.0.0 dev: true + /text-extensions/1.9.0: + resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} + engines: {node: '>=0.10'} + dev: true + /text-table/0.2.0: resolution: {integrity: sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=} dev: true @@ -5400,6 +6321,16 @@ packages: resolution: {integrity: sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=} dev: true + /through/2.3.8: + resolution: {integrity: sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=} + dev: true + + /through2/4.0.2: + resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + dependencies: + readable-stream: 3.6.0 + dev: true + /timers-ext/0.1.7: resolution: {integrity: sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==} dependencies: @@ -5407,6 +6338,13 @@ packages: next-tick: 1.1.0 dev: true + /tmp/0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + dependencies: + os-tmpdir: 1.0.2 + dev: true + /tmp/0.2.1: resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==} engines: {node: '>=8.17.0'} @@ -5500,6 +6438,45 @@ packages: glob: 7.2.0 dev: true + /ts-node/10.7.0_ee885bc7281b682b6adbed6ae09ee090: + resolution: {integrity: sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.7.0 + '@tsconfig/node10': 1.0.8 + '@tsconfig/node12': 1.0.9 + '@tsconfig/node14': 1.0.1 + '@tsconfig/node16': 1.0.2 + '@types/node': 17.0.23 + acorn: 8.7.0 + acorn-walk: 8.2.0 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 4.6.3 + v8-compile-cache-lib: 3.0.0 + yn: 3.1.1 + dev: true + + /tslib/1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + dev: true + + /tslib/2.3.1: + resolution: {integrity: sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==} + dev: true + /tunnel-agent/0.6.0: resolution: {integrity: sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=} dependencies: @@ -5527,6 +6504,11 @@ packages: engines: {node: '>=10'} dev: true + /type-fest/0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + dev: true + /type-fest/0.6.0: resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} engines: {node: '>=8'} @@ -5557,6 +6539,12 @@ packages: resolution: {integrity: sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=} dev: true + /typescript/4.6.3: + resolution: {integrity: sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==} + engines: {node: '>=4.2.0'} + hasBin: true + dev: true + /ua-parser-js/0.7.31: resolution: {integrity: sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==} dev: true @@ -5663,6 +6651,10 @@ packages: hasBin: true dev: true + /v8-compile-cache-lib/3.0.0: + resolution: {integrity: sha512-mpSYqfsFvASnSn5qMiwrr4VKfumbPyONLCOPmsR3A6pTY/r0+tSaVbgPWSAIuzbk3lCTa+FForeTiO+wBQGkjA==} + dev: true + /v8-compile-cache/2.3.0: resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==} dev: true @@ -5704,6 +6696,12 @@ packages: engines: {'0': node >=0.1.95} dev: true + /wcwidth/1.0.1: + resolution: {integrity: sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=} + dependencies: + defaults: 1.0.3 + dev: true + /when/3.7.8: resolution: {integrity: sha1-xxMLan6gRpPoQs3J56Hyqjmjn4I=} dev: true @@ -5862,3 +6860,13 @@ packages: /yeast/0.1.2: resolution: {integrity: sha1-AI4G2AlDIMNy28L47XagymyKxBk=} dev: true + + /yn/3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + dev: true + + /yocto-queue/0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: true From 7df5f2a748791dfdd32d054fdfd46ef6458c8458 Mon Sep 17 00:00:00 2001 From: Dan Onoshko Date: Fri, 15 Apr 2022 00:19:22 +0700 Subject: [PATCH 11/44] chore: use storybook (#4) --- .storybook/main.js | 9 + .storybook/manager.js | 8 + .storybook/preview.js | 5 + .storybook/theme.js | 7 + bs-config.js | 103 - index.html | 70 - package.json | 19 +- pnpm-lock.yaml | 9103 +++++++++++++++++++++++++++++++++--- src/charts/bar.stories.js | 56 + src/charts/line.stories.js | 30 + src/charts/pie.stories.js | 21 + 11 files changed, 8609 insertions(+), 822 deletions(-) create mode 100644 .storybook/main.js create mode 100644 .storybook/manager.js create mode 100644 .storybook/preview.js create mode 100644 .storybook/theme.js delete mode 100644 bs-config.js delete mode 100644 index.html create mode 100644 src/charts/bar.stories.js create mode 100644 src/charts/line.stories.js create mode 100644 src/charts/pie.stories.js diff --git a/.storybook/main.js b/.storybook/main.js new file mode 100644 index 00000000..6704ece0 --- /dev/null +++ b/.storybook/main.js @@ -0,0 +1,9 @@ +module.exports = { + stories: ['../src/**/*.stories.@(js|jsx|ts|tsx)'], + addons: [ + '@storybook/preset-scss', + '@storybook/addon-docs', + '@storybook/addon-controls', + '@storybook/addon-actions', + ] +}; diff --git a/.storybook/manager.js b/.storybook/manager.js new file mode 100644 index 00000000..d64c248b --- /dev/null +++ b/.storybook/manager.js @@ -0,0 +1,8 @@ +import { addons } from '@storybook/addons'; + +import { theme } from './theme'; + +addons.setConfig({ + theme, + panelPosition: 'right', +}); diff --git a/.storybook/preview.js b/.storybook/preview.js new file mode 100644 index 00000000..0578373f --- /dev/null +++ b/.storybook/preview.js @@ -0,0 +1,5 @@ +import { configureActions } from '@storybook/addon-actions'; + +configureActions({ + depth: 5, +}); diff --git a/.storybook/theme.js b/.storybook/theme.js new file mode 100644 index 00000000..d9b1155e --- /dev/null +++ b/.storybook/theme.js @@ -0,0 +1,7 @@ +import { create } from '@storybook/theming'; + +export const theme = create({ + base: 'light', + brandTitle: 'chartist', + brandUrl: 'https://github.com/chartist-js/chartist', +}); diff --git a/bs-config.js b/bs-config.js deleted file mode 100644 index 2afd471a..00000000 --- a/bs-config.js +++ /dev/null @@ -1,103 +0,0 @@ - -/* - |-------------------------------------------------------------------------- - | Browser-sync config file - |-------------------------------------------------------------------------- - | - | For up-to-date information about the options: - | http://www.browsersync.io/docs/options/ - | - | There are more options than you see here, these are just the ones that are - | set internally. See the website for more info. - | - | - */ -module.exports = { - "ui": { - "port": 3001, - "weinre": { - "port": 8080 - } - }, - "files": [ - "dist/**/*.css", "src/**/*.js", "index.html" - ], - "watchOptions": {}, - "server": true, - "proxy": false, - "port": 3000, - "middleware": false, - "serveStatic": [], - "ghostMode": { - "clicks": true, - "scroll": true, - "forms": { - "submit": true, - "inputs": true, - "toggles": true - } - }, - "logLevel": "info", - "logPrefix": "BS", - "logConnections": false, - "logFileChanges": true, - "logSnippet": true, - "rewriteRules": [], - "open": "local", - "browser": "default", - "cors": false, - "xip": false, - "hostnameSuffix": false, - "reloadOnRestart": false, - "notify": true, - "scrollProportionally": true, - "scrollThrottle": 0, - "scrollRestoreTechnique": "window.name", - "scrollElements": [], - "scrollElementMapping": [], - "reloadDelay": 0, - "reloadDebounce": 0, - "reloadThrottle": 0, - "plugins": [], - "injectChanges": true, - "startPath": null, - "minify": true, - "host": null, - "localOnly": false, - "codeSync": true, - "timestamps": true, - "clientEvents": [ - "scroll", - "scroll:element", - "input:text", - "input:toggles", - "form:submit", - "form:reset", - "click" - ], - "socket": { - "socketIoOptions": { - "log": false - }, - "socketIoClientConfig": { - "reconnectionAttempts": 50 - }, - "path": "/browser-sync/socket.io", - "clientPath": "/browser-sync", - "namespace": "/browser-sync", - "clients": { - "heartbeatTimeout": 5000 - } - }, - "tagNames": { - "less": "link", - "scss": "link", - "css": "link", - "jpg": "img", - "jpeg": "img", - "png": "img", - "svg": "img", - "gif": "img", - "js": "script" - } -}; diff --git a/index.html b/index.html deleted file mode 100644 index 086a631f..00000000 --- a/index.html +++ /dev/null @@ -1,70 +0,0 @@ - - - - - Chartist.js - Testbed - - - - - - - -
- - - diff --git a/package.json b/package.json index 134d6603..9beaf622 100644 --- a/package.json +++ b/package.json @@ -40,16 +40,24 @@ } ], "devDependencies": { + "@babel/core": "^7.17.9", "@commitlint/cli": "^16.2.3", "@commitlint/config-conventional": "^16.2.1", "@commitlint/cz-commitlint": "^16.2.3", + "@storybook/addon-actions": "^6.4.22", + "@storybook/addon-controls": "^6.4.22", + "@storybook/addon-docs": "^6.4.22", + "@storybook/html": "^6.4.22", + "@storybook/preset-scss": "^1.0.3", "autoprefixer": "^10.4.4", "babel-eslint": "^7.1.0", - "browser-sync": "^2.27.9", + "babel-loader": "^8.2.4", "chokidar": "^3.5.3", "commitizen": "^4.2.4", + "css-loader": "^5.0.0", "cssnano": "^5.1.7", "debounce": "^1.2.1", + "del-cli": "^4.0.1", "eslint": "^8.12.0", "fs-promise": "^0.5.0", "inquirer": "^8.0.0", @@ -63,7 +71,10 @@ "karma-phantomjs-launcher": "^1.0.4", "node-sass": "^7.0.1", "postcss": "^8.4.12", - "simple-git-hooks": "^2.7.0" + "sass": "^1.50.0", + "sass-loader": "^10.0.0", + "simple-git-hooks": "^2.7.0", + "style-loader": "^2.0.0" }, "engines": { "node": ">=6.9.0" @@ -79,11 +90,11 @@ } }, "scripts": { - "start": "pnpm test-watch & pnpm run server & pnpm styles-watch", + "start:storybook": "start-storybook -p 6006 --ci", + "build:storybook": "del ./storybook-static; NODE_ENV=production build-storybook", "test": "karma start karma.ci.config.js", "test-watch": "karma start karma.watch.config.js", "styles-watch": "./tooling/node/styles-watch.js", - "server": "browser-sync start --config 'bs-config.js'", "lint": "eslint src", "build": "pnpm build-styles && pnpm build-umd && pnpm build-esm", "build-umd": "jspm build chartist dist/chartist.umd.js --format umd --global-name Chartist --minify --source-map-contents && ./tooling/node/banner.js dist/chartist.umd.js dist/chartist.umd.js", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 98516f19..48987b61 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,16 +1,24 @@ lockfileVersion: 5.3 specifiers: + '@babel/core': ^7.17.9 '@commitlint/cli': ^16.2.3 '@commitlint/config-conventional': ^16.2.1 '@commitlint/cz-commitlint': ^16.2.3 + '@storybook/addon-actions': ^6.4.22 + '@storybook/addon-controls': ^6.4.22 + '@storybook/addon-docs': ^6.4.22 + '@storybook/html': ^6.4.22 + '@storybook/preset-scss': ^1.0.3 autoprefixer: ^10.4.4 babel-eslint: ^7.1.0 - browser-sync: ^2.27.9 + babel-loader: ^8.2.4 chokidar: ^3.5.3 commitizen: ^4.2.4 + css-loader: ^5.0.0 cssnano: ^5.1.7 debounce: ^1.2.1 + del-cli: ^4.0.1 eslint: ^8.12.0 fs-promise: ^0.5.0 inquirer: ^8.0.0 @@ -24,19 +32,30 @@ specifiers: karma-phantomjs-launcher: ^1.0.4 node-sass: ^7.0.1 postcss: ^8.4.12 + sass: ^1.50.0 + sass-loader: ^10.0.0 simple-git-hooks: ^2.7.0 + style-loader: ^2.0.0 devDependencies: + '@babel/core': 7.17.9 '@commitlint/cli': 16.2.3 '@commitlint/config-conventional': 16.2.1 '@commitlint/cz-commitlint': 16.2.3_commitizen@4.2.4+inquirer@8.2.2 + '@storybook/addon-actions': 6.4.22 + '@storybook/addon-controls': 6.4.22_eslint@8.13.0 + '@storybook/addon-docs': 6.4.22_7fd729fae3ed30395c91a6c3899e19ab + '@storybook/html': 6.4.22_@babel+core@7.17.9+eslint@8.13.0 + '@storybook/preset-scss': 1.0.3_98fb4723ddb8cb1321f7deacb3be93bc autoprefixer: 10.4.4_postcss@8.4.12 babel-eslint: 7.2.3 - browser-sync: 2.27.9 + babel-loader: 8.2.4_@babel+core@7.17.9 chokidar: 3.5.3 commitizen: 4.2.4 + css-loader: 5.2.7 cssnano: 5.1.7_postcss@8.4.12 debounce: 1.2.1 + del-cli: 4.0.1 eslint: 8.13.0 fs-promise: 0.5.0 inquirer: 8.2.2 @@ -50,10 +69,20 @@ devDependencies: karma-phantomjs-launcher: 1.0.4_karma@6.3.18 node-sass: 7.0.1 postcss: 8.4.12 + sass: 1.50.0 + sass-loader: 10.2.1_node-sass@7.0.1+sass@1.50.0 simple-git-hooks: 2.7.0 + style-loader: 2.0.0 packages: + /@ampproject/remapping/2.1.2: + resolution: {integrity: sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/trace-mapping': 0.3.4 + dev: true + /@babel/code-frame/7.16.7: resolution: {integrity: sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==} engines: {node: '>=6.9.0'} @@ -61,11 +90,313 @@ packages: '@babel/highlight': 7.17.9 dev: true + /@babel/compat-data/7.17.7: + resolution: {integrity: sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/core/7.12.9: + resolution: {integrity: sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.16.7 + '@babel/generator': 7.17.9 + '@babel/helper-module-transforms': 7.17.7 + '@babel/helpers': 7.17.9 + '@babel/parser': 7.17.9 + '@babel/template': 7.16.7 + '@babel/traverse': 7.17.9 + '@babel/types': 7.17.0 + convert-source-map: 1.8.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.1 + lodash: 4.17.21 + resolve: 1.22.0 + semver: 5.7.1 + source-map: 0.5.7 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/core/7.17.9: + resolution: {integrity: sha512-5ug+SfZCpDAkVp9SFIZAzlW18rlzsOcJGaetCjkySnrXXDUw9AR8cDUm1iByTmdWM6yxX6/zycaV76w3YTF2gw==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.1.2 + '@babel/code-frame': 7.16.7 + '@babel/generator': 7.17.9 + '@babel/helper-compilation-targets': 7.17.7_@babel+core@7.17.9 + '@babel/helper-module-transforms': 7.17.7 + '@babel/helpers': 7.17.9 + '@babel/parser': 7.17.9 + '@babel/template': 7.16.7 + '@babel/traverse': 7.17.9 + '@babel/types': 7.17.0 + convert-source-map: 1.8.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.1 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/generator/7.17.9: + resolution: {integrity: sha512-rAdDousTwxbIxbz5I7GEQ3lUip+xVCXooZNbsydCWs3xA7ZsYOv+CFRdzGxRX78BmQHu9B1Eso59AOZQOJDEdQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.17.0 + jsesc: 2.5.2 + source-map: 0.5.7 + dev: true + + /@babel/helper-annotate-as-pure/7.16.7: + resolution: {integrity: sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.17.0 + dev: true + + /@babel/helper-builder-binary-assignment-operator-visitor/7.16.7: + resolution: {integrity: sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-explode-assignable-expression': 7.16.7 + '@babel/types': 7.17.0 + dev: true + + /@babel/helper-compilation-targets/7.17.7_@babel+core@7.17.9: + resolution: {integrity: sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/compat-data': 7.17.7 + '@babel/core': 7.17.9 + '@babel/helper-validator-option': 7.16.7 + browserslist: 4.20.2 + semver: 6.3.0 + dev: true + + /@babel/helper-create-class-features-plugin/7.17.9_@babel+core@7.17.9: + resolution: {integrity: sha512-kUjip3gruz6AJKOq5i3nC6CoCEEF/oHH3cp6tOZhB+IyyyPyW0g1Gfsxn3mkk6S08pIA2y8GQh609v9G/5sHVQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-annotate-as-pure': 7.16.7 + '@babel/helper-environment-visitor': 7.16.7 + '@babel/helper-function-name': 7.17.9 + '@babel/helper-member-expression-to-functions': 7.17.7 + '@babel/helper-optimise-call-expression': 7.16.7 + '@babel/helper-replace-supers': 7.16.7 + '@babel/helper-split-export-declaration': 7.16.7 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-create-regexp-features-plugin/7.17.0_@babel+core@7.17.9: + resolution: {integrity: sha512-awO2So99wG6KnlE+TPs6rn83gCz5WlEePJDTnLEqbchMVrBeAujURVphRdigsk094VhvZehFoNOihSlcBjwsXA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-annotate-as-pure': 7.16.7 + regexpu-core: 5.0.1 + dev: true + + /@babel/helper-define-polyfill-provider/0.1.5_@babel+core@7.17.9: + resolution: {integrity: sha512-nXuzCSwlJ/WKr8qxzW816gwyT6VZgiJG17zR40fou70yfAcqjoNyTLl/DQ+FExw5Hx5KNqshmN8Ldl/r2N7cTg==} + peerDependencies: + '@babel/core': ^7.4.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-compilation-targets': 7.17.7_@babel+core@7.17.9 + '@babel/helper-module-imports': 7.16.7 + '@babel/helper-plugin-utils': 7.16.7 + '@babel/traverse': 7.17.9 + debug: 4.3.4 + lodash.debounce: 4.0.8 + resolve: 1.22.0 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-define-polyfill-provider/0.3.1_@babel+core@7.17.9: + resolution: {integrity: sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==} + peerDependencies: + '@babel/core': ^7.4.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-compilation-targets': 7.17.7_@babel+core@7.17.9 + '@babel/helper-module-imports': 7.16.7 + '@babel/helper-plugin-utils': 7.16.7 + '@babel/traverse': 7.17.9 + debug: 4.3.4 + lodash.debounce: 4.0.8 + resolve: 1.22.0 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-environment-visitor/7.16.7: + resolution: {integrity: sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.17.0 + dev: true + + /@babel/helper-explode-assignable-expression/7.16.7: + resolution: {integrity: sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.17.0 + dev: true + + /@babel/helper-function-name/7.17.9: + resolution: {integrity: sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.16.7 + '@babel/types': 7.17.0 + dev: true + + /@babel/helper-hoist-variables/7.16.7: + resolution: {integrity: sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.17.0 + dev: true + + /@babel/helper-member-expression-to-functions/7.17.7: + resolution: {integrity: sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.17.0 + dev: true + + /@babel/helper-module-imports/7.16.7: + resolution: {integrity: sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.17.0 + dev: true + + /@babel/helper-module-transforms/7.17.7: + resolution: {integrity: sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-environment-visitor': 7.16.7 + '@babel/helper-module-imports': 7.16.7 + '@babel/helper-simple-access': 7.17.7 + '@babel/helper-split-export-declaration': 7.16.7 + '@babel/helper-validator-identifier': 7.16.7 + '@babel/template': 7.16.7 + '@babel/traverse': 7.17.9 + '@babel/types': 7.17.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-optimise-call-expression/7.16.7: + resolution: {integrity: sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.17.0 + dev: true + + /@babel/helper-plugin-utils/7.10.4: + resolution: {integrity: sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==} + dev: true + + /@babel/helper-plugin-utils/7.16.7: + resolution: {integrity: sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-remap-async-to-generator/7.16.8: + resolution: {integrity: sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-annotate-as-pure': 7.16.7 + '@babel/helper-wrap-function': 7.16.8 + '@babel/types': 7.17.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-replace-supers/7.16.7: + resolution: {integrity: sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-environment-visitor': 7.16.7 + '@babel/helper-member-expression-to-functions': 7.17.7 + '@babel/helper-optimise-call-expression': 7.16.7 + '@babel/traverse': 7.17.9 + '@babel/types': 7.17.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-simple-access/7.17.7: + resolution: {integrity: sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.17.0 + dev: true + + /@babel/helper-skip-transparent-expression-wrappers/7.16.0: + resolution: {integrity: sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.17.0 + dev: true + + /@babel/helper-split-export-declaration/7.16.7: + resolution: {integrity: sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.17.0 + dev: true + /@babel/helper-validator-identifier/7.16.7: resolution: {integrity: sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==} engines: {node: '>=6.9.0'} dev: true + /@babel/helper-validator-option/7.16.7: + resolution: {integrity: sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-wrap-function/7.16.8: + resolution: {integrity: sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-function-name': 7.17.9 + '@babel/template': 7.16.7 + '@babel/traverse': 7.17.9 + '@babel/types': 7.17.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helpers/7.17.9: + resolution: {integrity: sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.16.7 + '@babel/traverse': 7.17.9 + '@babel/types': 7.17.0 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/highlight/7.17.9: resolution: {integrity: sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg==} engines: {node: '>=6.9.0'} @@ -75,318 +406,3573 @@ packages: js-tokens: 4.0.0 dev: true - /@colors/colors/1.5.0: - resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} - engines: {node: '>=0.1.90'} + /@babel/parser/7.17.9: + resolution: {integrity: sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg==} + engines: {node: '>=6.0.0'} + hasBin: true dev: true - /@commitlint/cli/16.2.3: - resolution: {integrity: sha512-VsJBQLvhhlOgEfxs/Z5liYuK0dXqLE5hz1VJzLBxiOxG31kL/X5Q4OvK292BmO7IGZcm1yJE3XQPWSiFaEHbWA==} - engines: {node: '>=v12'} - hasBin: true + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.16.7_@babel+core@7.17.9: + resolution: {integrity: sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 dependencies: - '@commitlint/format': 16.2.1 - '@commitlint/lint': 16.2.1 - '@commitlint/load': 16.2.3 - '@commitlint/read': 16.2.1 - '@commitlint/types': 16.2.1 - lodash: 4.17.21 - resolve-from: 5.0.0 - resolve-global: 1.0.0 - yargs: 17.4.1 - transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' + '@babel/core': 7.17.9 + '@babel/helper-plugin-utils': 7.16.7 dev: true - /@commitlint/config-conventional/16.2.1: - resolution: {integrity: sha512-cP9gArx7gnaj4IqmtCIcHdRjTYdRUi6lmGE+lOzGGjGe45qGOS8nyQQNvkNy2Ey2VqoSWuXXkD8zCUh6EHf1Ww==} - engines: {node: '>=v12'} + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.16.7_@babel+core@7.17.9: + resolution: {integrity: sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 dependencies: - conventional-changelog-conventionalcommits: 4.6.3 + '@babel/core': 7.17.9 + '@babel/helper-plugin-utils': 7.16.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.16.0 + '@babel/plugin-proposal-optional-chaining': 7.16.7_@babel+core@7.17.9 dev: true - /@commitlint/config-validator/16.2.1: - resolution: {integrity: sha512-hogSe0WGg7CKmp4IfNbdNES3Rq3UEI4XRPB8JL4EPgo/ORq5nrGTVzxJh78omibNuB8Ho4501Czb1Er1MoDWpw==} - engines: {node: '>=v12'} + /@babel/plugin-proposal-async-generator-functions/7.16.8_@babel+core@7.17.9: + resolution: {integrity: sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 dependencies: - '@commitlint/types': 16.2.1 - ajv: 6.12.6 + '@babel/core': 7.17.9 + '@babel/helper-plugin-utils': 7.16.7 + '@babel/helper-remap-async-to-generator': 7.16.8 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.17.9 + transitivePeerDependencies: + - supports-color dev: true - /@commitlint/cz-commitlint/16.2.3_commitizen@4.2.4+inquirer@8.2.2: - resolution: {integrity: sha512-G9rRnBJ/5te7RiOzp7EdqII9rQYvtsfsqwMxcoK4B7l0Rc57nFCOlf0e4Bn70E4aOsLeMzNe+PvVVrEsPStEHg==} - engines: {node: '>=v12'} + /@babel/plugin-proposal-class-properties/7.16.7_@babel+core@7.17.9: + resolution: {integrity: sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==} + engines: {node: '>=6.9.0'} peerDependencies: - commitizen: ^4.0.3 - inquirer: ^8.0.0 + '@babel/core': ^7.0.0-0 dependencies: - '@commitlint/ensure': 16.2.1 - '@commitlint/load': 16.2.3 - '@commitlint/types': 16.2.1 - chalk: 4.1.2 - commitizen: 4.2.4 - inquirer: 8.2.2 - lodash: 4.17.21 - word-wrap: 1.2.3 + '@babel/core': 7.17.9 + '@babel/helper-create-class-features-plugin': 7.17.9_@babel+core@7.17.9 + '@babel/helper-plugin-utils': 7.16.7 transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' + - supports-color dev: true - /@commitlint/ensure/16.2.1: - resolution: {integrity: sha512-/h+lBTgf1r5fhbDNHOViLuej38i3rZqTQnBTk+xEg+ehOwQDXUuissQ5GsYXXqI5uGy+261ew++sT4EA3uBJ+A==} - engines: {node: '>=v12'} + /@babel/plugin-proposal-class-static-block/7.17.6_@babel+core@7.17.9: + resolution: {integrity: sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 dependencies: - '@commitlint/types': 16.2.1 - lodash: 4.17.21 + '@babel/core': 7.17.9 + '@babel/helper-create-class-features-plugin': 7.17.9_@babel+core@7.17.9 + '@babel/helper-plugin-utils': 7.16.7 + '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.17.9 + transitivePeerDependencies: + - supports-color dev: true - /@commitlint/execute-rule/16.2.1: - resolution: {integrity: sha512-oSls82fmUTLM6cl5V3epdVo4gHhbmBFvCvQGHBRdQ50H/690Uq1Dyd7hXMuKITCIdcnr9umyDkr8r5C6HZDF3g==} - engines: {node: '>=v12'} + /@babel/plugin-proposal-decorators/7.17.9_@babel+core@7.17.9: + resolution: {integrity: sha512-EfH2LZ/vPa2wuPwJ26j+kYRkaubf89UlwxKXtxqEm57HrgSEYDB8t4swFP+p8LcI9yiP9ZRJJjo/58hS6BnaDA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-create-class-features-plugin': 7.17.9_@babel+core@7.17.9 + '@babel/helper-plugin-utils': 7.16.7 + '@babel/helper-replace-supers': 7.16.7 + '@babel/helper-split-export-declaration': 7.16.7 + '@babel/plugin-syntax-decorators': 7.17.0_@babel+core@7.17.9 + charcodes: 0.2.0 + transitivePeerDependencies: + - supports-color dev: true - /@commitlint/format/16.2.1: - resolution: {integrity: sha512-Yyio9bdHWmNDRlEJrxHKglamIk3d6hC0NkEUW6Ti6ipEh2g0BAhy8Od6t4vLhdZRa1I2n+gY13foy+tUgk0i1Q==} - engines: {node: '>=v12'} + /@babel/plugin-proposal-dynamic-import/7.16.7_@babel+core@7.17.9: + resolution: {integrity: sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 dependencies: - '@commitlint/types': 16.2.1 - chalk: 4.1.2 + '@babel/core': 7.17.9 + '@babel/helper-plugin-utils': 7.16.7 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.17.9 + dev: true + + /@babel/plugin-proposal-export-default-from/7.16.7_@babel+core@7.17.9: + resolution: {integrity: sha512-+cENpW1rgIjExn+o5c8Jw/4BuH4eGKKYvkMB8/0ZxFQ9mC0t4z09VsPIwNg6waF69QYC81zxGeAsREGuqQoKeg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-plugin-utils': 7.16.7 + '@babel/plugin-syntax-export-default-from': 7.16.7_@babel+core@7.17.9 + dev: true + + /@babel/plugin-proposal-export-namespace-from/7.16.7_@babel+core@7.17.9: + resolution: {integrity: sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-plugin-utils': 7.16.7 + '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.17.9 + dev: true + + /@babel/plugin-proposal-json-strings/7.16.7_@babel+core@7.17.9: + resolution: {integrity: sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-plugin-utils': 7.16.7 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.17.9 + dev: true + + /@babel/plugin-proposal-logical-assignment-operators/7.16.7_@babel+core@7.17.9: + resolution: {integrity: sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-plugin-utils': 7.16.7 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.17.9 + dev: true + + /@babel/plugin-proposal-nullish-coalescing-operator/7.16.7_@babel+core@7.17.9: + resolution: {integrity: sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-plugin-utils': 7.16.7 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.17.9 + dev: true + + /@babel/plugin-proposal-numeric-separator/7.16.7_@babel+core@7.17.9: + resolution: {integrity: sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-plugin-utils': 7.16.7 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.17.9 + dev: true + + /@babel/plugin-proposal-object-rest-spread/7.12.1_@babel+core@7.12.9: + resolution: {integrity: sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.16.7 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.12.9 + '@babel/plugin-transform-parameters': 7.16.7_@babel+core@7.12.9 + dev: true + + /@babel/plugin-proposal-object-rest-spread/7.17.3_@babel+core@7.17.9: + resolution: {integrity: sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.17.7 + '@babel/core': 7.17.9 + '@babel/helper-compilation-targets': 7.17.7_@babel+core@7.17.9 + '@babel/helper-plugin-utils': 7.16.7 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.17.9 + '@babel/plugin-transform-parameters': 7.16.7_@babel+core@7.17.9 + dev: true + + /@babel/plugin-proposal-optional-catch-binding/7.16.7_@babel+core@7.17.9: + resolution: {integrity: sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-plugin-utils': 7.16.7 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.17.9 + dev: true + + /@babel/plugin-proposal-optional-chaining/7.16.7_@babel+core@7.17.9: + resolution: {integrity: sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-plugin-utils': 7.16.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.16.0 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.17.9 + dev: true + + /@babel/plugin-proposal-private-methods/7.16.11_@babel+core@7.17.9: + resolution: {integrity: sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-create-class-features-plugin': 7.17.9_@babel+core@7.17.9 + '@babel/helper-plugin-utils': 7.16.7 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-private-property-in-object/7.16.7_@babel+core@7.17.9: + resolution: {integrity: sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-annotate-as-pure': 7.16.7 + '@babel/helper-create-class-features-plugin': 7.17.9_@babel+core@7.17.9 + '@babel/helper-plugin-utils': 7.16.7 + '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.17.9 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-unicode-property-regex/7.16.7_@babel+core@7.17.9: + resolution: {integrity: sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==} + engines: {node: '>=4'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-create-regexp-features-plugin': 7.17.0_@babel+core@7.17.9 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.17.9: + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.17.9: + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-syntax-class-static-block/7.14.5_@babel+core@7.17.9: + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-syntax-decorators/7.17.0_@babel+core@7.17.9: + resolution: {integrity: sha512-qWe85yCXsvDEluNP0OyeQjH63DlhAR3W7K9BxxU1MvbDb48tgBG+Ao6IJJ6smPDrrVzSQZrbF6donpkFBMcs3A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-syntax-dynamic-import/7.8.3_@babel+core@7.17.9: + resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-syntax-export-default-from/7.16.7_@babel+core@7.17.9: + resolution: {integrity: sha512-4C3E4NsrLOgftKaTYTULhHsuQrGv3FHrBzOMDiS7UYKIpgGBkAdawg4h+EI8zPeK9M0fiIIh72hIwsI24K7MbA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-syntax-export-namespace-from/7.8.3_@babel+core@7.17.9: + resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.17.9: + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-syntax-jsx/7.12.1_@babel+core@7.12.9: + resolution: {integrity: sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-syntax-jsx/7.16.7_@babel+core@7.17.9: + resolution: {integrity: sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.17.9: + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.17.9: + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.17.9: + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.12.9: + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.17.9: + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.17.9: + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.17.9: + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-syntax-private-property-in-object/7.14.5_@babel+core@7.17.9: + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.17.9: + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-syntax-typescript/7.16.7_@babel+core@7.17.9: + resolution: {integrity: sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-transform-arrow-functions/7.16.7_@babel+core@7.17.9: + resolution: {integrity: sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-transform-async-to-generator/7.16.8_@babel+core@7.17.9: + resolution: {integrity: sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-module-imports': 7.16.7 + '@babel/helper-plugin-utils': 7.16.7 + '@babel/helper-remap-async-to-generator': 7.16.8 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-block-scoped-functions/7.16.7_@babel+core@7.17.9: + resolution: {integrity: sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-transform-block-scoping/7.16.7_@babel+core@7.17.9: + resolution: {integrity: sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-transform-classes/7.16.7_@babel+core@7.17.9: + resolution: {integrity: sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-annotate-as-pure': 7.16.7 + '@babel/helper-environment-visitor': 7.16.7 + '@babel/helper-function-name': 7.17.9 + '@babel/helper-optimise-call-expression': 7.16.7 + '@babel/helper-plugin-utils': 7.16.7 + '@babel/helper-replace-supers': 7.16.7 + '@babel/helper-split-export-declaration': 7.16.7 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-computed-properties/7.16.7_@babel+core@7.17.9: + resolution: {integrity: sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-transform-destructuring/7.17.7_@babel+core@7.17.9: + resolution: {integrity: sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-transform-dotall-regex/7.16.7_@babel+core@7.17.9: + resolution: {integrity: sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-create-regexp-features-plugin': 7.17.0_@babel+core@7.17.9 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-transform-duplicate-keys/7.16.7_@babel+core@7.17.9: + resolution: {integrity: sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-transform-exponentiation-operator/7.16.7_@babel+core@7.17.9: + resolution: {integrity: sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.16.7 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-transform-for-of/7.16.7_@babel+core@7.17.9: + resolution: {integrity: sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-transform-function-name/7.16.7_@babel+core@7.17.9: + resolution: {integrity: sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-compilation-targets': 7.17.7_@babel+core@7.17.9 + '@babel/helper-function-name': 7.17.9 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-transform-literals/7.16.7_@babel+core@7.17.9: + resolution: {integrity: sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-transform-member-expression-literals/7.16.7_@babel+core@7.17.9: + resolution: {integrity: sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-transform-modules-amd/7.16.7_@babel+core@7.17.9: + resolution: {integrity: sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-module-transforms': 7.17.7 + '@babel/helper-plugin-utils': 7.16.7 + babel-plugin-dynamic-import-node: 2.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-modules-commonjs/7.17.9_@babel+core@7.17.9: + resolution: {integrity: sha512-2TBFd/r2I6VlYn0YRTz2JdazS+FoUuQ2rIFHoAxtyP/0G3D82SBLaRq9rnUkpqlLg03Byfl/+M32mpxjO6KaPw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-module-transforms': 7.17.7 + '@babel/helper-plugin-utils': 7.16.7 + '@babel/helper-simple-access': 7.17.7 + babel-plugin-dynamic-import-node: 2.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-modules-systemjs/7.17.8_@babel+core@7.17.9: + resolution: {integrity: sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-hoist-variables': 7.16.7 + '@babel/helper-module-transforms': 7.17.7 + '@babel/helper-plugin-utils': 7.16.7 + '@babel/helper-validator-identifier': 7.16.7 + babel-plugin-dynamic-import-node: 2.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-modules-umd/7.16.7_@babel+core@7.17.9: + resolution: {integrity: sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-module-transforms': 7.17.7 + '@babel/helper-plugin-utils': 7.16.7 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-named-capturing-groups-regex/7.16.8_@babel+core@7.17.9: + resolution: {integrity: sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-create-regexp-features-plugin': 7.17.0_@babel+core@7.17.9 + dev: true + + /@babel/plugin-transform-new-target/7.16.7_@babel+core@7.17.9: + resolution: {integrity: sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-transform-object-super/7.16.7_@babel+core@7.17.9: + resolution: {integrity: sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-plugin-utils': 7.16.7 + '@babel/helper-replace-supers': 7.16.7 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-parameters/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-transform-parameters/7.16.7_@babel+core@7.17.9: + resolution: {integrity: sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-transform-property-literals/7.16.7_@babel+core@7.17.9: + resolution: {integrity: sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-transform-react-display-name/7.16.7_@babel+core@7.17.9: + resolution: {integrity: sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-transform-react-jsx-development/7.16.7_@babel+core@7.17.9: + resolution: {integrity: sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/plugin-transform-react-jsx': 7.17.3_@babel+core@7.17.9 + dev: true + + /@babel/plugin-transform-react-jsx/7.17.3_@babel+core@7.17.9: + resolution: {integrity: sha512-9tjBm4O07f7mzKSIlEmPdiE6ub7kfIe6Cd+w+oQebpATfTQMAgW+YOuWxogbKVTulA+MEO7byMeIUtQ1z+z+ZQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-annotate-as-pure': 7.16.7 + '@babel/helper-module-imports': 7.16.7 + '@babel/helper-plugin-utils': 7.16.7 + '@babel/plugin-syntax-jsx': 7.16.7_@babel+core@7.17.9 + '@babel/types': 7.17.0 + dev: true + + /@babel/plugin-transform-react-pure-annotations/7.16.7_@babel+core@7.17.9: + resolution: {integrity: sha512-hs71ToC97k3QWxswh2ElzMFABXHvGiJ01IB1TbYQDGeWRKWz/MPUTh5jGExdHvosYKpnJW5Pm3S4+TA3FyX+GA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-annotate-as-pure': 7.16.7 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-transform-regenerator/7.17.9_@babel+core@7.17.9: + resolution: {integrity: sha512-Lc2TfbxR1HOyn/c6b4Y/b6NHoTb67n/IoWLxTu4kC7h4KQnWlhCq2S8Tx0t2SVvv5Uu87Hs+6JEJ5kt2tYGylQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + regenerator-transform: 0.15.0 + dev: true + + /@babel/plugin-transform-reserved-words/7.16.7_@babel+core@7.17.9: + resolution: {integrity: sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-transform-shorthand-properties/7.16.7_@babel+core@7.17.9: + resolution: {integrity: sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-transform-spread/7.16.7_@babel+core@7.17.9: + resolution: {integrity: sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-plugin-utils': 7.16.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.16.0 + dev: true + + /@babel/plugin-transform-sticky-regex/7.16.7_@babel+core@7.17.9: + resolution: {integrity: sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-transform-template-literals/7.16.7_@babel+core@7.17.9: + resolution: {integrity: sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-transform-typeof-symbol/7.16.7_@babel+core@7.17.9: + resolution: {integrity: sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-transform-typescript/7.16.8_@babel+core@7.17.9: + resolution: {integrity: sha512-bHdQ9k7YpBDO2d0NVfkj51DpQcvwIzIusJ7mEUaMlbZq3Kt/U47j24inXZHQ5MDiYpCs+oZiwnXyKedE8+q7AQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-create-class-features-plugin': 7.17.9_@babel+core@7.17.9 + '@babel/helper-plugin-utils': 7.16.7 + '@babel/plugin-syntax-typescript': 7.16.7_@babel+core@7.17.9 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-unicode-escapes/7.16.7_@babel+core@7.17.9: + resolution: {integrity: sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/plugin-transform-unicode-regex/7.16.7_@babel+core@7.17.9: + resolution: {integrity: sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-create-regexp-features-plugin': 7.17.0_@babel+core@7.17.9 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + + /@babel/preset-env/7.16.11_@babel+core@7.17.9: + resolution: {integrity: sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.17.7 + '@babel/core': 7.17.9 + '@babel/helper-compilation-targets': 7.17.7_@babel+core@7.17.9 + '@babel/helper-plugin-utils': 7.16.7 + '@babel/helper-validator-option': 7.16.7 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-proposal-async-generator-functions': 7.16.8_@babel+core@7.17.9 + '@babel/plugin-proposal-class-properties': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-proposal-class-static-block': 7.17.6_@babel+core@7.17.9 + '@babel/plugin-proposal-dynamic-import': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-proposal-export-namespace-from': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-proposal-json-strings': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-proposal-logical-assignment-operators': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-proposal-nullish-coalescing-operator': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-proposal-numeric-separator': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-proposal-object-rest-spread': 7.17.3_@babel+core@7.17.9 + '@babel/plugin-proposal-optional-catch-binding': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-proposal-optional-chaining': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-proposal-private-methods': 7.16.11_@babel+core@7.17.9 + '@babel/plugin-proposal-private-property-in-object': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-proposal-unicode-property-regex': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.17.9 + '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.17.9 + '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.17.9 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.17.9 + '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.17.9 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.17.9 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.17.9 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.17.9 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.17.9 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.17.9 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.17.9 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.17.9 + '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.17.9 + '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.17.9 + '@babel/plugin-transform-arrow-functions': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-transform-async-to-generator': 7.16.8_@babel+core@7.17.9 + '@babel/plugin-transform-block-scoped-functions': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-transform-block-scoping': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-transform-classes': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-transform-computed-properties': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-transform-destructuring': 7.17.7_@babel+core@7.17.9 + '@babel/plugin-transform-dotall-regex': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-transform-duplicate-keys': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-transform-exponentiation-operator': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-transform-for-of': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-transform-function-name': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-transform-literals': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-transform-member-expression-literals': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-transform-modules-amd': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-transform-modules-commonjs': 7.17.9_@babel+core@7.17.9 + '@babel/plugin-transform-modules-systemjs': 7.17.8_@babel+core@7.17.9 + '@babel/plugin-transform-modules-umd': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-transform-named-capturing-groups-regex': 7.16.8_@babel+core@7.17.9 + '@babel/plugin-transform-new-target': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-transform-object-super': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-transform-parameters': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-transform-property-literals': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-transform-regenerator': 7.17.9_@babel+core@7.17.9 + '@babel/plugin-transform-reserved-words': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-transform-shorthand-properties': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-transform-spread': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-transform-sticky-regex': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-transform-template-literals': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-transform-typeof-symbol': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-transform-unicode-escapes': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-transform-unicode-regex': 7.16.7_@babel+core@7.17.9 + '@babel/preset-modules': 0.1.5_@babel+core@7.17.9 + '@babel/types': 7.17.0 + babel-plugin-polyfill-corejs2: 0.3.1_@babel+core@7.17.9 + babel-plugin-polyfill-corejs3: 0.5.2_@babel+core@7.17.9 + babel-plugin-polyfill-regenerator: 0.3.1_@babel+core@7.17.9 + core-js-compat: 3.21.1 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/preset-modules/0.1.5_@babel+core@7.17.9: + resolution: {integrity: sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-plugin-utils': 7.16.7 + '@babel/plugin-proposal-unicode-property-regex': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-transform-dotall-regex': 7.16.7_@babel+core@7.17.9 + '@babel/types': 7.17.0 + esutils: 2.0.3 + dev: true + + /@babel/preset-react/7.16.7_@babel+core@7.17.9: + resolution: {integrity: sha512-fWpyI8UM/HE6DfPBzD8LnhQ/OcH8AgTaqcqP2nGOXEUV+VKBR5JRN9hCk9ai+zQQ57vtm9oWeXguBCPNUjytgA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-plugin-utils': 7.16.7 + '@babel/helper-validator-option': 7.16.7 + '@babel/plugin-transform-react-display-name': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-transform-react-jsx': 7.17.3_@babel+core@7.17.9 + '@babel/plugin-transform-react-jsx-development': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-transform-react-pure-annotations': 7.16.7_@babel+core@7.17.9 + dev: true + + /@babel/preset-typescript/7.16.7_@babel+core@7.17.9: + resolution: {integrity: sha512-WbVEmgXdIyvzB77AQjGBEyYPZx+8tTsO50XtfozQrkW8QB2rLJpH2lgx0TRw5EJrBxOZQ+wCcyPVQvS8tjEHpQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-plugin-utils': 7.16.7 + '@babel/helper-validator-option': 7.16.7 + '@babel/plugin-transform-typescript': 7.16.8_@babel+core@7.17.9 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/register/7.17.7_@babel+core@7.17.9: + resolution: {integrity: sha512-fg56SwvXRifootQEDQAu1mKdjh5uthPzdO0N6t358FktfL4XjAVXuH58ULoiW8mesxiOgNIrxiImqEwv0+hRRA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + clone-deep: 4.0.1 + find-cache-dir: 2.1.0 + make-dir: 2.1.0 + pirates: 4.0.5 + source-map-support: 0.5.21 + dev: true + + /@babel/runtime/7.17.9: + resolution: {integrity: sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.13.9 + dev: true + + /@babel/template/7.16.7: + resolution: {integrity: sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.16.7 + '@babel/parser': 7.17.9 + '@babel/types': 7.17.0 + dev: true + + /@babel/traverse/7.17.9: + resolution: {integrity: sha512-PQO8sDIJ8SIwipTPiR71kJQCKQYB5NGImbOviK8K+kg5xkNSYXLBupuX9QhatFowrsvo9Hj8WgArg3W7ijNAQw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.16.7 + '@babel/generator': 7.17.9 + '@babel/helper-environment-visitor': 7.16.7 + '@babel/helper-function-name': 7.17.9 + '@babel/helper-hoist-variables': 7.16.7 + '@babel/helper-split-export-declaration': 7.16.7 + '@babel/parser': 7.17.9 + '@babel/types': 7.17.0 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/types/7.17.0: + resolution: {integrity: sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.16.7 + to-fast-properties: 2.0.0 + dev: true + + /@base2/pretty-print-object/1.0.1: + resolution: {integrity: sha512-4iri8i1AqYHJE2DstZYkyEprg6Pq6sKx3xn5FpySk9sNhH7qN2LLlHJCfDTZRILNwQNPD7mATWM0TBui7uC1pA==} + dev: true + + /@cnakazawa/watch/1.0.4: + resolution: {integrity: sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==} + engines: {node: '>=0.1.95'} + hasBin: true + dependencies: + exec-sh: 0.3.6 + minimist: 1.2.6 + dev: true + + /@colors/colors/1.5.0: + resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} + engines: {node: '>=0.1.90'} + dev: true + + /@commitlint/cli/16.2.3: + resolution: {integrity: sha512-VsJBQLvhhlOgEfxs/Z5liYuK0dXqLE5hz1VJzLBxiOxG31kL/X5Q4OvK292BmO7IGZcm1yJE3XQPWSiFaEHbWA==} + engines: {node: '>=v12'} + hasBin: true + dependencies: + '@commitlint/format': 16.2.1 + '@commitlint/lint': 16.2.1 + '@commitlint/load': 16.2.3 + '@commitlint/read': 16.2.1 + '@commitlint/types': 16.2.1 + lodash: 4.17.21 + resolve-from: 5.0.0 + resolve-global: 1.0.0 + yargs: 17.4.1 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + dev: true + + /@commitlint/config-conventional/16.2.1: + resolution: {integrity: sha512-cP9gArx7gnaj4IqmtCIcHdRjTYdRUi6lmGE+lOzGGjGe45qGOS8nyQQNvkNy2Ey2VqoSWuXXkD8zCUh6EHf1Ww==} + engines: {node: '>=v12'} + dependencies: + conventional-changelog-conventionalcommits: 4.6.3 + dev: true + + /@commitlint/config-validator/16.2.1: + resolution: {integrity: sha512-hogSe0WGg7CKmp4IfNbdNES3Rq3UEI4XRPB8JL4EPgo/ORq5nrGTVzxJh78omibNuB8Ho4501Czb1Er1MoDWpw==} + engines: {node: '>=v12'} + dependencies: + '@commitlint/types': 16.2.1 + ajv: 6.12.6 + dev: true + + /@commitlint/cz-commitlint/16.2.3_commitizen@4.2.4+inquirer@8.2.2: + resolution: {integrity: sha512-G9rRnBJ/5te7RiOzp7EdqII9rQYvtsfsqwMxcoK4B7l0Rc57nFCOlf0e4Bn70E4aOsLeMzNe+PvVVrEsPStEHg==} + engines: {node: '>=v12'} + peerDependencies: + commitizen: ^4.0.3 + inquirer: ^8.0.0 + dependencies: + '@commitlint/ensure': 16.2.1 + '@commitlint/load': 16.2.3 + '@commitlint/types': 16.2.1 + chalk: 4.1.2 + commitizen: 4.2.4 + inquirer: 8.2.2 + lodash: 4.17.21 + word-wrap: 1.2.3 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + dev: true + + /@commitlint/ensure/16.2.1: + resolution: {integrity: sha512-/h+lBTgf1r5fhbDNHOViLuej38i3rZqTQnBTk+xEg+ehOwQDXUuissQ5GsYXXqI5uGy+261ew++sT4EA3uBJ+A==} + engines: {node: '>=v12'} + dependencies: + '@commitlint/types': 16.2.1 + lodash: 4.17.21 + dev: true + + /@commitlint/execute-rule/16.2.1: + resolution: {integrity: sha512-oSls82fmUTLM6cl5V3epdVo4gHhbmBFvCvQGHBRdQ50H/690Uq1Dyd7hXMuKITCIdcnr9umyDkr8r5C6HZDF3g==} + engines: {node: '>=v12'} + dev: true + + /@commitlint/format/16.2.1: + resolution: {integrity: sha512-Yyio9bdHWmNDRlEJrxHKglamIk3d6hC0NkEUW6Ti6ipEh2g0BAhy8Od6t4vLhdZRa1I2n+gY13foy+tUgk0i1Q==} + engines: {node: '>=v12'} + dependencies: + '@commitlint/types': 16.2.1 + chalk: 4.1.2 + dev: true + + /@commitlint/is-ignored/16.2.1: + resolution: {integrity: sha512-exl8HRzTIfb1YvDJp2b2HU5z1BT+9tmgxR2XF0YEzkMiCIuEKh+XLeocPr1VcvAKXv3Cmv5X/OfNRp+i+/HIhQ==} + engines: {node: '>=v12'} + dependencies: + '@commitlint/types': 16.2.1 + semver: 7.3.5 + dev: true + + /@commitlint/lint/16.2.1: + resolution: {integrity: sha512-fNINQ3X2ZqsCkNB3Z0Z8ElmhewqrS3gy2wgBTx97BkcjOWiyPAGwDJ752hwrsUnWAVBRztgw826n37xPzxsOgg==} + engines: {node: '>=v12'} + dependencies: + '@commitlint/is-ignored': 16.2.1 + '@commitlint/parse': 16.2.1 + '@commitlint/rules': 16.2.1 + '@commitlint/types': 16.2.1 + dev: true + + /@commitlint/load/16.2.3: + resolution: {integrity: sha512-Hb4OUlMnBUK6UxJEZ/VJ5k0LocIS7PtEMbRXEAA7eSpOgORIFexC4K/RaRpVd5UTtu3M0ST3ddPPijF9rdW6nw==} + engines: {node: '>=v12'} + dependencies: + '@commitlint/config-validator': 16.2.1 + '@commitlint/execute-rule': 16.2.1 + '@commitlint/resolve-extends': 16.2.1 + '@commitlint/types': 16.2.1 + '@types/node': 17.0.23 + chalk: 4.1.2 + cosmiconfig: 7.0.1 + cosmiconfig-typescript-loader: 1.0.9_ee885bc7281b682b6adbed6ae09ee090 + lodash: 4.17.21 + resolve-from: 5.0.0 + typescript: 4.6.3 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + dev: true + + /@commitlint/message/16.2.1: + resolution: {integrity: sha512-2eWX/47rftViYg7a3axYDdrgwKv32mxbycBJT6OQY/MJM7SUfYNYYvbMFOQFaA4xIVZt7t2Alyqslbl6blVwWw==} + engines: {node: '>=v12'} + dev: true + + /@commitlint/parse/16.2.1: + resolution: {integrity: sha512-2NP2dDQNL378VZYioLrgGVZhWdnJO4nAxQl5LXwYb08nEcN+cgxHN1dJV8OLJ5uxlGJtDeR8UZZ1mnQ1gSAD/g==} + engines: {node: '>=v12'} + dependencies: + '@commitlint/types': 16.2.1 + conventional-changelog-angular: 5.0.13 + conventional-commits-parser: 3.2.4 + dev: true + + /@commitlint/read/16.2.1: + resolution: {integrity: sha512-tViXGuaxLTrw2r7PiYMQOFA2fueZxnnt0lkOWqKyxT+n2XdEMGYcI9ID5ndJKXnfPGPppD0w/IItKsIXlZ+alw==} + engines: {node: '>=v12'} + dependencies: + '@commitlint/top-level': 16.2.1 + '@commitlint/types': 16.2.1 + fs-extra: 10.0.1 + git-raw-commits: 2.0.11 + dev: true + + /@commitlint/resolve-extends/16.2.1: + resolution: {integrity: sha512-NbbCMPKTFf2J805kwfP9EO+vV+XvnaHRcBy6ud5dF35dxMsvdJqke54W3XazXF1ZAxC4a3LBy4i/GNVBAthsEg==} + engines: {node: '>=v12'} + dependencies: + '@commitlint/config-validator': 16.2.1 + '@commitlint/types': 16.2.1 + import-fresh: 3.3.0 + lodash: 4.17.21 + resolve-from: 5.0.0 + resolve-global: 1.0.0 + dev: true + + /@commitlint/rules/16.2.1: + resolution: {integrity: sha512-ZFezJXQaBBso+BOTre/+1dGCuCzlWVaeLiVRGypI53qVgPMzQqZhkCcrxBFeqB87qeyzr4A4EoG++IvITwwpIw==} + engines: {node: '>=v12'} + dependencies: + '@commitlint/ensure': 16.2.1 + '@commitlint/message': 16.2.1 + '@commitlint/to-lines': 16.2.1 + '@commitlint/types': 16.2.1 + execa: 5.1.1 + dev: true + + /@commitlint/to-lines/16.2.1: + resolution: {integrity: sha512-9/VjpYj5j1QeY3eiog1zQWY6axsdWAc0AonUUfyZ7B0MVcRI0R56YsHAfzF6uK/g/WwPZaoe4Lb1QCyDVnpVaQ==} + engines: {node: '>=v12'} + dev: true + + /@commitlint/top-level/16.2.1: + resolution: {integrity: sha512-lS6GSieHW9y6ePL73ied71Z9bOKyK+Ib9hTkRsB8oZFAyQZcyRwq2w6nIa6Fngir1QW51oKzzaXfJL94qwImyw==} + engines: {node: '>=v12'} + dependencies: + find-up: 5.0.0 + dev: true + + /@commitlint/types/16.2.1: + resolution: {integrity: sha512-7/z7pA7BM0i8XvMSBynO7xsB3mVQPUZbVn6zMIlp/a091XJ3qAXRXc+HwLYhiIdzzS5fuxxNIHZMGHVD4HJxdA==} + engines: {node: '>=v12'} + dependencies: + chalk: 4.1.2 + dev: true + + /@cspotcode/source-map-consumer/0.8.0: + resolution: {integrity: sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==} + engines: {node: '>= 12'} + dev: true + + /@cspotcode/source-map-support/0.7.0: + resolution: {integrity: sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==} + engines: {node: '>=12'} + dependencies: + '@cspotcode/source-map-consumer': 0.8.0 + dev: true + + /@discoveryjs/json-ext/0.5.7: + resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} + engines: {node: '>=10.0.0'} + dev: true + + /@emotion/cache/10.0.29: + resolution: {integrity: sha512-fU2VtSVlHiF27empSbxi1O2JFdNWZO+2NFHfwO0pxgTep6Xa3uGb+3pVKfLww2l/IBGLNEZl5Xf/++A4wAYDYQ==} + dependencies: + '@emotion/sheet': 0.9.4 + '@emotion/stylis': 0.8.5 + '@emotion/utils': 0.11.3 + '@emotion/weak-memoize': 0.2.5 + dev: true + + /@emotion/core/10.3.1: + resolution: {integrity: sha512-447aUEjPIm0MnE6QYIaFz9VQOHSXf4Iu6EWOIqq11EAPqinkSZmfymPTmlOE3QjLv846lH4JVZBUOtwGbuQoww==} + peerDependencies: + react: '>=16.3.0' + dependencies: + '@babel/runtime': 7.17.9 + '@emotion/cache': 10.0.29 + '@emotion/css': 10.0.27 + '@emotion/serialize': 0.11.16 + '@emotion/sheet': 0.9.4 + '@emotion/utils': 0.11.3 + dev: true + + /@emotion/core/10.3.1_react@16.14.0: + resolution: {integrity: sha512-447aUEjPIm0MnE6QYIaFz9VQOHSXf4Iu6EWOIqq11EAPqinkSZmfymPTmlOE3QjLv846lH4JVZBUOtwGbuQoww==} + peerDependencies: + react: '>=16.3.0' + dependencies: + '@babel/runtime': 7.17.9 + '@emotion/cache': 10.0.29 + '@emotion/css': 10.0.27 + '@emotion/serialize': 0.11.16 + '@emotion/sheet': 0.9.4 + '@emotion/utils': 0.11.3 + react: 16.14.0 + dev: true + + /@emotion/css/10.0.27: + resolution: {integrity: sha512-6wZjsvYeBhyZQYNrGoR5yPMYbMBNEnanDrqmsqS1mzDm1cOTu12shvl2j4QHNS36UaTE0USIJawCH9C8oW34Zw==} + dependencies: + '@emotion/serialize': 0.11.16 + '@emotion/utils': 0.11.3 + babel-plugin-emotion: 10.2.2 + dev: true + + /@emotion/hash/0.8.0: + resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==} + dev: true + + /@emotion/is-prop-valid/0.8.8: + resolution: {integrity: sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==} + dependencies: + '@emotion/memoize': 0.7.4 + dev: true + + /@emotion/memoize/0.7.4: + resolution: {integrity: sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==} + dev: true + + /@emotion/serialize/0.11.16: + resolution: {integrity: sha512-G3J4o8by0VRrO+PFeSc3js2myYNOXVJ3Ya+RGVxnshRYgsvErfAOglKAiy1Eo1vhzxqtUvjCyS5gtewzkmvSSg==} + dependencies: + '@emotion/hash': 0.8.0 + '@emotion/memoize': 0.7.4 + '@emotion/unitless': 0.7.5 + '@emotion/utils': 0.11.3 + csstype: 2.6.20 + dev: true + + /@emotion/sheet/0.9.4: + resolution: {integrity: sha512-zM9PFmgVSqBw4zL101Q0HrBVTGmpAxFZH/pYx/cjJT5advXguvcgjHFTCaIO3enL/xr89vK2bh0Mfyj9aa0ANA==} + dev: true + + /@emotion/styled-base/10.3.0_864809d686fef2043b51d8d752270dc1: + resolution: {integrity: sha512-PBRqsVKR7QRNkmfH78hTSSwHWcwDpecH9W6heujWAcyp2wdz/64PP73s7fWS1dIPm8/Exc8JAzYS8dEWXjv60w==} + peerDependencies: + '@emotion/core': ^10.0.28 + react: '>=16.3.0' + dependencies: + '@babel/runtime': 7.17.9 + '@emotion/core': 10.3.1_react@16.14.0 + '@emotion/is-prop-valid': 0.8.8 + '@emotion/serialize': 0.11.16 + '@emotion/utils': 0.11.3 + react: 16.14.0 + dev: true + + /@emotion/styled-base/10.3.0_@emotion+core@10.3.1: + resolution: {integrity: sha512-PBRqsVKR7QRNkmfH78hTSSwHWcwDpecH9W6heujWAcyp2wdz/64PP73s7fWS1dIPm8/Exc8JAzYS8dEWXjv60w==} + peerDependencies: + '@emotion/core': ^10.0.28 + react: '>=16.3.0' + dependencies: + '@babel/runtime': 7.17.9 + '@emotion/core': 10.3.1 + '@emotion/is-prop-valid': 0.8.8 + '@emotion/serialize': 0.11.16 + '@emotion/utils': 0.11.3 + dev: true + + /@emotion/styled/10.3.0_864809d686fef2043b51d8d752270dc1: + resolution: {integrity: sha512-GgcUpXBBEU5ido+/p/mCT2/Xx+Oqmp9JzQRuC+a4lYM4i4LBBn/dWvc0rQ19N9ObA8/T4NWMrPNe79kMBDJqoQ==} + peerDependencies: + '@emotion/core': ^10.0.27 + react: '>=16.3.0' + dependencies: + '@emotion/core': 10.3.1_react@16.14.0 + '@emotion/styled-base': 10.3.0_864809d686fef2043b51d8d752270dc1 + babel-plugin-emotion: 10.2.2 + react: 16.14.0 + dev: true + + /@emotion/styled/10.3.0_@emotion+core@10.3.1: + resolution: {integrity: sha512-GgcUpXBBEU5ido+/p/mCT2/Xx+Oqmp9JzQRuC+a4lYM4i4LBBn/dWvc0rQ19N9ObA8/T4NWMrPNe79kMBDJqoQ==} + peerDependencies: + '@emotion/core': ^10.0.27 + react: '>=16.3.0' + dependencies: + '@emotion/core': 10.3.1 + '@emotion/styled-base': 10.3.0_@emotion+core@10.3.1 + babel-plugin-emotion: 10.2.2 + dev: true + + /@emotion/stylis/0.8.5: + resolution: {integrity: sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==} + dev: true + + /@emotion/unitless/0.7.5: + resolution: {integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==} + dev: true + + /@emotion/utils/0.11.3: + resolution: {integrity: sha512-0o4l6pZC+hI88+bzuaX/6BgOvQVhbt2PfmxauVaYOGgbsAw14wdKyvMCZXnsnsHys94iadcF+RG/wZyx6+ZZBw==} + dev: true + + /@emotion/weak-memoize/0.2.5: + resolution: {integrity: sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==} + dev: true + + /@eslint/eslintrc/1.2.1: + resolution: {integrity: sha512-bxvbYnBPN1Gibwyp6NrpnFzA3YtRL3BBAyEAFVIpNTm2Rn4Vy87GA5M4aSn3InRrlsbX5N0GW7XIx+U4SAEKdQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.3.1 + globals: 13.13.0 + ignore: 5.2.0 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@gar/promisify/1.1.3: + resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} + dev: true + + /@humanwhocodes/config-array/0.9.5: + resolution: {integrity: sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 1.2.1 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/object-schema/1.2.1: + resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + dev: true + + /@istanbuljs/load-nyc-config/1.1.0: + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} + dependencies: + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.14.1 + resolve-from: 5.0.0 + dev: true + + /@istanbuljs/schema/0.1.3: + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + dev: true + + /@jest/transform/26.6.2: + resolution: {integrity: sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==} + engines: {node: '>= 10.14.2'} + dependencies: + '@babel/core': 7.17.9 + '@jest/types': 26.6.2 + babel-plugin-istanbul: 6.1.1 + chalk: 4.1.2 + convert-source-map: 1.8.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.10 + jest-haste-map: 26.6.2 + jest-regex-util: 26.0.0 + jest-util: 26.6.2 + micromatch: 4.0.5 + pirates: 4.0.5 + slash: 3.0.0 + source-map: 0.6.1 + write-file-atomic: 3.0.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/types/26.6.2: + resolution: {integrity: sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==} + engines: {node: '>= 10.14.2'} + dependencies: + '@types/istanbul-lib-coverage': 2.0.4 + '@types/istanbul-reports': 3.0.1 + '@types/node': 17.0.23 + '@types/yargs': 15.0.14 + chalk: 4.1.2 + dev: true + + /@jridgewell/resolve-uri/3.0.5: + resolution: {integrity: sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/sourcemap-codec/1.4.11: + resolution: {integrity: sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==} + dev: true + + /@jridgewell/trace-mapping/0.3.4: + resolution: {integrity: sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ==} + dependencies: + '@jridgewell/resolve-uri': 3.0.5 + '@jridgewell/sourcemap-codec': 1.4.11 + dev: true + + /@mdx-js/loader/1.6.22: + resolution: {integrity: sha512-9CjGwy595NaxAYp0hF9B/A0lH6C8Rms97e2JS9d3jVUtILn6pT5i5IV965ra3lIWc7Rs1GG1tBdVF7dCowYe6Q==} + dependencies: + '@mdx-js/mdx': 1.6.22 + '@mdx-js/react': 1.6.22 + loader-utils: 2.0.0 + transitivePeerDependencies: + - react + - supports-color + dev: true + + /@mdx-js/mdx/1.6.22: + resolution: {integrity: sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA==} + dependencies: + '@babel/core': 7.12.9 + '@babel/plugin-syntax-jsx': 7.12.1_@babel+core@7.12.9 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.12.9 + '@mdx-js/util': 1.6.22 + babel-plugin-apply-mdx-type-prop: 1.6.22_@babel+core@7.12.9 + babel-plugin-extract-import-names: 1.6.22 + camelcase-css: 2.0.1 + detab: 2.0.4 + hast-util-raw: 6.0.1 + lodash.uniq: 4.5.0 + mdast-util-to-hast: 10.0.1 + remark-footnotes: 2.0.0 + remark-mdx: 1.6.22 + remark-parse: 8.0.3 + remark-squeeze-paragraphs: 4.0.0 + style-to-object: 0.3.0 + unified: 9.2.0 + unist-builder: 2.0.3 + unist-util-visit: 2.0.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@mdx-js/react/1.6.22: + resolution: {integrity: sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg==} + peerDependencies: + react: ^16.13.1 || ^17.0.0 + dev: true + + /@mdx-js/util/1.6.22: + resolution: {integrity: sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==} + dev: true + + /@mrmlnc/readdir-enhanced/2.2.1: + resolution: {integrity: sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==} + engines: {node: '>=4'} + dependencies: + call-me-maybe: 1.0.1 + glob-to-regexp: 0.3.0 + dev: true + + /@nodelib/fs.scandir/2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat/1.1.3: + resolution: {integrity: sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==} + engines: {node: '>= 6'} + dev: true + + /@nodelib/fs.stat/2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@nodelib/fs.walk/1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.13.0 + dev: true + + /@npmcli/fs/1.1.1: + resolution: {integrity: sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==} + dependencies: + '@gar/promisify': 1.1.3 + semver: 7.3.7 + dev: true + + /@npmcli/move-file/1.1.2: + resolution: {integrity: sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==} + engines: {node: '>=10'} + dependencies: + mkdirp: 1.0.4 + rimraf: 3.0.2 + dev: true + + /@popperjs/core/2.11.5: + resolution: {integrity: sha512-9X2obfABZuDVLCgPK9aX0a/x4jaOEweTTWE2+9sr0Qqqevj2Uv5XorvusThmc9XGYpS9yI+fhh8RTafBtGposw==} + dev: true + + /@socket.io/base64-arraybuffer/1.0.2: + resolution: {integrity: sha512-dOlCBKnDw4iShaIsH/bxujKTM18+2TOAsYz+KSc11Am38H4q5Xw8Bbz97ZYdrVNM+um3p7w86Bvvmcn9q+5+eQ==} + engines: {node: '>= 0.6.0'} + dev: true + + /@storybook/addon-actions/6.4.22: + resolution: {integrity: sha512-t2w3iLXFul+R/1ekYxIEzUOZZmvEa7EzUAVAuCHP4i6x0jBnTTZ7sAIUVRaxVREPguH5IqI/2OklYhKanty2Yw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + dependencies: + '@storybook/addons': 6.4.22 + '@storybook/api': 6.4.22 + '@storybook/components': 6.4.22 + '@storybook/core-events': 6.4.22 + '@storybook/csf': 0.0.2--canary.87bc651.0 + '@storybook/theming': 6.4.22 + core-js: 3.21.1 + fast-deep-equal: 3.1.3 + global: 4.4.0 + lodash: 4.17.21 + polished: 4.2.2 + prop-types: 15.8.1 + react-inspector: 5.1.1 + regenerator-runtime: 0.13.9 + telejson: 5.3.3 + ts-dedent: 2.2.0 + util-deprecate: 1.0.2 + uuid-browser: 3.1.0 + transitivePeerDependencies: + - '@types/react' + dev: true + + /@storybook/addon-controls/6.4.22_eslint@8.13.0: + resolution: {integrity: sha512-f/M/W+7UTEUnr/L6scBMvksq+ZA8GTfh3bomE5FtWyOyaFppq9k8daKAvdYNlzXAOrUUsoZVJDgpb20Z2VBiSQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + dependencies: + '@storybook/addons': 6.4.22 + '@storybook/api': 6.4.22 + '@storybook/client-logger': 6.4.22 + '@storybook/components': 6.4.22 + '@storybook/core-common': 6.4.22_eslint@8.13.0 + '@storybook/csf': 0.0.2--canary.87bc651.0 + '@storybook/node-logger': 6.4.22 + '@storybook/store': 6.4.22 + '@storybook/theming': 6.4.22 + core-js: 3.21.1 + lodash: 4.17.21 + ts-dedent: 2.2.0 + transitivePeerDependencies: + - '@types/react' + - eslint + - supports-color + - typescript + - vue-template-compiler + - webpack-cli + - webpack-command + dev: true + + /@storybook/addon-docs/6.4.22_7fd729fae3ed30395c91a6c3899e19ab: + resolution: {integrity: sha512-9j+i+W+BGHJuRe4jUrqk6ubCzP4fc1xgFS2o8pakRiZgPn5kUQPdkticmsyh1XeEJifwhqjKJvkEDrcsleytDA==} + peerDependencies: + '@storybook/angular': 6.4.22 + '@storybook/html': 6.4.22 + '@storybook/react': 6.4.22 + '@storybook/vue': 6.4.22 + '@storybook/vue3': 6.4.22 + '@storybook/web-components': 6.4.22 + lit: ^2.0.0 + lit-html: ^1.4.1 || ^2.0.0 + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + svelte: ^3.31.2 + sveltedoc-parser: ^4.1.0 + vue: ^2.6.10 || ^3.0.0 + webpack: '*' + peerDependenciesMeta: + '@storybook/angular': + optional: true + '@storybook/html': + optional: true + '@storybook/react': + optional: true + '@storybook/vue': + optional: true + '@storybook/vue3': + optional: true + '@storybook/web-components': + optional: true + lit: + optional: true + lit-html: + optional: true + react: + optional: true + react-dom: + optional: true + svelte: + optional: true + sveltedoc-parser: + optional: true + vue: + optional: true + webpack: + optional: true + dependencies: + '@babel/core': 7.17.9 + '@babel/generator': 7.17.9 + '@babel/parser': 7.17.9 + '@babel/plugin-transform-react-jsx': 7.17.3_@babel+core@7.17.9 + '@babel/preset-env': 7.16.11_@babel+core@7.17.9 + '@jest/transform': 26.6.2 + '@mdx-js/loader': 1.6.22 + '@mdx-js/mdx': 1.6.22 + '@mdx-js/react': 1.6.22 + '@storybook/addons': 6.4.22 + '@storybook/api': 6.4.22 + '@storybook/builder-webpack4': 6.4.22_eslint@8.13.0 + '@storybook/client-logger': 6.4.22 + '@storybook/components': 6.4.22 + '@storybook/core': 6.4.22_eslint@8.13.0 + '@storybook/core-events': 6.4.22 + '@storybook/csf': 0.0.2--canary.87bc651.0 + '@storybook/csf-tools': 6.4.22 + '@storybook/html': 6.4.22_@babel+core@7.17.9+eslint@8.13.0 + '@storybook/node-logger': 6.4.22 + '@storybook/postinstall': 6.4.22 + '@storybook/preview-web': 6.4.22 + '@storybook/source-loader': 6.4.22 + '@storybook/store': 6.4.22 + '@storybook/theming': 6.4.22 + acorn: 7.4.1 + acorn-jsx: 5.3.2_acorn@7.4.1 + acorn-walk: 7.2.0 + core-js: 3.21.1 + doctrine: 3.0.0 + escodegen: 2.0.0 + fast-deep-equal: 3.1.3 + global: 4.4.0 + html-tags: 3.2.0 + js-string-escape: 1.0.1 + loader-utils: 2.0.2 + lodash: 4.17.21 + nanoid: 3.3.2 + p-limit: 3.1.0 + prettier: 2.3.0 + prop-types: 15.8.1 + react-element-to-jsx-string: 14.3.4 + regenerator-runtime: 0.13.9 + remark-external-links: 8.0.0 + remark-slug: 6.1.0 + ts-dedent: 2.2.0 + util-deprecate: 1.0.2 + transitivePeerDependencies: + - '@storybook/builder-webpack5' + - '@storybook/manager-webpack5' + - '@types/react' + - bufferutil + - encoding + - eslint + - supports-color + - typescript + - utf-8-validate + - vue-template-compiler + - webpack-cli + - webpack-command + dev: true + + /@storybook/addons/6.4.22: + resolution: {integrity: sha512-P/R+Jsxh7pawKLYo8MtE3QU/ilRFKbtCewV/T1o5U/gm8v7hKQdFz3YdRMAra4QuCY8bQIp7MKd2HrB5aH5a1A==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + dependencies: + '@storybook/api': 6.4.22 + '@storybook/channels': 6.4.22 + '@storybook/client-logger': 6.4.22 + '@storybook/core-events': 6.4.22 + '@storybook/csf': 0.0.2--canary.87bc651.0 + '@storybook/router': 6.4.22 + '@storybook/theming': 6.4.22 + '@types/webpack-env': 1.16.3 + core-js: 3.21.1 + global: 4.4.0 + regenerator-runtime: 0.13.9 + dev: true + + /@storybook/addons/6.4.22_react-dom@16.14.0+react@16.14.0: + resolution: {integrity: sha512-P/R+Jsxh7pawKLYo8MtE3QU/ilRFKbtCewV/T1o5U/gm8v7hKQdFz3YdRMAra4QuCY8bQIp7MKd2HrB5aH5a1A==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + dependencies: + '@storybook/api': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@storybook/channels': 6.4.22 + '@storybook/client-logger': 6.4.22 + '@storybook/core-events': 6.4.22 + '@storybook/csf': 0.0.2--canary.87bc651.0 + '@storybook/router': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@storybook/theming': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@types/webpack-env': 1.16.3 + core-js: 3.21.1 + global: 4.4.0 + react: 16.14.0 + react-dom: 16.14.0_react@16.14.0 + regenerator-runtime: 0.13.9 + dev: true + + /@storybook/api/6.4.22: + resolution: {integrity: sha512-lAVI3o2hKupYHXFTt+1nqFct942up5dHH6YD7SZZJGyW21dwKC3HK1IzCsTawq3fZAKkgWFgmOO649hKk60yKg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + dependencies: + '@storybook/channels': 6.4.22 + '@storybook/client-logger': 6.4.22 + '@storybook/core-events': 6.4.22 + '@storybook/csf': 0.0.2--canary.87bc651.0 + '@storybook/router': 6.4.22 + '@storybook/semver': 7.3.2 + '@storybook/theming': 6.4.22 + core-js: 3.21.1 + fast-deep-equal: 3.1.3 + global: 4.4.0 + lodash: 4.17.21 + memoizerific: 1.11.3 + regenerator-runtime: 0.13.9 + store2: 2.13.2 + telejson: 5.3.3 + ts-dedent: 2.2.0 + util-deprecate: 1.0.2 + dev: true + + /@storybook/api/6.4.22_react-dom@16.14.0+react@16.14.0: + resolution: {integrity: sha512-lAVI3o2hKupYHXFTt+1nqFct942up5dHH6YD7SZZJGyW21dwKC3HK1IzCsTawq3fZAKkgWFgmOO649hKk60yKg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + dependencies: + '@storybook/channels': 6.4.22 + '@storybook/client-logger': 6.4.22 + '@storybook/core-events': 6.4.22 + '@storybook/csf': 0.0.2--canary.87bc651.0 + '@storybook/router': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@storybook/semver': 7.3.2 + '@storybook/theming': 6.4.22_react-dom@16.14.0+react@16.14.0 + core-js: 3.21.1 + fast-deep-equal: 3.1.3 + global: 4.4.0 + lodash: 4.17.21 + memoizerific: 1.11.3 + react: 16.14.0 + react-dom: 16.14.0_react@16.14.0 + regenerator-runtime: 0.13.9 + store2: 2.13.2 + telejson: 5.3.3 + ts-dedent: 2.2.0 + util-deprecate: 1.0.2 + dev: true + + /@storybook/builder-webpack4/6.4.22_cfdbbe835af0ce3c97f004e72dcbccdb: + resolution: {integrity: sha512-A+GgGtKGnBneRFSFkDarUIgUTI8pYFdLmUVKEAGdh2hL+vLXAz9A46sEY7C8LQ85XWa8TKy3OTDxqR4+4iWj3A==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@babel/core': 7.17.9 + '@babel/plugin-proposal-class-properties': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-proposal-decorators': 7.17.9_@babel+core@7.17.9 + '@babel/plugin-proposal-export-default-from': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-proposal-nullish-coalescing-operator': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-proposal-object-rest-spread': 7.17.3_@babel+core@7.17.9 + '@babel/plugin-proposal-optional-chaining': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-proposal-private-methods': 7.16.11_@babel+core@7.17.9 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.17.9 + '@babel/plugin-transform-arrow-functions': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-transform-block-scoping': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-transform-classes': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-transform-destructuring': 7.17.7_@babel+core@7.17.9 + '@babel/plugin-transform-for-of': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-transform-parameters': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-transform-shorthand-properties': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-transform-spread': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-transform-template-literals': 7.16.7_@babel+core@7.17.9 + '@babel/preset-env': 7.16.11_@babel+core@7.17.9 + '@babel/preset-react': 7.16.7_@babel+core@7.17.9 + '@babel/preset-typescript': 7.16.7_@babel+core@7.17.9 + '@storybook/addons': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@storybook/api': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@storybook/channel-postmessage': 6.4.22 + '@storybook/channels': 6.4.22 + '@storybook/client-api': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@storybook/client-logger': 6.4.22 + '@storybook/components': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@storybook/core-common': 6.4.22_cfdbbe835af0ce3c97f004e72dcbccdb + '@storybook/core-events': 6.4.22 + '@storybook/node-logger': 6.4.22 + '@storybook/preview-web': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@storybook/router': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@storybook/semver': 7.3.2 + '@storybook/store': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@storybook/theming': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@storybook/ui': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@types/node': 14.18.13 + '@types/webpack': 4.41.32 + autoprefixer: 9.8.8 + babel-loader: 8.2.4_598a497cebab8e15ee8f9e5632178e63 + babel-plugin-macros: 2.8.0 + babel-plugin-polyfill-corejs3: 0.1.7_@babel+core@7.17.9 + case-sensitive-paths-webpack-plugin: 2.4.0 + core-js: 3.21.1 + css-loader: 3.6.0_webpack@4.46.0 + file-loader: 6.2.0_webpack@4.46.0 + find-up: 5.0.0 + fork-ts-checker-webpack-plugin: 4.1.6 + glob: 7.2.0 + glob-promise: 3.4.0_glob@7.2.0 + global: 4.4.0 + html-webpack-plugin: 4.5.2_webpack@4.46.0 + pnp-webpack-plugin: 1.6.4 + postcss: 7.0.39 + postcss-flexbugs-fixes: 4.2.1 + postcss-loader: 4.3.0_postcss@7.0.39+webpack@4.46.0 + raw-loader: 4.0.2_webpack@4.46.0 + react: 16.14.0 + react-dom: 16.14.0_react@16.14.0 + stable: 0.1.8 + style-loader: 1.3.0_webpack@4.46.0 + terser-webpack-plugin: 4.2.3_webpack@4.46.0 + ts-dedent: 2.2.0 + url-loader: 4.1.1_file-loader@6.2.0+webpack@4.46.0 + util-deprecate: 1.0.2 + webpack: 4.46.0 + webpack-dev-middleware: 3.7.3_webpack@4.46.0 + webpack-filter-warnings-plugin: 1.2.1_webpack@4.46.0 + webpack-hot-middleware: 2.25.1 + webpack-virtual-modules: 0.2.2 + transitivePeerDependencies: + - '@types/react' + - eslint + - supports-color + - vue-template-compiler + - webpack-cli + - webpack-command + dev: true + + /@storybook/builder-webpack4/6.4.22_eslint@8.13.0: + resolution: {integrity: sha512-A+GgGtKGnBneRFSFkDarUIgUTI8pYFdLmUVKEAGdh2hL+vLXAz9A46sEY7C8LQ85XWa8TKy3OTDxqR4+4iWj3A==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@babel/core': 7.17.9 + '@babel/plugin-proposal-class-properties': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-proposal-decorators': 7.17.9_@babel+core@7.17.9 + '@babel/plugin-proposal-export-default-from': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-proposal-nullish-coalescing-operator': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-proposal-object-rest-spread': 7.17.3_@babel+core@7.17.9 + '@babel/plugin-proposal-optional-chaining': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-proposal-private-methods': 7.16.11_@babel+core@7.17.9 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.17.9 + '@babel/plugin-transform-arrow-functions': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-transform-block-scoping': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-transform-classes': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-transform-destructuring': 7.17.7_@babel+core@7.17.9 + '@babel/plugin-transform-for-of': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-transform-parameters': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-transform-shorthand-properties': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-transform-spread': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-transform-template-literals': 7.16.7_@babel+core@7.17.9 + '@babel/preset-env': 7.16.11_@babel+core@7.17.9 + '@babel/preset-react': 7.16.7_@babel+core@7.17.9 + '@babel/preset-typescript': 7.16.7_@babel+core@7.17.9 + '@storybook/addons': 6.4.22 + '@storybook/api': 6.4.22 + '@storybook/channel-postmessage': 6.4.22 + '@storybook/channels': 6.4.22 + '@storybook/client-api': 6.4.22 + '@storybook/client-logger': 6.4.22 + '@storybook/components': 6.4.22 + '@storybook/core-common': 6.4.22_eslint@8.13.0 + '@storybook/core-events': 6.4.22 + '@storybook/node-logger': 6.4.22 + '@storybook/preview-web': 6.4.22 + '@storybook/router': 6.4.22 + '@storybook/semver': 7.3.2 + '@storybook/store': 6.4.22 + '@storybook/theming': 6.4.22 + '@storybook/ui': 6.4.22 + '@types/node': 14.18.13 + '@types/webpack': 4.41.32 + autoprefixer: 9.8.8 + babel-loader: 8.2.4_598a497cebab8e15ee8f9e5632178e63 + babel-plugin-macros: 2.8.0 + babel-plugin-polyfill-corejs3: 0.1.7_@babel+core@7.17.9 + case-sensitive-paths-webpack-plugin: 2.4.0 + core-js: 3.21.1 + css-loader: 3.6.0_webpack@4.46.0 + file-loader: 6.2.0_webpack@4.46.0 + find-up: 5.0.0 + fork-ts-checker-webpack-plugin: 4.1.6 + glob: 7.2.0 + glob-promise: 3.4.0_glob@7.2.0 + global: 4.4.0 + html-webpack-plugin: 4.5.2_webpack@4.46.0 + pnp-webpack-plugin: 1.6.4 + postcss: 7.0.39 + postcss-flexbugs-fixes: 4.2.1 + postcss-loader: 4.3.0_postcss@7.0.39+webpack@4.46.0 + raw-loader: 4.0.2_webpack@4.46.0 + stable: 0.1.8 + style-loader: 1.3.0_webpack@4.46.0 + terser-webpack-plugin: 4.2.3_webpack@4.46.0 + ts-dedent: 2.2.0 + url-loader: 4.1.1_file-loader@6.2.0+webpack@4.46.0 + util-deprecate: 1.0.2 + webpack: 4.46.0 + webpack-dev-middleware: 3.7.3_webpack@4.46.0 + webpack-filter-warnings-plugin: 1.2.1_webpack@4.46.0 + webpack-hot-middleware: 2.25.1 + webpack-virtual-modules: 0.2.2 + transitivePeerDependencies: + - '@types/react' + - eslint + - supports-color + - vue-template-compiler + - webpack-cli + - webpack-command + dev: true + + /@storybook/channel-postmessage/6.4.22: + resolution: {integrity: sha512-gt+0VZLszt2XZyQMh8E94TqjHZ8ZFXZ+Lv/Mmzl0Yogsc2H+6VzTTQO4sv0IIx6xLbpgG72g5cr8VHsxW5kuDQ==} + dependencies: + '@storybook/channels': 6.4.22 + '@storybook/client-logger': 6.4.22 + '@storybook/core-events': 6.4.22 + core-js: 3.21.1 + global: 4.4.0 + qs: 6.10.3 + telejson: 5.3.3 + dev: true + + /@storybook/channel-websocket/6.4.22: + resolution: {integrity: sha512-Bm/FcZ4Su4SAK5DmhyKKfHkr7HiHBui6PNutmFkASJInrL9wBduBfN8YQYaV7ztr8ezoHqnYRx8sj28jpwa6NA==} + dependencies: + '@storybook/channels': 6.4.22 + '@storybook/client-logger': 6.4.22 + core-js: 3.21.1 + global: 4.4.0 + telejson: 5.3.3 + dev: true + + /@storybook/channels/6.4.22: + resolution: {integrity: sha512-cfR74tu7MLah1A8Rru5sak71I+kH2e/sY6gkpVmlvBj4hEmdZp4Puj9PTeaKcMXh9DgIDPNA5mb8yvQH6VcyxQ==} + dependencies: + core-js: 3.21.1 + ts-dedent: 2.2.0 + util-deprecate: 1.0.2 + dev: true + + /@storybook/client-api/6.4.22: + resolution: {integrity: sha512-sO6HJNtrrdit7dNXQcZMdlmmZG1k6TswH3gAyP/DoYajycrTwSJ6ovkarzkO+0QcJ+etgra4TEdTIXiGHBMe/A==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + dependencies: + '@storybook/addons': 6.4.22 + '@storybook/channel-postmessage': 6.4.22 + '@storybook/channels': 6.4.22 + '@storybook/client-logger': 6.4.22 + '@storybook/core-events': 6.4.22 + '@storybook/csf': 0.0.2--canary.87bc651.0 + '@storybook/store': 6.4.22 + '@types/qs': 6.9.7 + '@types/webpack-env': 1.16.3 + core-js: 3.21.1 + fast-deep-equal: 3.1.3 + global: 4.4.0 + lodash: 4.17.21 + memoizerific: 1.11.3 + qs: 6.10.3 + regenerator-runtime: 0.13.9 + store2: 2.13.2 + synchronous-promise: 2.0.15 + ts-dedent: 2.2.0 + util-deprecate: 1.0.2 + dev: true + + /@storybook/client-api/6.4.22_react-dom@16.14.0+react@16.14.0: + resolution: {integrity: sha512-sO6HJNtrrdit7dNXQcZMdlmmZG1k6TswH3gAyP/DoYajycrTwSJ6ovkarzkO+0QcJ+etgra4TEdTIXiGHBMe/A==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + dependencies: + '@storybook/addons': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@storybook/channel-postmessage': 6.4.22 + '@storybook/channels': 6.4.22 + '@storybook/client-logger': 6.4.22 + '@storybook/core-events': 6.4.22 + '@storybook/csf': 0.0.2--canary.87bc651.0 + '@storybook/store': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@types/qs': 6.9.7 + '@types/webpack-env': 1.16.3 + core-js: 3.21.1 + fast-deep-equal: 3.1.3 + global: 4.4.0 + lodash: 4.17.21 + memoizerific: 1.11.3 + qs: 6.10.3 + react: 16.14.0 + react-dom: 16.14.0_react@16.14.0 + regenerator-runtime: 0.13.9 + store2: 2.13.2 + synchronous-promise: 2.0.15 + ts-dedent: 2.2.0 + util-deprecate: 1.0.2 + dev: true + + /@storybook/client-logger/6.4.22: + resolution: {integrity: sha512-LXhxh/lcDsdGnK8kimqfhu3C0+D2ylCSPPQNbU0IsLRmTfbpQYMdyl0XBjPdHiRVwlL7Gkw5OMjYemQgJ02zlw==} + dependencies: + core-js: 3.21.1 + global: 4.4.0 + dev: true + + /@storybook/components/6.4.22: + resolution: {integrity: sha512-dCbXIJF9orMvH72VtAfCQsYbe57OP7fAADtR6YTwfCw9Sm1jFuZr8JbblQ1HcrXEoJG21nOyad3Hm5EYVb/sBw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + dependencies: + '@popperjs/core': 2.11.5 + '@storybook/client-logger': 6.4.22 + '@storybook/csf': 0.0.2--canary.87bc651.0 + '@storybook/theming': 6.4.22 + '@types/color-convert': 2.0.0 + '@types/overlayscrollbars': 1.12.1 + '@types/react-syntax-highlighter': 11.0.5 + color-convert: 2.0.1 + core-js: 3.21.1 + fast-deep-equal: 3.1.3 + global: 4.4.0 + lodash: 4.17.21 + markdown-to-jsx: 7.1.7 + memoizerific: 1.11.3 + overlayscrollbars: 1.13.1 + polished: 4.2.2 + prop-types: 15.8.1 + react-colorful: 5.5.1 + react-popper-tooltip: 3.1.1 + react-syntax-highlighter: 13.5.3 + react-textarea-autosize: 8.3.3 + regenerator-runtime: 0.13.9 + ts-dedent: 2.2.0 + util-deprecate: 1.0.2 + transitivePeerDependencies: + - '@types/react' + dev: true + + /@storybook/components/6.4.22_react-dom@16.14.0+react@16.14.0: + resolution: {integrity: sha512-dCbXIJF9orMvH72VtAfCQsYbe57OP7fAADtR6YTwfCw9Sm1jFuZr8JbblQ1HcrXEoJG21nOyad3Hm5EYVb/sBw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + dependencies: + '@popperjs/core': 2.11.5 + '@storybook/client-logger': 6.4.22 + '@storybook/csf': 0.0.2--canary.87bc651.0 + '@storybook/theming': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@types/color-convert': 2.0.0 + '@types/overlayscrollbars': 1.12.1 + '@types/react-syntax-highlighter': 11.0.5 + color-convert: 2.0.1 + core-js: 3.21.1 + fast-deep-equal: 3.1.3 + global: 4.4.0 + lodash: 4.17.21 + markdown-to-jsx: 7.1.7_react@16.14.0 + memoizerific: 1.11.3 + overlayscrollbars: 1.13.1 + polished: 4.2.2 + prop-types: 15.8.1 + react: 16.14.0 + react-colorful: 5.5.1_react-dom@16.14.0+react@16.14.0 + react-dom: 16.14.0_react@16.14.0 + react-popper-tooltip: 3.1.1_react-dom@16.14.0+react@16.14.0 + react-syntax-highlighter: 13.5.3_react@16.14.0 + react-textarea-autosize: 8.3.3_react@16.14.0 + regenerator-runtime: 0.13.9 + ts-dedent: 2.2.0 + util-deprecate: 1.0.2 + transitivePeerDependencies: + - '@types/react' + dev: true + + /@storybook/core-client/6.4.22: + resolution: {integrity: sha512-uHg4yfCBeM6eASSVxStWRVTZrAnb4FT6X6v/xDqr4uXCpCttZLlBzrSDwPBLNNLtCa7ntRicHM8eGKIOD5lMYQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + typescript: '*' + webpack: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@storybook/addons': 6.4.22 + '@storybook/channel-postmessage': 6.4.22 + '@storybook/channel-websocket': 6.4.22 + '@storybook/client-api': 6.4.22 + '@storybook/client-logger': 6.4.22 + '@storybook/core-events': 6.4.22 + '@storybook/csf': 0.0.2--canary.87bc651.0 + '@storybook/preview-web': 6.4.22 + '@storybook/store': 6.4.22 + '@storybook/ui': 6.4.22 + airbnb-js-shims: 2.2.1 + ansi-to-html: 0.6.15 + core-js: 3.21.1 + global: 4.4.0 + lodash: 4.17.21 + qs: 6.10.3 + regenerator-runtime: 0.13.9 + ts-dedent: 2.2.0 + unfetch: 4.2.0 + util-deprecate: 1.0.2 + transitivePeerDependencies: + - '@types/react' + dev: true + + /@storybook/core-client/6.4.22_e97e5e3809294a3414549b4ba42cd203: + resolution: {integrity: sha512-uHg4yfCBeM6eASSVxStWRVTZrAnb4FT6X6v/xDqr4uXCpCttZLlBzrSDwPBLNNLtCa7ntRicHM8eGKIOD5lMYQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + typescript: '*' + webpack: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@storybook/addons': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@storybook/channel-postmessage': 6.4.22 + '@storybook/channel-websocket': 6.4.22 + '@storybook/client-api': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@storybook/client-logger': 6.4.22 + '@storybook/core-events': 6.4.22 + '@storybook/csf': 0.0.2--canary.87bc651.0 + '@storybook/preview-web': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@storybook/store': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@storybook/ui': 6.4.22_react-dom@16.14.0+react@16.14.0 + airbnb-js-shims: 2.2.1 + ansi-to-html: 0.6.15 + core-js: 3.21.1 + global: 4.4.0 + lodash: 4.17.21 + qs: 6.10.3 + react: 16.14.0 + react-dom: 16.14.0_react@16.14.0 + regenerator-runtime: 0.13.9 + ts-dedent: 2.2.0 + unfetch: 4.2.0 + util-deprecate: 1.0.2 + webpack: 4.46.0 + transitivePeerDependencies: + - '@types/react' + dev: true + + /@storybook/core-client/6.4.22_react-dom@16.14.0+react@16.14.0: + resolution: {integrity: sha512-uHg4yfCBeM6eASSVxStWRVTZrAnb4FT6X6v/xDqr4uXCpCttZLlBzrSDwPBLNNLtCa7ntRicHM8eGKIOD5lMYQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + typescript: '*' + webpack: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@storybook/addons': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@storybook/channel-postmessage': 6.4.22 + '@storybook/channel-websocket': 6.4.22 + '@storybook/client-api': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@storybook/client-logger': 6.4.22 + '@storybook/core-events': 6.4.22 + '@storybook/csf': 0.0.2--canary.87bc651.0 + '@storybook/preview-web': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@storybook/store': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@storybook/ui': 6.4.22_react-dom@16.14.0+react@16.14.0 + airbnb-js-shims: 2.2.1 + ansi-to-html: 0.6.15 + core-js: 3.21.1 + global: 4.4.0 + lodash: 4.17.21 + qs: 6.10.3 + react: 16.14.0 + react-dom: 16.14.0_react@16.14.0 + regenerator-runtime: 0.13.9 + ts-dedent: 2.2.0 + unfetch: 4.2.0 + util-deprecate: 1.0.2 + transitivePeerDependencies: + - '@types/react' + dev: true + + /@storybook/core-client/6.4.22_webpack@4.46.0: + resolution: {integrity: sha512-uHg4yfCBeM6eASSVxStWRVTZrAnb4FT6X6v/xDqr4uXCpCttZLlBzrSDwPBLNNLtCa7ntRicHM8eGKIOD5lMYQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + typescript: '*' + webpack: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@storybook/addons': 6.4.22 + '@storybook/channel-postmessage': 6.4.22 + '@storybook/channel-websocket': 6.4.22 + '@storybook/client-api': 6.4.22 + '@storybook/client-logger': 6.4.22 + '@storybook/core-events': 6.4.22 + '@storybook/csf': 0.0.2--canary.87bc651.0 + '@storybook/preview-web': 6.4.22 + '@storybook/store': 6.4.22 + '@storybook/ui': 6.4.22 + airbnb-js-shims: 2.2.1 + ansi-to-html: 0.6.15 + core-js: 3.21.1 + global: 4.4.0 + lodash: 4.17.21 + qs: 6.10.3 + regenerator-runtime: 0.13.9 + ts-dedent: 2.2.0 + unfetch: 4.2.0 + util-deprecate: 1.0.2 + webpack: 4.46.0 + transitivePeerDependencies: + - '@types/react' + dev: true + + /@storybook/core-common/6.4.22_cfdbbe835af0ce3c97f004e72dcbccdb: + resolution: {integrity: sha512-PD3N/FJXPNRHeQS2zdgzYFtqPLdi3MLwAicbnw+U3SokcsspfsAuyYHZOYZgwO8IAEKy6iCc7TpBdiSJZ/vAKQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@babel/core': 7.17.9 + '@babel/plugin-proposal-class-properties': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-proposal-decorators': 7.17.9_@babel+core@7.17.9 + '@babel/plugin-proposal-export-default-from': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-proposal-nullish-coalescing-operator': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-proposal-object-rest-spread': 7.17.3_@babel+core@7.17.9 + '@babel/plugin-proposal-optional-chaining': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-proposal-private-methods': 7.16.11_@babel+core@7.17.9 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.17.9 + '@babel/plugin-transform-arrow-functions': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-transform-block-scoping': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-transform-classes': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-transform-destructuring': 7.17.7_@babel+core@7.17.9 + '@babel/plugin-transform-for-of': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-transform-parameters': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-transform-shorthand-properties': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-transform-spread': 7.16.7_@babel+core@7.17.9 + '@babel/preset-env': 7.16.11_@babel+core@7.17.9 + '@babel/preset-react': 7.16.7_@babel+core@7.17.9 + '@babel/preset-typescript': 7.16.7_@babel+core@7.17.9 + '@babel/register': 7.17.7_@babel+core@7.17.9 + '@storybook/node-logger': 6.4.22 + '@storybook/semver': 7.3.2 + '@types/node': 14.18.13 + '@types/pretty-hrtime': 1.0.1 + babel-loader: 8.2.4_598a497cebab8e15ee8f9e5632178e63 + babel-plugin-macros: 3.1.0 + babel-plugin-polyfill-corejs3: 0.1.7_@babel+core@7.17.9 + chalk: 4.1.2 + core-js: 3.21.1 + express: 4.17.3 + file-system-cache: 1.0.5 + find-up: 5.0.0 + fork-ts-checker-webpack-plugin: 6.5.1_eslint@8.13.0+webpack@4.46.0 + fs-extra: 9.1.0 + glob: 7.2.0 + handlebars: 4.7.7 + interpret: 2.2.0 + json5: 2.2.1 + lazy-universal-dotenv: 3.0.1 + picomatch: 2.3.1 + pkg-dir: 5.0.0 + pretty-hrtime: 1.0.3 + react: 16.14.0 + react-dom: 16.14.0_react@16.14.0 + resolve-from: 5.0.0 + slash: 3.0.0 + telejson: 5.3.3 + ts-dedent: 2.2.0 + util-deprecate: 1.0.2 + webpack: 4.46.0 + transitivePeerDependencies: + - eslint + - supports-color + - vue-template-compiler + - webpack-cli + - webpack-command + dev: true + + /@storybook/core-common/6.4.22_eslint@8.13.0: + resolution: {integrity: sha512-PD3N/FJXPNRHeQS2zdgzYFtqPLdi3MLwAicbnw+U3SokcsspfsAuyYHZOYZgwO8IAEKy6iCc7TpBdiSJZ/vAKQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@babel/core': 7.17.9 + '@babel/plugin-proposal-class-properties': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-proposal-decorators': 7.17.9_@babel+core@7.17.9 + '@babel/plugin-proposal-export-default-from': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-proposal-nullish-coalescing-operator': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-proposal-object-rest-spread': 7.17.3_@babel+core@7.17.9 + '@babel/plugin-proposal-optional-chaining': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-proposal-private-methods': 7.16.11_@babel+core@7.17.9 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.17.9 + '@babel/plugin-transform-arrow-functions': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-transform-block-scoping': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-transform-classes': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-transform-destructuring': 7.17.7_@babel+core@7.17.9 + '@babel/plugin-transform-for-of': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-transform-parameters': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-transform-shorthand-properties': 7.16.7_@babel+core@7.17.9 + '@babel/plugin-transform-spread': 7.16.7_@babel+core@7.17.9 + '@babel/preset-env': 7.16.11_@babel+core@7.17.9 + '@babel/preset-react': 7.16.7_@babel+core@7.17.9 + '@babel/preset-typescript': 7.16.7_@babel+core@7.17.9 + '@babel/register': 7.17.7_@babel+core@7.17.9 + '@storybook/node-logger': 6.4.22 + '@storybook/semver': 7.3.2 + '@types/node': 14.18.13 + '@types/pretty-hrtime': 1.0.1 + babel-loader: 8.2.4_598a497cebab8e15ee8f9e5632178e63 + babel-plugin-macros: 3.1.0 + babel-plugin-polyfill-corejs3: 0.1.7_@babel+core@7.17.9 + chalk: 4.1.2 + core-js: 3.21.1 + express: 4.17.3 + file-system-cache: 1.0.5 + find-up: 5.0.0 + fork-ts-checker-webpack-plugin: 6.5.1_eslint@8.13.0+webpack@4.46.0 + fs-extra: 9.1.0 + glob: 7.2.0 + handlebars: 4.7.7 + interpret: 2.2.0 + json5: 2.2.1 + lazy-universal-dotenv: 3.0.1 + picomatch: 2.3.1 + pkg-dir: 5.0.0 + pretty-hrtime: 1.0.3 + resolve-from: 5.0.0 + slash: 3.0.0 + telejson: 5.3.3 + ts-dedent: 2.2.0 + util-deprecate: 1.0.2 + webpack: 4.46.0 + transitivePeerDependencies: + - eslint + - supports-color + - vue-template-compiler + - webpack-cli + - webpack-command + dev: true + + /@storybook/core-events/6.4.22: + resolution: {integrity: sha512-5GYY5+1gd58Gxjqex27RVaX6qbfIQmJxcbzbNpXGNSqwqAuIIepcV1rdCVm6I4C3Yb7/AQ3cN5dVbf33QxRIwA==} + dependencies: + core-js: 3.21.1 + dev: true + + /@storybook/core-server/6.4.22_cfdbbe835af0ce3c97f004e72dcbccdb: + resolution: {integrity: sha512-wFh3e2fa0un1d4+BJP+nd3FVWUO7uHTqv3OGBfOmzQMKp4NU1zaBNdSQG7Hz6mw0fYPBPZgBjPfsJRwIYLLZyw==} + peerDependencies: + '@storybook/builder-webpack5': 6.4.22 + '@storybook/manager-webpack5': 6.4.22 + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + typescript: '*' + peerDependenciesMeta: + '@storybook/builder-webpack5': + optional: true + '@storybook/manager-webpack5': + optional: true + typescript: + optional: true + dependencies: + '@discoveryjs/json-ext': 0.5.7 + '@storybook/builder-webpack4': 6.4.22_cfdbbe835af0ce3c97f004e72dcbccdb + '@storybook/core-client': 6.4.22_e97e5e3809294a3414549b4ba42cd203 + '@storybook/core-common': 6.4.22_cfdbbe835af0ce3c97f004e72dcbccdb + '@storybook/core-events': 6.4.22 + '@storybook/csf': 0.0.2--canary.87bc651.0 + '@storybook/csf-tools': 6.4.22 + '@storybook/manager-webpack4': 6.4.22_cfdbbe835af0ce3c97f004e72dcbccdb + '@storybook/node-logger': 6.4.22 + '@storybook/semver': 7.3.2 + '@storybook/store': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@types/node': 14.18.13 + '@types/node-fetch': 2.6.1 + '@types/pretty-hrtime': 1.0.1 + '@types/webpack': 4.41.32 + better-opn: 2.1.1 + boxen: 5.1.2 + chalk: 4.1.2 + cli-table3: 0.6.2 + commander: 6.2.1 + compression: 1.7.4 + core-js: 3.21.1 + cpy: 8.1.2 + detect-port: 1.3.0 + express: 4.17.3 + file-system-cache: 1.0.5 + fs-extra: 9.1.0 + globby: 11.1.0 + ip: 1.1.5 + lodash: 4.17.21 + node-fetch: 2.6.7 + pretty-hrtime: 1.0.3 + prompts: 2.4.2 + react: 16.14.0 + react-dom: 16.14.0_react@16.14.0 + regenerator-runtime: 0.13.9 + serve-favicon: 2.5.0 + slash: 3.0.0 + telejson: 5.3.3 + ts-dedent: 2.2.0 + util-deprecate: 1.0.2 + watchpack: 2.3.1 + webpack: 4.46.0 + ws: 8.2.3 + transitivePeerDependencies: + - '@types/react' + - bufferutil + - encoding + - eslint + - supports-color + - utf-8-validate + - vue-template-compiler + - webpack-cli + - webpack-command + dev: true + + /@storybook/core-server/6.4.22_eslint@8.13.0: + resolution: {integrity: sha512-wFh3e2fa0un1d4+BJP+nd3FVWUO7uHTqv3OGBfOmzQMKp4NU1zaBNdSQG7Hz6mw0fYPBPZgBjPfsJRwIYLLZyw==} + peerDependencies: + '@storybook/builder-webpack5': 6.4.22 + '@storybook/manager-webpack5': 6.4.22 + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + typescript: '*' + peerDependenciesMeta: + '@storybook/builder-webpack5': + optional: true + '@storybook/manager-webpack5': + optional: true + typescript: + optional: true + dependencies: + '@discoveryjs/json-ext': 0.5.7 + '@storybook/builder-webpack4': 6.4.22_eslint@8.13.0 + '@storybook/core-client': 6.4.22_webpack@4.46.0 + '@storybook/core-common': 6.4.22_eslint@8.13.0 + '@storybook/core-events': 6.4.22 + '@storybook/csf': 0.0.2--canary.87bc651.0 + '@storybook/csf-tools': 6.4.22 + '@storybook/manager-webpack4': 6.4.22_eslint@8.13.0 + '@storybook/node-logger': 6.4.22 + '@storybook/semver': 7.3.2 + '@storybook/store': 6.4.22 + '@types/node': 14.18.13 + '@types/node-fetch': 2.6.1 + '@types/pretty-hrtime': 1.0.1 + '@types/webpack': 4.41.32 + better-opn: 2.1.1 + boxen: 5.1.2 + chalk: 4.1.2 + cli-table3: 0.6.2 + commander: 6.2.1 + compression: 1.7.4 + core-js: 3.21.1 + cpy: 8.1.2 + detect-port: 1.3.0 + express: 4.17.3 + file-system-cache: 1.0.5 + fs-extra: 9.1.0 + globby: 11.1.0 + ip: 1.1.5 + lodash: 4.17.21 + node-fetch: 2.6.7 + pretty-hrtime: 1.0.3 + prompts: 2.4.2 + regenerator-runtime: 0.13.9 + serve-favicon: 2.5.0 + slash: 3.0.0 + telejson: 5.3.3 + ts-dedent: 2.2.0 + util-deprecate: 1.0.2 + watchpack: 2.3.1 + webpack: 4.46.0 + ws: 8.2.3 + transitivePeerDependencies: + - '@types/react' + - bufferutil + - encoding + - eslint + - supports-color + - utf-8-validate + - vue-template-compiler + - webpack-cli + - webpack-command + dev: true + + /@storybook/core/6.4.22_cfdbbe835af0ce3c97f004e72dcbccdb: + resolution: {integrity: sha512-KZYJt7GM5NgKFXbPRZZZPEONZ5u/tE/cRbMdkn/zWN3He8+VP+65/tz8hbriI/6m91AWVWkBKrODSkeq59NgRA==} + peerDependencies: + '@storybook/builder-webpack5': 6.4.22 + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + typescript: '*' + webpack: '*' + peerDependenciesMeta: + '@storybook/builder-webpack5': + optional: true + typescript: + optional: true + dependencies: + '@storybook/core-client': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@storybook/core-server': 6.4.22_cfdbbe835af0ce3c97f004e72dcbccdb + react: 16.14.0 + react-dom: 16.14.0_react@16.14.0 + transitivePeerDependencies: + - '@storybook/manager-webpack5' + - '@types/react' + - bufferutil + - encoding + - eslint + - supports-color + - utf-8-validate + - vue-template-compiler + - webpack-cli + - webpack-command + dev: true + + /@storybook/core/6.4.22_eslint@8.13.0: + resolution: {integrity: sha512-KZYJt7GM5NgKFXbPRZZZPEONZ5u/tE/cRbMdkn/zWN3He8+VP+65/tz8hbriI/6m91AWVWkBKrODSkeq59NgRA==} + peerDependencies: + '@storybook/builder-webpack5': 6.4.22 + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + typescript: '*' + webpack: '*' + peerDependenciesMeta: + '@storybook/builder-webpack5': + optional: true + typescript: + optional: true + dependencies: + '@storybook/core-client': 6.4.22 + '@storybook/core-server': 6.4.22_eslint@8.13.0 + transitivePeerDependencies: + - '@storybook/manager-webpack5' + - '@types/react' + - bufferutil + - encoding + - eslint + - supports-color + - utf-8-validate + - vue-template-compiler + - webpack-cli + - webpack-command + dev: true + + /@storybook/csf-tools/6.4.22: + resolution: {integrity: sha512-LMu8MZAiQspJAtMBLU2zitsIkqQv7jOwX7ih5JrXlyaDticH7l2j6Q+1mCZNWUOiMTizj0ivulmUsSaYbpToSw==} + dependencies: + '@babel/core': 7.17.9 + '@babel/generator': 7.17.9 + '@babel/parser': 7.17.9 + '@babel/plugin-transform-react-jsx': 7.17.3_@babel+core@7.17.9 + '@babel/preset-env': 7.16.11_@babel+core@7.17.9 + '@babel/traverse': 7.17.9 + '@babel/types': 7.17.0 + '@mdx-js/mdx': 1.6.22 + '@storybook/csf': 0.0.2--canary.87bc651.0 + core-js: 3.21.1 + fs-extra: 9.1.0 + global: 4.4.0 + js-string-escape: 1.0.1 + lodash: 4.17.21 + prettier: 2.3.0 + regenerator-runtime: 0.13.9 + ts-dedent: 2.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@storybook/csf/0.0.2--canary.87bc651.0: + resolution: {integrity: sha512-ajk1Uxa+rBpFQHKrCcTmJyQBXZ5slfwHVEaKlkuFaW77it8RgbPJp/ccna3sgoi8oZ7FkkOyvv1Ve4SmwFqRqw==} + dependencies: + lodash: 4.17.21 + dev: true + + /@storybook/html/6.4.22_@babel+core@7.17.9+eslint@8.13.0: + resolution: {integrity: sha512-qOULn4db1bJlN6IuGCfH2g88utO+0h9aFityfRpmM0KntYx+tezLDD2/2yzdRy69Mh3KsIoqmDtX0hdsaFxH6w==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + '@babel/core': '*' + dependencies: + '@babel/core': 7.17.9 + '@storybook/addons': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@storybook/client-api': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@storybook/core': 6.4.22_cfdbbe835af0ce3c97f004e72dcbccdb + '@storybook/core-common': 6.4.22_cfdbbe835af0ce3c97f004e72dcbccdb + '@storybook/csf': 0.0.2--canary.87bc651.0 + '@storybook/preview-web': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@storybook/store': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@types/webpack-env': 1.16.3 + core-js: 3.21.1 + global: 4.4.0 + html-loader: 1.3.2 + react: 16.14.0 + react-dom: 16.14.0_react@16.14.0 + read-pkg-up: 7.0.1 + regenerator-runtime: 0.13.9 + ts-dedent: 2.2.0 + transitivePeerDependencies: + - '@storybook/builder-webpack5' + - '@storybook/manager-webpack5' + - '@types/react' + - bufferutil + - encoding + - eslint + - supports-color + - typescript + - utf-8-validate + - vue-template-compiler + - webpack + - webpack-cli + - webpack-command + dev: true + + /@storybook/manager-webpack4/6.4.22_cfdbbe835af0ce3c97f004e72dcbccdb: + resolution: {integrity: sha512-nzhDMJYg0vXdcG0ctwE6YFZBX71+5NYaTGkxg3xT7gbgnP1YFXn9gVODvgq3tPb3gcRapjyOIxUa20rV+r8edA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@babel/core': 7.17.9 + '@babel/plugin-transform-template-literals': 7.16.7_@babel+core@7.17.9 + '@babel/preset-react': 7.16.7_@babel+core@7.17.9 + '@storybook/addons': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@storybook/core-client': 6.4.22_e97e5e3809294a3414549b4ba42cd203 + '@storybook/core-common': 6.4.22_cfdbbe835af0ce3c97f004e72dcbccdb + '@storybook/node-logger': 6.4.22 + '@storybook/theming': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@storybook/ui': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@types/node': 14.18.13 + '@types/webpack': 4.41.32 + babel-loader: 8.2.4_598a497cebab8e15ee8f9e5632178e63 + case-sensitive-paths-webpack-plugin: 2.4.0 + chalk: 4.1.2 + core-js: 3.21.1 + css-loader: 3.6.0_webpack@4.46.0 + express: 4.17.3 + file-loader: 6.2.0_webpack@4.46.0 + file-system-cache: 1.0.5 + find-up: 5.0.0 + fs-extra: 9.1.0 + html-webpack-plugin: 4.5.2_webpack@4.46.0 + node-fetch: 2.6.7 + pnp-webpack-plugin: 1.6.4 + react: 16.14.0 + react-dom: 16.14.0_react@16.14.0 + read-pkg-up: 7.0.1 + regenerator-runtime: 0.13.9 + resolve-from: 5.0.0 + style-loader: 1.3.0_webpack@4.46.0 + telejson: 5.3.3 + terser-webpack-plugin: 4.2.3_webpack@4.46.0 + ts-dedent: 2.2.0 + url-loader: 4.1.1_file-loader@6.2.0+webpack@4.46.0 + util-deprecate: 1.0.2 + webpack: 4.46.0 + webpack-dev-middleware: 3.7.3_webpack@4.46.0 + webpack-virtual-modules: 0.2.2 + transitivePeerDependencies: + - '@types/react' + - encoding + - eslint + - supports-color + - vue-template-compiler + - webpack-cli + - webpack-command + dev: true + + /@storybook/manager-webpack4/6.4.22_eslint@8.13.0: + resolution: {integrity: sha512-nzhDMJYg0vXdcG0ctwE6YFZBX71+5NYaTGkxg3xT7gbgnP1YFXn9gVODvgq3tPb3gcRapjyOIxUa20rV+r8edA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@babel/core': 7.17.9 + '@babel/plugin-transform-template-literals': 7.16.7_@babel+core@7.17.9 + '@babel/preset-react': 7.16.7_@babel+core@7.17.9 + '@storybook/addons': 6.4.22 + '@storybook/core-client': 6.4.22_webpack@4.46.0 + '@storybook/core-common': 6.4.22_eslint@8.13.0 + '@storybook/node-logger': 6.4.22 + '@storybook/theming': 6.4.22 + '@storybook/ui': 6.4.22 + '@types/node': 14.18.13 + '@types/webpack': 4.41.32 + babel-loader: 8.2.4_598a497cebab8e15ee8f9e5632178e63 + case-sensitive-paths-webpack-plugin: 2.4.0 + chalk: 4.1.2 + core-js: 3.21.1 + css-loader: 3.6.0_webpack@4.46.0 + express: 4.17.3 + file-loader: 6.2.0_webpack@4.46.0 + file-system-cache: 1.0.5 + find-up: 5.0.0 + fs-extra: 9.1.0 + html-webpack-plugin: 4.5.2_webpack@4.46.0 + node-fetch: 2.6.7 + pnp-webpack-plugin: 1.6.4 + read-pkg-up: 7.0.1 + regenerator-runtime: 0.13.9 + resolve-from: 5.0.0 + style-loader: 1.3.0_webpack@4.46.0 + telejson: 5.3.3 + terser-webpack-plugin: 4.2.3_webpack@4.46.0 + ts-dedent: 2.2.0 + url-loader: 4.1.1_file-loader@6.2.0+webpack@4.46.0 + util-deprecate: 1.0.2 + webpack: 4.46.0 + webpack-dev-middleware: 3.7.3_webpack@4.46.0 + webpack-virtual-modules: 0.2.2 + transitivePeerDependencies: + - '@types/react' + - encoding + - eslint + - supports-color + - vue-template-compiler + - webpack-cli + - webpack-command + dev: true + + /@storybook/node-logger/6.4.22: + resolution: {integrity: sha512-sUXYFqPxiqM7gGH7gBXvO89YEO42nA4gBicJKZjj9e+W4QQLrftjF9l+mAw2K0mVE10Bn7r4pfs5oEZ0aruyyA==} + dependencies: + '@types/npmlog': 4.1.4 + chalk: 4.1.2 + core-js: 3.21.1 + npmlog: 5.0.1 + pretty-hrtime: 1.0.3 + dev: true + + /@storybook/postinstall/6.4.22: + resolution: {integrity: sha512-LdIvA+l70Mp5FSkawOC16uKocefc+MZLYRHqjTjgr7anubdi6y7W4n9A7/Yw4IstZHoknfL88qDj/uK5N+Ahzw==} + dependencies: + core-js: 3.21.1 + dev: true + + /@storybook/preset-scss/1.0.3_98fb4723ddb8cb1321f7deacb3be93bc: + resolution: {integrity: sha512-o9Iz6wxPeNENrQa2mKlsDKynBfqU2uWaRP80HeWp4TkGgf7/x3DVF2O7yi9N0x/PI1qzzTTpxlQ90D62XmpiTw==} + peerDependencies: + css-loader: '*' + sass-loader: '*' + style-loader: '*' + dependencies: + css-loader: 5.2.7 + sass-loader: 10.2.1_node-sass@7.0.1+sass@1.50.0 + style-loader: 2.0.0 + dev: true + + /@storybook/preview-web/6.4.22: + resolution: {integrity: sha512-sWS+sgvwSvcNY83hDtWUUL75O2l2LY/GTAS0Zp2dh3WkObhtuJ/UehftzPZlZmmv7PCwhb4Q3+tZDKzMlFxnKQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + dependencies: + '@storybook/addons': 6.4.22 + '@storybook/channel-postmessage': 6.4.22 + '@storybook/client-logger': 6.4.22 + '@storybook/core-events': 6.4.22 + '@storybook/csf': 0.0.2--canary.87bc651.0 + '@storybook/store': 6.4.22 + ansi-to-html: 0.6.15 + core-js: 3.21.1 + global: 4.4.0 + lodash: 4.17.21 + qs: 6.10.3 + regenerator-runtime: 0.13.9 + synchronous-promise: 2.0.15 + ts-dedent: 2.2.0 + unfetch: 4.2.0 + util-deprecate: 1.0.2 + dev: true + + /@storybook/preview-web/6.4.22_react-dom@16.14.0+react@16.14.0: + resolution: {integrity: sha512-sWS+sgvwSvcNY83hDtWUUL75O2l2LY/GTAS0Zp2dh3WkObhtuJ/UehftzPZlZmmv7PCwhb4Q3+tZDKzMlFxnKQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + dependencies: + '@storybook/addons': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@storybook/channel-postmessage': 6.4.22 + '@storybook/client-logger': 6.4.22 + '@storybook/core-events': 6.4.22 + '@storybook/csf': 0.0.2--canary.87bc651.0 + '@storybook/store': 6.4.22_react-dom@16.14.0+react@16.14.0 + ansi-to-html: 0.6.15 + core-js: 3.21.1 + global: 4.4.0 + lodash: 4.17.21 + qs: 6.10.3 + react: 16.14.0 + react-dom: 16.14.0_react@16.14.0 + regenerator-runtime: 0.13.9 + synchronous-promise: 2.0.15 + ts-dedent: 2.2.0 + unfetch: 4.2.0 + util-deprecate: 1.0.2 + dev: true + + /@storybook/router/6.4.22: + resolution: {integrity: sha512-zeuE8ZgFhNerQX8sICQYNYL65QEi3okyzw7ynF58Ud6nRw4fMxSOHcj2T+nZCIU5ufozRL4QWD/Rg9P2s/HtLw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + dependencies: + '@storybook/client-logger': 6.4.22 + core-js: 3.21.1 + fast-deep-equal: 3.1.3 + global: 4.4.0 + history: 5.0.0 + lodash: 4.17.21 + memoizerific: 1.11.3 + qs: 6.10.3 + react-router: 6.3.0 + react-router-dom: 6.3.0 + ts-dedent: 2.2.0 + dev: true + + /@storybook/router/6.4.22_react-dom@16.14.0+react@16.14.0: + resolution: {integrity: sha512-zeuE8ZgFhNerQX8sICQYNYL65QEi3okyzw7ynF58Ud6nRw4fMxSOHcj2T+nZCIU5ufozRL4QWD/Rg9P2s/HtLw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + dependencies: + '@storybook/client-logger': 6.4.22 + core-js: 3.21.1 + fast-deep-equal: 3.1.3 + global: 4.4.0 + history: 5.0.0 + lodash: 4.17.21 + memoizerific: 1.11.3 + qs: 6.10.3 + react: 16.14.0 + react-dom: 16.14.0_react@16.14.0 + react-router: 6.3.0_react@16.14.0 + react-router-dom: 6.3.0_react-dom@16.14.0+react@16.14.0 + ts-dedent: 2.2.0 + dev: true + + /@storybook/semver/7.3.2: + resolution: {integrity: sha512-SWeszlsiPsMI0Ps0jVNtH64cI5c0UF3f7KgjVKJoNP30crQ6wUSddY2hsdeczZXEKVJGEn50Q60flcGsQGIcrg==} + engines: {node: '>=10'} + hasBin: true + dependencies: + core-js: 3.21.1 + find-up: 4.1.0 + dev: true + + /@storybook/source-loader/6.4.22: + resolution: {integrity: sha512-O4RxqPgRyOgAhssS6q1Rtc8LiOvPBpC1EqhCYWRV3K+D2EjFarfQMpjgPj18hC+QzpUSfzoBZYqsMECewEuLNw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + dependencies: + '@storybook/addons': 6.4.22 + '@storybook/client-logger': 6.4.22 + '@storybook/csf': 0.0.2--canary.87bc651.0 + core-js: 3.21.1 + estraverse: 5.3.0 + global: 4.4.0 + loader-utils: 2.0.2 + lodash: 4.17.21 + prettier: 2.3.0 + regenerator-runtime: 0.13.9 + dev: true + + /@storybook/store/6.4.22: + resolution: {integrity: sha512-lrmcZtYJLc2emO+1l6AG4Txm9445K6Pyv9cGAuhOJ9Kks0aYe0YtvMkZVVry0RNNAIv6Ypz72zyKc/QK+tZLAQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + dependencies: + '@storybook/addons': 6.4.22 + '@storybook/client-logger': 6.4.22 + '@storybook/core-events': 6.4.22 + '@storybook/csf': 0.0.2--canary.87bc651.0 + core-js: 3.21.1 + fast-deep-equal: 3.1.3 + global: 4.4.0 + lodash: 4.17.21 + memoizerific: 1.11.3 + regenerator-runtime: 0.13.9 + slash: 3.0.0 + stable: 0.1.8 + synchronous-promise: 2.0.15 + ts-dedent: 2.2.0 + util-deprecate: 1.0.2 + dev: true + + /@storybook/store/6.4.22_react-dom@16.14.0+react@16.14.0: + resolution: {integrity: sha512-lrmcZtYJLc2emO+1l6AG4Txm9445K6Pyv9cGAuhOJ9Kks0aYe0YtvMkZVVry0RNNAIv6Ypz72zyKc/QK+tZLAQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + dependencies: + '@storybook/addons': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@storybook/client-logger': 6.4.22 + '@storybook/core-events': 6.4.22 + '@storybook/csf': 0.0.2--canary.87bc651.0 + core-js: 3.21.1 + fast-deep-equal: 3.1.3 + global: 4.4.0 + lodash: 4.17.21 + memoizerific: 1.11.3 + react: 16.14.0 + react-dom: 16.14.0_react@16.14.0 + regenerator-runtime: 0.13.9 + slash: 3.0.0 + stable: 0.1.8 + synchronous-promise: 2.0.15 + ts-dedent: 2.2.0 + util-deprecate: 1.0.2 + dev: true + + /@storybook/theming/6.4.22: + resolution: {integrity: sha512-NVMKH/jxSPtnMTO4VCN1k47uztq+u9fWv4GSnzq/eezxdGg9ceGL4/lCrNGoNajht9xbrsZ4QvsJ/V2sVGM8wA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + dependencies: + '@emotion/core': 10.3.1 + '@emotion/is-prop-valid': 0.8.8 + '@emotion/styled': 10.3.0_@emotion+core@10.3.1 + '@storybook/client-logger': 6.4.22 + core-js: 3.21.1 + deep-object-diff: 1.1.7 + emotion-theming: 10.3.0_@emotion+core@10.3.1 + global: 4.4.0 + memoizerific: 1.11.3 + polished: 4.2.2 + resolve-from: 5.0.0 + ts-dedent: 2.2.0 + dev: true + + /@storybook/theming/6.4.22_react-dom@16.14.0+react@16.14.0: + resolution: {integrity: sha512-NVMKH/jxSPtnMTO4VCN1k47uztq+u9fWv4GSnzq/eezxdGg9ceGL4/lCrNGoNajht9xbrsZ4QvsJ/V2sVGM8wA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + dependencies: + '@emotion/core': 10.3.1_react@16.14.0 + '@emotion/is-prop-valid': 0.8.8 + '@emotion/styled': 10.3.0_864809d686fef2043b51d8d752270dc1 + '@storybook/client-logger': 6.4.22 + core-js: 3.21.1 + deep-object-diff: 1.1.7 + emotion-theming: 10.3.0_864809d686fef2043b51d8d752270dc1 + global: 4.4.0 + memoizerific: 1.11.3 + polished: 4.2.2 + react: 16.14.0 + react-dom: 16.14.0_react@16.14.0 + resolve-from: 5.0.0 + ts-dedent: 2.2.0 + dev: true + + /@storybook/ui/6.4.22: + resolution: {integrity: sha512-UVjMoyVsqPr+mkS1L7m30O/xrdIEgZ5SCWsvqhmyMUok3F3tRB+6M+OA5Yy+cIVfvObpA7MhxirUT1elCGXsWQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + dependencies: + '@emotion/core': 10.3.1 + '@storybook/addons': 6.4.22 + '@storybook/api': 6.4.22 + '@storybook/channels': 6.4.22 + '@storybook/client-logger': 6.4.22 + '@storybook/components': 6.4.22 + '@storybook/core-events': 6.4.22 + '@storybook/router': 6.4.22 + '@storybook/semver': 7.3.2 + '@storybook/theming': 6.4.22 + copy-to-clipboard: 3.3.1 + core-js: 3.21.1 + core-js-pure: 3.21.1 + downshift: 6.1.7 + emotion-theming: 10.3.0_@emotion+core@10.3.1 + fuse.js: 3.6.1 + global: 4.4.0 + lodash: 4.17.21 + markdown-to-jsx: 7.1.7 + memoizerific: 1.11.3 + polished: 4.2.2 + qs: 6.10.3 + react-draggable: 4.4.4 + react-helmet-async: 1.3.0 + react-sizeme: 3.0.2 + regenerator-runtime: 0.13.9 + resolve-from: 5.0.0 + store2: 2.13.2 + transitivePeerDependencies: + - '@types/react' + dev: true + + /@storybook/ui/6.4.22_react-dom@16.14.0+react@16.14.0: + resolution: {integrity: sha512-UVjMoyVsqPr+mkS1L7m30O/xrdIEgZ5SCWsvqhmyMUok3F3tRB+6M+OA5Yy+cIVfvObpA7MhxirUT1elCGXsWQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + dependencies: + '@emotion/core': 10.3.1_react@16.14.0 + '@storybook/addons': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@storybook/api': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@storybook/channels': 6.4.22 + '@storybook/client-logger': 6.4.22 + '@storybook/components': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@storybook/core-events': 6.4.22 + '@storybook/router': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@storybook/semver': 7.3.2 + '@storybook/theming': 6.4.22_react-dom@16.14.0+react@16.14.0 + copy-to-clipboard: 3.3.1 + core-js: 3.21.1 + core-js-pure: 3.21.1 + downshift: 6.1.7_react@16.14.0 + emotion-theming: 10.3.0_864809d686fef2043b51d8d752270dc1 + fuse.js: 3.6.1 + global: 4.4.0 + lodash: 4.17.21 + markdown-to-jsx: 7.1.7_react@16.14.0 + memoizerific: 1.11.3 + polished: 4.2.2 + qs: 6.10.3 + react: 16.14.0 + react-dom: 16.14.0_react@16.14.0 + react-draggable: 4.4.4_react-dom@16.14.0+react@16.14.0 + react-helmet-async: 1.3.0_react-dom@16.14.0+react@16.14.0 + react-sizeme: 3.0.2 + regenerator-runtime: 0.13.9 + resolve-from: 5.0.0 + store2: 2.13.2 + transitivePeerDependencies: + - '@types/react' + dev: true + + /@tootallnate/once/1.1.2: + resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} + engines: {node: '>= 6'} + dev: true + + /@trysound/sax/0.2.0: + resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} + engines: {node: '>=10.13.0'} + dev: true + + /@tsconfig/node10/1.0.8: + resolution: {integrity: sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==} + dev: true + + /@tsconfig/node12/1.0.9: + resolution: {integrity: sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==} + dev: true + + /@tsconfig/node14/1.0.1: + resolution: {integrity: sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==} + dev: true + + /@tsconfig/node16/1.0.2: + resolution: {integrity: sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==} + dev: true + + /@types/color-convert/2.0.0: + resolution: {integrity: sha512-m7GG7IKKGuJUXvkZ1qqG3ChccdIM/qBBo913z+Xft0nKCX4hAU/IxKwZBU4cpRZ7GS5kV4vOblUkILtSShCPXQ==} + dependencies: + '@types/color-name': 1.1.1 + dev: true + + /@types/color-name/1.1.1: + resolution: {integrity: sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==} + dev: true + + /@types/component-emitter/1.2.11: + resolution: {integrity: sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ==} + dev: true + + /@types/cookie/0.4.1: + resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==} + dev: true + + /@types/cors/2.8.12: + resolution: {integrity: sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==} + dev: true + + /@types/estree/0.0.38: + resolution: {integrity: sha512-F/v7t1LwS4vnXuPooJQGBRKRGIoxWUTmA4VHfqjOccFsNDThD5bfUNpITive6s352O7o384wcpEaDV8rHCehDA==} + dev: true + + /@types/glob/7.2.0: + resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} + dependencies: + '@types/minimatch': 3.0.5 + '@types/node': 17.0.23 + dev: true + + /@types/graceful-fs/4.1.5: + resolution: {integrity: sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==} + dependencies: + '@types/node': 17.0.23 + dev: true + + /@types/hast/2.3.4: + resolution: {integrity: sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==} + dependencies: + '@types/unist': 2.0.6 + dev: true + + /@types/html-minifier-terser/5.1.2: + resolution: {integrity: sha512-h4lTMgMJctJybDp8CQrxTUiiYmedihHWkjnF/8Pxseu2S6Nlfcy8kwboQ8yejh456rP2yWoEVm1sS/FVsfM48w==} + dev: true + + /@types/is-function/1.0.1: + resolution: {integrity: sha512-A79HEEiwXTFtfY+Bcbo58M2GRYzCr9itHWzbzHVFNEYCcoU/MMGwYYf721gBrnhpj1s6RGVVha/IgNFnR0Iw/Q==} + dev: true + + /@types/istanbul-lib-coverage/2.0.4: + resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} + dev: true + + /@types/istanbul-lib-report/3.0.0: + resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==} + dependencies: + '@types/istanbul-lib-coverage': 2.0.4 + dev: true + + /@types/istanbul-reports/3.0.1: + resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==} + dependencies: + '@types/istanbul-lib-report': 3.0.0 + dev: true + + /@types/json-schema/7.0.11: + resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} + dev: true + + /@types/mdast/3.0.10: + resolution: {integrity: sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==} + dependencies: + '@types/unist': 2.0.6 + dev: true + + /@types/minimatch/3.0.5: + resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} + dev: true + + /@types/minimist/1.2.2: + resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} + dev: true + + /@types/node-fetch/2.6.1: + resolution: {integrity: sha512-oMqjURCaxoSIsHSr1E47QHzbmzNR5rK8McHuNb11BOM9cHcIK3Avy0s/b2JlXHoQGTYS3NsvWzV1M0iK7l0wbA==} + dependencies: + '@types/node': 17.0.23 + form-data: 3.0.1 + dev: true + + /@types/node/14.18.13: + resolution: {integrity: sha512-Z6/KzgyWOga3pJNS42A+zayjhPbf2zM3hegRQaOPnLOzEi86VV++6FLDWgR1LGrVCRufP/ph2daa3tEa5br1zA==} + dev: true + + /@types/node/17.0.23: + resolution: {integrity: sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==} + dev: true + + /@types/normalize-package-data/2.4.1: + resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} + dev: true + + /@types/npmlog/4.1.4: + resolution: {integrity: sha512-WKG4gTr8przEZBiJ5r3s8ZIAoMXNbOgQ+j/d5O4X3x6kZJRLNvyUJuUK/KoG3+8BaOHPhp2m7WC6JKKeovDSzQ==} + dev: true + + /@types/overlayscrollbars/1.12.1: + resolution: {integrity: sha512-V25YHbSoKQN35UasHf0EKD9U2vcmexRSp78qa8UglxFH8H3D+adEa9zGZwrqpH4TdvqeMrgMqVqsLB4woAryrQ==} dev: true - /@commitlint/is-ignored/16.2.1: - resolution: {integrity: sha512-exl8HRzTIfb1YvDJp2b2HU5z1BT+9tmgxR2XF0YEzkMiCIuEKh+XLeocPr1VcvAKXv3Cmv5X/OfNRp+i+/HIhQ==} - engines: {node: '>=v12'} - dependencies: - '@commitlint/types': 16.2.1 - semver: 7.3.5 + /@types/parse-json/4.0.0: + resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} dev: true - /@commitlint/lint/16.2.1: - resolution: {integrity: sha512-fNINQ3X2ZqsCkNB3Z0Z8ElmhewqrS3gy2wgBTx97BkcjOWiyPAGwDJ752hwrsUnWAVBRztgw826n37xPzxsOgg==} - engines: {node: '>=v12'} - dependencies: - '@commitlint/is-ignored': 16.2.1 - '@commitlint/parse': 16.2.1 - '@commitlint/rules': 16.2.1 - '@commitlint/types': 16.2.1 + /@types/parse5/5.0.3: + resolution: {integrity: sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==} dev: true - /@commitlint/load/16.2.3: - resolution: {integrity: sha512-Hb4OUlMnBUK6UxJEZ/VJ5k0LocIS7PtEMbRXEAA7eSpOgORIFexC4K/RaRpVd5UTtu3M0ST3ddPPijF9rdW6nw==} - engines: {node: '>=v12'} - dependencies: - '@commitlint/config-validator': 16.2.1 - '@commitlint/execute-rule': 16.2.1 - '@commitlint/resolve-extends': 16.2.1 - '@commitlint/types': 16.2.1 - '@types/node': 17.0.23 - chalk: 4.1.2 - cosmiconfig: 7.0.1 - cosmiconfig-typescript-loader: 1.0.9_ee885bc7281b682b6adbed6ae09ee090 - lodash: 4.17.21 - resolve-from: 5.0.0 - typescript: 4.6.3 - transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' + /@types/pretty-hrtime/1.0.1: + resolution: {integrity: sha512-VjID5MJb1eGKthz2qUerWT8+R4b9N+CHvGCzg9fn4kWZgaF9AhdYikQio3R7wV8YY1NsQKPaCwKz1Yff+aHNUQ==} dev: true - /@commitlint/message/16.2.1: - resolution: {integrity: sha512-2eWX/47rftViYg7a3axYDdrgwKv32mxbycBJT6OQY/MJM7SUfYNYYvbMFOQFaA4xIVZt7t2Alyqslbl6blVwWw==} - engines: {node: '>=v12'} + /@types/prop-types/15.7.5: + resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} dev: true - /@commitlint/parse/16.2.1: - resolution: {integrity: sha512-2NP2dDQNL378VZYioLrgGVZhWdnJO4nAxQl5LXwYb08nEcN+cgxHN1dJV8OLJ5uxlGJtDeR8UZZ1mnQ1gSAD/g==} - engines: {node: '>=v12'} - dependencies: - '@commitlint/types': 16.2.1 - conventional-changelog-angular: 5.0.13 - conventional-commits-parser: 3.2.4 + /@types/qs/6.9.7: + resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} dev: true - /@commitlint/read/16.2.1: - resolution: {integrity: sha512-tViXGuaxLTrw2r7PiYMQOFA2fueZxnnt0lkOWqKyxT+n2XdEMGYcI9ID5ndJKXnfPGPppD0w/IItKsIXlZ+alw==} - engines: {node: '>=v12'} + /@types/react-syntax-highlighter/11.0.5: + resolution: {integrity: sha512-VIOi9i2Oj5XsmWWoB72p3KlZoEbdRAcechJa8Ztebw7bDl2YmR+odxIqhtJGp1q2EozHs02US+gzxJ9nuf56qg==} dependencies: - '@commitlint/top-level': 16.2.1 - '@commitlint/types': 16.2.1 - fs-extra: 10.0.1 - git-raw-commits: 2.0.11 + '@types/react': 18.0.5 dev: true - /@commitlint/resolve-extends/16.2.1: - resolution: {integrity: sha512-NbbCMPKTFf2J805kwfP9EO+vV+XvnaHRcBy6ud5dF35dxMsvdJqke54W3XazXF1ZAxC4a3LBy4i/GNVBAthsEg==} - engines: {node: '>=v12'} + /@types/react/18.0.5: + resolution: {integrity: sha512-UPxNGInDCIKlfqBrm8LDXYWNfLHwIdisWcsH5GpMyGjhEDLFgTtlRBaoWuCua9HcyuE0rMkmAeZ3FXV1pYLIYQ==} dependencies: - '@commitlint/config-validator': 16.2.1 - '@commitlint/types': 16.2.1 - import-fresh: 3.3.0 - lodash: 4.17.21 - resolve-from: 5.0.0 - resolve-global: 1.0.0 + '@types/prop-types': 15.7.5 + '@types/scheduler': 0.16.2 + csstype: 3.0.11 dev: true - /@commitlint/rules/16.2.1: - resolution: {integrity: sha512-ZFezJXQaBBso+BOTre/+1dGCuCzlWVaeLiVRGypI53qVgPMzQqZhkCcrxBFeqB87qeyzr4A4EoG++IvITwwpIw==} - engines: {node: '>=v12'} - dependencies: - '@commitlint/ensure': 16.2.1 - '@commitlint/message': 16.2.1 - '@commitlint/to-lines': 16.2.1 - '@commitlint/types': 16.2.1 - execa: 5.1.1 + /@types/scheduler/0.16.2: + resolution: {integrity: sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==} dev: true - /@commitlint/to-lines/16.2.1: - resolution: {integrity: sha512-9/VjpYj5j1QeY3eiog1zQWY6axsdWAc0AonUUfyZ7B0MVcRI0R56YsHAfzF6uK/g/WwPZaoe4Lb1QCyDVnpVaQ==} - engines: {node: '>=v12'} + /@types/source-list-map/0.1.2: + resolution: {integrity: sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==} dev: true - /@commitlint/top-level/16.2.1: - resolution: {integrity: sha512-lS6GSieHW9y6ePL73ied71Z9bOKyK+Ib9hTkRsB8oZFAyQZcyRwq2w6nIa6Fngir1QW51oKzzaXfJL94qwImyw==} - engines: {node: '>=v12'} - dependencies: - find-up: 5.0.0 + /@types/tapable/1.0.8: + resolution: {integrity: sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ==} dev: true - /@commitlint/types/16.2.1: - resolution: {integrity: sha512-7/z7pA7BM0i8XvMSBynO7xsB3mVQPUZbVn6zMIlp/a091XJ3qAXRXc+HwLYhiIdzzS5fuxxNIHZMGHVD4HJxdA==} - engines: {node: '>=v12'} + /@types/uglify-js/3.13.2: + resolution: {integrity: sha512-/xFrPIo+4zOeNGtVMbf9rUm0N+i4pDf1ynExomqtokIJmVzR3962lJ1UE+MmexMkA0cmN9oTzg5Xcbwge0Ij2Q==} dependencies: - chalk: 4.1.2 + source-map: 0.6.1 dev: true - /@cspotcode/source-map-consumer/0.8.0: - resolution: {integrity: sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==} - engines: {node: '>= 12'} + /@types/unist/2.0.6: + resolution: {integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==} dev: true - /@cspotcode/source-map-support/0.7.0: - resolution: {integrity: sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==} - engines: {node: '>=12'} + /@types/webpack-env/1.16.3: + resolution: {integrity: sha512-9gtOPPkfyNoEqCQgx4qJKkuNm/x0R2hKR7fdl7zvTJyHnIisuE/LfvXOsYWL0o3qq6uiBnKZNNNzi3l0y/X+xw==} + dev: true + + /@types/webpack-sources/3.2.0: + resolution: {integrity: sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg==} dependencies: - '@cspotcode/source-map-consumer': 0.8.0 + '@types/node': 17.0.23 + '@types/source-list-map': 0.1.2 + source-map: 0.7.3 dev: true - /@eslint/eslintrc/1.2.1: - resolution: {integrity: sha512-bxvbYnBPN1Gibwyp6NrpnFzA3YtRL3BBAyEAFVIpNTm2Rn4Vy87GA5M4aSn3InRrlsbX5N0GW7XIx+U4SAEKdQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@types/webpack/4.41.32: + resolution: {integrity: sha512-cb+0ioil/7oz5//7tZUSwbrSAN/NWHrQylz5cW8G0dWTcF/g+/dSdMlKVZspBYuMAN1+WnwHrkxiRrLcwd0Heg==} dependencies: - ajv: 6.12.6 - debug: 4.3.4 - espree: 9.3.1 - globals: 13.13.0 - ignore: 5.2.0 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color + '@types/node': 17.0.23 + '@types/tapable': 1.0.8 + '@types/uglify-js': 3.13.2 + '@types/webpack-sources': 3.2.0 + anymatch: 3.1.2 + source-map: 0.6.1 dev: true - /@gar/promisify/1.1.3: - resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} + /@types/yargs-parser/21.0.0: + resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} dev: true - /@humanwhocodes/config-array/0.9.5: - resolution: {integrity: sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==} - engines: {node: '>=10.10.0'} + /@types/yargs/15.0.14: + resolution: {integrity: sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==} dependencies: - '@humanwhocodes/object-schema': 1.2.1 - debug: 4.3.4 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color + '@types/yargs-parser': 21.0.0 dev: true - /@humanwhocodes/object-schema/1.2.1: - resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + /@webassemblyjs/ast/1.9.0: + resolution: {integrity: sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==} + dependencies: + '@webassemblyjs/helper-module-context': 1.9.0 + '@webassemblyjs/helper-wasm-bytecode': 1.9.0 + '@webassemblyjs/wast-parser': 1.9.0 dev: true - /@npmcli/fs/1.1.1: - resolution: {integrity: sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==} - dependencies: - '@gar/promisify': 1.1.3 - semver: 7.3.7 + /@webassemblyjs/floating-point-hex-parser/1.9.0: + resolution: {integrity: sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==} dev: true - /@npmcli/move-file/1.1.2: - resolution: {integrity: sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==} - engines: {node: '>=10'} - dependencies: - mkdirp: 1.0.4 - rimraf: 3.0.2 + /@webassemblyjs/helper-api-error/1.9.0: + resolution: {integrity: sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==} dev: true - /@socket.io/base64-arraybuffer/1.0.2: - resolution: {integrity: sha512-dOlCBKnDw4iShaIsH/bxujKTM18+2TOAsYz+KSc11Am38H4q5Xw8Bbz97ZYdrVNM+um3p7w86Bvvmcn9q+5+eQ==} - engines: {node: '>= 0.6.0'} + /@webassemblyjs/helper-buffer/1.9.0: + resolution: {integrity: sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==} dev: true - /@socket.io/component-emitter/3.0.0: - resolution: {integrity: sha512-2pTGuibAXJswAPJjaKisthqS/NOK5ypG4LYT6tEAV0S/mxW0zOIvYvGK0V8w8+SHxAm6vRMSjqSalFXeBAqs+Q==} + /@webassemblyjs/helper-code-frame/1.9.0: + resolution: {integrity: sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==} + dependencies: + '@webassemblyjs/wast-printer': 1.9.0 dev: true - /@tootallnate/once/1.1.2: - resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} - engines: {node: '>= 6'} + /@webassemblyjs/helper-fsm/1.9.0: + resolution: {integrity: sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==} dev: true - /@trysound/sax/0.2.0: - resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} - engines: {node: '>=10.13.0'} + /@webassemblyjs/helper-module-context/1.9.0: + resolution: {integrity: sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==} + dependencies: + '@webassemblyjs/ast': 1.9.0 dev: true - /@tsconfig/node10/1.0.8: - resolution: {integrity: sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==} + /@webassemblyjs/helper-wasm-bytecode/1.9.0: + resolution: {integrity: sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==} dev: true - /@tsconfig/node12/1.0.9: - resolution: {integrity: sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==} + /@webassemblyjs/helper-wasm-section/1.9.0: + resolution: {integrity: sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==} + dependencies: + '@webassemblyjs/ast': 1.9.0 + '@webassemblyjs/helper-buffer': 1.9.0 + '@webassemblyjs/helper-wasm-bytecode': 1.9.0 + '@webassemblyjs/wasm-gen': 1.9.0 dev: true - /@tsconfig/node14/1.0.1: - resolution: {integrity: sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==} + /@webassemblyjs/ieee754/1.9.0: + resolution: {integrity: sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==} + dependencies: + '@xtuc/ieee754': 1.2.0 dev: true - /@tsconfig/node16/1.0.2: - resolution: {integrity: sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==} + /@webassemblyjs/leb128/1.9.0: + resolution: {integrity: sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==} + dependencies: + '@xtuc/long': 4.2.2 dev: true - /@types/component-emitter/1.2.11: - resolution: {integrity: sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ==} + /@webassemblyjs/utf8/1.9.0: + resolution: {integrity: sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==} dev: true - /@types/cookie/0.4.1: - resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==} + /@webassemblyjs/wasm-edit/1.9.0: + resolution: {integrity: sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==} + dependencies: + '@webassemblyjs/ast': 1.9.0 + '@webassemblyjs/helper-buffer': 1.9.0 + '@webassemblyjs/helper-wasm-bytecode': 1.9.0 + '@webassemblyjs/helper-wasm-section': 1.9.0 + '@webassemblyjs/wasm-gen': 1.9.0 + '@webassemblyjs/wasm-opt': 1.9.0 + '@webassemblyjs/wasm-parser': 1.9.0 + '@webassemblyjs/wast-printer': 1.9.0 dev: true - /@types/cors/2.8.12: - resolution: {integrity: sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==} + /@webassemblyjs/wasm-gen/1.9.0: + resolution: {integrity: sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==} + dependencies: + '@webassemblyjs/ast': 1.9.0 + '@webassemblyjs/helper-wasm-bytecode': 1.9.0 + '@webassemblyjs/ieee754': 1.9.0 + '@webassemblyjs/leb128': 1.9.0 + '@webassemblyjs/utf8': 1.9.0 dev: true - /@types/estree/0.0.38: - resolution: {integrity: sha512-F/v7t1LwS4vnXuPooJQGBRKRGIoxWUTmA4VHfqjOccFsNDThD5bfUNpITive6s352O7o384wcpEaDV8rHCehDA==} + /@webassemblyjs/wasm-opt/1.9.0: + resolution: {integrity: sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==} + dependencies: + '@webassemblyjs/ast': 1.9.0 + '@webassemblyjs/helper-buffer': 1.9.0 + '@webassemblyjs/wasm-gen': 1.9.0 + '@webassemblyjs/wasm-parser': 1.9.0 dev: true - /@types/minimist/1.2.2: - resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} + /@webassemblyjs/wasm-parser/1.9.0: + resolution: {integrity: sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==} + dependencies: + '@webassemblyjs/ast': 1.9.0 + '@webassemblyjs/helper-api-error': 1.9.0 + '@webassemblyjs/helper-wasm-bytecode': 1.9.0 + '@webassemblyjs/ieee754': 1.9.0 + '@webassemblyjs/leb128': 1.9.0 + '@webassemblyjs/utf8': 1.9.0 dev: true - /@types/node/17.0.23: - resolution: {integrity: sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==} + /@webassemblyjs/wast-parser/1.9.0: + resolution: {integrity: sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==} + dependencies: + '@webassemblyjs/ast': 1.9.0 + '@webassemblyjs/floating-point-hex-parser': 1.9.0 + '@webassemblyjs/helper-api-error': 1.9.0 + '@webassemblyjs/helper-code-frame': 1.9.0 + '@webassemblyjs/helper-fsm': 1.9.0 + '@xtuc/long': 4.2.2 dev: true - /@types/normalize-package-data/2.4.1: - resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} + /@webassemblyjs/wast-printer/1.9.0: + resolution: {integrity: sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==} + dependencies: + '@webassemblyjs/ast': 1.9.0 + '@webassemblyjs/wast-parser': 1.9.0 + '@xtuc/long': 4.2.2 dev: true - /@types/parse-json/4.0.0: - resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} + /@xtuc/ieee754/1.2.0: + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + dev: true + + /@xtuc/long/4.2.2: + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} dev: true /JSONStream/1.3.5: @@ -409,6 +3995,14 @@ packages: negotiator: 0.6.3 dev: true + /acorn-jsx/5.3.2_acorn@7.4.1: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 7.4.1 + dev: true + /acorn-jsx/5.3.2_acorn@8.7.0: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -417,17 +4011,39 @@ packages: acorn: 8.7.0 dev: true + /acorn-walk/7.2.0: + resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} + engines: {node: '>=0.4.0'} + dev: true + /acorn-walk/8.2.0: resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} engines: {node: '>=0.4.0'} dev: true + /acorn/6.4.2: + resolution: {integrity: sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /acorn/7.4.1: + resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + /acorn/8.7.0: resolution: {integrity: sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==} engines: {node: '>=0.4.0'} hasBin: true dev: true + /address/1.1.2: + resolution: {integrity: sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==} + engines: {node: '>= 0.12.0'} + dev: true + /agent-base/6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} @@ -456,6 +4072,44 @@ packages: indent-string: 4.0.0 dev: true + /airbnb-js-shims/2.2.1: + resolution: {integrity: sha512-wJNXPH66U2xjgo1Zwyjf9EydvJ2Si94+vSdk6EERcBfB2VZkeltpqIats0cqIZMLCXP3zcyaUKGYQeIBT6XjsQ==} + dependencies: + array-includes: 3.1.4 + array.prototype.flat: 1.3.0 + array.prototype.flatmap: 1.3.0 + es5-shim: 4.6.5 + es6-shim: 0.35.6 + function.prototype.name: 1.1.5 + globalthis: 1.0.2 + object.entries: 1.1.5 + object.fromentries: 2.0.5 + object.getownpropertydescriptors: 2.1.3 + object.values: 1.1.5 + promise.allsettled: 1.0.5 + promise.prototype.finally: 3.1.3 + string.prototype.matchall: 4.0.7 + string.prototype.padend: 3.1.3 + string.prototype.padstart: 3.1.3 + symbol.prototype.description: 1.0.5 + dev: true + + /ajv-errors/1.0.1_ajv@6.12.6: + resolution: {integrity: sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==} + peerDependencies: + ajv: '>=5.0.0' + dependencies: + ajv: 6.12.6 + dev: true + + /ajv-keywords/3.5.2_ajv@6.12.6: + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + dependencies: + ajv: 6.12.6 + dev: true + /ajv/6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} dependencies: @@ -479,6 +4133,17 @@ packages: engines: {node: '>=0.4.2'} dev: true + /ansi-align/3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + dependencies: + string-width: 4.2.3 + dev: true + + /ansi-colors/3.2.4: + resolution: {integrity: sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==} + engines: {node: '>=6'} + dev: true + /ansi-escapes/3.2.0: resolution: {integrity: sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==} engines: {node: '>=4'} @@ -491,6 +4156,12 @@ packages: type-fest: 0.21.3 dev: true + /ansi-html-community/0.0.8: + resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} + engines: {'0': node >= 0.8.0} + hasBin: true + dev: true + /ansi-regex/2.1.1: resolution: {integrity: sha1-w7M6te42DYbg5ijwRorn7yfWVN8=} engines: {node: '>=0.10.0'} @@ -530,6 +4201,14 @@ packages: color-convert: 2.0.1 dev: true + /ansi-to-html/0.6.15: + resolution: {integrity: sha512-28ijx2aHJGdzbs+O5SNQF65r6rrKYnkuwTYm8lZlChuoJ9P1vVzIpWO20sQTqTPDXYp6NFwk326vApTtLVFXpQ==} + engines: {node: '>=8.0.0'} + hasBin: true + dependencies: + entities: 2.2.0 + dev: true + /any-promise/1.3.0: resolution: {integrity: sha1-q8av7tzqUugJzcA3au0845Y10X8=} dev: true @@ -541,6 +4220,13 @@ packages: normalize-path: 2.1.1 dev: true + /anymatch/2.0.0: + resolution: {integrity: sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==} + dependencies: + micromatch: 3.1.10 + normalize-path: 2.1.1 + dev: true + /anymatch/3.1.2: resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} engines: {node: '>= 8'} @@ -549,6 +4235,14 @@ packages: picomatch: 2.3.1 dev: true + /app-root-dir/1.0.2: + resolution: {integrity: sha1-OBh+wt6nV3//Az/8sSFyaS/24Rg=} + dev: true + + /aproba/1.2.0: + resolution: {integrity: sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==} + dev: true + /aproba/2.0.0: resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} dev: true @@ -573,6 +4267,12 @@ packages: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} dev: true + /argparse/1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + dependencies: + sprintf-js: 1.0.3 + dev: true + /argparse/2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} dev: true @@ -604,12 +4304,44 @@ packages: engines: {node: '>=0.10.0'} dev: true - /array-ify/1.0.0: - resolution: {integrity: sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=} + /array-flatten/1.1.1: + resolution: {integrity: sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=} + dev: true + + /array-ify/1.0.0: + resolution: {integrity: sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=} + dev: true + + /array-includes/3.1.4: + resolution: {integrity: sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + es-abstract: 1.19.5 + get-intrinsic: 1.1.1 + is-string: 1.0.7 + dev: true + + /array-slice/1.1.0: + resolution: {integrity: sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==} + engines: {node: '>=0.10.0'} + dev: true + + /array-union/1.0.2: + resolution: {integrity: sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=} + engines: {node: '>=0.10.0'} + dependencies: + array-uniq: 1.0.3 + dev: true + + /array-union/2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} dev: true - /array-slice/1.1.0: - resolution: {integrity: sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==} + /array-uniq/1.0.3: + resolution: {integrity: sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=} engines: {node: '>=0.10.0'} dev: true @@ -623,11 +4355,56 @@ packages: engines: {node: '>=0.10.0'} dev: true + /array.prototype.flat/1.3.0: + resolution: {integrity: sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + es-abstract: 1.19.5 + es-shim-unscopables: 1.0.0 + dev: true + + /array.prototype.flatmap/1.3.0: + resolution: {integrity: sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + es-abstract: 1.19.5 + es-shim-unscopables: 1.0.0 + dev: true + + /array.prototype.map/1.0.4: + resolution: {integrity: sha512-Qds9QnX7A0qISY7JT5WuJO0NJPE9CMlC6JzHQfhpqAAQQzufVRoeH7EzUY5GcPTx72voG8LV/5eo+b8Qi8hmhA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + es-abstract: 1.19.5 + es-array-method-boxes-properly: 1.0.0 + is-string: 1.0.7 + dev: true + /arrify/1.0.1: resolution: {integrity: sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=} engines: {node: '>=0.10.0'} dev: true + /arrify/2.0.1: + resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} + engines: {node: '>=8'} + dev: true + + /asn1.js/5.4.1: + resolution: {integrity: sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==} + dependencies: + bn.js: 4.12.0 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + safer-buffer: 2.1.2 + dev: true + /asn1/0.2.6: resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} dependencies: @@ -639,28 +4416,36 @@ packages: engines: {node: '>=0.8'} dev: true + /assert/1.5.0: + resolution: {integrity: sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==} + dependencies: + object-assign: 4.1.1 + util: 0.10.3 + dev: true + /assign-symbols/1.0.0: resolution: {integrity: sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=} engines: {node: '>=0.10.0'} dev: true - /async-each-series/0.1.1: - resolution: {integrity: sha1-dhfBkXQB/Yykooqtzj266Yr+tDI=} - engines: {node: '>=0.8.0'} + /async-each/1.0.3: + resolution: {integrity: sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==} dev: true + optional: true /async-foreach/0.1.3: resolution: {integrity: sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=} dev: true - /async/1.5.2: - resolution: {integrity: sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=} - dev: true - /asynckit/0.4.0: resolution: {integrity: sha1-x57Zf380y48robyXkLzDZkdLS3k=} dev: true + /at-least-node/1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + dev: true + /atob/2.1.2: resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} engines: {node: '>= 4.5.0'} @@ -683,6 +4468,19 @@ packages: postcss-value-parser: 4.2.0 dev: true + /autoprefixer/9.8.8: + resolution: {integrity: sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==} + hasBin: true + dependencies: + browserslist: 4.20.2 + caniuse-lite: 1.0.30001331 + normalize-range: 0.1.2 + num2fraction: 1.2.2 + picocolors: 0.2.1 + postcss: 7.0.39 + postcss-value-parser: 4.2.0 + dev: true + /aws-sign2/0.7.0: resolution: {integrity: sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=} dev: true @@ -691,14 +4489,6 @@ packages: resolution: {integrity: sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==} dev: true - /axios/0.21.4_debug@4.3.2: - resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} - dependencies: - follow-redirects: 1.14.9_debug@4.3.2 - transitivePeerDependencies: - - debug - dev: true - /babel-code-frame/6.26.0: resolution: {integrity: sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=} dependencies: @@ -769,16 +4559,164 @@ packages: babel-template: 6.26.0 dev: true + /babel-loader/8.2.4_598a497cebab8e15ee8f9e5632178e63: + resolution: {integrity: sha512-8dytA3gcvPPPv4Grjhnt8b5IIiTcq/zeXOPk4iTYI0SVXcsmuGg7JtBRDp8S9X+gJfhQ8ektjXZlDu1Bb33U8A==} + engines: {node: '>= 8.9'} + peerDependencies: + '@babel/core': ^7.0.0 + webpack: '>=2' + dependencies: + '@babel/core': 7.17.9 + find-cache-dir: 3.3.2 + loader-utils: 2.0.2 + make-dir: 3.1.0 + schema-utils: 2.7.1 + webpack: 4.46.0 + dev: true + + /babel-loader/8.2.4_@babel+core@7.17.9: + resolution: {integrity: sha512-8dytA3gcvPPPv4Grjhnt8b5IIiTcq/zeXOPk4iTYI0SVXcsmuGg7JtBRDp8S9X+gJfhQ8ektjXZlDu1Bb33U8A==} + engines: {node: '>= 8.9'} + peerDependencies: + '@babel/core': ^7.0.0 + webpack: '>=2' + dependencies: + '@babel/core': 7.17.9 + find-cache-dir: 3.3.2 + loader-utils: 2.0.2 + make-dir: 3.1.0 + schema-utils: 2.7.1 + dev: true + /babel-messages/6.23.0: resolution: {integrity: sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=} dependencies: babel-runtime: 6.26.0 dev: true + /babel-plugin-apply-mdx-type-prop/1.6.22_@babel+core@7.12.9: + resolution: {integrity: sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ==} + peerDependencies: + '@babel/core': ^7.11.6 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.10.4 + '@mdx-js/util': 1.6.22 + dev: true + + /babel-plugin-dynamic-import-node/2.3.3: + resolution: {integrity: sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==} + dependencies: + object.assign: 4.1.2 + dev: true + + /babel-plugin-emotion/10.2.2: + resolution: {integrity: sha512-SMSkGoqTbTyUTDeuVuPIWifPdUGkTk1Kf9BWRiXIOIcuyMfsdp2EjeiiFvOzX8NOBvEh/ypKYvUh2rkgAJMCLA==} + dependencies: + '@babel/helper-module-imports': 7.16.7 + '@emotion/hash': 0.8.0 + '@emotion/memoize': 0.7.4 + '@emotion/serialize': 0.11.16 + babel-plugin-macros: 2.8.0 + babel-plugin-syntax-jsx: 6.18.0 + convert-source-map: 1.8.0 + escape-string-regexp: 1.0.5 + find-root: 1.1.0 + source-map: 0.5.7 + dev: true + + /babel-plugin-extract-import-names/1.6.22: + resolution: {integrity: sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ==} + dependencies: + '@babel/helper-plugin-utils': 7.10.4 + dev: true + + /babel-plugin-istanbul/6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} + dependencies: + '@babel/helper-plugin-utils': 7.16.7 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-instrument: 5.1.0 + test-exclude: 6.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-macros/2.8.0: + resolution: {integrity: sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==} + dependencies: + '@babel/runtime': 7.17.9 + cosmiconfig: 6.0.0 + resolve: 1.22.0 + dev: true + + /babel-plugin-macros/3.1.0: + resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} + engines: {node: '>=10', npm: '>=6'} + dependencies: + '@babel/runtime': 7.17.9 + cosmiconfig: 7.0.1 + resolve: 1.22.0 + dev: true + + /babel-plugin-polyfill-corejs2/0.3.1_@babel+core@7.17.9: + resolution: {integrity: sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.17.7 + '@babel/core': 7.17.9 + '@babel/helper-define-polyfill-provider': 0.3.1_@babel+core@7.17.9 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-polyfill-corejs3/0.1.7_@babel+core@7.17.9: + resolution: {integrity: sha512-u+gbS9bbPhZWEeyy1oR/YaaSpod/KDT07arZHb80aTpl8H5ZBq+uN1nN9/xtX7jQyfLdPfoqI4Rue/MQSWJquw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-define-polyfill-provider': 0.1.5_@babel+core@7.17.9 + core-js-compat: 3.21.1 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-polyfill-corejs3/0.5.2_@babel+core@7.17.9: + resolution: {integrity: sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-define-polyfill-provider': 0.3.1_@babel+core@7.17.9 + core-js-compat: 3.21.1 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-polyfill-regenerator/0.3.1_@babel+core@7.17.9: + resolution: {integrity: sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-define-polyfill-provider': 0.3.1_@babel+core@7.17.9 + transitivePeerDependencies: + - supports-color + dev: true + /babel-plugin-syntax-dynamic-import/6.18.0: resolution: {integrity: sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=} dev: true + /babel-plugin-syntax-jsx/6.18.0: + resolution: {integrity: sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=} + dev: true + /babel-plugin-transform-amd-system-wrapper/0.3.7: resolution: {integrity: sha1-Uhx4LTVkRJHJeepoPopeHK/wukI=} dependencies: @@ -866,8 +4804,8 @@ packages: hasBin: true dev: true - /backo2/1.0.2: - resolution: {integrity: sha1-MasayLEpNjRj41s+u2n038+6eUc=} + /bail/1.0.5: + resolution: {integrity: sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==} dev: true /balanced-match/1.0.2: @@ -896,8 +4834,8 @@ packages: engines: {node: ^4.5.0 || >= 5.9} dev: true - /batch/0.6.1: - resolution: {integrity: sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=} + /batch-processor/1.0.0: + resolution: {integrity: sha1-dclcMrdI4IUNEMKxaPa9vpiRrOg=} dev: true /bcrypt-pbkdf/1.0.2: @@ -906,11 +4844,35 @@ packages: tweetnacl: 0.14.5 dev: true + /better-opn/2.1.1: + resolution: {integrity: sha512-kIPXZS5qwyKiX/HcRvDYfmBQUa8XP17I0mYZZ0y4UhpYOSvtsLHDYqmomS+Mj20aDvD3knEiQ0ecQy2nhio3yA==} + engines: {node: '>8.0.0'} + dependencies: + open: 7.4.2 + dev: true + + /big.js/5.2.2: + resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + dev: true + + /binary-extensions/1.13.1: + resolution: {integrity: sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==} + engines: {node: '>=0.10.0'} + dev: true + optional: true + /binary-extensions/2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} dev: true + /bindings/1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + dependencies: + file-uri-to-path: 1.0.0 + dev: true + optional: true + /bl/1.2.3: resolution: {integrity: sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==} dependencies: @@ -930,6 +4892,30 @@ packages: resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} dev: true + /bn.js/4.12.0: + resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} + dev: true + + /bn.js/5.2.0: + resolution: {integrity: sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==} + dev: true + + /body-parser/1.19.2: + resolution: {integrity: sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==} + engines: {node: '>= 0.8'} + dependencies: + bytes: 3.1.2 + content-type: 1.0.4 + debug: 2.6.9 + depd: 1.1.2 + http-errors: 1.8.1 + iconv-lite: 0.4.24 + on-finished: 2.3.0 + qs: 6.9.7 + raw-body: 2.4.3 + type-is: 1.6.18 + dev: true + /body-parser/1.20.0: resolution: {integrity: sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} @@ -952,6 +4938,20 @@ packages: resolution: {integrity: sha1-aN/1++YMUes3cl6p4+0xDcwed24=} dev: true + /boxen/5.1.2: + resolution: {integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==} + engines: {node: '>=10'} + dependencies: + ansi-align: 3.0.1 + camelcase: 6.3.0 + chalk: 4.1.2 + cli-boxes: 2.2.1 + string-width: 4.2.3 + type-fest: 0.20.2 + widest-line: 3.1.0 + wrap-ansi: 7.0.0 + dev: true + /brace-expansion/1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: @@ -991,71 +4991,63 @@ packages: fill-range: 7.0.1 dev: true - /browser-sync-client/2.27.9: - resolution: {integrity: sha512-FHW8kydp7FXo6jnX3gXJCpHAHtWNLK0nx839nnK+boMfMI1n4KZd0+DmTxHBsHsF3OHud4V4jwoN8U5HExMIdQ==} - engines: {node: '>=8.0.0'} + /brorand/1.1.0: + resolution: {integrity: sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=} + dev: true + + /browserify-aes/1.2.0: + resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} dependencies: - etag: 1.8.1 - fresh: 0.5.2 - mitt: 1.2.0 - rxjs: 5.5.12 + buffer-xor: 1.0.3 + cipher-base: 1.0.4 + create-hash: 1.2.0 + evp_bytestokey: 1.0.3 + inherits: 2.0.4 + safe-buffer: 5.2.1 dev: true - /browser-sync-ui/2.27.9: - resolution: {integrity: sha512-rsduR2bRIwFvM8CX6iY/Nu5aWub0WB9zfSYg9Le/RV5N5DEyxJYey0VxdfWCnzDOoelassTDzYQo+r0iJno3qw==} + /browserify-cipher/1.0.1: + resolution: {integrity: sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==} dependencies: - async-each-series: 0.1.1 - connect-history-api-fallback: 1.6.0 - immutable: 3.8.2 - server-destroy: 1.0.1 - socket.io-client: 4.4.1 - stream-throttle: 0.1.3 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate + browserify-aes: 1.2.0 + browserify-des: 1.0.2 + evp_bytestokey: 1.0.3 dev: true - /browser-sync/2.27.9: - resolution: {integrity: sha512-3zBtggcaZIeU9so4ja9yxk7/CZu9B3DOL6zkxFpzHCHsQmkGBPVXg61jItbeoa+WXgNLnr1sYES/2yQwyEZ2+w==} - engines: {node: '>= 8.0.0'} - hasBin: true + /browserify-des/1.0.2: + resolution: {integrity: sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==} dependencies: - browser-sync-client: 2.27.9 - browser-sync-ui: 2.27.9 - bs-recipes: 1.3.4 - bs-snippet-injector: 2.0.1 - chokidar: 3.5.3 - connect: 3.6.6 - connect-history-api-fallback: 1.6.0 - dev-ip: 1.0.1 - easy-extender: 2.3.4 - eazy-logger: 3.1.0 - etag: 1.8.1 - fresh: 0.5.2 - fs-extra: 3.0.1 - http-proxy: 1.18.1 - immutable: 3.8.2 - localtunnel: 2.0.2 - micromatch: 4.0.5 - opn: 5.3.0 - portscanner: 2.1.1 - qs: 6.2.3 - raw-body: 2.5.1 - resp-modifier: 6.0.2 - rx: 4.1.0 - send: 0.16.2 - serve-index: 1.9.1 - serve-static: 1.13.2 - server-destroy: 1.0.1 - socket.io: 4.4.1 - ua-parser-js: 1.0.2 - yargs: 17.4.1 - transitivePeerDependencies: - - bufferutil - - debug - - supports-color - - utf-8-validate + cipher-base: 1.0.4 + des.js: 1.0.1 + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: true + + /browserify-rsa/4.1.0: + resolution: {integrity: sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==} + dependencies: + bn.js: 5.2.0 + randombytes: 2.1.0 + dev: true + + /browserify-sign/4.2.1: + resolution: {integrity: sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==} + dependencies: + bn.js: 5.2.0 + browserify-rsa: 4.1.0 + create-hash: 1.2.0 + create-hmac: 1.1.7 + elliptic: 6.5.4 + inherits: 2.0.4 + parse-asn1: 5.1.6 + readable-stream: 3.6.0 + safe-buffer: 5.2.1 + dev: true + + /browserify-zlib/0.2.0: + resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==} + dependencies: + pako: 1.0.11 dev: true /browserslist/4.20.2: @@ -1070,14 +5062,6 @@ packages: picocolors: 1.0.0 dev: true - /bs-recipes/1.3.4: - resolution: {integrity: sha1-DS1NSKcYyMBEdp/cT4lZLci2lYU=} - dev: true - - /bs-snippet-injector/2.0.1: - resolution: {integrity: sha1-YbU5PxH1JVntEgaTEANDtu2wTdU=} - dev: true - /bser/2.1.1: resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} dependencies: @@ -1111,6 +5095,18 @@ packages: resolution: {integrity: sha512-b3MXlJ52rPOL5xCAQsiCOy/tY9WXOP/hwATporJriUDxnT3MjJgVppDzTFegpg2Nw7NMS28MKC6IKvaXLnGr+Q==} dev: true + /buffer-xor/1.0.3: + resolution: {integrity: sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=} + dev: true + + /buffer/4.9.2: + resolution: {integrity: sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + isarray: 1.0.0 + dev: true + /buffer/5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} dependencies: @@ -1118,11 +5114,40 @@ packages: ieee754: 1.2.1 dev: true + /builtin-status-codes/3.0.0: + resolution: {integrity: sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=} + dev: true + + /bytes/3.0.0: + resolution: {integrity: sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=} + engines: {node: '>= 0.8'} + dev: true + /bytes/3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} dev: true + /cacache/12.0.4: + resolution: {integrity: sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==} + dependencies: + bluebird: 3.7.2 + chownr: 1.1.4 + figgy-pudding: 3.5.2 + glob: 7.2.0 + graceful-fs: 4.2.10 + infer-owner: 1.0.4 + lru-cache: 5.1.1 + mississippi: 3.0.0 + mkdirp: 0.5.6 + move-concurrently: 1.0.1 + promise-inflight: 1.0.1 + rimraf: 2.7.1 + ssri: 6.0.2 + unique-filename: 1.1.1 + y18n: 4.0.3 + dev: true + /cacache/15.3.0: resolution: {integrity: sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==} engines: {node: '>= 10'} @@ -1174,11 +5199,27 @@ packages: get-intrinsic: 1.1.1 dev: true + /call-me-maybe/1.0.1: + resolution: {integrity: sha1-JtII6onje1y95gJQoV8DHBak1ms=} + dev: true + /callsites/3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} dev: true + /camel-case/4.1.2: + resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} + dependencies: + pascal-case: 3.1.2 + tslib: 2.3.1 + dev: true + + /camelcase-css/2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + dev: true + /camelcase-keys/6.2.2: resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} engines: {node: '>=8'} @@ -1188,6 +5229,16 @@ packages: quick-lru: 4.0.1 dev: true + /camelcase-keys/7.0.2: + resolution: {integrity: sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==} + engines: {node: '>=12'} + dependencies: + camelcase: 6.3.0 + map-obj: 4.3.0 + quick-lru: 5.1.1 + type-fest: 1.4.0 + dev: true + /camelcase/1.2.1: resolution: {integrity: sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=} engines: {node: '>=0.10.0'} @@ -1198,6 +5249,11 @@ packages: engines: {node: '>=6'} dev: true + /camelcase/6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + dev: true + /caniuse-api/3.0.0: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} dependencies: @@ -1211,10 +5267,26 @@ packages: resolution: {integrity: sha512-Y1xk6paHpUXKP/P6YjQv1xqyTbgAP05ycHBcRdQjTcyXlWol868sJJPlmk5ylOekw2BrucWes5jk+LvVd7WZ5Q==} dev: true + /capture-exit/2.0.0: + resolution: {integrity: sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==} + engines: {node: 6.* || 8.* || >= 10.*} + dependencies: + rsvp: 4.8.5 + dev: true + + /case-sensitive-paths-webpack-plugin/2.4.0: + resolution: {integrity: sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==} + engines: {node: '>=4'} + dev: true + /caseless/0.12.0: resolution: {integrity: sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=} dev: true + /ccount/1.1.0: + resolution: {integrity: sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==} + dev: true + /center-align/0.1.3: resolution: {integrity: sha1-qg0yYptu6XIgBBHL1EYckHvCt60=} engines: {node: '>=0.10.0'} @@ -1251,10 +5323,47 @@ packages: supports-color: 7.2.0 dev: true + /character-entities-legacy/1.1.4: + resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} + dev: true + + /character-entities/1.2.4: + resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} + dev: true + + /character-reference-invalid/1.1.4: + resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} + dev: true + + /charcodes/0.2.0: + resolution: {integrity: sha512-Y4kiDb+AM4Ecy58YkuZrrSRJBDQdQ2L+NyS1vHHFtNtUjgutcZfx3yp1dAONI/oPaPmyGfCLx5CxL+zauIMyKQ==} + engines: {node: '>=6'} + dev: true + /chardet/0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} dev: true + /chokidar/2.1.8: + resolution: {integrity: sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==} + deprecated: Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies + dependencies: + anymatch: 2.0.0 + async-each: 1.0.3 + braces: 2.3.2 + glob-parent: 3.1.0 + inherits: 2.0.4 + is-binary-path: 1.0.1 + is-glob: 4.0.3 + normalize-path: 3.0.0 + path-is-absolute: 1.0.1 + readdirp: 2.2.1 + upath: 1.2.0 + optionalDependencies: + fsevents: 1.2.13 + dev: true + optional: true + /chokidar/3.5.3: resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} engines: {node: '>= 8.10.0'} @@ -1279,6 +5388,22 @@ packages: engines: {node: '>=10'} dev: true + /chrome-trace-event/1.0.3: + resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} + engines: {node: '>=6.0'} + dev: true + + /ci-info/2.0.0: + resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} + dev: true + + /cipher-base/1.0.4: + resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==} + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: true + /class-utils/0.3.6: resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==} engines: {node: '>=0.10.0'} @@ -1289,11 +5414,23 @@ packages: static-extend: 0.1.2 dev: true + /clean-css/4.2.4: + resolution: {integrity: sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==} + engines: {node: '>= 4.0'} + dependencies: + source-map: 0.6.1 + dev: true + /clean-stack/2.2.0: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} dev: true + /cli-boxes/2.2.1: + resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==} + engines: {node: '>=6'} + dev: true + /cli-color/0.3.3: resolution: {integrity: sha1-EtW90Vj/igsNtAEZiRPAPfBp9vU=} dependencies: @@ -1322,6 +5459,15 @@ packages: engines: {node: '>=6'} dev: true + /cli-table3/0.6.2: + resolution: {integrity: sha512-QyavHCaIC80cMivimWu4aWHilIpiDpfm3hGmqAmXVL1UsnbLuBSMd21hTX6VY4ZSDSM73ESLeF8TOYId3rBTbw==} + engines: {node: 10.* || >= 12.*} + dependencies: + string-width: 4.2.3 + optionalDependencies: + '@colors/colors': 1.5.0 + dev: true + /cli-width/2.2.1: resolution: {integrity: sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==} dev: true @@ -1347,11 +5493,29 @@ packages: wrap-ansi: 7.0.0 dev: true + /clone-deep/4.0.1: + resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} + engines: {node: '>=6'} + dependencies: + is-plain-object: 2.0.4 + kind-of: 6.0.3 + shallow-clone: 3.0.1 + dev: true + /clone/1.0.4: resolution: {integrity: sha1-2jCcwmPfFZlMaIypAheco8fNfH4=} engines: {node: '>=0.8'} dev: true + /clsx/1.1.1: + resolution: {integrity: sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==} + engines: {node: '>=6'} + dev: true + + /collapse-white-space/1.0.6: + resolution: {integrity: sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==} + dev: true + /collection-visit/1.0.0: resolution: {integrity: sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=} engines: {node: '>=0.10.0'} @@ -1397,6 +5561,10 @@ packages: delayed-stream: 1.0.0 dev: true + /comma-separated-tokens/1.0.8: + resolution: {integrity: sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==} + dev: true + /commander/2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} dev: true @@ -1408,6 +5576,16 @@ packages: graceful-readlink: 1.0.1 dev: true + /commander/4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + dev: true + + /commander/6.2.1: + resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} + engines: {node: '>= 6'} + dev: true + /commander/7.2.0: resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} engines: {node: '>= 10'} @@ -1437,6 +5615,10 @@ packages: - '@swc/wasm' dev: true + /commondir/1.0.1: + resolution: {integrity: sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=} + dev: true + /compare-func/2.0.0: resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} dependencies: @@ -1448,6 +5630,30 @@ packages: resolution: {integrity: sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==} dev: true + /compressible/2.0.18: + resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + dev: true + + /compression/1.7.4: + resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} + engines: {node: '>= 0.8.0'} + dependencies: + accepts: 1.3.8 + bytes: 3.0.0 + compressible: 2.0.18 + debug: 2.6.9 + on-headers: 1.0.2 + safe-buffer: 5.1.2 + vary: 1.1.2 + dev: true + + /compute-scroll-into-view/1.0.17: + resolution: {integrity: sha512-j4dx+Fb0URmzbwwMUrhqWM2BEWHdFGx+qZ9qqASHRPqvTYdqvWnHg0H1hIbcyLnvgnoNAVMlwkepyqM3DaIFUg==} + dev: true + /concat-map/0.0.1: resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} dev: true @@ -1462,21 +5668,6 @@ packages: typedarray: 0.0.6 dev: true - /connect-history-api-fallback/1.6.0: - resolution: {integrity: sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==} - engines: {node: '>=0.8'} - dev: true - - /connect/3.6.6: - resolution: {integrity: sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=} - engines: {node: '>= 0.10.0'} - dependencies: - debug: 2.6.9 - finalhandler: 1.1.0 - parseurl: 1.3.3 - utils-merge: 1.0.1 - dev: true - /connect/3.7.0: resolution: {integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==} engines: {node: '>= 0.10.0'} @@ -1487,10 +5678,25 @@ packages: utils-merge: 1.0.1 dev: true + /console-browserify/1.2.0: + resolution: {integrity: sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==} + dev: true + /console-control-strings/1.1.0: resolution: {integrity: sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=} dev: true + /constants-browserify/1.0.0: + resolution: {integrity: sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=} + dev: true + + /content-disposition/0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + dependencies: + safe-buffer: 5.2.1 + dev: true + /content-type/1.0.4: resolution: {integrity: sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==} engines: {node: '>= 0.6'} @@ -1536,16 +5742,49 @@ packages: safe-buffer: 5.1.2 dev: true + /cookie-signature/1.0.6: + resolution: {integrity: sha1-4wOogrNCzD7oylE6eZmXNNqzriw=} + dev: true + /cookie/0.4.2: resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} engines: {node: '>= 0.6'} dev: true + /copy-concurrently/1.0.5: + resolution: {integrity: sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==} + dependencies: + aproba: 1.2.0 + fs-write-stream-atomic: 1.0.10 + iferr: 0.1.5 + mkdirp: 0.5.6 + rimraf: 2.7.1 + run-queue: 1.0.3 + dev: true + /copy-descriptor/0.1.1: resolution: {integrity: sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=} engines: {node: '>=0.10.0'} dev: true + /copy-to-clipboard/3.3.1: + resolution: {integrity: sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw==} + dependencies: + toggle-selection: 1.0.6 + dev: true + + /core-js-compat/3.21.1: + resolution: {integrity: sha512-gbgX5AUvMb8gwxC7FLVWYT7Kkgu/y7+h/h1X43yJkNqhlK2fuYyQimqvKGNZFAY6CKii/GFKJ2cp/1/42TN36g==} + dependencies: + browserslist: 4.20.2 + semver: 7.0.0 + dev: true + + /core-js-pure/3.21.1: + resolution: {integrity: sha512-12VZfFIu+wyVbBebyHmRTuEE/tZrB4tJToWcwAMcsp3h4+sHR+fMJWbKpYiCRWlhFBq+KNyO8rIV9rTkeVmznQ==} + requiresBuild: true + dev: true + /core-js/1.2.7: resolution: {integrity: sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=} deprecated: core-js@<3.4 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Please, upgrade your dependencies to the actual version of core-js. @@ -1557,6 +5796,11 @@ packages: requiresBuild: true dev: true + /core-js/3.21.1: + resolution: {integrity: sha512-FRq5b/VMrWlrmCzwRrpDYNxyHP9BcAZC+xHJaqTgIE5091ZV1NTmyh0sGOg5XqpnHvR0svdy0sv1gWA1zmhxig==} + requiresBuild: true + dev: true + /core-util-is/1.0.2: resolution: {integrity: sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=} dev: true @@ -1589,6 +5833,17 @@ packages: - '@swc/wasm' dev: true + /cosmiconfig/6.0.0: + resolution: {integrity: sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==} + engines: {node: '>=8'} + dependencies: + '@types/parse-json': 4.0.0 + import-fresh: 3.3.0 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + dev: true + /cosmiconfig/7.0.1: resolution: {integrity: sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==} engines: {node: '>=10'} @@ -1600,10 +5855,74 @@ packages: yaml: 1.10.2 dev: true + /cp-file/7.0.0: + resolution: {integrity: sha512-0Cbj7gyvFVApzpK/uhCtQ/9kE9UnYpxMzaq5nQQC/Dh4iaj5fxp7iEFIullrYwzj8nf0qnsI1Qsx34hAeAebvw==} + engines: {node: '>=8'} + dependencies: + graceful-fs: 4.2.10 + make-dir: 3.1.0 + nested-error-stacks: 2.1.1 + p-event: 4.2.0 + dev: true + + /cpy/8.1.2: + resolution: {integrity: sha512-dmC4mUesv0OYH2kNFEidtf/skUwv4zePmGeepjyyJ0qTo5+8KhA1o99oIAwVVLzQMAeDJml74d6wPPKb6EZUTg==} + engines: {node: '>=8'} + dependencies: + arrify: 2.0.1 + cp-file: 7.0.0 + globby: 9.2.0 + has-glob: 1.0.0 + junk: 3.1.0 + nested-error-stacks: 2.1.1 + p-all: 2.1.0 + p-filter: 2.1.0 + p-map: 3.0.0 + dev: true + + /create-ecdh/4.0.4: + resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==} + dependencies: + bn.js: 4.12.0 + elliptic: 6.5.4 + dev: true + + /create-hash/1.2.0: + resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} + dependencies: + cipher-base: 1.0.4 + inherits: 2.0.4 + md5.js: 1.3.5 + ripemd160: 2.0.2 + sha.js: 2.4.11 + dev: true + + /create-hmac/1.1.7: + resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} + dependencies: + cipher-base: 1.0.4 + create-hash: 1.2.0 + inherits: 2.0.4 + ripemd160: 2.0.2 + safe-buffer: 5.2.1 + sha.js: 2.4.11 + dev: true + /create-require/1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} dev: true + /cross-spawn/6.0.5: + resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} + engines: {node: '>=4.8'} + dependencies: + nice-try: 1.0.5 + path-key: 2.0.1 + semver: 5.7.1 + shebang-command: 1.2.0 + which: 1.3.1 + dev: true + /cross-spawn/7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} @@ -1613,6 +5932,22 @@ packages: which: 2.0.2 dev: true + /crypto-browserify/3.12.0: + resolution: {integrity: sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==} + dependencies: + browserify-cipher: 1.0.1 + browserify-sign: 4.2.1 + create-ecdh: 4.0.4 + create-hash: 1.2.0 + create-hmac: 1.1.7 + diffie-hellman: 5.0.3 + inherits: 2.0.4 + pbkdf2: 3.1.2 + public-encrypt: 4.0.3 + randombytes: 2.1.0 + randomfill: 1.0.4 + dev: true + /css-declaration-sorter/6.2.2_postcss@8.4.12: resolution: {integrity: sha512-Ufadglr88ZLsrvS11gjeu/40Lw74D9Am/Jpr3LlYm5Q4ZP5KdlUhG+6u2EjyXeZcxmZ2h1ebCKngDjolpeLHpg==} engines: {node: ^10 || ^12 || >=14} @@ -1622,6 +5957,46 @@ packages: postcss: 8.4.12 dev: true + /css-loader/3.6.0_webpack@4.46.0: + resolution: {integrity: sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ==} + engines: {node: '>= 8.9.0'} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + dependencies: + camelcase: 5.3.1 + cssesc: 3.0.0 + icss-utils: 4.1.1 + loader-utils: 1.4.0 + normalize-path: 3.0.0 + postcss: 7.0.39 + postcss-modules-extract-imports: 2.0.0 + postcss-modules-local-by-default: 3.0.3 + postcss-modules-scope: 2.2.0 + postcss-modules-values: 3.0.0 + postcss-value-parser: 4.2.0 + schema-utils: 2.7.1 + semver: 6.3.0 + webpack: 4.46.0 + dev: true + + /css-loader/5.2.7: + resolution: {integrity: sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg==} + engines: {node: '>= 10.13.0'} + peerDependencies: + webpack: ^4.27.0 || ^5.0.0 + dependencies: + icss-utils: 5.1.0_postcss@8.4.12 + loader-utils: 2.0.2 + postcss: 8.4.12 + postcss-modules-extract-imports: 3.0.0_postcss@8.4.12 + postcss-modules-local-by-default: 4.0.0_postcss@8.4.12 + postcss-modules-scope: 3.0.0_postcss@8.4.12 + postcss-modules-values: 4.0.0_postcss@8.4.12 + postcss-value-parser: 4.2.0 + schema-utils: 3.1.1 + semver: 7.3.7 + dev: true + /css-select/4.3.0: resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} dependencies: @@ -1717,10 +6092,22 @@ packages: css-tree: 1.1.3 dev: true + /csstype/2.6.20: + resolution: {integrity: sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==} + dev: true + + /csstype/3.0.11: + resolution: {integrity: sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==} + dev: true + /custom-event/1.0.1: resolution: {integrity: sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=} dev: true + /cyclist/1.0.1: + resolution: {integrity: sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=} + dev: true + /cz-conventional-changelog/3.2.0: resolution: {integrity: sha512-yAYxeGpVi27hqIilG1nh4A9Bnx4J3Ov+eXy4koL3drrR+IO9GaWPsKjik20ht608Asqi8TQPf0mczhEeyAtMzg==} engines: {node: '>= 10'} @@ -1782,16 +6169,10 @@ packages: ms: 2.0.0 dev: true - /debug/4.3.2: - resolution: {integrity: sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + /debug/3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} dependencies: - ms: 2.1.2 + ms: 2.1.3 dev: true /debug/4.3.4: @@ -1819,6 +6200,11 @@ packages: engines: {node: '>=0.10.0'} dev: true + /decamelize/5.0.1: + resolution: {integrity: sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==} + engines: {node: '>=10'} + dev: true + /decode-uri-component/0.2.0: resolution: {integrity: sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=} engines: {node: '>=0.10'} @@ -1832,12 +6218,28 @@ packages: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} dev: true + /deep-object-diff/1.1.7: + resolution: {integrity: sha512-QkgBca0mL08P6HiOjoqvmm6xOAl2W6CT2+34Ljhg0OeFan8cwlcdq8jrLKsBBuUFAZLsN5b6y491KdKEoSo9lg==} + dev: true + + /deepmerge/4.2.2: + resolution: {integrity: sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==} + engines: {node: '>=0.10.0'} + dev: true + /defaults/1.0.3: resolution: {integrity: sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=} dependencies: clone: 1.0.4 dev: true + /define-properties/1.1.3: + resolution: {integrity: sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==} + engines: {node: '>= 0.4'} + dependencies: + object-keys: 1.1.1 + dev: true + /define-property/0.2.5: resolution: {integrity: sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=} engines: {node: '>=0.10.0'} @@ -1860,6 +6262,29 @@ packages: isobject: 3.0.1 dev: true + /del-cli/4.0.1: + resolution: {integrity: sha512-KtR/6cBfZkGDAP2NA7z+bP4p1OMob3wjN9mq13+SWvExx6jT9gFWfLgXEeX8J2B47OKeNCq9yTONmtryQ+m+6g==} + engines: {node: '>=12.20'} + hasBin: true + dependencies: + del: 6.0.0 + meow: 10.1.2 + dev: true + + /del/6.0.0: + resolution: {integrity: sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==} + engines: {node: '>=10'} + dependencies: + globby: 11.1.0 + graceful-fs: 4.2.10 + is-glob: 4.0.3 + is-path-cwd: 2.2.0 + is-path-inside: 3.0.3 + p-map: 4.0.0 + rimraf: 3.0.2 + slash: 3.0.0 + dev: true + /delayed-stream/1.0.0: resolution: {integrity: sha1-3zrhmayt+31ECqrgsp4icrJOxhk=} engines: {node: '>=0.4.0'} @@ -1879,6 +6304,13 @@ packages: engines: {node: '>= 0.8'} dev: true + /des.js/1.0.1: + resolution: {integrity: sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==} + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + dev: true + /destroy/1.0.4: resolution: {integrity: sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=} dev: true @@ -1888,6 +6320,12 @@ packages: engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} dev: true + /detab/2.0.4: + resolution: {integrity: sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g==} + dependencies: + repeat-string: 1.6.1 + dev: true + /detect-file/1.0.0: resolution: {integrity: sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=} engines: {node: '>=0.10.0'} @@ -1905,10 +6343,13 @@ packages: engines: {node: '>=8'} dev: true - /dev-ip/1.0.1: - resolution: {integrity: sha1-p2o+0YVb56ASu4rBbLgPPADcKPA=} - engines: {node: '>= 0.8.0'} + /detect-port/1.3.0: + resolution: {integrity: sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ==} + engines: {node: '>= 4.2.1'} hasBin: true + dependencies: + address: 1.1.2 + debug: 2.6.9 dev: true /di/0.0.1: @@ -1920,8 +6361,26 @@ packages: engines: {node: '>=0.3.1'} dev: true - /dlv/1.1.3: - resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + /diffie-hellman/5.0.3: + resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==} + dependencies: + bn.js: 4.12.0 + miller-rabin: 4.0.1 + randombytes: 2.1.0 + dev: true + + /dir-glob/2.2.2: + resolution: {integrity: sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==} + engines: {node: '>=4'} + dependencies: + path-type: 3.0.0 + dev: true + + /dir-glob/3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 dev: true /doctrine/3.0.0: @@ -1931,6 +6390,12 @@ packages: esutils: 2.0.3 dev: true + /dom-converter/0.2.0: + resolution: {integrity: sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==} + dependencies: + utila: 0.4.0 + dev: true + /dom-serialize/2.2.1: resolution: {integrity: sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=} dependencies: @@ -1948,10 +6413,26 @@ packages: entities: 2.2.0 dev: true + /dom-walk/0.1.2: + resolution: {integrity: sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==} + dev: true + + /domain-browser/1.2.0: + resolution: {integrity: sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==} + engines: {node: '>=0.4', npm: '>=1.2'} + dev: true + /domelementtype/2.3.0: resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} dev: true + /domhandler/3.3.0: + resolution: {integrity: sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA==} + engines: {node: '>= 4'} + dependencies: + domelementtype: 2.3.0 + dev: true + /domhandler/4.3.1: resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} engines: {node: '>= 4'} @@ -1967,6 +6448,13 @@ packages: domhandler: 4.3.1 dev: true + /dot-case/3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + dependencies: + no-case: 3.0.4 + tslib: 2.3.1 + dev: true + /dot-prop/5.3.0: resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} engines: {node: '>=8'} @@ -1974,18 +6462,47 @@ packages: is-obj: 2.0.0 dev: true - /easy-extender/2.3.4: - resolution: {integrity: sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q==} - engines: {node: '>= 4.0.0'} + /dotenv-expand/5.1.0: + resolution: {integrity: sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==} + dev: true + + /dotenv/8.6.0: + resolution: {integrity: sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==} + engines: {node: '>=10'} + dev: true + + /downshift/6.1.7: + resolution: {integrity: sha512-cVprZg/9Lvj/uhYRxELzlu1aezRcgPWBjTvspiGTVEU64gF5pRdSRKFVLcxqsZC637cLAGMbL40JavEfWnqgNg==} + peerDependencies: + react: '>=16.12.0' dependencies: - lodash: 4.17.21 + '@babel/runtime': 7.17.9 + compute-scroll-into-view: 1.0.17 + prop-types: 15.8.1 + react-is: 17.0.2 + tslib: 2.3.1 + dev: true + + /downshift/6.1.7_react@16.14.0: + resolution: {integrity: sha512-cVprZg/9Lvj/uhYRxELzlu1aezRcgPWBjTvspiGTVEU64gF5pRdSRKFVLcxqsZC637cLAGMbL40JavEfWnqgNg==} + peerDependencies: + react: '>=16.12.0' + dependencies: + '@babel/runtime': 7.17.9 + compute-scroll-into-view: 1.0.17 + prop-types: 15.8.1 + react: 16.14.0 + react-is: 17.0.2 + tslib: 2.3.1 dev: true - /eazy-logger/3.1.0: - resolution: {integrity: sha512-/snsn2JqBtUSSstEl4R0RKjkisGHAhvYj89i7r3ytNUKW12y178KDZwXLXIgwDqLW6E/VRMT9qfld7wvFae8bQ==} - engines: {node: '>= 0.8.0'} + /duplexify/3.7.1: + resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} dependencies: - tfunk: 4.0.0 + end-of-stream: 1.4.4 + inherits: 2.0.4 + readable-stream: 2.3.7 + stream-shift: 1.0.1 dev: true /ecc-jsbn/0.1.2: @@ -2003,10 +6520,58 @@ packages: resolution: {integrity: sha512-Huen6taaVrUrSy8o7mGStByba8PfOWWluHNxSHGBrCgEdFVLtvdQDBr9LBCF9Uci8SYxh28QNNMO0oC17wbGAg==} dev: true + /element-resize-detector/1.2.4: + resolution: {integrity: sha512-Fl5Ftk6WwXE0wqCgNoseKWndjzZlDCwuPTcoVZfCP9R3EHQF8qUtr3YUPNETegRBOKqQKPW3n4kiIWngGi8tKg==} + dependencies: + batch-processor: 1.0.0 + dev: true + + /elliptic/6.5.4: + resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} + dependencies: + bn.js: 4.12.0 + brorand: 1.1.0 + hash.js: 1.1.7 + hmac-drbg: 1.0.1 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + dev: true + /emoji-regex/8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} dev: true + /emojis-list/3.0.0: + resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} + engines: {node: '>= 4'} + dev: true + + /emotion-theming/10.3.0_864809d686fef2043b51d8d752270dc1: + resolution: {integrity: sha512-mXiD2Oj7N9b6+h/dC6oLf9hwxbtKHQjoIqtodEyL8CpkN4F3V4IK/BT4D0C7zSs4BBFOu4UlPJbvvBLa88SGEA==} + peerDependencies: + '@emotion/core': ^10.0.27 + react: '>=16.3.0' + dependencies: + '@babel/runtime': 7.17.9 + '@emotion/core': 10.3.1_react@16.14.0 + '@emotion/weak-memoize': 0.2.5 + hoist-non-react-statics: 3.3.2 + react: 16.14.0 + dev: true + + /emotion-theming/10.3.0_@emotion+core@10.3.1: + resolution: {integrity: sha512-mXiD2Oj7N9b6+h/dC6oLf9hwxbtKHQjoIqtodEyL8CpkN4F3V4IK/BT4D0C7zSs4BBFOu4UlPJbvvBLa88SGEA==} + peerDependencies: + '@emotion/core': ^10.0.27 + react: '>=16.3.0' + dependencies: + '@babel/runtime': 7.17.9 + '@emotion/core': 10.3.1 + '@emotion/weak-memoize': 0.2.5 + hoist-non-react-statics: 3.3.2 + dev: true + /encodeurl/1.0.2: resolution: {integrity: sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=} engines: {node: '>= 0.8'} @@ -2026,24 +6591,6 @@ packages: once: 1.4.0 dev: true - /engine.io-client/6.1.1: - resolution: {integrity: sha512-V05mmDo4gjimYW+FGujoGmmmxRaDsrVr7AXA3ZIfa04MWM1jOfZfUwou0oNqhNwy/votUDvGDt4JA4QF4e0b4g==} - dependencies: - '@socket.io/component-emitter': 3.0.0 - debug: 4.3.4 - engine.io-parser: 5.0.3 - has-cors: 1.1.0 - parseqs: 0.0.6 - parseuri: 0.0.6 - ws: 8.2.3 - xmlhttprequest-ssl: 2.0.0 - yeast: 0.1.2 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: true - /engine.io-parser/5.0.3: resolution: {integrity: sha512-BtQxwF27XUNnSafQLvDi0dQ8s3i6VgzSoQMJacpIcGNrlUdfHSKbgm3jmjCVvQluGzqwujQMPAoMai3oYSTurg==} engines: {node: '>=10.0.0'} @@ -2071,6 +6618,15 @@ packages: - utf-8-validate dev: true + /enhanced-resolve/4.5.0: + resolution: {integrity: sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==} + engines: {node: '>=6.9.0'} + dependencies: + graceful-fs: 4.2.10 + memory-fs: 0.5.0 + tapable: 1.1.3 + dev: true + /ent/2.2.0: resolution: {integrity: sha1-6WQhkyWiHQX0RGai9obtbOX13R0=} dev: true @@ -2092,12 +6648,77 @@ packages: resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} dev: true + /errno/0.1.8: + resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} + hasBin: true + dependencies: + prr: 1.0.1 + dev: true + /error-ex/1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} dependencies: is-arrayish: 0.2.1 dev: true + /es-abstract/1.19.5: + resolution: {integrity: sha512-Aa2G2+Rd3b6kxEUKTF4TaW67czBLyAv3z7VOhYRU50YBx+bbsYZ9xQP4lMNazePuFlybXI0V4MruPos7qUo5fA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + es-to-primitive: 1.2.1 + function-bind: 1.1.1 + get-intrinsic: 1.1.1 + get-symbol-description: 1.0.0 + has: 1.0.3 + has-symbols: 1.0.3 + internal-slot: 1.0.3 + is-callable: 1.2.4 + is-negative-zero: 2.0.2 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.2 + is-string: 1.0.7 + is-weakref: 1.0.2 + object-inspect: 1.12.0 + object-keys: 1.1.1 + object.assign: 4.1.2 + string.prototype.trimend: 1.0.4 + string.prototype.trimstart: 1.0.4 + unbox-primitive: 1.0.1 + dev: true + + /es-array-method-boxes-properly/1.0.0: + resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} + dev: true + + /es-get-iterator/1.1.2: + resolution: {integrity: sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.1.1 + has-symbols: 1.0.3 + is-arguments: 1.1.1 + is-map: 2.0.2 + is-set: 2.0.2 + is-string: 1.0.7 + isarray: 2.0.5 + dev: true + + /es-shim-unscopables/1.0.0: + resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} + dependencies: + has: 1.0.3 + dev: true + + /es-to-primitive/1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.4 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + dev: true + /es5-ext/0.10.60: resolution: {integrity: sha512-jpKNXIt60htYG59/9FGf2PYT3pwMpnEbNKysU+k/4FGwyGtMotOvcZOuW+EmXXYASRqYSXQfGL5cVIthOTgbkg==} engines: {node: '>=0.10'} @@ -2108,6 +6729,11 @@ packages: next-tick: 1.1.0 dev: true + /es5-shim/4.6.5: + resolution: {integrity: sha512-vfQ4UAai8szn0sAubCy97xnZ4sJVDD1gt/Grn736hg8D7540wemIb1YPrYZSTqlM2H69EQX1or4HU/tSwRTI3w==} + engines: {node: '>=0.4.0'} + dev: true + /es6-iterator/0.1.3: resolution: {integrity: sha1-1vWLjE/EE8JJtLqhl2j45NfIlE4=} dependencies: @@ -2128,6 +6754,10 @@ packages: resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} dev: true + /es6-shim/0.35.6: + resolution: {integrity: sha512-EmTr31wppcaIAgblChZiuN/l9Y7DPyw8Xtbg7fIVngn6zMW+IEBJDJngeKC3x6wr0V/vcA2wqeFnaw1bFJbDdA==} + dev: true + /es6-symbol/2.0.1: resolution: {integrity: sha1-dhtcZ8/U8dGK+yNPaR1nhoLLO/M=} dependencies: @@ -2177,6 +6807,27 @@ packages: engines: {node: '>=10'} dev: true + /escodegen/2.0.0: + resolution: {integrity: sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==} + engines: {node: '>=6.0'} + hasBin: true + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionator: 0.8.3 + optionalDependencies: + source-map: 0.6.1 + dev: true + + /eslint-scope/4.0.3: + resolution: {integrity: sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==} + engines: {node: '>=4.0.0'} + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + dev: true + /eslint-scope/7.1.1: resolution: {integrity: sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2265,6 +6916,12 @@ packages: eslint-visitor-keys: 3.3.0 dev: true + /esprima/4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + dev: true + /esquery/1.4.0: resolution: {integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==} engines: {node: '>=0.10'} @@ -2279,6 +6936,11 @@ packages: estraverse: 5.3.0 dev: true + /estraverse/4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + dev: true + /estraverse/5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} @@ -2305,12 +6967,41 @@ packages: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} dev: true + /events/3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + dev: true + + /evp_bytestokey/1.0.3: + resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} + dependencies: + md5.js: 1.3.5 + safe-buffer: 5.2.1 + dev: true + /exec-sh/0.2.2: resolution: {integrity: sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw==} dependencies: merge: 1.2.1 dev: true + /exec-sh/0.3.6: + resolution: {integrity: sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==} + dev: true + + /execa/1.0.0: + resolution: {integrity: sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==} + engines: {node: '>=6'} + dependencies: + cross-spawn: 6.0.5 + get-stream: 4.1.0 + is-stream: 1.1.0 + npm-run-path: 2.0.2 + p-finally: 1.0.0 + signal-exit: 3.0.7 + strip-eof: 1.0.0 + dev: true + /execa/5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} @@ -2367,6 +7058,42 @@ packages: homedir-polyfill: 1.0.3 dev: true + /express/4.17.3: + resolution: {integrity: sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==} + engines: {node: '>= 0.10.0'} + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.19.2 + content-disposition: 0.5.4 + content-type: 1.0.4 + cookie: 0.4.2 + 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.2 + fresh: 0.5.2 + merge-descriptors: 1.0.1 + methods: 1.1.2 + on-finished: 2.3.0 + parseurl: 1.3.3 + path-to-regexp: 0.1.7 + proxy-addr: 2.0.7 + qs: 6.9.7 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.17.2 + serve-static: 1.14.2 + setprototypeof: 1.2.0 + statuses: 1.5.0 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + dev: true + /ext/1.6.0: resolution: {integrity: sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==} dependencies: @@ -2441,6 +7168,29 @@ packages: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} dev: true + /fast-glob/2.2.7: + resolution: {integrity: sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==} + engines: {node: '>=4.0.0'} + dependencies: + '@mrmlnc/readdir-enhanced': 2.2.1 + '@nodelib/fs.stat': 1.1.3 + glob-parent: 3.1.0 + is-glob: 4.0.3 + merge2: 1.4.1 + micromatch: 3.1.10 + dev: true + + /fast-glob/3.2.11: + resolution: {integrity: sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + /fast-json-stable-stringify/2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} dev: true @@ -2449,6 +7199,18 @@ packages: resolution: {integrity: sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=} dev: true + /fastq/1.13.0: + resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==} + dependencies: + reusify: 1.0.4 + dev: true + + /fault/1.0.4: + resolution: {integrity: sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==} + dependencies: + format: 0.2.2 + dev: true + /fb-watchman/2.0.1: resolution: {integrity: sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==} dependencies: @@ -2461,6 +7223,10 @@ packages: pend: 1.2.0 dev: true + /figgy-pudding/3.5.2: + resolution: {integrity: sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==} + dev: true + /figures/2.0.0: resolution: {integrity: sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=} engines: {node: '>=4'} @@ -2482,6 +7248,30 @@ packages: flat-cache: 3.0.4 dev: true + /file-loader/6.2.0_webpack@4.46.0: + resolution: {integrity: sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==} + engines: {node: '>= 10.13.0'} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + dependencies: + loader-utils: 2.0.2 + schema-utils: 3.1.1 + webpack: 4.46.0 + dev: true + + /file-system-cache/1.0.5: + resolution: {integrity: sha1-hCWbNqK7uNPW6xAh0xMv/mTP/08=} + dependencies: + bluebird: 3.7.2 + fs-extra: 0.30.0 + ramda: 0.21.0 + dev: true + + /file-uri-to-path/1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + dev: true + optional: true + /filename-regex/2.0.1: resolution: {integrity: sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=} engines: {node: '>=0.10.0'} @@ -2515,19 +7305,6 @@ packages: to-regex-range: 5.0.1 dev: true - /finalhandler/1.1.0: - resolution: {integrity: sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=} - engines: {node: '>= 0.8'} - dependencies: - debug: 2.6.9 - encodeurl: 1.0.2 - escape-html: 1.0.3 - on-finished: 2.3.0 - parseurl: 1.3.3 - statuses: 1.3.1 - unpipe: 1.0.0 - dev: true - /finalhandler/1.1.2: resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==} engines: {node: '>= 0.8'} @@ -2541,6 +7318,24 @@ packages: unpipe: 1.0.0 dev: true + /find-cache-dir/2.1.0: + resolution: {integrity: sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==} + engines: {node: '>=6'} + dependencies: + commondir: 1.0.1 + make-dir: 2.1.0 + pkg-dir: 3.0.0 + dev: true + + /find-cache-dir/3.3.2: + resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} + engines: {node: '>=8'} + dependencies: + commondir: 1.0.1 + make-dir: 3.1.0 + pkg-dir: 4.2.0 + dev: true + /find-node-modules/2.1.3: resolution: {integrity: sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg==} dependencies: @@ -2552,6 +7347,13 @@ packages: resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} dev: true + /find-up/3.0.0: + resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} + engines: {node: '>=6'} + dependencies: + locate-path: 3.0.0 + dev: true + /find-up/4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} @@ -2616,7 +7418,14 @@ packages: resolution: {integrity: sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==} dev: true - /follow-redirects/1.14.9_debug@4.3.2: + /flush-write-stream/1.1.1: + resolution: {integrity: sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==} + dependencies: + inherits: 2.0.4 + readable-stream: 2.3.7 + dev: true + + /follow-redirects/1.14.9: resolution: {integrity: sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==} engines: {node: '>=4.0'} peerDependencies: @@ -2624,8 +7433,6 @@ packages: peerDependenciesMeta: debug: optional: true - dependencies: - debug: 4.3.2 dev: true /for-in/1.0.2: @@ -2651,6 +7458,50 @@ packages: resolution: {integrity: sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=} dev: true + /fork-ts-checker-webpack-plugin/4.1.6: + resolution: {integrity: sha512-DUxuQaKoqfNne8iikd14SAkh5uw4+8vNifp6gmA73yYNS6ywLIWSLD/n/mBzHQRpW3J7rbATEakmiA8JvkTyZw==} + engines: {node: '>=6.11.5', yarn: '>=1.0.0'} + dependencies: + '@babel/code-frame': 7.16.7 + chalk: 2.4.2 + micromatch: 3.1.10 + minimatch: 3.1.2 + semver: 5.7.1 + tapable: 1.1.3 + worker-rpc: 0.1.1 + dev: true + + /fork-ts-checker-webpack-plugin/6.5.1_eslint@8.13.0+webpack@4.46.0: + resolution: {integrity: sha512-x1wumpHOEf4gDROmKTaB6i4/Q6H3LwmjVO7fIX47vBwlZbtPjU33hgoMuD/Q/y6SU8bnuYSoN6ZQOLshGp0T/g==} + engines: {node: '>=10', yarn: '>=1.0.0'} + peerDependencies: + eslint: '>= 6' + typescript: '>= 2.7' + vue-template-compiler: '*' + webpack: '>= 4' + peerDependenciesMeta: + eslint: + optional: true + vue-template-compiler: + optional: true + dependencies: + '@babel/code-frame': 7.16.7 + '@types/json-schema': 7.0.11 + chalk: 4.1.2 + chokidar: 3.5.3 + cosmiconfig: 6.0.0 + deepmerge: 4.2.2 + eslint: 8.13.0 + fs-extra: 9.1.0 + glob: 7.2.0 + memfs: 3.4.1 + minimatch: 3.1.2 + schema-utils: 2.7.0 + semver: 7.3.7 + tapable: 1.1.3 + webpack: 4.46.0 + dev: true + /form-data/2.3.3: resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} engines: {node: '>= 0.12'} @@ -2660,6 +7511,25 @@ packages: mime-types: 2.1.35 dev: true + /form-data/3.0.1: + resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: true + + /format/0.2.2: + resolution: {integrity: sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs=} + engines: {node: '>=0.4.x'} + dev: true + + /forwarded/0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + dev: true + /fraction.js/4.2.0: resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==} dev: true @@ -2676,6 +7546,13 @@ packages: engines: {node: '>= 0.6'} dev: true + /from2/2.3.0: + resolution: {integrity: sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=} + dependencies: + inherits: 2.0.4 + readable-stream: 2.3.7 + dev: true + /fs-constants/1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} dev: true @@ -2690,6 +7567,16 @@ packages: rimraf: 2.7.1 dev: true + /fs-extra/0.30.0: + resolution: {integrity: sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=} + dependencies: + graceful-fs: 4.2.10 + jsonfile: 2.4.0 + klaw: 1.3.1 + path-is-absolute: 1.0.1 + rimraf: 2.7.1 + dev: true + /fs-extra/1.0.0: resolution: {integrity: sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=} dependencies: @@ -2707,14 +7594,6 @@ packages: universalify: 2.0.0 dev: true - /fs-extra/3.0.1: - resolution: {integrity: sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=} - dependencies: - graceful-fs: 4.2.10 - jsonfile: 3.0.1 - universalify: 0.1.2 - dev: true - /fs-extra/8.1.0: resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} engines: {node: '>=6 <7 || >=8'} @@ -2724,6 +7603,16 @@ packages: universalify: 0.1.2 dev: true + /fs-extra/9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.10 + jsonfile: 6.1.0 + universalify: 2.0.0 + dev: true + /fs-minipass/2.1.0: resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} engines: {node: '>= 8'} @@ -2731,6 +7620,10 @@ packages: minipass: 3.1.6 dev: true + /fs-monkey/1.0.3: + resolution: {integrity: sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==} + dev: true + /fs-promise/0.5.0: resolution: {integrity: sha1-Q0fWv2JGVacGGkMZITw5MnatPvM=} deprecated: Use mz or fs-extra^3.0 with Promise Support @@ -2741,10 +7634,31 @@ packages: thenify-all: 1.6.0 dev: true + /fs-write-stream-atomic/1.0.10: + resolution: {integrity: sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=} + dependencies: + graceful-fs: 4.2.10 + iferr: 0.1.5 + imurmurhash: 0.1.4 + readable-stream: 2.3.7 + dev: true + /fs.realpath/1.0.0: resolution: {integrity: sha1-FQStJSMVjKpA20onh8sBQRmU6k8=} dev: true + /fsevents/1.2.13: + resolution: {integrity: sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==} + engines: {node: '>= 4.0'} + os: [darwin] + deprecated: fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2. + requiresBuild: true + dependencies: + bindings: 1.5.0 + nan: 2.15.0 + dev: true + optional: true + /fsevents/2.3.2: resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -2757,10 +7671,29 @@ packages: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} dev: true + /function.prototype.name/1.1.5: + resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + es-abstract: 1.19.5 + functions-have-names: 1.2.2 + dev: true + /functional-red-black-tree/1.0.1: resolution: {integrity: sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=} dev: true + /functions-have-names/1.2.2: + resolution: {integrity: sha512-bLgc3asbWdwPbx2mNk2S49kmJCuQeu0nfmaOgbs8WIyzzkw3r4htszdIi9Q9EMezDPTYuJx2wvjZ/EwgAthpnA==} + dev: true + + /fuse.js/3.6.1: + resolution: {integrity: sha512-hT9yh/tiinkmirKrlv4KWOjztdoZo1mx9Qh4KvWqC7isoXwdUY3PNWUxceF4/qO9R6riA2C29jdTOeQOIROjgw==} + engines: {node: '>=6'} + dev: true + /gauge/3.0.2: resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} engines: {node: '>=10'} @@ -2797,6 +7730,11 @@ packages: globule: 1.3.3 dev: true + /gensync/1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + dev: true + /get-caller-file/2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} @@ -2810,16 +7748,36 @@ packages: has-symbols: 1.0.3 dev: true + /get-package-type/0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + dev: true + /get-stdin/4.0.1: resolution: {integrity: sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=} engines: {node: '>=0.10.0'} dev: true + /get-stream/4.1.0: + resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} + engines: {node: '>=6'} + dependencies: + pump: 3.0.0 + dev: true + /get-stream/6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} dev: true + /get-symbol-description/1.0.0: + resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.1.1 + dev: true + /get-value/2.0.6: resolution: {integrity: sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=} engines: {node: '>=0.10.0'} @@ -2843,6 +7801,10 @@ packages: through2: 4.0.2 dev: true + /github-slugger/1.4.0: + resolution: {integrity: sha512-w0dzqw/nt51xMVmlaV1+JRzN+oCa1KfcgGEWhxUG16wbdA+Xnt/yoFO8Z8x/V82ZcZ0wy6ln9QDup5avbhiDhQ==} + dev: true + /glob-base/0.3.0: resolution: {integrity: sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=} engines: {node: '>=0.10.0'} @@ -2857,6 +7819,13 @@ packages: is-glob: 2.0.1 dev: true + /glob-parent/3.1.0: + resolution: {integrity: sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=} + dependencies: + is-glob: 3.1.0 + path-dirname: 1.0.2 + dev: true + /glob-parent/5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -2871,6 +7840,24 @@ packages: is-glob: 4.0.3 dev: true + /glob-promise/3.4.0_glob@7.2.0: + resolution: {integrity: sha512-q08RJ6O+eJn+dVanerAndJwIcumgbDdYiUT7zFQl3Wm1xD6fBKtah7H8ZJChj4wP+8C+QfeVy8xautR7rdmKEw==} + engines: {node: '>=4'} + peerDependencies: + glob: '*' + dependencies: + '@types/glob': 7.2.0 + glob: 7.2.0 + dev: true + + /glob-to-regexp/0.3.0: + resolution: {integrity: sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=} + dev: true + + /glob-to-regexp/0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + dev: true + /glob/5.0.15: resolution: {integrity: sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=} dependencies: @@ -2962,6 +7949,18 @@ packages: which: 1.3.1 dev: true + /global/4.4.0: + resolution: {integrity: sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==} + dependencies: + min-document: 2.19.0 + process: 0.11.10 + dev: true + + /globals/11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + dev: true + /globals/13.13.0: resolution: {integrity: sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==} engines: {node: '>=8'} @@ -2974,6 +7973,39 @@ packages: engines: {node: '>=0.10.0'} dev: true + /globalthis/1.0.2: + resolution: {integrity: sha512-ZQnSFO1la8P7auIOQECnm0sSuoMeaSq0EEdXMBFF2QJO4uNcwbyhSgG3MruWNbFTqCLmxVwGOl7LZ9kASvHdeQ==} + engines: {node: '>= 0.4'} + dependencies: + define-properties: 1.1.3 + dev: true + + /globby/11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.2.11 + ignore: 5.2.0 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + + /globby/9.2.0: + resolution: {integrity: sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==} + engines: {node: '>=6'} + dependencies: + '@types/glob': 7.2.0 + array-union: 1.0.2 + dir-glob: 2.2.2 + fast-glob: 2.2.7 + glob: 7.2.0 + ignore: 4.0.6 + pify: 4.0.1 + slash: 2.0.0 + dev: true + /globule/1.3.3: resolution: {integrity: sha512-mb1aYtDbIjTu4ShMB85m3UzjX9BVKe9WCzsnfMSZk+K5GpIbBOexgg4PPCt5eHDEG5/ZQAUX2Kct02zfiPLsKg==} engines: {node: '>= 0.10'} @@ -2991,6 +8023,19 @@ packages: resolution: {integrity: sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=} dev: true + /handlebars/4.7.7: + resolution: {integrity: sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==} + engines: {node: '>=0.4.7'} + hasBin: true + dependencies: + minimist: 1.2.6 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.15.4 + dev: true + /har-schema/2.0.0: resolution: {integrity: sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=} engines: {node: '>=4'} @@ -3017,8 +8062,8 @@ packages: ansi-regex: 2.1.1 dev: true - /has-cors/1.1.0: - resolution: {integrity: sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=} + /has-bigints/1.0.1: + resolution: {integrity: sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==} dev: true /has-flag/3.0.0: @@ -3031,11 +8076,25 @@ packages: engines: {node: '>=8'} dev: true + /has-glob/1.0.0: + resolution: {integrity: sha1-mqqe7b/7G6OZCnsAEPtnjuAIEgc=} + engines: {node: '>=0.10.0'} + dependencies: + is-glob: 3.1.0 + dev: true + /has-symbols/1.0.3: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} engines: {node: '>= 0.4'} dev: true + /has-tostringtag/1.0.0: + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: true + /has-unicode/2.0.1: resolution: {integrity: sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=} dev: true @@ -3078,6 +8137,22 @@ packages: function-bind: 1.1.1 dev: true + /hash-base/3.1.0: + resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} + engines: {node: '>=4'} + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.0 + safe-buffer: 5.2.1 + dev: true + + /hash.js/1.1.7: + resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + dev: true + /hasha/2.2.0: resolution: {integrity: sha1-eNfL/B5tZjA/55g3NlmEUXsvbuE=} engines: {node: '>=0.10.0'} @@ -3086,6 +8161,103 @@ packages: pinkie-promise: 2.0.1 dev: true + /hast-to-hyperscript/9.0.1: + resolution: {integrity: sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==} + dependencies: + '@types/unist': 2.0.6 + comma-separated-tokens: 1.0.8 + property-information: 5.6.0 + space-separated-tokens: 1.1.5 + style-to-object: 0.3.0 + unist-util-is: 4.1.0 + web-namespaces: 1.1.4 + dev: true + + /hast-util-from-parse5/6.0.1: + resolution: {integrity: sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA==} + dependencies: + '@types/parse5': 5.0.3 + hastscript: 6.0.0 + property-information: 5.6.0 + vfile: 4.2.1 + vfile-location: 3.2.0 + web-namespaces: 1.1.4 + dev: true + + /hast-util-parse-selector/2.2.5: + resolution: {integrity: sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==} + dev: true + + /hast-util-raw/6.0.1: + resolution: {integrity: sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig==} + dependencies: + '@types/hast': 2.3.4 + hast-util-from-parse5: 6.0.1 + hast-util-to-parse5: 6.0.0 + html-void-elements: 1.0.5 + parse5: 6.0.1 + unist-util-position: 3.1.0 + vfile: 4.2.1 + web-namespaces: 1.1.4 + xtend: 4.0.2 + zwitch: 1.0.5 + dev: true + + /hast-util-to-parse5/6.0.0: + resolution: {integrity: sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==} + dependencies: + hast-to-hyperscript: 9.0.1 + property-information: 5.6.0 + web-namespaces: 1.1.4 + xtend: 4.0.2 + zwitch: 1.0.5 + dev: true + + /hastscript/6.0.0: + resolution: {integrity: sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==} + dependencies: + '@types/hast': 2.3.4 + comma-separated-tokens: 1.0.8 + hast-util-parse-selector: 2.2.5 + property-information: 5.6.0 + space-separated-tokens: 1.1.5 + dev: true + + /he/1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + dev: true + + /highlight.js/10.7.3: + resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} + dev: true + + /history/5.0.0: + resolution: {integrity: sha512-3NyRMKIiFSJmIPdq7FxkNMJkQ7ZEtVblOQ38VtKaA0zZMW1Eo6Q6W8oDKEflr1kNNTItSnk4JMCO1deeSgbLLg==} + dependencies: + '@babel/runtime': 7.17.9 + dev: true + + /history/5.3.0: + resolution: {integrity: sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==} + dependencies: + '@babel/runtime': 7.17.9 + dev: true + + /hmac-drbg/1.0.1: + resolution: {integrity: sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=} + dependencies: + hash.js: 1.1.7 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + dev: true + + /hoist-non-react-statics/3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + dependencies: + react-is: 16.13.1 + dev: true + /home-or-tmp/2.0.0: resolution: {integrity: sha1-42w/LSyufXRqhX440Y1fMqeILbg=} engines: {node: '>=0.10.0'} @@ -3112,18 +8284,94 @@ packages: lru-cache: 6.0.0 dev: true + /html-entities/2.3.3: + resolution: {integrity: sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==} + dev: true + + /html-loader/1.3.2: + resolution: {integrity: sha512-DEkUwSd0sijK5PF3kRWspYi56XP7bTNkyg5YWSzBdjaSDmvCufep5c4Vpb3PBf6lUL0YPtLwBfy9fL0t5hBAGA==} + engines: {node: '>= 10.13.0'} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + dependencies: + html-minifier-terser: 5.1.1 + htmlparser2: 4.1.0 + loader-utils: 2.0.2 + schema-utils: 3.1.1 + dev: true + + /html-minifier-terser/5.1.1: + resolution: {integrity: sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==} + engines: {node: '>=6'} + hasBin: true + dependencies: + camel-case: 4.1.2 + clean-css: 4.2.4 + commander: 4.1.1 + he: 1.2.0 + param-case: 3.0.4 + relateurl: 0.2.7 + terser: 4.8.0 + dev: true + + /html-tags/3.2.0: + resolution: {integrity: sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==} + engines: {node: '>=8'} + dev: true + + /html-void-elements/1.0.5: + resolution: {integrity: sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==} + dev: true + + /html-webpack-plugin/4.5.2_webpack@4.46.0: + resolution: {integrity: sha512-q5oYdzjKUIPQVjOosjgvCHQOv9Ett9CYYHlgvJeXG0qQvdSojnBq4vAdQBwn1+yGveAwHCoe/rMR86ozX3+c2A==} + engines: {node: '>=6.9'} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + dependencies: + '@types/html-minifier-terser': 5.1.2 + '@types/tapable': 1.0.8 + '@types/webpack': 4.41.32 + html-minifier-terser: 5.1.1 + loader-utils: 1.4.0 + lodash: 4.17.21 + pretty-error: 2.1.2 + tapable: 1.1.3 + util.promisify: 1.0.0 + webpack: 4.46.0 + dev: true + + /htmlparser2/4.1.0: + resolution: {integrity: sha512-4zDq1a1zhE4gQso/c5LP1OtrhYTncXNSpvJYtWJBtXAETPlMfi3IFNjGuQbYLuVY4ZR0QMqRVvo4Pdy9KLyP8Q==} + dependencies: + domelementtype: 2.3.0 + domhandler: 3.3.0 + domutils: 2.8.0 + entities: 2.2.0 + dev: true + + /htmlparser2/6.1.0: + resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + domutils: 2.8.0 + entities: 2.2.0 + dev: true + /http-cache-semantics/4.1.0: resolution: {integrity: sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==} dev: true - /http-errors/1.6.3: - resolution: {integrity: sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=} + /http-errors/1.8.1: + resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} engines: {node: '>= 0.6'} dependencies: depd: 1.1.2 - inherits: 2.0.3 - setprototypeof: 1.1.0 - statuses: 1.4.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 1.5.0 + toidentifier: 1.0.1 dev: true /http-errors/2.0.0: @@ -3153,7 +8401,7 @@ packages: engines: {node: '>=8.0.0'} dependencies: eventemitter3: 4.0.7 - follow-redirects: 1.14.9_debug@4.3.2 + follow-redirects: 1.14.9 requires-port: 1.0.0 transitivePeerDependencies: - debug @@ -3168,6 +8416,10 @@ packages: sshpk: 1.17.0 dev: true + /https-browserify/1.0.0: + resolution: {integrity: sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=} + dev: true + /https-proxy-agent/5.0.0: resolution: {integrity: sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==} engines: {node: '>= 6'} @@ -3204,18 +8456,42 @@ packages: dev: true optional: true + /icss-utils/4.1.1: + resolution: {integrity: sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==} + engines: {node: '>= 6'} + dependencies: + postcss: 7.0.39 + dev: true + + /icss-utils/5.1.0_postcss@8.4.12: + resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + dependencies: + postcss: 8.4.12 + dev: true + /ieee754/1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} dev: true + /iferr/0.1.5: + resolution: {integrity: sha1-xg7taebY/bazEEofy8ocGS3FtQE=} + dev: true + + /ignore/4.0.6: + resolution: {integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==} + engines: {node: '>= 4'} + dev: true + /ignore/5.2.0: resolution: {integrity: sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==} engines: {node: '>= 4'} dev: true - /immutable/3.8.2: - resolution: {integrity: sha1-wkOZUUVbs5kT2vKBN28VMOEErfM=} - engines: {node: '>=0.10.0'} + /immutable/4.0.0: + resolution: {integrity: sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw==} dev: true /import-fresh/3.3.0: @@ -3236,6 +8512,11 @@ packages: engines: {node: '>=8'} dev: true + /indent-string/5.0.0: + resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} + engines: {node: '>=12'} + dev: true + /infer-owner/1.0.4: resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} dev: true @@ -3247,6 +8528,10 @@ packages: wrappy: 1.0.2 dev: true + /inherits/2.0.1: + resolution: {integrity: sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=} + dev: true + /inherits/2.0.3: resolution: {integrity: sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=} dev: true @@ -3259,6 +8544,10 @@ packages: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} dev: true + /inline-style-parser/0.1.1: + resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} + dev: true + /inquirer/6.5.2: resolution: {integrity: sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==} engines: {node: '>=6.0.0'} @@ -3298,11 +8587,25 @@ packages: through: 2.3.8 dev: true + /internal-slot/1.0.3: + resolution: {integrity: sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.1.1 + has: 1.0.3 + side-channel: 1.0.4 + dev: true + /interpolate/0.1.0: resolution: {integrity: sha1-tgF3pLqUH7NyTIIZBdmareE9Hfk=} engines: {node: '>= 0.6.0'} dev: true + /interpret/2.2.0: + resolution: {integrity: sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==} + engines: {node: '>= 0.10'} + dev: true + /invariant/2.2.4: resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} dependencies: @@ -3313,6 +8616,16 @@ packages: resolution: {integrity: sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=} dev: true + /ipaddr.js/1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + dev: true + + /is-absolute-url/3.0.3: + resolution: {integrity: sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==} + engines: {node: '>=8'} + dev: true + /is-absolute/1.0.0: resolution: {integrity: sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==} engines: {node: '>=0.10.0'} @@ -3335,10 +8648,43 @@ packages: kind-of: 6.0.3 dev: true + /is-alphabetical/1.0.4: + resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} + dev: true + + /is-alphanumerical/1.0.4: + resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} + dependencies: + is-alphabetical: 1.0.4 + is-decimal: 1.0.4 + dev: true + + /is-arguments/1.1.1: + resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + dev: true + /is-arrayish/0.2.1: resolution: {integrity: sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=} dev: true + /is-bigint/1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + dependencies: + has-bigints: 1.0.1 + dev: true + + /is-binary-path/1.0.1: + resolution: {integrity: sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=} + engines: {node: '>=0.10.0'} + dependencies: + binary-extensions: 1.13.1 + dev: true + optional: true + /is-binary-path/2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} @@ -3346,10 +8692,35 @@ packages: binary-extensions: 2.2.0 dev: true + /is-boolean-object/1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + dev: true + /is-buffer/1.1.6: resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} dev: true + /is-buffer/2.0.5: + resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} + engines: {node: '>=4'} + dev: true + + /is-callable/1.2.4: + resolution: {integrity: sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==} + engines: {node: '>= 0.4'} + dev: true + + /is-ci/2.0.0: + resolution: {integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==} + hasBin: true + dependencies: + ci-info: 2.0.0 + dev: true + /is-core-module/2.8.1: resolution: {integrity: sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==} dependencies: @@ -3370,6 +8741,17 @@ packages: kind-of: 6.0.3 dev: true + /is-date-object/1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-decimal/1.0.4: + resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} + dev: true + /is-descriptor/0.1.6: resolution: {integrity: sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==} engines: {node: '>=0.10.0'} @@ -3388,6 +8770,19 @@ packages: kind-of: 6.0.3 dev: true + /is-docker/2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + dev: true + + /is-dom/1.1.0: + resolution: {integrity: sha512-u82f6mvhYxRPKpw8V1N0W8ce1xXwOrQtgGcxl6UCL5zBmZu3is/18K0rR7uFCnMDuAsS/3W54mGL4vsaFUQlEQ==} + dependencies: + is-object: 1.0.2 + is-window: 1.0.2 + dev: true + /is-dotfile/1.0.3: resolution: {integrity: sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=} engines: {node: '>=0.10.0'} @@ -3437,6 +8832,10 @@ packages: engines: {node: '>=8'} dev: true + /is-function/1.0.2: + resolution: {integrity: sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==} + dev: true + /is-glob/2.0.1: resolution: {integrity: sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=} engines: {node: '>=0.10.0'} @@ -3458,6 +8857,10 @@ packages: is-extglob: 2.1.1 dev: true + /is-hexadecimal/1.0.4: + resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} + dev: true + /is-interactive/1.0.0: resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} engines: {node: '>=8'} @@ -3467,10 +8870,20 @@ packages: resolution: {integrity: sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=} dev: true - /is-number-like/1.0.8: - resolution: {integrity: sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==} + /is-map/2.0.2: + resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} + dev: true + + /is-negative-zero/2.0.2: + resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} + engines: {node: '>= 0.4'} + dev: true + + /is-number-object/1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} dependencies: - lodash.isfinite: 3.3.2 + has-tostringtag: 1.0.0 dev: true /is-number/2.1.0: @@ -3502,11 +8915,30 @@ packages: engines: {node: '>=8'} dev: true + /is-object/1.0.2: + resolution: {integrity: sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==} + dev: true + + /is-path-cwd/2.2.0: + resolution: {integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==} + engines: {node: '>=6'} + dev: true + + /is-path-inside/3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + dev: true + /is-plain-obj/1.1.0: resolution: {integrity: sha1-caUMhCnfync8kqOQpKA7OfzVHT4=} engines: {node: '>=0.10.0'} dev: true + /is-plain-obj/2.1.0: + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} + engines: {node: '>=8'} + dev: true + /is-plain-object/2.0.4: resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} engines: {node: '>=0.10.0'} @@ -3514,6 +8946,11 @@ packages: isobject: 3.0.1 dev: true + /is-plain-object/5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + dev: true + /is-posix-bracket/0.1.1: resolution: {integrity: sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=} engines: {node: '>=0.10.0'} @@ -3524,6 +8961,14 @@ packages: engines: {node: '>=0.10.0'} dev: true + /is-regex/1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + dev: true + /is-relative/1.0.0: resolution: {integrity: sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==} engines: {node: '>=0.10.0'} @@ -3531,6 +8976,16 @@ packages: is-unc-path: 1.0.0 dev: true + /is-set/2.0.2: + resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} + dev: true + + /is-shared-array-buffer/1.0.2: + resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} + dependencies: + call-bind: 1.0.2 + dev: true + /is-stream/1.1.0: resolution: {integrity: sha1-EtSj3U5o4Lec6428hBc66A2RykQ=} engines: {node: '>=0.10.0'} @@ -3541,6 +8996,20 @@ packages: engines: {node: '>=8'} dev: true + /is-string/1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-symbol/1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: true + /is-text-path/1.0.1: resolution: {integrity: sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=} engines: {node: '>=0.10.0'} @@ -3568,20 +9037,49 @@ packages: resolution: {integrity: sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=} dev: true + /is-weakref/1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + dependencies: + call-bind: 1.0.2 + dev: true + + /is-whitespace-character/1.0.4: + resolution: {integrity: sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==} + dev: true + + /is-window/1.0.2: + resolution: {integrity: sha1-LIlspT25feRdPDMTOmXYyfVjSA0=} + dev: true + /is-windows/1.0.2: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} dev: true + /is-word-character/1.0.4: + resolution: {integrity: sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==} + dev: true + /is-wsl/1.1.0: resolution: {integrity: sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=} engines: {node: '>=4'} dev: true + /is-wsl/2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + dependencies: + is-docker: 2.2.1 + dev: true + /isarray/1.0.0: resolution: {integrity: sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=} dev: true + /isarray/2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + dev: true + /isbinaryfile/4.0.10: resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==} engines: {node: '>= 8.0.0'} @@ -3603,10 +9101,44 @@ packages: engines: {node: '>=0.10.0'} dev: true + /isobject/4.0.0: + resolution: {integrity: sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA==} + engines: {node: '>=0.10.0'} + dev: true + /isstream/0.1.2: resolution: {integrity: sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=} dev: true + /istanbul-lib-coverage/3.2.0: + resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} + engines: {node: '>=8'} + dev: true + + /istanbul-lib-instrument/5.1.0: + resolution: {integrity: sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q==} + engines: {node: '>=8'} + dependencies: + '@babel/core': 7.17.9 + '@babel/parser': 7.17.9 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.0 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /iterate-iterator/1.0.2: + resolution: {integrity: sha512-t91HubM4ZDQ70M9wqp+pcNpu8OyJ9UAtXntT/Bcsvp5tZMnz9vRa+IunKXeI8AnfZMTv0jNuVEmGeLSMjVvfPw==} + dev: true + + /iterate-value/1.0.2: + resolution: {integrity: sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==} + dependencies: + es-get-iterator: 1.1.2 + iterate-iterator: 1.0.2 + dev: true + /jasmine-core/3.99.1: resolution: {integrity: sha512-Hu1dmuoGcZ7AfyynN3LsfruwMbxMALMka+YtZeGoLuDEySVmVAPaonkNoBRIw/ectu8b9tVQCJNgp4a4knp+tg==} dev: true @@ -3615,10 +9147,70 @@ packages: resolution: {integrity: sha512-8E8BiffCL8sBwK1zU9cbavLe8xpJAgOduSJ6N8PJVv8VosQ/nxVTuXj2kUeHxTlZBVvh24G19ga7xdiaxlceKg==} dev: true + /jest-haste-map/26.6.2: + resolution: {integrity: sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==} + engines: {node: '>= 10.14.2'} + dependencies: + '@jest/types': 26.6.2 + '@types/graceful-fs': 4.1.5 + '@types/node': 17.0.23 + anymatch: 3.1.2 + fb-watchman: 2.0.1 + graceful-fs: 4.2.10 + jest-regex-util: 26.0.0 + jest-serializer: 26.6.2 + jest-util: 26.6.2 + jest-worker: 26.6.2 + micromatch: 4.0.5 + sane: 4.1.0 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /jest-regex-util/26.0.0: + resolution: {integrity: sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==} + engines: {node: '>= 10.14.2'} + dev: true + + /jest-serializer/26.6.2: + resolution: {integrity: sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==} + engines: {node: '>= 10.14.2'} + dependencies: + '@types/node': 17.0.23 + graceful-fs: 4.2.10 + dev: true + + /jest-util/26.6.2: + resolution: {integrity: sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==} + engines: {node: '>= 10.14.2'} + dependencies: + '@jest/types': 26.6.2 + '@types/node': 17.0.23 + chalk: 4.1.2 + graceful-fs: 4.2.10 + is-ci: 2.0.0 + micromatch: 4.0.5 + dev: true + + /jest-worker/26.6.2: + resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/node': 17.0.23 + merge-stream: 2.0.0 + supports-color: 7.2.0 + dev: true + /js-base64/2.6.4: resolution: {integrity: sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==} dev: true + /js-string-escape/1.0.1: + resolution: {integrity: sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8=} + engines: {node: '>= 0.8'} + dev: true + /js-tokens/3.0.2: resolution: {integrity: sha1-mGbfOVECEw449/mWvOtlRDIJwls=} dev: true @@ -3627,6 +9219,14 @@ packages: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} dev: true + /js-yaml/3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + dev: true + /js-yaml/4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true @@ -3638,11 +9238,26 @@ packages: resolution: {integrity: sha1-peZUwuWi3rXyAdls77yoDA7y9RM=} dev: true + /jsesc/0.5.0: + resolution: {integrity: sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=} + hasBin: true + dev: true + /jsesc/1.3.0: resolution: {integrity: sha1-RsP+yMGJKxKwgz25vHYiF226s0s=} hasBin: true dev: true + /jsesc/2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /json-parse-better-errors/1.0.2: + resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} + dev: true + /json-parse-even-better-errors/2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} dev: true @@ -3668,14 +9283,21 @@ packages: hasBin: true dev: true - /jsonfile/2.4.0: - resolution: {integrity: sha1-NzaitCi4e72gzIO1P6PWM6NcKug=} - optionalDependencies: - graceful-fs: 4.2.10 + /json5/1.0.1: + resolution: {integrity: sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==} + hasBin: true + dependencies: + minimist: 1.2.6 + dev: true + + /json5/2.2.1: + resolution: {integrity: sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==} + engines: {node: '>=6'} + hasBin: true dev: true - /jsonfile/3.0.1: - resolution: {integrity: sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=} + /jsonfile/2.4.0: + resolution: {integrity: sha1-NzaitCi4e72gzIO1P6PWM6NcKug=} optionalDependencies: graceful-fs: 4.2.10 dev: true @@ -3775,6 +9397,11 @@ packages: verror: 1.10.0 dev: true + /junk/3.1.0: + resolution: {integrity: sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==} + engines: {node: '>=8'} + dev: true + /karma-jasmine/4.0.2_karma@6.3.18: resolution: {integrity: sha512-ggi84RMNQffSDmWSyyt4zxzh2CQGwsxvYYsprgyR1j8ikzIduEdOlcLvXjZGwXG/0j41KUXOWsUCBfbEHPWP9g==} engines: {node: '>= 10'} @@ -3880,11 +9507,40 @@ packages: graceful-fs: 4.2.10 dev: true + /kleur/3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + dev: true + + /klona/2.0.5: + resolution: {integrity: sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==} + engines: {node: '>= 8'} + dev: true + /lazy-cache/1.0.4: resolution: {integrity: sha1-odePw6UEdMuAhF07O24dpJpEbo4=} engines: {node: '>=0.10.0'} dev: true + /lazy-universal-dotenv/3.0.1: + resolution: {integrity: sha512-prXSYk799h3GY3iOWnC6ZigYzMPjxN2svgjJ9shk7oMadSNX3wXy0B6F32PMJv7qtMnrIbUxoEHzbutvxR2LBQ==} + engines: {node: '>=6.0.0', npm: '>=6.0.0', yarn: '>=1.0.0'} + dependencies: + '@babel/runtime': 7.17.9 + app-root-dir: 1.0.2 + core-js: 3.21.1 + dotenv: 8.6.0 + dotenv-expand: 5.1.0 + dev: true + + /levn/0.3.0: + resolution: {integrity: sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.1.2 + type-check: 0.3.2 + dev: true + /levn/0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -3912,25 +9568,48 @@ packages: engines: {node: '>=10'} dev: true - /limiter/1.1.5: - resolution: {integrity: sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==} - dev: true - /lines-and-columns/1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} dev: true - /localtunnel/2.0.2: - resolution: {integrity: sha512-n418Cn5ynvJd7m/N1d9WVJISLJF/ellZnfsLnx8WBWGzxv/ntNcFkJ1o6se5quUhCplfLGBNL5tYHiq5WF3Nug==} - engines: {node: '>=8.3.0'} - hasBin: true + /loader-runner/2.4.0: + resolution: {integrity: sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==} + engines: {node: '>=4.3.0 <5.0.0 || >=5.10'} + dev: true + + /loader-utils/1.4.0: + resolution: {integrity: sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==} + engines: {node: '>=4.0.0'} dependencies: - axios: 0.21.4_debug@4.3.2 - debug: 4.3.2 - openurl: 1.1.1 - yargs: 17.1.1 - transitivePeerDependencies: - - supports-color + big.js: 5.2.2 + emojis-list: 3.0.0 + json5: 1.0.1 + dev: true + + /loader-utils/2.0.0: + resolution: {integrity: sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==} + engines: {node: '>=8.9.0'} + dependencies: + big.js: 5.2.2 + emojis-list: 3.0.0 + json5: 2.2.1 + dev: true + + /loader-utils/2.0.2: + resolution: {integrity: sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==} + engines: {node: '>=8.9.0'} + dependencies: + big.js: 5.2.2 + emojis-list: 3.0.0 + json5: 2.2.1 + dev: true + + /locate-path/3.0.0: + resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} + engines: {node: '>=6'} + dependencies: + p-locate: 3.0.0 + path-exists: 3.0.0 dev: true /locate-path/5.0.0: @@ -3947,8 +9626,8 @@ packages: p-locate: 5.0.0 dev: true - /lodash.isfinite/3.3.2: - resolution: {integrity: sha1-+4m2WpqAKBgz8LdHizpRBPiY67M=} + /lodash.debounce/4.0.8: + resolution: {integrity: sha1-gteb/zCmfEAF/9XiUVMArZyk168=} dev: true /lodash.map/4.6.0: @@ -4009,6 +9688,25 @@ packages: js-tokens: 4.0.0 dev: true + /lower-case/2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + dependencies: + tslib: 2.3.1 + dev: true + + /lowlight/1.20.0: + resolution: {integrity: sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==} + dependencies: + fault: 1.0.4 + highlight.js: 10.7.3 + dev: true + + /lru-cache/5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + dev: true + /lru-cache/6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} @@ -4022,6 +9720,21 @@ packages: es5-ext: 0.10.60 dev: true + /make-dir/2.1.0: + resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} + engines: {node: '>=6'} + dependencies: + pify: 4.0.1 + semver: 5.7.1 + dev: true + + /make-dir/3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + dependencies: + semver: 6.3.0 + dev: true + /make-error/1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} dev: true @@ -4078,6 +9791,10 @@ packages: engines: {node: '>=8'} dev: true + /map-or-similar/1.5.0: + resolution: {integrity: sha1-beJlMXSt+12e3DPGnT6Sobdvrwg=} + dev: true + /map-visit/1.0.0: resolution: {integrity: sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=} engines: {node: '>=0.10.0'} @@ -4085,19 +9802,87 @@ packages: object-visit: 1.0.1 dev: true + /markdown-escapes/1.0.4: + resolution: {integrity: sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==} + dev: true + + /markdown-to-jsx/7.1.7: + resolution: {integrity: sha512-VI3TyyHlGkO8uFle0IOibzpO1c1iJDcXcS/zBrQrXQQvJ2tpdwVzVZ7XdKsyRz1NdRmre4dqQkMZzUHaKIG/1w==} + engines: {node: '>= 10'} + peerDependencies: + react: '>= 0.14.0' + dev: true + + /markdown-to-jsx/7.1.7_react@16.14.0: + resolution: {integrity: sha512-VI3TyyHlGkO8uFle0IOibzpO1c1iJDcXcS/zBrQrXQQvJ2tpdwVzVZ7XdKsyRz1NdRmre4dqQkMZzUHaKIG/1w==} + engines: {node: '>= 10'} + peerDependencies: + react: '>= 0.14.0' + dependencies: + react: 16.14.0 + dev: true + /math-random/1.0.4: resolution: {integrity: sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==} dev: true + /md5.js/1.3.5: + resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} + dependencies: + hash-base: 3.1.0 + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: true + + /mdast-squeeze-paragraphs/4.0.0: + resolution: {integrity: sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ==} + dependencies: + unist-util-remove: 2.1.0 + dev: true + + /mdast-util-definitions/4.0.0: + resolution: {integrity: sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==} + dependencies: + unist-util-visit: 2.0.3 + dev: true + + /mdast-util-to-hast/10.0.1: + resolution: {integrity: sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA==} + dependencies: + '@types/mdast': 3.0.10 + '@types/unist': 2.0.6 + mdast-util-definitions: 4.0.0 + mdurl: 1.0.1 + unist-builder: 2.0.3 + unist-util-generated: 1.1.6 + unist-util-position: 3.1.0 + unist-util-visit: 2.0.3 + dev: true + + /mdast-util-to-string/1.1.0: + resolution: {integrity: sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A==} + dev: true + /mdn-data/2.0.14: resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} dev: true + /mdurl/1.0.1: + resolution: {integrity: sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=} + dev: true + /media-typer/0.3.0: resolution: {integrity: sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=} engines: {node: '>= 0.6'} dev: true + /memfs/3.4.1: + resolution: {integrity: sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw==} + engines: {node: '>= 4.0.0'} + dependencies: + fs-monkey: 1.0.3 + dev: true + /memoizee/0.3.10: resolution: {integrity: sha1-TsoNiu057J0Bf0xcLy9kMvQuXI8=} dependencies: @@ -4110,6 +9895,45 @@ packages: timers-ext: 0.1.7 dev: true + /memoizerific/1.11.3: + resolution: {integrity: sha1-fIekZGREwy11Q4VwkF8tvRsagFo=} + dependencies: + map-or-similar: 1.5.0 + dev: true + + /memory-fs/0.4.1: + resolution: {integrity: sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=} + dependencies: + errno: 0.1.8 + readable-stream: 2.3.7 + dev: true + + /memory-fs/0.5.0: + resolution: {integrity: sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==} + engines: {node: '>=4.3.0 <5.0.0 || >=5.10'} + dependencies: + errno: 0.1.8 + readable-stream: 2.3.7 + dev: true + + /meow/10.1.2: + resolution: {integrity: sha512-zbuAlN+V/sXlbGchNS9WTWjUzeamwMt/BApKCJi7B0QyZstZaMx0n4Unll/fg0njGtMdC9UP5SAscvOCLYdM+Q==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + '@types/minimist': 1.2.2 + camelcase-keys: 7.0.2 + decamelize: 5.0.1 + decamelize-keys: 1.1.0 + hard-rejection: 2.1.0 + minimist-options: 4.1.0 + normalize-package-data: 3.0.3 + read-pkg-up: 8.0.0 + redent: 4.0.0 + trim-newlines: 4.0.2 + type-fest: 1.4.0 + yargs-parser: 20.2.9 + dev: true + /meow/8.1.2: resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} engines: {node: '>=10'} @@ -4145,6 +9969,10 @@ packages: yargs-parser: 20.2.9 dev: true + /merge-descriptors/1.0.1: + resolution: {integrity: sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=} + dev: true + /merge-stream/2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} dev: true @@ -4157,6 +9985,20 @@ packages: resolution: {integrity: sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==} dev: true + /merge2/1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /methods/1.1.2: + resolution: {integrity: sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=} + engines: {node: '>= 0.6'} + dev: true + + /microevent.ts/0.1.1: + resolution: {integrity: sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g==} + dev: true + /micromatch/2.3.11: resolution: {integrity: sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=} engines: {node: '>=0.10.0'} @@ -4203,6 +10045,14 @@ packages: picomatch: 2.3.1 dev: true + /miller-rabin/4.0.1: + resolution: {integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==} + hasBin: true + dependencies: + bn.js: 4.12.0 + brorand: 1.1.0 + dev: true + /mime-db/1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} @@ -4215,8 +10065,9 @@ packages: mime-db: 1.52.0 dev: true - /mime/1.4.1: - resolution: {integrity: sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==} + /mime/1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} hasBin: true dev: true @@ -4236,11 +10087,25 @@ packages: engines: {node: '>=6'} dev: true + /min-document/2.19.0: + resolution: {integrity: sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=} + dependencies: + dom-walk: 0.1.2 + dev: true + /min-indent/1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} dev: true + /minimalistic-assert/1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + dev: true + + /minimalistic-crypto-utils/1.0.1: + resolution: {integrity: sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=} + dev: true + /minimatch/3.0.8: resolution: {integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==} dependencies: @@ -4324,8 +10189,20 @@ packages: yallist: 4.0.0 dev: true - /mitt/1.2.0: - resolution: {integrity: sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==} + /mississippi/3.0.0: + resolution: {integrity: sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==} + engines: {node: '>=4.0.0'} + dependencies: + concat-stream: 1.6.2 + duplexify: 3.7.1 + end-of-stream: 1.4.4 + flush-write-stream: 1.1.1 + from2: 2.3.0 + parallel-transform: 1.2.0 + pump: 3.0.0 + pumpify: 1.5.1 + stream-each: 1.2.3 + through2: 2.0.5 dev: true /mixin-deep/1.3.2: @@ -4349,10 +10226,25 @@ packages: hasBin: true dev: true + /move-concurrently/1.0.1: + resolution: {integrity: sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=} + dependencies: + aproba: 1.2.0 + copy-concurrently: 1.0.5 + fs-write-stream-atomic: 1.0.10 + mkdirp: 0.5.6 + rimraf: 2.7.1 + run-queue: 1.0.3 + dev: true + /ms/2.0.0: resolution: {integrity: sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=} dev: true + /ms/2.1.1: + resolution: {integrity: sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==} + dev: true + /ms/2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} dev: true @@ -4418,6 +10310,14 @@ packages: engines: {node: '>= 0.6'} dev: true + /neo-async/2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + dev: true + + /nested-error-stacks/2.1.1: + resolution: {integrity: sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw==} + dev: true + /netrc/0.1.4: resolution: {integrity: sha1-a+lPysqNd63gqWcNxGCRTJRHJEQ=} dev: true @@ -4430,6 +10330,29 @@ packages: resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} dev: true + /nice-try/1.0.5: + resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} + dev: true + + /no-case/3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + dependencies: + lower-case: 2.0.2 + tslib: 2.3.1 + dev: true + + /node-fetch/2.6.7: + resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: true + /node-gyp/8.4.1: resolution: {integrity: sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==} engines: {node: '>= 10.12.0'} @@ -4453,6 +10376,34 @@ packages: resolution: {integrity: sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=} dev: true + /node-libs-browser/2.2.1: + resolution: {integrity: sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==} + dependencies: + assert: 1.5.0 + browserify-zlib: 0.2.0 + buffer: 4.9.2 + console-browserify: 1.2.0 + constants-browserify: 1.0.0 + crypto-browserify: 3.12.0 + domain-browser: 1.2.0 + events: 3.3.0 + https-browserify: 1.0.0 + os-browserify: 0.3.0 + path-browserify: 0.0.1 + process: 0.11.10 + punycode: 1.4.1 + querystring-es3: 0.2.1 + readable-stream: 2.3.7 + stream-browserify: 2.0.2 + stream-http: 2.8.3 + string_decoder: 1.3.0 + timers-browserify: 2.0.12 + tty-browserify: 0.0.0 + url: 0.11.0 + util: 0.11.1 + vm-browserify: 1.1.2 + dev: true + /node-releases/2.0.3: resolution: {integrity: sha512-maHFz6OLqYxz+VQyCAtA3PTX4UP/53pa05fyDNc9CwjvJ0yEh6+xBwKsgCxMNhS8taUKBFYxfuiaD9U/55iFaw==} dev: true @@ -4531,6 +10482,13 @@ packages: engines: {node: '>=10'} dev: true + /npm-run-path/2.0.2: + resolution: {integrity: sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=} + engines: {node: '>=4'} + dependencies: + path-key: 2.0.1 + dev: true + /npm-run-path/4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} @@ -4563,6 +10521,10 @@ packages: boolbase: 1.0.0 dev: true + /num2fraction/1.2.2: + resolution: {integrity: sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=} + dev: true + /oauth-sign/0.9.0: resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} dev: true @@ -4585,6 +10547,11 @@ packages: resolution: {integrity: sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==} dev: true + /object-keys/1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + dev: true + /object-visit/1.0.1: resolution: {integrity: sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=} engines: {node: '>=0.10.0'} @@ -4592,6 +10559,16 @@ packages: isobject: 3.0.1 dev: true + /object.assign/4.1.2: + resolution: {integrity: sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + has-symbols: 1.0.3 + object-keys: 1.1.1 + dev: true + /object.defaults/1.1.0: resolution: {integrity: sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=} engines: {node: '>=0.10.0'} @@ -4602,6 +10579,33 @@ packages: isobject: 3.0.1 dev: true + /object.entries/1.1.5: + resolution: {integrity: sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + es-abstract: 1.19.5 + dev: true + + /object.fromentries/2.0.5: + resolution: {integrity: sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + es-abstract: 1.19.5 + dev: true + + /object.getownpropertydescriptors/2.1.3: + resolution: {integrity: sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw==} + engines: {node: '>= 0.8'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + es-abstract: 1.19.5 + dev: true + /object.map/1.0.1: resolution: {integrity: sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=} engines: {node: '>=0.10.0'} @@ -4625,6 +10629,15 @@ packages: isobject: 3.0.1 dev: true + /object.values/1.1.5: + resolution: {integrity: sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + es-abstract: 1.19.5 + dev: true + /on-finished/2.3.0: resolution: {integrity: sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=} engines: {node: '>= 0.8'} @@ -4639,6 +10652,11 @@ packages: ee-first: 1.1.1 dev: true + /on-headers/1.0.2: + resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} + engines: {node: '>= 0.8'} + dev: true + /once/1.4.0: resolution: {integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E=} dependencies: @@ -4659,15 +10677,24 @@ packages: mimic-fn: 2.1.0 dev: true - /openurl/1.1.1: - resolution: {integrity: sha1-OHW0sO96UsFW8NtB1GCduw+Us4c=} + /open/7.4.2: + resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==} + engines: {node: '>=8'} + dependencies: + is-docker: 2.2.1 + is-wsl: 2.2.0 dev: true - /opn/5.3.0: - resolution: {integrity: sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==} - engines: {node: '>=4'} + /optionator/0.8.3: + resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} + engines: {node: '>= 0.8.0'} dependencies: - is-wsl: 1.1.0 + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.3.0 + prelude-ls: 1.1.2 + type-check: 0.3.2 + word-wrap: 1.2.3 dev: true /optionator/0.9.1: @@ -4697,6 +10724,10 @@ packages: wcwidth: 1.0.1 dev: true + /os-browserify/0.3.0: + resolution: {integrity: sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=} + dev: true + /os-homedir/1.0.2: resolution: {integrity: sha1-/7xJiDNuDoM94MFox+8VISGqf7M=} engines: {node: '>=0.10.0'} @@ -4707,6 +10738,36 @@ packages: engines: {node: '>=0.10.0'} dev: true + /overlayscrollbars/1.13.1: + resolution: {integrity: sha512-gIQfzgGgu1wy80EB4/6DaJGHMEGmizq27xHIESrzXq0Y/J0Ay1P3DWk6tuVmEPIZH15zaBlxeEJOqdJKmowHCQ==} + dev: true + + /p-all/2.1.0: + resolution: {integrity: sha512-HbZxz5FONzz/z2gJfk6bFca0BCiSRF8jU3yCsWOen/vR6lZjfPOu/e7L3uFzTW1i0H8TlC3vqQstEJPQL4/uLA==} + engines: {node: '>=6'} + dependencies: + p-map: 2.1.0 + dev: true + + /p-event/4.2.0: + resolution: {integrity: sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==} + engines: {node: '>=8'} + dependencies: + p-timeout: 3.2.0 + dev: true + + /p-filter/2.1.0: + resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} + engines: {node: '>=8'} + dependencies: + p-map: 2.1.0 + dev: true + + /p-finally/1.0.0: + resolution: {integrity: sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=} + engines: {node: '>=4'} + dev: true + /p-limit/2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -4721,6 +10782,13 @@ packages: yocto-queue: 0.1.0 dev: true + /p-locate/3.0.0: + resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} + engines: {node: '>=6'} + dependencies: + p-limit: 2.3.0 + dev: true + /p-locate/4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} @@ -4735,6 +10803,18 @@ packages: p-limit: 3.1.0 dev: true + /p-map/2.1.0: + resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} + engines: {node: '>=6'} + dev: true + + /p-map/3.0.0: + resolution: {integrity: sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==} + engines: {node: '>=8'} + dependencies: + aggregate-error: 3.1.0 + dev: true + /p-map/4.0.0: resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} engines: {node: '>=10'} @@ -4742,11 +10822,37 @@ packages: aggregate-error: 3.1.0 dev: true + /p-timeout/3.2.0: + resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} + engines: {node: '>=8'} + dependencies: + p-finally: 1.0.0 + dev: true + /p-try/2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} dev: true + /pako/1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + dev: true + + /parallel-transform/1.2.0: + resolution: {integrity: sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==} + dependencies: + cyclist: 1.0.1 + inherits: 2.0.4 + readable-stream: 2.3.7 + dev: true + + /param-case/3.0.4: + resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} + dependencies: + dot-case: 3.0.4 + tslib: 2.3.1 + dev: true + /parent-module/1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -4754,6 +10860,27 @@ packages: callsites: 3.1.0 dev: true + /parse-asn1/5.1.6: + resolution: {integrity: sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==} + dependencies: + asn1.js: 5.4.1 + browserify-aes: 1.2.0 + evp_bytestokey: 1.0.3 + pbkdf2: 3.1.2 + safe-buffer: 5.2.1 + dev: true + + /parse-entities/2.0.0: + resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} + dependencies: + character-entities: 1.2.4 + character-entities-legacy: 1.1.4 + character-reference-invalid: 1.1.4 + is-alphanumerical: 1.0.4 + is-decimal: 1.0.4 + is-hexadecimal: 1.0.4 + dev: true + /parse-filepath/1.0.2: resolution: {integrity: sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=} engines: {node: '>=0.8'} @@ -4788,12 +10915,8 @@ packages: engines: {node: '>=0.10.0'} dev: true - /parseqs/0.0.6: - resolution: {integrity: sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==} - dev: true - - /parseuri/0.0.6: - resolution: {integrity: sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==} + /parse5/6.0.1: + resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} dev: true /parseurl/1.3.3: @@ -4801,11 +10924,31 @@ packages: engines: {node: '>= 0.8'} dev: true + /pascal-case/3.1.2: + resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + dependencies: + no-case: 3.0.4 + tslib: 2.3.1 + dev: true + /pascalcase/0.1.1: resolution: {integrity: sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=} engines: {node: '>=0.10.0'} dev: true + /path-browserify/0.0.1: + resolution: {integrity: sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==} + dev: true + + /path-dirname/1.0.2: + resolution: {integrity: sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=} + dev: true + + /path-exists/3.0.0: + resolution: {integrity: sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=} + engines: {node: '>=4'} + dev: true + /path-exists/4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -4816,6 +10959,11 @@ packages: engines: {node: '>=0.10.0'} dev: true + /path-key/2.0.1: + resolution: {integrity: sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=} + engines: {node: '>=4'} + dev: true + /path-key/3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -4837,11 +10985,33 @@ packages: path-root-regex: 0.1.2 dev: true + /path-to-regexp/0.1.7: + resolution: {integrity: sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=} + dev: true + + /path-type/3.0.0: + resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} + engines: {node: '>=4'} + dependencies: + pify: 3.0.0 + dev: true + /path-type/4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} dev: true + /pbkdf2/3.1.2: + resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} + engines: {node: '>=0.12'} + dependencies: + create-hash: 1.2.0 + create-hmac: 1.1.7 + ripemd160: 2.0.2 + safe-buffer: 5.2.1 + sha.js: 2.4.11 + dev: true + /pend/1.2.0: resolution: {integrity: sha1-elfrVQpng/kRUzH89GY9XI4AelA=} dev: true @@ -4867,6 +11037,10 @@ packages: which: 1.3.1 dev: true + /picocolors/0.2.1: + resolution: {integrity: sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==} + dev: true + /picocolors/1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} dev: true @@ -4876,6 +11050,16 @@ packages: engines: {node: '>=8.6'} dev: true + /pify/3.0.0: + resolution: {integrity: sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=} + engines: {node: '>=4'} + dev: true + + /pify/4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + dev: true + /pinkie-promise/2.0.1: resolution: {integrity: sha1-ITXW36ejWMBprJsXh3YogihFD/o=} engines: {node: '>=0.10.0'} @@ -4888,12 +11072,46 @@ packages: engines: {node: '>=0.10.0'} dev: true - /portscanner/2.1.1: - resolution: {integrity: sha1-6rtAnk3iSVD1oqUW01rnaTQ/u5Y=} - engines: {node: '>=0.4', npm: '>=1.0.0'} + /pirates/4.0.5: + resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==} + engines: {node: '>= 6'} + dev: true + + /pkg-dir/3.0.0: + resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==} + engines: {node: '>=6'} + dependencies: + find-up: 3.0.0 + dev: true + + /pkg-dir/4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + dev: true + + /pkg-dir/5.0.0: + resolution: {integrity: sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==} + engines: {node: '>=10'} + dependencies: + find-up: 5.0.0 + dev: true + + /pnp-webpack-plugin/1.6.4: + resolution: {integrity: sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg==} + engines: {node: '>=6'} + dependencies: + ts-pnp: 1.2.0 + transitivePeerDependencies: + - typescript + dev: true + + /polished/4.2.2: + resolution: {integrity: sha512-Sz2Lkdxz6F2Pgnpi9U5Ng/WdWAUZxmHrNPoVlm3aAemxoy2Qy7LGjQg4uf8qKelDAUW94F4np3iH2YPf2qefcQ==} + engines: {node: '>=10'} dependencies: - async: 1.5.2 - is-number-like: 1.0.8 + '@babel/runtime': 7.17.9 dev: true /posix-character-classes/0.1.1: @@ -4970,6 +11188,28 @@ packages: postcss: 8.4.12 dev: true + /postcss-flexbugs-fixes/4.2.1: + resolution: {integrity: sha512-9SiofaZ9CWpQWxOwRh1b/r85KD5y7GgvsNt1056k6OYLvWUun0czCvogfJgylC22uJTwW1KzY3Gz65NZRlvoiQ==} + dependencies: + postcss: 7.0.39 + dev: true + + /postcss-loader/4.3.0_postcss@7.0.39+webpack@4.46.0: + resolution: {integrity: sha512-M/dSoIiNDOo8Rk0mUqoj4kpGq91gcxCfb9PoyZVdZ76/AuhxylHDYZblNE8o+EQ9AMSASeMFEKxZf5aU6wlx1Q==} + engines: {node: '>= 10.13.0'} + peerDependencies: + postcss: ^7.0.0 || ^8.0.1 + webpack: ^4.0.0 || ^5.0.0 + dependencies: + cosmiconfig: 7.0.1 + klona: 2.0.5 + loader-utils: 2.0.2 + postcss: 7.0.39 + schema-utils: 3.1.1 + semver: 7.3.7 + webpack: 4.46.0 + dev: true + /postcss-merge-longhand/5.1.4_postcss@8.4.12: resolution: {integrity: sha512-hbqRRqYfmXoGpzYKeW0/NCZhvNyQIlQeWVSao5iKWdyx7skLvCfQFGIUsP9NUs3dSbPac2IC4Go85/zG+7MlmA==} engines: {node: ^10 || ^12 || >=14.0} @@ -5025,17 +11265,90 @@ packages: browserslist: 4.20.2 cssnano-utils: 3.1.0_postcss@8.4.12 postcss: 8.4.12 - postcss-value-parser: 4.2.0 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-minify-selectors/5.2.0_postcss@8.4.12: + resolution: {integrity: sha512-vYxvHkW+iULstA+ctVNx0VoRAR4THQQRkG77o0oa4/mBS0OzGvvzLIvHDv/nNEM0crzN2WIyFU5X7wZhaUK3RA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.12 + postcss-selector-parser: 6.0.10 + dev: true + + /postcss-modules-extract-imports/2.0.0: + resolution: {integrity: sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==} + engines: {node: '>= 6'} + dependencies: + postcss: 7.0.39 + dev: true + + /postcss-modules-extract-imports/3.0.0_postcss@8.4.12: + resolution: {integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + dependencies: + postcss: 8.4.12 + dev: true + + /postcss-modules-local-by-default/3.0.3: + resolution: {integrity: sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==} + engines: {node: '>= 6'} + dependencies: + icss-utils: 4.1.1 + postcss: 7.0.39 + postcss-selector-parser: 6.0.10 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-modules-local-by-default/4.0.0_postcss@8.4.12: + resolution: {integrity: sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + dependencies: + icss-utils: 5.1.0_postcss@8.4.12 + postcss: 8.4.12 + postcss-selector-parser: 6.0.10 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-modules-scope/2.2.0: + resolution: {integrity: sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==} + engines: {node: '>= 6'} + dependencies: + postcss: 7.0.39 + postcss-selector-parser: 6.0.10 + dev: true + + /postcss-modules-scope/3.0.0_postcss@8.4.12: + resolution: {integrity: sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + dependencies: + postcss: 8.4.12 + postcss-selector-parser: 6.0.10 dev: true - /postcss-minify-selectors/5.2.0_postcss@8.4.12: - resolution: {integrity: sha512-vYxvHkW+iULstA+ctVNx0VoRAR4THQQRkG77o0oa4/mBS0OzGvvzLIvHDv/nNEM0crzN2WIyFU5X7wZhaUK3RA==} - engines: {node: ^10 || ^12 || >=14.0} + /postcss-modules-values/3.0.0: + resolution: {integrity: sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==} + dependencies: + icss-utils: 4.1.1 + postcss: 7.0.39 + dev: true + + /postcss-modules-values/4.0.0_postcss@8.4.12: + resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} + engines: {node: ^10 || ^12 || >= 14} peerDependencies: - postcss: ^8.2.15 + postcss: ^8.1.0 dependencies: + icss-utils: 5.1.0_postcss@8.4.12 postcss: 8.4.12 - postcss-selector-parser: 6.0.10 dev: true /postcss-normalize-charset/5.1.0_postcss@8.4.12: @@ -5194,6 +11507,14 @@ packages: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} dev: true + /postcss/7.0.39: + resolution: {integrity: sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==} + engines: {node: '>=6.0.0'} + dependencies: + picocolors: 0.2.1 + source-map: 0.6.1 + dev: true + /postcss/8.4.12: resolution: {integrity: sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg==} engines: {node: ^10 || ^12 || >=14} @@ -5203,121 +11524,582 @@ packages: source-map-js: 1.0.2 dev: true + /prelude-ls/1.1.2: + resolution: {integrity: sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=} + engines: {node: '>= 0.8.0'} + dev: true + /prelude-ls/1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} dev: true - /preserve/0.2.0: - resolution: {integrity: sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=} - engines: {node: '>=0.10.0'} + /preserve/0.2.0: + resolution: {integrity: sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=} + engines: {node: '>=0.10.0'} + dev: true + + /prettier/2.3.0: + resolution: {integrity: sha512-kXtO4s0Lz/DW/IJ9QdWhAf7/NmPWQXkFr/r/WkR3vyI+0v8amTDxiaQSLzs8NBlytfLWX/7uQUMIW677yLKl4w==} + engines: {node: '>=10.13.0'} + hasBin: true + dev: true + + /pretty-error/2.1.2: + resolution: {integrity: sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==} + dependencies: + lodash: 4.17.21 + renderkid: 2.0.7 + dev: true + + /pretty-hrtime/1.0.3: + resolution: {integrity: sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=} + engines: {node: '>= 0.8'} + dev: true + + /prismjs/1.27.0: + resolution: {integrity: sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==} + engines: {node: '>=6'} + dev: true + + /private/0.1.8: + resolution: {integrity: sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==} + engines: {node: '>= 0.6'} + dev: true + + /process-nextick-args/2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + dev: true + + /process/0.11.10: + resolution: {integrity: sha1-czIwDoQBYb2j5podHZGn1LwW8YI=} + engines: {node: '>= 0.6.0'} + dev: true + + /progress/1.1.8: + resolution: {integrity: sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=} + engines: {node: '>=0.4.0'} + dev: true + + /promise-inflight/1.0.1: + resolution: {integrity: sha1-mEcocL8igTL8vdhoEputEsPAKeM=} + dev: true + + /promise-retry/2.0.1: + resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} + engines: {node: '>=10'} + dependencies: + err-code: 2.0.3 + retry: 0.12.0 + dev: true + + /promise.allsettled/1.0.5: + resolution: {integrity: sha512-tVDqeZPoBC0SlzJHzWGZ2NKAguVq2oiYj7gbggbiTvH2itHohijTp7njOUA0aQ/nl+0lr/r6egmhoYu63UZ/pQ==} + engines: {node: '>= 0.4'} + dependencies: + array.prototype.map: 1.0.4 + call-bind: 1.0.2 + define-properties: 1.1.3 + es-abstract: 1.19.5 + get-intrinsic: 1.1.1 + iterate-value: 1.0.2 + dev: true + + /promise.prototype.finally/3.1.3: + resolution: {integrity: sha512-EXRF3fC9/0gz4qkt/f5EP5iW4kj9oFpBICNpCNOb/52+8nlHIX07FPLbi/q4qYBQ1xZqivMzTpNQSnArVASolQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + es-abstract: 1.19.5 + dev: true + + /prompts/2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + dev: true + + /prop-types/15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + dev: true + + /proper-lockfile/1.2.0: + resolution: {integrity: sha1-zv9d2J0+XxD7deHo52vHWAGlnDQ=} + dependencies: + err-code: 1.1.2 + extend: 3.0.2 + graceful-fs: 4.2.10 + retry: 0.10.1 + dev: true + + /property-information/5.6.0: + resolution: {integrity: sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==} + dependencies: + xtend: 4.0.2 + dev: true + + /proxy-addr/2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + dev: true + + /prr/1.0.1: + resolution: {integrity: sha1-0/wRS6BplaRexok/SEzrHXj19HY=} + dev: true + + /psl/1.8.0: + resolution: {integrity: sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==} + dev: true + + /public-encrypt/4.0.3: + resolution: {integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==} + dependencies: + bn.js: 4.12.0 + browserify-rsa: 4.1.0 + create-hash: 1.2.0 + parse-asn1: 5.1.6 + randombytes: 2.1.0 + safe-buffer: 5.2.1 + dev: true + + /pump/1.0.3: + resolution: {integrity: sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: true + + /pump/2.0.1: + resolution: {integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: true + + /pump/3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: true + + /pumpify/1.5.1: + resolution: {integrity: sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==} + dependencies: + duplexify: 3.7.1 + inherits: 2.0.4 + pump: 2.0.1 + dev: true + + /punycode/1.3.2: + resolution: {integrity: sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=} + dev: true + + /punycode/1.4.1: + resolution: {integrity: sha1-wNWmOycYgArY4esPpSachN1BhF4=} + dev: true + + /punycode/2.1.1: + resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==} + engines: {node: '>=6'} + dev: true + + /q/1.5.1: + resolution: {integrity: sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=} + engines: {node: '>=0.6.0', teleport: '>=0.2.0'} + dev: true + + /qjobs/1.2.0: + resolution: {integrity: sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==} + engines: {node: '>=0.9'} + dev: true + + /qs/6.10.3: + resolution: {integrity: sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.4 + dev: true + + /qs/6.5.3: + resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} + engines: {node: '>=0.6'} + dev: true + + /qs/6.9.7: + resolution: {integrity: sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==} + engines: {node: '>=0.6'} + dev: true + + /querystring-es3/0.2.1: + resolution: {integrity: sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=} + engines: {node: '>=0.4.x'} + dev: true + + /querystring/0.2.0: + resolution: {integrity: sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=} + engines: {node: '>=0.4.x'} + deprecated: The querystring API is considered Legacy. new code should use the URLSearchParams API instead. + dev: true + + /querystring/0.2.1: + resolution: {integrity: sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==} + engines: {node: '>=0.4.x'} + deprecated: The querystring API is considered Legacy. new code should use the URLSearchParams API instead. + dev: true + + /queue-microtask/1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /quick-lru/4.0.1: + resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} + engines: {node: '>=8'} + dev: true + + /quick-lru/5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + dev: true + + /ramda/0.21.0: + resolution: {integrity: sha1-oAGr7bP/YQd9T/HVd9RN536NCjU=} + dev: true + + /randomatic/3.1.1: + resolution: {integrity: sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==} + engines: {node: '>= 0.10.0'} + dependencies: + is-number: 4.0.0 + kind-of: 6.0.3 + math-random: 1.0.4 + dev: true + + /randombytes/2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /randomfill/1.0.4: + resolution: {integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==} + dependencies: + randombytes: 2.1.0 + safe-buffer: 5.2.1 + dev: true + + /range-parser/1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + dev: true + + /raw-body/2.4.3: + resolution: {integrity: sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==} + engines: {node: '>= 0.8'} + dependencies: + bytes: 3.1.2 + http-errors: 1.8.1 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + dev: true + + /raw-body/2.5.1: + resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} + engines: {node: '>= 0.8'} + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + dev: true + + /raw-loader/4.0.2_webpack@4.46.0: + resolution: {integrity: sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==} + engines: {node: '>= 10.13.0'} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + dependencies: + loader-utils: 2.0.2 + schema-utils: 3.1.1 + webpack: 4.46.0 + dev: true + + /react-colorful/5.5.1: + resolution: {integrity: sha512-M1TJH2X3RXEt12sWkpa6hLc/bbYS0H6F4rIqjQZ+RxNBstpY67d9TrFXtqdZwhpmBXcCwEi7stKqFue3ZRkiOg==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + dev: true + + /react-colorful/5.5.1_react-dom@16.14.0+react@16.14.0: + resolution: {integrity: sha512-M1TJH2X3RXEt12sWkpa6hLc/bbYS0H6F4rIqjQZ+RxNBstpY67d9TrFXtqdZwhpmBXcCwEi7stKqFue3ZRkiOg==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + dependencies: + react: 16.14.0 + react-dom: 16.14.0_react@16.14.0 + dev: true + + /react-dom/16.14.0_react@16.14.0: + resolution: {integrity: sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==} + peerDependencies: + react: ^16.14.0 + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + prop-types: 15.8.1 + react: 16.14.0 + scheduler: 0.19.1 + dev: true + + /react-draggable/4.4.4: + resolution: {integrity: sha512-6e0WdcNLwpBx/YIDpoyd2Xb04PB0elrDrulKUgdrIlwuYvxh5Ok9M+F8cljm8kPXXs43PmMzek9RrB1b7mLMqA==} + peerDependencies: + react: '>= 16.3.0' + react-dom: '>= 16.3.0' + dependencies: + clsx: 1.1.1 + prop-types: 15.8.1 + dev: true + + /react-draggable/4.4.4_react-dom@16.14.0+react@16.14.0: + resolution: {integrity: sha512-6e0WdcNLwpBx/YIDpoyd2Xb04PB0elrDrulKUgdrIlwuYvxh5Ok9M+F8cljm8kPXXs43PmMzek9RrB1b7mLMqA==} + peerDependencies: + react: '>= 16.3.0' + react-dom: '>= 16.3.0' + dependencies: + clsx: 1.1.1 + prop-types: 15.8.1 + react: 16.14.0 + react-dom: 16.14.0_react@16.14.0 + dev: true + + /react-element-to-jsx-string/14.3.4: + resolution: {integrity: sha512-t4ZwvV6vwNxzujDQ+37bspnLwA4JlgUPWhLjBJWsNIDceAf6ZKUTCjdm08cN6WeZ5pTMKiCJkmAYnpmR4Bm+dg==} + peerDependencies: + react: ^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 + react-dom: ^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 + dependencies: + '@base2/pretty-print-object': 1.0.1 + is-plain-object: 5.0.0 + react-is: 17.0.2 + dev: true + + /react-fast-compare/3.2.0: + resolution: {integrity: sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==} dev: true - /private/0.1.8: - resolution: {integrity: sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==} - engines: {node: '>= 0.6'} + /react-helmet-async/1.3.0: + resolution: {integrity: sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg==} + peerDependencies: + react: ^16.6.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.6.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@babel/runtime': 7.17.9 + invariant: 2.2.4 + prop-types: 15.8.1 + react-fast-compare: 3.2.0 + shallowequal: 1.1.0 dev: true - /process-nextick-args/2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + /react-helmet-async/1.3.0_react-dom@16.14.0+react@16.14.0: + resolution: {integrity: sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg==} + peerDependencies: + react: ^16.6.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.6.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@babel/runtime': 7.17.9 + invariant: 2.2.4 + prop-types: 15.8.1 + react: 16.14.0 + react-dom: 16.14.0_react@16.14.0 + react-fast-compare: 3.2.0 + shallowequal: 1.1.0 dev: true - /progress/1.1.8: - resolution: {integrity: sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=} - engines: {node: '>=0.4.0'} + /react-inspector/5.1.1: + resolution: {integrity: sha512-GURDaYzoLbW8pMGXwYPDBIv6nqei4kK7LPRZ9q9HCZF54wqXz/dnylBp/kfE9XmekBhHvLDdcYeyIwSrvtOiWg==} + peerDependencies: + react: ^16.8.4 || ^17.0.0 + dependencies: + '@babel/runtime': 7.17.9 + is-dom: 1.1.0 + prop-types: 15.8.1 dev: true - /promise-inflight/1.0.1: - resolution: {integrity: sha1-mEcocL8igTL8vdhoEputEsPAKeM=} + /react-is/16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} dev: true - /promise-retry/2.0.1: - resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} - engines: {node: '>=10'} + /react-is/17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + dev: true + + /react-popper-tooltip/3.1.1: + resolution: {integrity: sha512-EnERAnnKRptQBJyaee5GJScWNUKQPDD2ywvzZyUjst/wj5U64C8/CnSYLNEmP2hG0IJ3ZhtDxE8oDN+KOyavXQ==} + peerDependencies: + react: ^16.6.0 || ^17.0.0 + react-dom: ^16.6.0 || ^17.0.0 dependencies: - err-code: 2.0.3 - retry: 0.12.0 + '@babel/runtime': 7.17.9 + '@popperjs/core': 2.11.5 + react-popper: 2.2.5_@popperjs+core@2.11.5 dev: true - /proper-lockfile/1.2.0: - resolution: {integrity: sha1-zv9d2J0+XxD7deHo52vHWAGlnDQ=} + /react-popper-tooltip/3.1.1_react-dom@16.14.0+react@16.14.0: + resolution: {integrity: sha512-EnERAnnKRptQBJyaee5GJScWNUKQPDD2ywvzZyUjst/wj5U64C8/CnSYLNEmP2hG0IJ3ZhtDxE8oDN+KOyavXQ==} + peerDependencies: + react: ^16.6.0 || ^17.0.0 + react-dom: ^16.6.0 || ^17.0.0 dependencies: - err-code: 1.1.2 - extend: 3.0.2 - graceful-fs: 4.2.10 - retry: 0.10.1 + '@babel/runtime': 7.17.9 + '@popperjs/core': 2.11.5 + react: 16.14.0 + react-dom: 16.14.0_react@16.14.0 + react-popper: 2.2.5_6a538338d4aada8f90332fc3121ce9a9 dev: true - /psl/1.8.0: - resolution: {integrity: sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==} + /react-popper/2.2.5_6a538338d4aada8f90332fc3121ce9a9: + resolution: {integrity: sha512-kxGkS80eQGtLl18+uig1UIf9MKixFSyPxglsgLBxlYnyDf65BiY9B3nZSc6C9XUNDgStROB0fMQlTEz1KxGddw==} + peerDependencies: + '@popperjs/core': ^2.0.0 + react: ^16.8.0 || ^17 + dependencies: + '@popperjs/core': 2.11.5 + react: 16.14.0 + react-fast-compare: 3.2.0 + warning: 4.0.3 dev: true - /pump/1.0.3: - resolution: {integrity: sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==} + /react-popper/2.2.5_@popperjs+core@2.11.5: + resolution: {integrity: sha512-kxGkS80eQGtLl18+uig1UIf9MKixFSyPxglsgLBxlYnyDf65BiY9B3nZSc6C9XUNDgStROB0fMQlTEz1KxGddw==} + peerDependencies: + '@popperjs/core': ^2.0.0 + react: ^16.8.0 || ^17 dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 + '@popperjs/core': 2.11.5 + react-fast-compare: 3.2.0 + warning: 4.0.3 dev: true - /punycode/2.1.1: - resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==} - engines: {node: '>=6'} + /react-router-dom/6.3.0: + resolution: {integrity: sha512-uaJj7LKytRxZNQV8+RbzJWnJ8K2nPsOOEuX7aQstlMZKQT0164C+X2w6bnkqU3sjtLvpd5ojrezAyfZ1+0sStw==} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' + dependencies: + history: 5.3.0 + react-router: 6.3.0 dev: true - /q/1.5.1: - resolution: {integrity: sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=} - engines: {node: '>=0.6.0', teleport: '>=0.2.0'} + /react-router-dom/6.3.0_react-dom@16.14.0+react@16.14.0: + resolution: {integrity: sha512-uaJj7LKytRxZNQV8+RbzJWnJ8K2nPsOOEuX7aQstlMZKQT0164C+X2w6bnkqU3sjtLvpd5ojrezAyfZ1+0sStw==} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' + dependencies: + history: 5.3.0 + react: 16.14.0 + react-dom: 16.14.0_react@16.14.0 + react-router: 6.3.0_react@16.14.0 dev: true - /qjobs/1.2.0: - resolution: {integrity: sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==} - engines: {node: '>=0.9'} + /react-router/6.3.0: + resolution: {integrity: sha512-7Wh1DzVQ+tlFjkeo+ujvjSqSJmkt1+8JO+T5xklPlgrh70y7ogx75ODRW0ThWhY7S+6yEDks8TYrtQe/aoboBQ==} + peerDependencies: + react: '>=16.8' + dependencies: + history: 5.3.0 dev: true - /qs/6.10.3: - resolution: {integrity: sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==} - engines: {node: '>=0.6'} + /react-router/6.3.0_react@16.14.0: + resolution: {integrity: sha512-7Wh1DzVQ+tlFjkeo+ujvjSqSJmkt1+8JO+T5xklPlgrh70y7ogx75ODRW0ThWhY7S+6yEDks8TYrtQe/aoboBQ==} + peerDependencies: + react: '>=16.8' dependencies: - side-channel: 1.0.4 + history: 5.3.0 + react: 16.14.0 dev: true - /qs/6.2.3: - resolution: {integrity: sha1-HPyyXBCpsrSDBT/zn138kjOQjP4=} - engines: {node: '>=0.6'} + /react-sizeme/3.0.2: + resolution: {integrity: sha512-xOIAOqqSSmKlKFJLO3inBQBdymzDuXx4iuwkNcJmC96jeiOg5ojByvL+g3MW9LPEsojLbC6pf68zOfobK8IPlw==} + dependencies: + element-resize-detector: 1.2.4 + invariant: 2.2.4 + shallowequal: 1.1.0 + throttle-debounce: 3.0.1 dev: true - /qs/6.5.3: - resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} - engines: {node: '>=0.6'} + /react-syntax-highlighter/13.5.3: + resolution: {integrity: sha512-crPaF+QGPeHNIblxxCdf2Lg936NAHKhNhuMzRL3F9ct6aYXL3NcZtCL0Rms9+qVo6Y1EQLdXGypBNSbPL/r+qg==} + peerDependencies: + react: '>= 0.14.0' + dependencies: + '@babel/runtime': 7.17.9 + highlight.js: 10.7.3 + lowlight: 1.20.0 + prismjs: 1.27.0 + refractor: 3.6.0 dev: true - /quick-lru/4.0.1: - resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} - engines: {node: '>=8'} + /react-syntax-highlighter/13.5.3_react@16.14.0: + resolution: {integrity: sha512-crPaF+QGPeHNIblxxCdf2Lg936NAHKhNhuMzRL3F9ct6aYXL3NcZtCL0Rms9+qVo6Y1EQLdXGypBNSbPL/r+qg==} + peerDependencies: + react: '>= 0.14.0' + dependencies: + '@babel/runtime': 7.17.9 + highlight.js: 10.7.3 + lowlight: 1.20.0 + prismjs: 1.27.0 + react: 16.14.0 + refractor: 3.6.0 dev: true - /randomatic/3.1.1: - resolution: {integrity: sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==} - engines: {node: '>= 0.10.0'} + /react-textarea-autosize/8.3.3: + resolution: {integrity: sha512-2XlHXK2TDxS6vbQaoPbMOfQ8GK7+irc2fVK6QFIcC8GOnH3zI/v481n+j1L0WaPVvKxwesnY93fEfH++sus2rQ==} + engines: {node: '>=10'} + peerDependencies: + react: ^16.8.0 || ^17.0.0 dependencies: - is-number: 4.0.0 - kind-of: 6.0.3 - math-random: 1.0.4 + '@babel/runtime': 7.17.9 + use-composed-ref: 1.2.1 + use-latest: 1.2.0 + transitivePeerDependencies: + - '@types/react' dev: true - /range-parser/1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} + /react-textarea-autosize/8.3.3_react@16.14.0: + resolution: {integrity: sha512-2XlHXK2TDxS6vbQaoPbMOfQ8GK7+irc2fVK6QFIcC8GOnH3zI/v481n+j1L0WaPVvKxwesnY93fEfH++sus2rQ==} + engines: {node: '>=10'} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + dependencies: + '@babel/runtime': 7.17.9 + react: 16.14.0 + use-composed-ref: 1.2.1_react@16.14.0 + use-latest: 1.2.0_react@16.14.0 + transitivePeerDependencies: + - '@types/react' dev: true - /raw-body/2.5.1: - resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} - engines: {node: '>= 0.8'} + /react/16.14.0: + resolution: {integrity: sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==} + engines: {node: '>=0.10.0'} dependencies: - bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - unpipe: 1.0.0 + loose-envify: 1.4.0 + object-assign: 4.1.1 + prop-types: 15.8.1 dev: true /read-pkg-up/7.0.1: @@ -5329,6 +12111,15 @@ packages: type-fest: 0.8.1 dev: true + /read-pkg-up/8.0.0: + resolution: {integrity: sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==} + engines: {node: '>=12'} + dependencies: + find-up: 5.0.0 + read-pkg: 6.0.0 + type-fest: 1.4.0 + dev: true + /read-pkg/5.2.0: resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} engines: {node: '>=8'} @@ -5339,6 +12130,16 @@ packages: type-fest: 0.6.0 dev: true + /read-pkg/6.0.0: + resolution: {integrity: sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==} + engines: {node: '>=12'} + dependencies: + '@types/normalize-package-data': 2.4.1 + normalize-package-data: 3.0.3 + parse-json: 5.2.0 + type-fest: 1.4.0 + dev: true + /readable-stream/2.3.7: resolution: {integrity: sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==} dependencies: @@ -5391,10 +12192,47 @@ packages: strip-indent: 3.0.0 dev: true + /redent/4.0.0: + resolution: {integrity: sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==} + engines: {node: '>=12'} + dependencies: + indent-string: 5.0.0 + strip-indent: 4.0.0 + dev: true + + /refractor/3.6.0: + resolution: {integrity: sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==} + dependencies: + hastscript: 6.0.0 + parse-entities: 2.0.0 + prismjs: 1.27.0 + dev: true + + /regenerate-unicode-properties/10.0.1: + resolution: {integrity: sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==} + engines: {node: '>=4'} + dependencies: + regenerate: 1.4.2 + dev: true + + /regenerate/1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + dev: true + /regenerator-runtime/0.11.1: resolution: {integrity: sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==} dev: true + /regenerator-runtime/0.13.9: + resolution: {integrity: sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==} + dev: true + + /regenerator-transform/0.15.0: + resolution: {integrity: sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==} + dependencies: + '@babel/runtime': 7.17.9 + dev: true + /regex-cache/0.4.4: resolution: {integrity: sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==} engines: {node: '>=0.10.0'} @@ -5410,15 +12248,125 @@ packages: safe-regex: 1.1.0 dev: true + /regexp.prototype.flags/1.4.2: + resolution: {integrity: sha512-Ynz8fTQW5/1elh+jWU2EDDzeoNbD0OQ0R+D1VJU5ATOkUaro4A9YEkdN2ODQl/8UQFPPpZNw91fOcLFamM7Pww==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + dev: true + /regexpp/3.2.0: resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} engines: {node: '>=8'} dev: true + /regexpu-core/5.0.1: + resolution: {integrity: sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw==} + engines: {node: '>=4'} + dependencies: + regenerate: 1.4.2 + regenerate-unicode-properties: 10.0.1 + regjsgen: 0.6.0 + regjsparser: 0.8.4 + unicode-match-property-ecmascript: 2.0.0 + unicode-match-property-value-ecmascript: 2.0.0 + dev: true + + /regjsgen/0.6.0: + resolution: {integrity: sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==} + dev: true + + /regjsparser/0.8.4: + resolution: {integrity: sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==} + hasBin: true + dependencies: + jsesc: 0.5.0 + dev: true + + /relateurl/0.2.7: + resolution: {integrity: sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=} + engines: {node: '>= 0.10'} + dev: true + + /remark-external-links/8.0.0: + resolution: {integrity: sha512-5vPSX0kHoSsqtdftSHhIYofVINC8qmp0nctkeU9YoJwV3YfiBRiI6cbFRJ0oI/1F9xS+bopXG0m2KS8VFscuKA==} + dependencies: + extend: 3.0.2 + is-absolute-url: 3.0.3 + mdast-util-definitions: 4.0.0 + space-separated-tokens: 1.1.5 + unist-util-visit: 2.0.3 + dev: true + + /remark-footnotes/2.0.0: + resolution: {integrity: sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ==} + dev: true + + /remark-mdx/1.6.22: + resolution: {integrity: sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ==} + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.10.4 + '@babel/plugin-proposal-object-rest-spread': 7.12.1_@babel+core@7.12.9 + '@babel/plugin-syntax-jsx': 7.12.1_@babel+core@7.12.9 + '@mdx-js/util': 1.6.22 + is-alphabetical: 1.0.4 + remark-parse: 8.0.3 + unified: 9.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /remark-parse/8.0.3: + resolution: {integrity: sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==} + dependencies: + ccount: 1.1.0 + collapse-white-space: 1.0.6 + is-alphabetical: 1.0.4 + is-decimal: 1.0.4 + is-whitespace-character: 1.0.4 + is-word-character: 1.0.4 + markdown-escapes: 1.0.4 + parse-entities: 2.0.0 + repeat-string: 1.6.1 + state-toggle: 1.0.3 + trim: 0.0.1 + trim-trailing-lines: 1.1.4 + unherit: 1.1.3 + unist-util-remove-position: 2.0.1 + vfile-location: 3.2.0 + xtend: 4.0.2 + dev: true + + /remark-slug/6.1.0: + resolution: {integrity: sha512-oGCxDF9deA8phWvxFuyr3oSJsdyUAxMFbA0mZ7Y1Sas+emILtO+e5WutF9564gDsEN4IXaQXm5pFo6MLH+YmwQ==} + dependencies: + github-slugger: 1.4.0 + mdast-util-to-string: 1.1.0 + unist-util-visit: 2.0.3 + dev: true + + /remark-squeeze-paragraphs/4.0.0: + resolution: {integrity: sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw==} + dependencies: + mdast-squeeze-paragraphs: 4.0.0 + dev: true + /remove-trailing-separator/1.1.0: resolution: {integrity: sha1-wkvOKig62tW8P1jg1IJJuSN52O8=} dev: true + /renderkid/2.0.7: + resolution: {integrity: sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==} + dependencies: + css-select: 4.3.0 + dom-converter: 0.2.0 + htmlparser2: 6.1.0 + lodash: 4.17.21 + strip-ansi: 3.0.1 + dev: true + /repeat-element/1.1.4: resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==} engines: {node: '>=0.10.0'} @@ -5517,14 +12465,6 @@ packages: supports-preserve-symlinks-flag: 1.0.0 dev: true - /resp-modifier/6.0.2: - resolution: {integrity: sha1-sSTeXE+6/LpUH0j/pzlw9KpFa08=} - engines: {node: '>= 0.8.0'} - dependencies: - debug: 2.6.9 - minimatch: 3.1.2 - dev: true - /restore-cursor/2.0.0: resolution: {integrity: sha1-n37ih/gv0ybU/RYpI9YhKe7g368=} engines: {node: '>=4'} @@ -5555,6 +12495,11 @@ packages: engines: {node: '>= 4'} dev: true + /reusify/1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + /rfdc/1.3.0: resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} dev: true @@ -5580,6 +12525,13 @@ packages: glob: 7.2.0 dev: true + /ripemd160/2.0.2: + resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} + dependencies: + hash-base: 3.1.0 + inherits: 2.0.4 + dev: true + /rollup/0.58.2: resolution: {integrity: sha512-RZVvCWm9BHOYloaE6LLiE/ibpjv1CmI8F8k0B0Cp+q1eezo3cswszJH1DN0djgzSlo0hjuuCmyeI+1XOYLl4wg==} hasBin: true @@ -5593,20 +12545,26 @@ packages: engines: {node: 0.12.* || 4.* || 6.* || >= 7.*} dev: true + /rsvp/4.8.5: + resolution: {integrity: sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==} + engines: {node: 6.* || >= 7.*} + dev: true + /run-async/2.4.1: resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} engines: {node: '>=0.12.0'} dev: true - /rx/4.1.0: - resolution: {integrity: sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=} + /run-parallel/1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 dev: true - /rxjs/5.5.12: - resolution: {integrity: sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==} - engines: {npm: '>=2.0.0'} + /run-queue/1.0.3: + resolution: {integrity: sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=} dependencies: - symbol-observable: 1.0.1 + aproba: 1.2.0 dev: true /rxjs/6.6.7: @@ -5622,6 +12580,10 @@ packages: tslib: 2.3.1 dev: true + /safe-buffer/5.1.1: + resolution: {integrity: sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==} + dev: true + /safe-buffer/5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} dev: true @@ -5646,24 +12608,119 @@ packages: deprecated: some dependency vulnerabilities fixed, support for node < 10 dropped, and newer ECMAScript syntax/features added hasBin: true dependencies: - anymatch: 1.3.2 - exec-sh: 0.2.2 - fb-watchman: 2.0.1 - minimatch: 3.1.2 - minimist: 1.2.6 - walker: 1.0.8 - watch: 0.10.0 + anymatch: 1.3.2 + exec-sh: 0.2.2 + fb-watchman: 2.0.1 + minimatch: 3.1.2 + minimist: 1.2.6 + walker: 1.0.8 + watch: 0.10.0 + dev: true + + /sane/4.1.0: + resolution: {integrity: sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==} + engines: {node: 6.* || 8.* || >= 10.*} + deprecated: some dependency vulnerabilities fixed, support for node < 10 dropped, and newer ECMAScript syntax/features added + hasBin: true + dependencies: + '@cnakazawa/watch': 1.0.4 + anymatch: 2.0.0 + capture-exit: 2.0.0 + exec-sh: 0.3.6 + execa: 1.0.0 + fb-watchman: 2.0.1 + micromatch: 3.1.10 + minimist: 1.2.6 + walker: 1.0.8 + dev: true + + /sass-graph/4.0.0: + resolution: {integrity: sha512-WSO/MfXqKH7/TS8RdkCX3lVkPFQzCgbqdGsmSKq6tlPU+GpGEsa/5aW18JqItnqh+lPtcjifqdZ/VmiILkKckQ==} + engines: {node: '>=12'} + hasBin: true + dependencies: + glob: 7.2.0 + lodash: 4.17.21 + scss-tokenizer: 0.3.0 + yargs: 17.4.1 + dev: true + + /sass-loader/10.2.1_node-sass@7.0.1+sass@1.50.0: + resolution: {integrity: sha512-RRvWl+3K2LSMezIsd008ErK4rk6CulIMSwrcc2aZvjymUgKo/vjXGp1rSWmfTUX7bblEOz8tst4wBwWtCGBqKA==} + engines: {node: '>= 10.13.0'} + peerDependencies: + fibers: '>= 3.1.0' + node-sass: ^4.0.0 || ^5.0.0 || ^6.0.0 + sass: ^1.3.0 + webpack: ^4.36.0 || ^5.0.0 + peerDependenciesMeta: + fibers: + optional: true + node-sass: + optional: true + sass: + optional: true + dependencies: + klona: 2.0.5 + loader-utils: 2.0.2 + neo-async: 2.6.2 + node-sass: 7.0.1 + sass: 1.50.0 + schema-utils: 3.1.1 + semver: 7.3.7 + dev: true + + /sass/1.50.0: + resolution: {integrity: sha512-cLsD6MEZ5URXHStxApajEh7gW189kkjn4Rc8DQweMyF+o5HF5nfEz8QYLMlPsTOD88DknatTmBWkOcw5/LnJLQ==} + engines: {node: '>=12.0.0'} + hasBin: true + dependencies: + chokidar: 3.5.3 + immutable: 4.0.0 + source-map-js: 1.0.2 + dev: true + + /scheduler/0.19.1: + resolution: {integrity: sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==} + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + dev: true + + /schema-utils/1.0.0: + resolution: {integrity: sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==} + engines: {node: '>= 4'} + dependencies: + ajv: 6.12.6 + ajv-errors: 1.0.1_ajv@6.12.6 + ajv-keywords: 3.5.2_ajv@6.12.6 + dev: true + + /schema-utils/2.7.0: + resolution: {integrity: sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==} + engines: {node: '>= 8.9.0'} + dependencies: + '@types/json-schema': 7.0.11 + ajv: 6.12.6 + ajv-keywords: 3.5.2_ajv@6.12.6 + dev: true + + /schema-utils/2.7.1: + resolution: {integrity: sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==} + engines: {node: '>= 8.9.0'} + dependencies: + '@types/json-schema': 7.0.11 + ajv: 6.12.6 + ajv-keywords: 3.5.2_ajv@6.12.6 dev: true - /sass-graph/4.0.0: - resolution: {integrity: sha512-WSO/MfXqKH7/TS8RdkCX3lVkPFQzCgbqdGsmSKq6tlPU+GpGEsa/5aW18JqItnqh+lPtcjifqdZ/VmiILkKckQ==} - engines: {node: '>=12'} - hasBin: true + /schema-utils/3.1.1: + resolution: {integrity: sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==} + engines: {node: '>= 10.13.0'} dependencies: - glob: 7.2.0 - lodash: 4.17.21 - scss-tokenizer: 0.3.0 - yargs: 17.4.1 + '@types/json-schema': 7.0.11 + ajv: 6.12.6 + ajv-keywords: 3.5.2_ajv@6.12.6 dev: true /scss-tokenizer/0.3.0: @@ -5683,6 +12740,16 @@ packages: hasBin: true dev: true + /semver/6.3.0: + resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} + hasBin: true + dev: true + + /semver/7.0.0: + resolution: {integrity: sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==} + hasBin: true + dev: true + /semver/7.3.5: resolution: {integrity: sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==} engines: {node: '>=10'} @@ -5699,8 +12766,8 @@ packages: lru-cache: 6.0.0 dev: true - /send/0.16.2: - resolution: {integrity: sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==} + /send/0.17.2: + resolution: {integrity: sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==} engines: {node: '>= 0.8.0'} dependencies: debug: 2.6.9 @@ -5710,39 +12777,45 @@ packages: escape-html: 1.0.3 etag: 1.8.1 fresh: 0.5.2 - http-errors: 1.6.3 - mime: 1.4.1 - ms: 2.0.0 + http-errors: 1.8.1 + mime: 1.6.0 + ms: 2.1.3 on-finished: 2.3.0 range-parser: 1.2.1 - statuses: 1.4.0 + statuses: 1.5.0 + dev: true + + /serialize-javascript/4.0.0: + resolution: {integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==} + dependencies: + randombytes: 2.1.0 dev: true - /serve-index/1.9.1: - resolution: {integrity: sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=} + /serialize-javascript/5.0.1: + resolution: {integrity: sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==} + dependencies: + randombytes: 2.1.0 + dev: true + + /serve-favicon/2.5.0: + resolution: {integrity: sha1-k10kDN/g9YBTB/3+ln2IlCosvPA=} engines: {node: '>= 0.8.0'} dependencies: - accepts: 1.3.8 - batch: 0.6.1 - debug: 2.6.9 - escape-html: 1.0.3 - http-errors: 1.6.3 - mime-types: 2.1.35 + etag: 1.8.1 + fresh: 0.5.2 + ms: 2.1.1 parseurl: 1.3.3 + safe-buffer: 5.1.1 dev: true - /serve-static/1.13.2: - resolution: {integrity: sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==} + /serve-static/1.14.2: + resolution: {integrity: sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==} engines: {node: '>= 0.8.0'} dependencies: encodeurl: 1.0.2 escape-html: 1.0.3 parseurl: 1.3.3 - send: 0.16.2 - dev: true - - /server-destroy/1.0.1: - resolution: {integrity: sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0=} + send: 0.17.2 dev: true /set-blocking/2.0.0: @@ -5759,14 +12832,40 @@ packages: split-string: 3.1.0 dev: true - /setprototypeof/1.1.0: - resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} + /setimmediate/1.0.5: + resolution: {integrity: sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=} dev: true /setprototypeof/1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} dev: true + /sha.js/2.4.11: + resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} + hasBin: true + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: true + + /shallow-clone/3.0.1: + resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} + engines: {node: '>=8'} + dependencies: + kind-of: 6.0.3 + dev: true + + /shallowequal/1.1.0: + resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} + dev: true + + /shebang-command/1.2.0: + resolution: {integrity: sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=} + engines: {node: '>=0.10.0'} + dependencies: + shebang-regex: 1.0.0 + dev: true + /shebang-command/2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -5774,6 +12873,11 @@ packages: shebang-regex: 3.0.0 dev: true + /shebang-regex/1.0.0: + resolution: {integrity: sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=} + engines: {node: '>=0.10.0'} + dev: true + /shebang-regex/3.0.0: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} @@ -5797,11 +12901,25 @@ packages: requiresBuild: true dev: true + /sisteransi/1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + dev: true + /slash/1.0.0: resolution: {integrity: sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=} engines: {node: '>=0.10.0'} dev: true + /slash/2.0.0: + resolution: {integrity: sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==} + engines: {node: '>=6'} + dev: true + + /slash/3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: true + /smart-buffer/4.2.0: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} @@ -5841,22 +12959,6 @@ packages: resolution: {integrity: sha512-Qd/iwn3VskrpNO60BeRyCyr8ZWw9CPZyitW4AQwmRZ8zCiyDiL+znRnWX6tDHXnWn1sJrM1+b6Mn6wEDJJ4aYQ==} dev: true - /socket.io-client/4.4.1: - resolution: {integrity: sha512-N5C/L5fLNha5Ojd7Yeb/puKcPWWcoB/A09fEjjNsg91EDVr5twk/OEyO6VT9dlLSUNY85NpW6KBhVMvaLKQ3vQ==} - engines: {node: '>=10.0.0'} - dependencies: - '@socket.io/component-emitter': 3.0.0 - backo2: 1.0.2 - debug: 4.3.4 - engine.io-client: 6.1.1 - parseuri: 0.0.6 - socket.io-parser: 4.1.2 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: true - /socket.io-parser/4.0.4: resolution: {integrity: sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==} engines: {node: '>=10.0.0'} @@ -5868,16 +12970,6 @@ packages: - supports-color dev: true - /socket.io-parser/4.1.2: - resolution: {integrity: sha512-j3kk71QLJuyQ/hh5F/L2t1goqzdTL0gvDzuhTuNSwihfuFUrcSji0qFZmJJPtG6Rmug153eOPsUizeirf1IIog==} - engines: {node: '>=10.0.0'} - dependencies: - '@socket.io/component-emitter': 3.0.0 - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: true - /socket.io/4.4.1: resolution: {integrity: sha512-s04vrBswdQBUmuWJuuNTmXUVJhP0cVky8bBDhdkf8y0Ptsu7fKU2LuLbts9g+pdmAdyMMn8F/9Mf1/wbtUN0fg==} engines: {node: '>=10.0.0'} @@ -5913,6 +13005,10 @@ packages: smart-buffer: 4.2.0 dev: true + /source-list-map/2.0.1: + resolution: {integrity: sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==} + dev: true + /source-map-js/1.0.2: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} @@ -5941,6 +13037,13 @@ packages: source-map: 0.5.7 dev: true + /source-map-support/0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: true + /source-map-url/0.4.1: resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==} deprecated: See https://github.com/lydell/source-map-url#deprecated @@ -5968,6 +13071,10 @@ packages: engines: {node: '>= 8'} dev: true + /space-separated-tokens/1.1.5: + resolution: {integrity: sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==} + dev: true + /spdx-correct/3.1.1: resolution: {integrity: sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==} dependencies: @@ -6003,6 +13110,10 @@ packages: readable-stream: 3.6.0 dev: true + /sprintf-js/1.0.3: + resolution: {integrity: sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=} + dev: true + /sshpk/1.17.0: resolution: {integrity: sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==} engines: {node: '>=0.10.0'} @@ -6019,6 +13130,12 @@ packages: tweetnacl: 0.14.5 dev: true + /ssri/6.0.2: + resolution: {integrity: sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==} + dependencies: + figgy-pudding: 3.5.2 + dev: true + /ssri/8.0.1: resolution: {integrity: sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==} engines: {node: '>= 8'} @@ -6030,6 +13147,10 @@ packages: resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} dev: true + /state-toggle/1.0.3: + resolution: {integrity: sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==} + dev: true + /static-extend/0.1.2: resolution: {integrity: sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=} engines: {node: '>=0.10.0'} @@ -6038,16 +13159,6 @@ packages: object-copy: 0.1.0 dev: true - /statuses/1.3.1: - resolution: {integrity: sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=} - engines: {node: '>= 0.6'} - dev: true - - /statuses/1.4.0: - resolution: {integrity: sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==} - engines: {node: '>= 0.6'} - dev: true - /statuses/1.5.0: resolution: {integrity: sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=} engines: {node: '>= 0.6'} @@ -6064,13 +13175,36 @@ packages: readable-stream: 2.3.7 dev: true - /stream-throttle/0.1.3: - resolution: {integrity: sha1-rdV8jXzHOoFjDTHNVdOWHPr7qcM=} - engines: {node: '>= 0.10.0'} - hasBin: true + /store2/2.13.2: + resolution: {integrity: sha512-CMtO2Uneg3SAz/d6fZ/6qbqqQHi2ynq6/KzMD/26gTkiEShCcpqFfTHgOxsE0egAq6SX3FmN4CeSqn8BzXQkJg==} + dev: true + + /stream-browserify/2.0.2: + resolution: {integrity: sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==} dependencies: - commander: 2.20.3 - limiter: 1.1.5 + inherits: 2.0.4 + readable-stream: 2.3.7 + dev: true + + /stream-each/1.2.3: + resolution: {integrity: sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==} + dependencies: + end-of-stream: 1.4.4 + stream-shift: 1.0.1 + dev: true + + /stream-http/2.8.3: + resolution: {integrity: sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==} + dependencies: + builtin-status-codes: 3.0.0 + inherits: 2.0.4 + readable-stream: 2.3.7 + to-arraybuffer: 1.0.1 + xtend: 4.0.2 + dev: true + + /stream-shift/1.0.1: + resolution: {integrity: sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==} dev: true /streamroller/3.0.6: @@ -6101,6 +13235,51 @@ packages: strip-ansi: 6.0.1 dev: true + /string.prototype.matchall/4.0.7: + resolution: {integrity: sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + es-abstract: 1.19.5 + get-intrinsic: 1.1.1 + has-symbols: 1.0.3 + internal-slot: 1.0.3 + regexp.prototype.flags: 1.4.2 + side-channel: 1.0.4 + dev: true + + /string.prototype.padend/3.1.3: + resolution: {integrity: sha512-jNIIeokznm8SD/TZISQsZKYu7RJyheFNt84DUPrh482GC8RVp2MKqm2O5oBRdGxbDQoXrhhWtPIWQOiy20svUg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + es-abstract: 1.19.5 + dev: true + + /string.prototype.padstart/3.1.3: + resolution: {integrity: sha512-NZydyOMtYxpTjGqp0VN5PYUF/tsU15yDMZnUdj16qRUIUiMJkHHSDElYyQFrMu+/WloTpA7MQSiADhBicDfaoA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + es-abstract: 1.19.5 + dev: true + + /string.prototype.trimend/1.0.4: + resolution: {integrity: sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + dev: true + + /string.prototype.trimstart/1.0.4: + resolution: {integrity: sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + dev: true + /string_decoder/1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} dependencies: @@ -6146,6 +13325,11 @@ packages: engines: {node: '>=8'} dev: true + /strip-eof/1.0.0: + resolution: {integrity: sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=} + engines: {node: '>=0.10.0'} + dev: true + /strip-final-newline/2.0.0: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} @@ -6158,6 +13342,13 @@ packages: min-indent: 1.0.1 dev: true + /strip-indent/4.0.0: + resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==} + engines: {node: '>=12'} + dependencies: + min-indent: 1.0.1 + dev: true + /strip-json-comments/3.0.1: resolution: {integrity: sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==} engines: {node: '>=8'} @@ -6168,6 +13359,33 @@ packages: engines: {node: '>=8'} dev: true + /style-loader/1.3.0_webpack@4.46.0: + resolution: {integrity: sha512-V7TCORko8rs9rIqkSrlMfkqA63DfoGBBJmK1kKGCcSi+BWb4cqz0SRsnp4l6rU5iwOEd0/2ePv68SV22VXon4Q==} + engines: {node: '>= 8.9.0'} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + dependencies: + loader-utils: 2.0.2 + schema-utils: 2.7.1 + webpack: 4.46.0 + dev: true + + /style-loader/2.0.0: + resolution: {integrity: sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ==} + engines: {node: '>= 10.13.0'} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + dependencies: + loader-utils: 2.0.2 + schema-utils: 3.1.1 + dev: true + + /style-to-object/0.3.0: + resolution: {integrity: sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==} + dependencies: + inline-style-parser: 0.1.1 + dev: true + /stylehacks/5.1.0_postcss@8.4.12: resolution: {integrity: sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q==} engines: {node: ^10 || ^12 || >=14.0} @@ -6217,9 +13435,18 @@ packages: stable: 0.1.8 dev: true - /symbol-observable/1.0.1: - resolution: {integrity: sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=} - engines: {node: '>=0.10.0'} + /symbol.prototype.description/1.0.5: + resolution: {integrity: sha512-x738iXRYsrAt9WBhRCVG5BtIC3B7CUkFwbHW2zOvGtwM33s7JjrCDyq8V0zgMYVb5ymsL8+qkzzpANH63CPQaQ==} + engines: {node: '>= 0.11.15'} + dependencies: + call-bind: 1.0.2 + get-symbol-description: 1.0.0 + has-symbols: 1.0.3 + object.getownpropertydescriptors: 2.1.3 + dev: true + + /synchronous-promise/2.0.15: + resolution: {integrity: sha512-k8uzYIkIVwmT+TcglpdN50pS2y1BDcUnBPK9iJeGu0Pl1lOI8pD6wtzgw91Pjpe+RxtTncw32tLxs/R0yNL2Mg==} dev: true /systemjs-builder/0.16.13: @@ -6254,6 +13481,11 @@ packages: resolution: {integrity: sha512-l1O8boHjAIY5UG74Xk4B63LK9QbFxv/FkQa//GGGWaTeQoMhTsWnFrYwPWBScSF4xQFMO/+v9QB4i633h8Oytw==} dev: true + /tapable/1.1.3: + resolution: {integrity: sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==} + engines: {node: '>=6'} + dev: true + /tar-fs/1.16.3: resolution: {integrity: sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw==} dependencies: @@ -6288,6 +13520,85 @@ packages: yallist: 4.0.0 dev: true + /telejson/5.3.3: + resolution: {integrity: sha512-PjqkJZpzEggA9TBpVtJi1LVptP7tYtXB6rEubwlHap76AMjzvOdKX41CxyaW7ahhzDU1aftXnMCx5kAPDZTQBA==} + dependencies: + '@types/is-function': 1.0.1 + global: 4.4.0 + is-function: 1.0.2 + is-regex: 1.1.4 + is-symbol: 1.0.4 + isobject: 4.0.0 + lodash: 4.17.21 + memoizerific: 1.11.3 + dev: true + + /terser-webpack-plugin/1.4.5_webpack@4.46.0: + resolution: {integrity: sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==} + engines: {node: '>= 6.9.0'} + peerDependencies: + webpack: ^4.0.0 + dependencies: + cacache: 12.0.4 + find-cache-dir: 2.1.0 + is-wsl: 1.1.0 + schema-utils: 1.0.0 + serialize-javascript: 4.0.0 + source-map: 0.6.1 + terser: 4.8.0 + webpack: 4.46.0 + webpack-sources: 1.4.3 + worker-farm: 1.7.0 + dev: true + + /terser-webpack-plugin/4.2.3_webpack@4.46.0: + resolution: {integrity: sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ==} + engines: {node: '>= 10.13.0'} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + dependencies: + cacache: 15.3.0 + find-cache-dir: 3.3.2 + jest-worker: 26.6.2 + p-limit: 3.1.0 + schema-utils: 3.1.1 + serialize-javascript: 5.0.1 + source-map: 0.6.1 + terser: 5.12.1 + webpack: 4.46.0 + webpack-sources: 1.4.3 + dev: true + + /terser/4.8.0: + resolution: {integrity: sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + commander: 2.20.3 + source-map: 0.6.1 + source-map-support: 0.5.21 + dev: true + + /terser/5.12.1: + resolution: {integrity: sha512-NXbs+7nisos5E+yXwAD+y7zrcTkMqb0dEJxIGtSKPdCBzopf7ni4odPul2aechpV7EXNvOudYOX2bb5tln1jbQ==} + engines: {node: '>=10'} + hasBin: true + dependencies: + acorn: 8.7.0 + commander: 2.20.3 + source-map: 0.7.3 + source-map-support: 0.5.21 + dev: true + + /test-exclude/6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.0 + minimatch: 3.1.2 + dev: true + /text-extensions/1.9.0: resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} engines: {node: '>=0.10'} @@ -6297,13 +13608,6 @@ packages: resolution: {integrity: sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=} dev: true - /tfunk/4.0.0: - resolution: {integrity: sha512-eJQ0dGfDIzWNiFNYFVjJ+Ezl/GmwHaFTBTjrtqNPW0S7cuVDBrZrmzUz6VkMeCR4DZFqhd4YtLwsw3i2wYHswQ==} - dependencies: - chalk: 1.1.3 - dlv: 1.1.3 - dev: true - /thenify-all/1.6.0: resolution: {integrity: sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=} engines: {node: '>=0.8'} @@ -6317,6 +13621,11 @@ packages: any-promise: 1.3.0 dev: true + /throttle-debounce/3.0.1: + resolution: {integrity: sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==} + engines: {node: '>=10'} + dev: true + /throttleit/1.0.0: resolution: {integrity: sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=} dev: true @@ -6325,12 +13634,26 @@ packages: resolution: {integrity: sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=} dev: true + /through2/2.0.5: + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + dependencies: + readable-stream: 2.3.7 + xtend: 4.0.2 + dev: true + /through2/4.0.2: resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} dependencies: readable-stream: 3.6.0 dev: true + /timers-browserify/2.0.12: + resolution: {integrity: sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==} + engines: {node: '>=0.6.0'} + dependencies: + setimmediate: 1.0.5 + dev: true + /timers-ext/0.1.7: resolution: {integrity: sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==} dependencies: @@ -6356,6 +13679,10 @@ packages: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} dev: true + /to-arraybuffer/1.0.1: + resolution: {integrity: sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=} + dev: true + /to-buffer/1.1.1: resolution: {integrity: sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==} dev: true @@ -6365,6 +13692,11 @@ packages: engines: {node: '>=0.10.0'} dev: true + /to-fast-properties/2.0.0: + resolution: {integrity: sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=} + engines: {node: '>=4'} + dev: true + /to-object-path/0.3.0: resolution: {integrity: sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=} engines: {node: '>=0.10.0'} @@ -6397,6 +13729,10 @@ packages: safe-regex: 1.1.0 dev: true + /toggle-selection/1.0.6: + resolution: {integrity: sha1-bkWxJj8gF/oKzH2J14sVuL932jI=} + dev: true + /toidentifier/1.0.1: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} @@ -6410,6 +13746,10 @@ packages: punycode: 2.1.1 dev: true + /tr46/0.0.3: + resolution: {integrity: sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=} + dev: true + /traceur/0.0.105: resolution: {integrity: sha1-XPne6D1rd4YcPWxE1ThZrterBHk=} engines: {node: '>=0.10'} @@ -6427,17 +13767,39 @@ packages: engines: {node: '>=8'} dev: true + /trim-newlines/4.0.2: + resolution: {integrity: sha512-GJtWyq9InR/2HRiLZgpIKv+ufIKrVrvjQWEj7PxAXNc5dwbNJkqhAUoAGgzRmULAnoOM5EIpveYd3J2VeSAIew==} + engines: {node: '>=12'} + dev: true + /trim-right/1.0.1: resolution: {integrity: sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=} engines: {node: '>=0.10.0'} dev: true + /trim-trailing-lines/1.1.4: + resolution: {integrity: sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==} + dev: true + + /trim/0.0.1: + resolution: {integrity: sha1-WFhUf2spB1fulczMZm+1AITEYN0=} + dev: true + + /trough/1.0.5: + resolution: {integrity: sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==} + dev: true + /true-case-path/1.0.3: resolution: {integrity: sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==} dependencies: glob: 7.2.0 dev: true + /ts-dedent/2.2.0: + resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} + engines: {node: '>=6.10'} + dev: true + /ts-node/10.7.0_ee885bc7281b682b6adbed6ae09ee090: resolution: {integrity: sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A==} hasBin: true @@ -6469,6 +13831,16 @@ packages: yn: 3.1.1 dev: true + /ts-pnp/1.2.0: + resolution: {integrity: sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==} + engines: {node: '>=6'} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dev: true + /tslib/1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} dev: true @@ -6477,6 +13849,10 @@ packages: resolution: {integrity: sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==} dev: true + /tty-browserify/0.0.0: + resolution: {integrity: sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=} + dev: true + /tunnel-agent/0.6.0: resolution: {integrity: sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=} dependencies: @@ -6487,6 +13863,13 @@ packages: resolution: {integrity: sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=} dev: true + /type-check/0.3.2: + resolution: {integrity: sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.1.2 + dev: true + /type-check/0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -6519,6 +13902,11 @@ packages: engines: {node: '>=8'} dev: true + /type-fest/1.4.0: + resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} + engines: {node: '>=10'} + dev: true + /type-is/1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} @@ -6535,6 +13923,12 @@ packages: resolution: {integrity: sha512-eiDBDOmkih5pMbo9OqsqPRGMljLodLcwd5XD5JbtNB0o89xZAwynY9EdCDsJU7LtcVCClu9DvM7/0Ep1hYX3EQ==} dev: true + /typedarray-to-buffer/3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + dependencies: + is-typedarray: 1.0.0 + dev: true + /typedarray/0.0.6: resolution: {integrity: sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=} dev: true @@ -6549,10 +13943,6 @@ packages: resolution: {integrity: sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==} dev: true - /ua-parser-js/1.0.2: - resolution: {integrity: sha512-00y/AXhx0/SsnI51fTc0rLRmafiGOM4/O+ny10Ps7f+j/b8p/ZY11ytMgznXkOVo4GQ+KwQG5UQLkLGirsACRg==} - dev: true - /uglify-js/2.8.29: resolution: {integrity: sha1-KcVzMUgFe7Th913zW3qcty5qWd0=} engines: {node: '>=0.8.0'} @@ -6564,17 +13954,79 @@ packages: uglify-to-browserify: 1.0.2 dev: true + /uglify-js/3.15.4: + resolution: {integrity: sha512-vMOPGDuvXecPs34V74qDKk4iJ/SN4vL3Ow/23ixafENYvtrNvtbcgUeugTcUGRGsOF/5fU8/NYSL5Hyb3l1OJA==} + engines: {node: '>=0.8.0'} + hasBin: true + requiresBuild: true + dev: true + optional: true + /uglify-to-browserify/1.0.2: resolution: {integrity: sha1-bgkk1r2mta/jSeOabWMoUKD4grc=} requiresBuild: true dev: true optional: true + /unbox-primitive/1.0.1: + resolution: {integrity: sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==} + dependencies: + function-bind: 1.1.1 + has-bigints: 1.0.1 + has-symbols: 1.0.3 + which-boxed-primitive: 1.0.2 + dev: true + /unc-path-regex/0.1.2: resolution: {integrity: sha1-5z3T17DXxe2G+6xrCufYxqadUPo=} engines: {node: '>=0.10.0'} dev: true + /unfetch/4.2.0: + resolution: {integrity: sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==} + dev: true + + /unherit/1.1.3: + resolution: {integrity: sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==} + dependencies: + inherits: 2.0.4 + xtend: 4.0.2 + dev: true + + /unicode-canonical-property-names-ecmascript/2.0.0: + resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} + engines: {node: '>=4'} + dev: true + + /unicode-match-property-ecmascript/2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + dependencies: + unicode-canonical-property-names-ecmascript: 2.0.0 + unicode-property-aliases-ecmascript: 2.0.0 + dev: true + + /unicode-match-property-value-ecmascript/2.0.0: + resolution: {integrity: sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==} + engines: {node: '>=4'} + dev: true + + /unicode-property-aliases-ecmascript/2.0.0: + resolution: {integrity: sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==} + engines: {node: '>=4'} + dev: true + + /unified/9.2.0: + resolution: {integrity: sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==} + dependencies: + bail: 1.0.5 + extend: 3.0.2 + is-buffer: 2.0.5 + is-plain-obj: 2.1.0 + trough: 1.0.5 + vfile: 4.2.1 + dev: true + /union-value/1.0.1: resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} engines: {node: '>=0.10.0'} @@ -6597,6 +14049,55 @@ packages: imurmurhash: 0.1.4 dev: true + /unist-builder/2.0.3: + resolution: {integrity: sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==} + dev: true + + /unist-util-generated/1.1.6: + resolution: {integrity: sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==} + dev: true + + /unist-util-is/4.1.0: + resolution: {integrity: sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==} + dev: true + + /unist-util-position/3.1.0: + resolution: {integrity: sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==} + dev: true + + /unist-util-remove-position/2.0.1: + resolution: {integrity: sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==} + dependencies: + unist-util-visit: 2.0.3 + dev: true + + /unist-util-remove/2.1.0: + resolution: {integrity: sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q==} + dependencies: + unist-util-is: 4.1.0 + dev: true + + /unist-util-stringify-position/2.0.3: + resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} + dependencies: + '@types/unist': 2.0.6 + dev: true + + /unist-util-visit-parents/3.1.1: + resolution: {integrity: sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==} + dependencies: + '@types/unist': 2.0.6 + unist-util-is: 4.1.0 + dev: true + + /unist-util-visit/2.0.3: + resolution: {integrity: sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==} + dependencies: + '@types/unist': 2.0.6 + unist-util-is: 4.1.0 + unist-util-visit-parents: 3.1.1 + dev: true + /universalify/0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} @@ -6620,6 +14121,12 @@ packages: isobject: 3.0.1 dev: true + /upath/1.2.0: + resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} + engines: {node: '>=4'} + dev: true + optional: true + /uri-js/4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: @@ -6631,6 +14138,91 @@ packages: deprecated: Please see https://github.com/lydell/urix#deprecated dev: true + /url-loader/4.1.1_file-loader@6.2.0+webpack@4.46.0: + resolution: {integrity: sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==} + engines: {node: '>= 10.13.0'} + peerDependencies: + file-loader: '*' + webpack: ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + file-loader: + optional: true + dependencies: + file-loader: 6.2.0_webpack@4.46.0 + loader-utils: 2.0.2 + mime-types: 2.1.35 + schema-utils: 3.1.1 + webpack: 4.46.0 + dev: true + + /url/0.11.0: + resolution: {integrity: sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=} + dependencies: + punycode: 1.3.2 + querystring: 0.2.0 + dev: true + + /use-composed-ref/1.2.1: + resolution: {integrity: sha512-6+X1FLlIcjvFMAeAD/hcxDT8tmyrWnbSPMU0EnxQuDLIxokuFzWliXBiYZuGIx+mrAMLBw0WFfCkaPw8ebzAhw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + dev: true + + /use-composed-ref/1.2.1_react@16.14.0: + resolution: {integrity: sha512-6+X1FLlIcjvFMAeAD/hcxDT8tmyrWnbSPMU0EnxQuDLIxokuFzWliXBiYZuGIx+mrAMLBw0WFfCkaPw8ebzAhw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + dependencies: + react: 16.14.0 + dev: true + + /use-isomorphic-layout-effect/1.1.2: + resolution: {integrity: sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dev: true + + /use-isomorphic-layout-effect/1.1.2_react@16.14.0: + resolution: {integrity: sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + react: 16.14.0 + dev: true + + /use-latest/1.2.0: + resolution: {integrity: sha512-d2TEuG6nSLKQLAfW3By8mKr8HurOlTkul0sOpxbClIv4SQ4iOd7BYr7VIzdbktUCnv7dua/60xzd8igMU6jmyw==} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + use-isomorphic-layout-effect: 1.1.2 + dev: true + + /use-latest/1.2.0_react@16.14.0: + resolution: {integrity: sha512-d2TEuG6nSLKQLAfW3By8mKr8HurOlTkul0sOpxbClIv4SQ4iOd7BYr7VIzdbktUCnv7dua/60xzd8igMU6jmyw==} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + react: 16.14.0 + use-isomorphic-layout-effect: 1.1.2_react@16.14.0 + dev: true + /use/3.1.1: resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} engines: {node: '>=0.10.0'} @@ -6640,11 +14232,38 @@ packages: resolution: {integrity: sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=} dev: true + /util.promisify/1.0.0: + resolution: {integrity: sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==} + dependencies: + define-properties: 1.1.3 + object.getownpropertydescriptors: 2.1.3 + dev: true + + /util/0.10.3: + resolution: {integrity: sha1-evsa/lCAUkZInj23/g7TeTNqwPk=} + dependencies: + inherits: 2.0.1 + dev: true + + /util/0.11.1: + resolution: {integrity: sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==} + dependencies: + inherits: 2.0.3 + dev: true + + /utila/0.4.0: + resolution: {integrity: sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=} + dev: true + /utils-merge/1.0.1: resolution: {integrity: sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=} engines: {node: '>= 0.4.0'} dev: true + /uuid-browser/3.1.0: + resolution: {integrity: sha1-DwWkCu90+eWVHiDvv0SxGHHlZBA=} + dev: true + /uuid/3.4.0: resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. @@ -6680,6 +14299,30 @@ packages: extsprintf: 1.3.0 dev: true + /vfile-location/3.2.0: + resolution: {integrity: sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==} + dev: true + + /vfile-message/2.0.4: + resolution: {integrity: sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==} + dependencies: + '@types/unist': 2.0.6 + unist-util-stringify-position: 2.0.3 + dev: true + + /vfile/4.2.1: + resolution: {integrity: sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==} + dependencies: + '@types/unist': 2.0.6 + is-buffer: 2.0.5 + unist-util-stringify-position: 2.0.3 + vfile-message: 2.0.4 + dev: true + + /vm-browserify/1.1.2: + resolution: {integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==} + dev: true + /void-elements/2.0.1: resolution: {integrity: sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=} engines: {node: '>=0.10.0'} @@ -6691,21 +14334,169 @@ packages: makeerror: 1.0.12 dev: true + /warning/4.0.3: + resolution: {integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==} + dependencies: + loose-envify: 1.4.0 + dev: true + /watch/0.10.0: resolution: {integrity: sha1-d3mLLaD5kQ1ZXxrOWwwiWFIfIdw=} engines: {'0': node >=0.1.95} dev: true + /watchpack-chokidar2/2.0.1: + resolution: {integrity: sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==} + requiresBuild: true + dependencies: + chokidar: 2.1.8 + dev: true + optional: true + + /watchpack/1.7.5: + resolution: {integrity: sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==} + dependencies: + graceful-fs: 4.2.10 + neo-async: 2.6.2 + optionalDependencies: + chokidar: 3.5.3 + watchpack-chokidar2: 2.0.1 + dev: true + + /watchpack/2.3.1: + resolution: {integrity: sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==} + engines: {node: '>=10.13.0'} + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.10 + dev: true + /wcwidth/1.0.1: resolution: {integrity: sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=} dependencies: defaults: 1.0.3 dev: true + /web-namespaces/1.1.4: + resolution: {integrity: sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==} + dev: true + + /webidl-conversions/3.0.1: + resolution: {integrity: sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=} + dev: true + + /webpack-dev-middleware/3.7.3_webpack@4.46.0: + resolution: {integrity: sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==} + engines: {node: '>= 6'} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + dependencies: + memory-fs: 0.4.1 + mime: 2.6.0 + mkdirp: 0.5.6 + range-parser: 1.2.1 + webpack: 4.46.0 + webpack-log: 2.0.0 + dev: true + + /webpack-filter-warnings-plugin/1.2.1_webpack@4.46.0: + resolution: {integrity: sha512-Ez6ytc9IseDMLPo0qCuNNYzgtUl8NovOqjIq4uAU8LTD4uoa1w1KpZyyzFtLTEMZpkkOkLfL9eN+KGYdk1Qtwg==} + engines: {node: '>= 4.3 < 5.0.0 || >= 5.10'} + peerDependencies: + webpack: ^2.0.0 || ^3.0.0 || ^4.0.0 + dependencies: + webpack: 4.46.0 + dev: true + + /webpack-hot-middleware/2.25.1: + resolution: {integrity: sha512-Koh0KyU/RPYwel/khxbsDz9ibDivmUbrRuKSSQvW42KSDdO4w23WI3SkHpSUKHE76LrFnnM/L7JCrpBwu8AXYw==} + dependencies: + ansi-html-community: 0.0.8 + html-entities: 2.3.3 + querystring: 0.2.1 + strip-ansi: 6.0.1 + dev: true + + /webpack-log/2.0.0: + resolution: {integrity: sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==} + engines: {node: '>= 6'} + dependencies: + ansi-colors: 3.2.4 + uuid: 3.4.0 + dev: true + + /webpack-sources/1.4.3: + resolution: {integrity: sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==} + dependencies: + source-list-map: 2.0.1 + source-map: 0.6.1 + dev: true + + /webpack-virtual-modules/0.2.2: + resolution: {integrity: sha512-kDUmfm3BZrei0y+1NTHJInejzxfhtU8eDj2M7OKb2IWrPFAeO1SOH2KuQ68MSZu9IGEHcxbkKKR1v18FrUSOmA==} + dependencies: + debug: 3.2.7 + dev: true + + /webpack/4.46.0: + resolution: {integrity: sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==} + engines: {node: '>=6.11.5'} + hasBin: true + peerDependencies: + webpack-cli: '*' + webpack-command: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + webpack-command: + optional: true + dependencies: + '@webassemblyjs/ast': 1.9.0 + '@webassemblyjs/helper-module-context': 1.9.0 + '@webassemblyjs/wasm-edit': 1.9.0 + '@webassemblyjs/wasm-parser': 1.9.0 + acorn: 6.4.2 + ajv: 6.12.6 + ajv-keywords: 3.5.2_ajv@6.12.6 + chrome-trace-event: 1.0.3 + enhanced-resolve: 4.5.0 + eslint-scope: 4.0.3 + json-parse-better-errors: 1.0.2 + loader-runner: 2.4.0 + loader-utils: 1.4.0 + memory-fs: 0.4.1 + micromatch: 3.1.10 + mkdirp: 0.5.6 + neo-async: 2.6.2 + node-libs-browser: 2.2.1 + schema-utils: 1.0.0 + tapable: 1.1.3 + terser-webpack-plugin: 1.4.5_webpack@4.46.0 + watchpack: 1.7.5 + webpack-sources: 1.4.3 + dev: true + + /whatwg-url/5.0.0: + resolution: {integrity: sha1-lmRU6HZUYuN2RNNib2dCzotwll0=} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + dev: true + /when/3.7.8: resolution: {integrity: sha1-xxMLan6gRpPoQs3J56Hyqjmjn4I=} dev: true + /which-boxed-primitive/1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + dev: true + /which/1.3.1: resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} hasBin: true @@ -6727,6 +14518,13 @@ packages: string-width: 4.2.3 dev: true + /widest-line/3.1.0: + resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} + engines: {node: '>=8'} + dependencies: + string-width: 4.2.3 + dev: true + /window-size/0.1.0: resolution: {integrity: sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=} engines: {node: '>= 0.8.0'} @@ -6742,6 +14540,22 @@ packages: engines: {node: '>=0.4.0'} dev: true + /wordwrap/1.0.0: + resolution: {integrity: sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=} + dev: true + + /worker-farm/1.7.0: + resolution: {integrity: sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==} + dependencies: + errno: 0.1.8 + dev: true + + /worker-rpc/0.1.1: + resolution: {integrity: sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg==} + dependencies: + microevent.ts: 0.1.1 + dev: true + /wrap-ansi/7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -6755,6 +14569,15 @@ packages: resolution: {integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=} dev: true + /write-file-atomic/3.0.3: + resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + dependencies: + imurmurhash: 0.1.4 + is-typedarray: 1.0.0 + signal-exit: 3.0.7 + typedarray-to-buffer: 3.1.5 + dev: true + /ws/8.2.3: resolution: {integrity: sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==} engines: {node: '>=10.0.0'} @@ -6768,21 +14591,24 @@ packages: optional: true dev: true - /xmlhttprequest-ssl/2.0.0: - resolution: {integrity: sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==} - engines: {node: '>=0.4.0'} - dev: true - /xtend/4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} dev: true + /y18n/4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + dev: true + /y18n/5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} dev: true + /yallist/3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + dev: true + /yallist/4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} dev: true @@ -6815,19 +14641,6 @@ packages: yargs-parser: 20.2.9 dev: true - /yargs/17.1.1: - resolution: {integrity: sha512-c2k48R0PwKIqKhPMWjeiF6y2xY/gPMUlro0sgxqXpbOIohWiLNXWslsootttv7E1e73QPAMQSg5FeySbVcpsPQ==} - engines: {node: '>=12'} - dependencies: - cliui: 7.0.4 - escalade: 3.1.1 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.9 - dev: true - /yargs/17.4.1: resolution: {integrity: sha512-WSZD9jgobAg3ZKuCQZSa3g9QOJeCCqLoLAykiWgmXnDo9EPnn4RPf5qVTtzgOx66o6/oqhcA5tHtJXpG8pMt3g==} engines: {node: '>=12'} @@ -6857,10 +14670,6 @@ packages: fd-slicer: 1.1.0 dev: true - /yeast/0.1.2: - resolution: {integrity: sha1-AI4G2AlDIMNy28L47XagymyKxBk=} - dev: true - /yn/3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} @@ -6870,3 +14679,7 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} dev: true + + /zwitch/1.0.5: + resolution: {integrity: sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==} + dev: true diff --git a/src/charts/bar.stories.js b/src/charts/bar.stories.js new file mode 100644 index 00000000..413705c1 --- /dev/null +++ b/src/charts/bar.stories.js @@ -0,0 +1,56 @@ +import '../styles/chartist.scss'; +import { BarChart } from './bar'; + +export default { + title: 'BarChart', + argTypes: {} +}; + +export function Default() { + const root = document.createElement('div'); + + new BarChart(root, { + labels: ['Quarter 1', 'Quarter 2', 'Quarter 3', 'Quarter 4'], + series: [ + [5, 4, 3, 7], + [3, 2, 9, 5], + [1, 5, 8, 4], + [2, 3, 4, 6], + [4, 1, 2, 1] + ] + }, { + // Default mobile configuration + stackBars: true, + axisX: { + labelInterpolationFnc: value => value.split(/\s+/).map(word => word[0]).join('') + }, + axisY: { + offset: 20 + } + }, [ + // Options override for media > 400px + ['screen and (min-width: 400px)', { + reverseData: true, + horizontalBars: true, + axisX: { + labelInterpolationFnc: () => undefined, + }, + axisY: { + offset: 60 + } + }], + // Options override for media > 800px + ['screen and (min-width: 800px)', { + stackBars: false, + seriesBarDistance: 10 + }], + // Options override for media > 1000px + ['screen and (min-width: 1000px)', { + reverseData: false, + horizontalBars: false, + seriesBarDistance: 15 + }] + ]); + + return root +} diff --git a/src/charts/line.stories.js b/src/charts/line.stories.js new file mode 100644 index 00000000..f0936132 --- /dev/null +++ b/src/charts/line.stories.js @@ -0,0 +1,30 @@ +import '../styles/chartist.scss'; +import { LineChart } from './line'; +import { AutoScaleAxis } from '../axes/axes'; + +export default { + title: 'LineChart', + argTypes: {} +}; + +export function Default() { + const root = document.createElement('div'); + + new LineChart(root, { + series: [[ + {x: 1, y: 1}, + {x: 3, y: 5} + ]] + }, { + axisX: { + type: AutoScaleAxis, + onlyInteger: true + }, + axisY: { + type: AutoScaleAxis, + onlyInteger: true + } + }); + + return root +} diff --git a/src/charts/pie.stories.js b/src/charts/pie.stories.js new file mode 100644 index 00000000..01992252 --- /dev/null +++ b/src/charts/pie.stories.js @@ -0,0 +1,21 @@ +import '../styles/chartist.scss'; +import { PieChart } from './pie'; + +export default { + title: 'PieChart', + argTypes: {} +}; + +export function Default() { + const root = document.createElement('div'); + + new PieChart(root, { + series: [5, 3, 4] + }, { + width: 100, + height: 100, + chartPadding: 10 + }); + + return root +} From f7d7c4b5ab692e477554e399923ac541686243f0 Mon Sep 17 00:00:00 2001 From: Dan Onoshko Date: Fri, 15 Apr 2022 23:10:11 +0700 Subject: [PATCH 12/44] build: use rollup (#5) --- .gitignore | 18 +- .nvmrc | 3 +- dist/chartist.esm.js | 4287 ----------------- dist/chartist.esm.js.map | 1 - dist/chartist.umd.js | 8 - dist/chartist.umd.js.map | 1 - jspm.config.js | 47 - package.json | 96 +- pnpm-lock.yaml | 271 +- rollup.config.js | 56 + {tooling/node => scripts}/compile-sass.js | 0 {tooling/node => scripts}/styles.js | 0 {src/testing => test}/fixtures.js | 0 {src/testing => test}/jasmine-dom-matchers.js | 0 .../spec/fixture-with-multiple-elements.html | 0 .../spec/fixture-with-single-element.html | 0 {src/testing => test}/spec/fixtures.spec.js | 0 tooling/node/banner.js | 12 - tooling/node/styles-watch.js | 16 - .../system-loaders/version-loader-plugin.js | 3 - 20 files changed, 372 insertions(+), 4447 deletions(-) delete mode 100644 dist/chartist.esm.js delete mode 100644 dist/chartist.esm.js.map delete mode 100644 dist/chartist.umd.js delete mode 100644 dist/chartist.umd.js.map delete mode 100644 jspm.config.js create mode 100644 rollup.config.js rename {tooling/node => scripts}/compile-sass.js (100%) rename {tooling/node => scripts}/styles.js (100%) rename {src/testing => test}/fixtures.js (100%) rename {src/testing => test}/jasmine-dom-matchers.js (100%) rename {src/testing => test}/spec/fixture-with-multiple-elements.html (100%) rename {src/testing => test}/spec/fixture-with-single-element.html (100%) rename {src/testing => test}/spec/fixtures.spec.js (100%) delete mode 100755 tooling/node/banner.js delete mode 100755 tooling/node/styles-watch.js delete mode 100644 tooling/system-loaders/version-loader-plugin.js diff --git a/.gitignore b/.gitignore index 673420c6..2617246b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,16 @@ -/node_modules -/jspm_packages -npm-debug.log +# See https://help.github.com/ignore-files/ for more about ignoring files. +# dependencies +node_modules + +# builds +package +dist + +# misc +.DS_Store + +npm-debug.log* + +# testing +coverage diff --git a/.nvmrc b/.nvmrc index be628fe2..b009dfb9 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1,2 +1 @@ -v6.9.0 - +lts/* diff --git a/dist/chartist.esm.js b/dist/chartist.esm.js deleted file mode 100644 index 41e969f6..00000000 --- a/dist/chartist.esm.js +++ /dev/null @@ -1,4287 +0,0 @@ -/* Chartist.js 1.0.0 - * Copyright © 2022 Gion Kunz - * Free to use under either the WTFPL license or the MIT license. - * https://raw.githubusercontent.com/chartist-js/chartist/master/LICENSE-WTFPL - * https://raw.githubusercontent.com/chartist-js/chartist/master/LICENSE-MIT - */ -/** - * This object contains all namespaces used within Chartist. - * - * @type {{svg: string, xmlns: string, xhtml: string, xlink: string, ct: string}} - */ -var namespaces = { - svg: 'http://www.w3.org/2000/svg', - xmlns: 'http://www.w3.org/2000/xmlns/', - xhtml: 'http://www.w3.org/1999/xhtml', - xlink: 'http://www.w3.org/1999/xlink', - ct: 'http://gionkunz.github.com/chartist-js/ct' -}; - -/** - * Precision level used internally in Chartist for rounding. If you require more decimal places you can increase this number. - * - * @type {number} - */ -var precision = 8; - -/** - * A map with characters to escape for strings to be safely used as attribute values. - * - * @type {Object} - */ -var escapingMap = { - '&': '&', - '<': '<', - '>': '>', - '"': '"', - '\'': ''' -}; - -/** - * Replaces all occurrences of subStr in str with newSubStr and returns a new string. - * - * @param {String} str - * @param {String} subStr - * @param {String} newSubStr - * @return {String} - */ -function replaceAll(str, subStr, newSubStr) { - return str.replace(new RegExp(subStr, 'g'), newSubStr); -} - -/** - * This is a wrapper around document.querySelector that will return the query if it's already of type Node - * - * @memberof Chartist.Core - * @param {String|Node} query The query to use for selecting a Node or a DOM node that will be returned directly - * @return {Node} - */ -function querySelector(query) { - return query instanceof Node ? query : document.querySelector(query); -} - -/** - * This function safely checks if an objects has an owned property. - * - * @param {Object} object The object where to check for a property - * @param {string} property The property name - * @returns {boolean} Returns true if the object owns the specified property - */ -function safeHasProperty(object, property) { - return object !== null && typeof object === 'object' && object.hasOwnProperty(property); -} - -/** - * Checks if a value can be safely coerced to a number. This includes all values except null which result in finite numbers when coerced. This excludes NaN, since it's not finite. - * - * @memberof Chartist.Core - * @param value - * @returns {Boolean} - */ -function isNumeric(value) { - return value === null ? false : isFinite(value); -} - -/** - * Returns true on all falsey values except the numeric value 0. - * - * @memberof Chartist.Core - * @param value - * @returns {boolean} - */ -function isFalseyButZero(value) { - return !value && value !== 0; -} - -/** - * Returns a number if the passed parameter is a valid number or the function will return undefined. On all other values than a valid number, this function will return undefined. - * - * @memberof Chartist.Core - * @param value - * @returns {*} - */ -function getNumberOrUndefined(value) { - return isNumeric(value) ? +value : undefined; -} - -/** - * Converts a number to a string with a unit. If a string is passed then this will be returned unmodified. - * - * @memberof Chartist.Core - * @param {Number} value - * @param {String} unit - * @return {String} Returns the passed number value with unit. - */ -function ensureUnit(value, unit) { - if (typeof value === 'number') { - value = value + unit; - } - - return value; -} - -/** - * Converts a number or string to a quantity object. - * - * @memberof Chartist.Core - * @param {String|Number} input - * @return {Object} Returns an object containing the value as number and the unit as string. - */ -function quantity(input) { - if (typeof input === 'string') { - var match = /^(\d+)\s*(.*)$/g.exec(input); - return { - value: +match[1], - unit: match[2] || undefined - }; - } - - return { - value: input - }; -} - -/** - * Generates a-z from a number 0 to 26 - * - * @memberof Chartist.Core - * @param {Number} n A number from 0 to 26 that will result in a letter a-z - * @return {String} A character from a-z based on the input number n - */ -function alphaNumerate(n) { - // Limit to a-z - return String.fromCharCode(97 + n % 26); -} - -var _toConsumableArray = (function (arr) { - if (Array.isArray(arr)) { - for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { - arr2[i] = arr[i]; - }return arr2; - } else { - return Array.from(arr); - } -}); - -/** - * Helps to simplify functional style code - * - * @memberof Chartist.Core - * @param {*} n This exact value will be returned by the noop function - * @return {*} The same value that was provided to the n parameter - */ -var noop = function noop(n) { - return n; -}; - -/** - * Functional style helper to produce array with given length initialized with undefined values - * - * @memberof Chartist.Core - * @param length - * @return {Array} - */ -var times = function times(length) { - return Array.from({ length: length }); -}; - -/** - * Sum helper to be used in reduce functions - * - * @memberof Chartist.Core - * @param previous - * @param current - * @return {*} - */ -var sum = function sum(previous, current) { - return previous + (current ? current : 0); -}; - -/** - * Map for multi dimensional arrays where their nested arrays will be mapped in serial. The output array will have the length of the largest nested array. The callback function is called with variable arguments where each argument is the nested array value (or undefined if there are no more values). - * - * For example: - * @example - * ```javascript - * const data = [[1, 2], [3], []]; - * serialMap(data, cb); - * - * // where cb will be called 2 times - * // 1. call arguments: (1, 3, undefined) - * // 2. call arguments: (2, undefined, undefined) - * ``` - * - * @memberof Chartist.Core - * @param array - * @param callback - * @return {Array} - */ -var serialMap = function serialMap(array, callback) { - return times(Math.max.apply(Math, _toConsumableArray(array.map(function (element) { - return element.length; - })))).map(function (inner, index) { - return callback.apply(undefined, _toConsumableArray(array.map(function (element) { - return element[index]; - }))); - }); -}; - -var EPSILON = 2.221E-16; - -/** - * Calculate the order of magnitude for the chart scale - * - * @memberof Chartist.Core - * @param {Number} value The value Range of the chart - * @return {Number} The order of magnitude - */ -function orderOfMagnitude(value) { - return Math.floor(Math.log(Math.abs(value)) / Math.LN10); -} - -/** - * Project a data length into screen coordinates (pixels) - * - * @memberof Chartist.Core - * @param {Object} axisLength The svg element for the chart - * @param {Number} length Single data value from a series array - * @param {Object} bounds All the values to set the bounds of the chart - * @return {Number} The projected data length in pixels - */ -function projectLength(axisLength, length, bounds) { - return length / bounds.range * axisLength; -} - -/** - * This helper function can be used to round values with certain precision level after decimal. This is used to prevent rounding errors near float point precision limit. - * - * @memberof Chartist.Core - * @param {Number} value The value that should be rounded with precision - * @param {Number} [digits] The number of digits after decimal used to do the rounding - * @returns {number} Rounded value - */ -function roundWithPrecision(value, digits) { - var precision$$1 = Math.pow(10, digits || precision); - return Math.round(value * precision$$1) / precision$$1; -} - -/** - * Pollard Rho Algorithm to find smallest factor of an integer value. There are more efficient algorithms for factorization, but this one is quite efficient and not so complex. - * - * @memberof Chartist.Core - * @param {Number} num An integer number where the smallest factor should be searched for - * @returns {Number} The smallest integer factor of the parameter num. - */ -function rho(num) { - if (num === 1) { - return num; - } - - function gcd(p, q) { - if (p % q === 0) { - return q; - } else { - return gcd(q, p % q); - } - } - - function f(x) { - return x * x + 1; - } - - var x1 = 2; - var x2 = 2; - var divisor = void 0; - if (num % 2 === 0) { - return 2; - } - - do { - x1 = f(x1) % num; - x2 = f(f(x2)) % num; - divisor = gcd(Math.abs(x1 - x2), num); - } while (divisor === 1); - - return divisor; -} - -/** - * Calculate cartesian coordinates of polar coordinates - * - * @memberof Chartist.Core - * @param {Number} centerX X-axis coordinates of center point of circle segment - * @param {Number} centerY X-axis coordinates of center point of circle segment - * @param {Number} radius Radius of circle segment - * @param {Number} angleInDegrees Angle of circle segment in degrees - * @return {{x:Number, y:Number}} Coordinates of point on circumference - */ -function polarToCartesian(centerX, centerY, radius, angleInDegrees) { - var angleInRadians = (angleInDegrees - 90) * Math.PI / 180.0; - - return { - x: centerX + radius * Math.cos(angleInRadians), - y: centerY + radius * Math.sin(angleInRadians) - }; -} - -/** - * Simple recursive object extend - * - * @memberof Chartist.Core - * @param {Object} target Target object where the source will be merged into - * @param {Object...} sources This object (objects) will be merged into target and then target is returned - * @return {Object} An object that has the same reference as target but is extended and merged with the properties of source - */ -function extend() { - var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - - target = target || {}; - - for (var _len = arguments.length, sources = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - sources[_key - 1] = arguments[_key]; - } - - for (var i = 0; i < sources.length; i++) { - var source = sources[i]; - for (var prop in source) { - var sourceProp = source[prop]; - if (typeof sourceProp === 'object' && sourceProp !== null && !(sourceProp instanceof Array)) { - target[prop] = extend(target[prop], sourceProp); - } else { - target[prop] = sourceProp; - } - } - } - - return target; -} - -/** - * This function serializes arbitrary data to a string. In case of data that can't be easily converted to a string, this function will create a wrapper object and serialize the data using JSON.stringify. The outcoming string will always be escaped using Chartist.escapingMap. - * If called with null or undefined the function will return immediately with null or undefined. - * - * @memberof Chartist.Core - * @param {Number|String|Object} data - * @return {String} - */ -function serialize(data) { - if (data === null || data === undefined) { - return data; - } else if (typeof data === 'number') { - data = '' + data; - } else if (typeof data === 'object') { - data = JSON.stringify({ data: data }); - } - - return Object.keys(escapingMap).reduce(function (result, key) { - return replaceAll(result, key, escapingMap[key]); - }, data); -} - -/** - * This function de-serializes a string previously serialized with Chartist.serialize. The string will always be unescaped using Chartist.escapingMap before it's returned. Based on the input value the return type can be Number, String or Object. JSON.parse is used with try / catch to see if the unescaped string can be parsed into an Object and this Object will be returned on success. - * - * @memberof Chartist.Core - * @param {String} data - * @return {String|Number|Object} - */ -function deserialize(data) { - if (typeof data !== 'string') { - return data; - } - - data = Object.keys(escapingMap).reduce(function (result, key) { - return replaceAll(result, escapingMap[key], key); - }, data); - - try { - data = JSON.parse(data); - data = data.data !== undefined ? data.data : data; - } catch (e) {} - - return data; -} - -/** - * Ensures that the data object passed as second argument to the charts is present and correctly initialized. - * - * @param {Object} data The data object that is passed as second argument to the charts - * @return {Object} The normalized data object - */ -function normalizeData(data, reverse, multi) { - var _output$normalized$la; - - var labelCount = void 0; - var output = { - raw: data, - normalized: {} - }; - - // Check if we should generate some labels based on existing series data - output.normalized.series = getDataArray({ - series: data.series || [] - }, reverse, multi); - - // If all elements of the normalized data array are arrays we're dealing with - // multi series data and we need to find the largest series if they are un-even - if (output.normalized.series.every(function (value) { - return value instanceof Array; - })) { - // Getting the series with the the most elements - labelCount = Math.max.apply(Math, _toConsumableArray(output.normalized.series.map(function (series) { - return series.length; - }))); - } else { - // We're dealing with Pie data so we just take the normalized array length - labelCount = output.normalized.series.length; - } - - output.normalized.labels = (data.labels || []).slice(); - // Padding the labels to labelCount with empty strings - (_output$normalized$la = output.normalized.labels).push.apply(_output$normalized$la, _toConsumableArray(times(Math.max(0, labelCount - output.normalized.labels.length)).map(function () { - return ''; - }))); - - if (reverse) { - reverseData(output.normalized); - } - - return output; -} - -/** - * Get meta data of a specific value in a series. - * - * @param series - * @param index - * @returns {*} - */ -function getMetaData(series, index) { - var value = series.data ? series.data[index] : series[index]; - return value ? value.meta : undefined; -} - -/** - * Checks if a value is considered a hole in the data series. - * - * @param {*} value - * @returns {boolean} True if the value is considered a data hole - */ -function isDataHoleValue(value) { - return value === null || value === undefined || typeof value === 'number' && isNaN(value); -} - -/** - * Reverses the series, labels and series data arrays. - * - * @memberof Chartist.Core - * @param data - */ -function reverseData(data) { - data.labels.reverse(); - data.series.reverse(); - var _iteratorNormalCompletion = true; - var _didIteratorError = false; - var _iteratorError = undefined; - - try { - for (var _iterator = data.series[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { - var series = _step.value; - - if (typeof series === 'object' && series.data !== undefined) { - series.data.reverse(); - } else if (series instanceof Array) { - series.reverse(); - } - } - } catch (err) { - _didIteratorError = true; - _iteratorError = err; - } finally { - try { - if (!_iteratorNormalCompletion && _iterator.return) { - _iterator.return(); - } - } finally { - if (_didIteratorError) { - throw _iteratorError; - } - } - } -} - -/** - * Convert data series into plain array - * - * @memberof Chartist.Core - * @param {Object} data The series object that contains the data to be visualized in the chart - * @param {Boolean} [reverse] If true the whole data is reversed by the getDataArray call. This will modify the data object passed as first parameter. The labels as well as the series order is reversed. The whole series data arrays are reversed too. - * @param {Boolean} [multi] Create a multi dimensional array from a series data array where a value object with `x` and `y` values will be created. - * @return {Array} A plain array that contains the data to be visualized in the chart - */ -function getDataArray(data, reverse, multi) { - // Recursively walks through nested arrays and convert string values to numbers and objects with value properties - // to values. Check the tests in data core -> data normalization for a detailed specification of expected values - function recursiveConvert(value) { - if (safeHasProperty(value, 'value')) { - // We are dealing with value object notation so we need to recurse on value property - return recursiveConvert(value.value); - } else if (safeHasProperty(value, 'data')) { - // We are dealing with series object notation so we need to recurse on data property - return recursiveConvert(value.data); - } else if (value instanceof Array) { - // Data is of type array so we need to recurse on the series - return value.map(recursiveConvert); - } else if (isDataHoleValue(value)) { - // We're dealing with a hole in the data and therefore need to return undefined - // We're also returning undefined for multi value output - return undefined; - } else { - // We need to prepare multi value output (x and y data) - if (multi) { - var multiValue = {}; - - // Single series value arrays are assumed to specify the Y-Axis value - // For example: [1, 2] => [{x: undefined, y: 1}, {x: undefined, y: 2}] - // If multi is a string then it's assumed that it specified which dimension should be filled as default - if (typeof multi === 'string') { - multiValue[multi] = getNumberOrUndefined(value); - } else { - multiValue.y = getNumberOrUndefined(value); - } - - multiValue.x = value.hasOwnProperty('x') ? getNumberOrUndefined(value.x) : multiValue.x; - multiValue.y = value.hasOwnProperty('y') ? getNumberOrUndefined(value.y) : multiValue.y; - - return multiValue; - } else { - // We can return simple data - return getNumberOrUndefined(value); - } - } - } - - return data.series.map(recursiveConvert); -} - -/** - * Checks if provided value object is multi value (contains x or y properties) - * - * @memberof Chartist.Core - * @param value - */ -function isMultiValue(value) { - return typeof value === 'object' && (value.hasOwnProperty('x') || value.hasOwnProperty('y')); -} - -/** - * Gets a value from a dimension `value.x` or `value.y` while returning value directly if it's a valid numeric value. If the value is not numeric and it's falsey this function will return `defaultValue`. - * - * @memberof Chartist.Core - * @param value - * @param dimension - * @returns {*} - */ -function getMultiValue(value) { - var dimension = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'y'; - - if (isMultiValue(value)) { - return getNumberOrUndefined(value[dimension]); - } else { - return getNumberOrUndefined(value); - } -} - -/** - * Helper to read series specific options from options object. It automatically falls back to the global option if - * there is no option in the series options. - * - * @param {Object} series Series object - * @param {Object} options Chartist options object - * @param {string} key The options key that should be used to obtain the options - * @returns {*} - */ -function getSeriesOption(series, options, key) { - if (series.name && options.series && options.series[series.name]) { - var seriesOptions = options.series[series.name]; - return seriesOptions.hasOwnProperty(key) ? seriesOptions[key] : options[key]; - } else { - return options[key]; - } -} - -/** - * Splits a list of coordinates and associated values into segments. Each returned segment contains a pathCoordinates - * valueData property describing the segment. - * - * With the default options, segments consist of contiguous sets of points that do not have an undefined value. Any - * points with undefined values are discarded. - * - * **Options** - * The following options are used to determine how segments are formed - * ```javascript - * var options = { - * // If fillHoles is true, undefined values are simply discarded without creating a new segment. Assuming other options are default, this returns single segment. - * fillHoles: false, - * // If increasingX is true, the coordinates in all segments have strictly increasing x-values. - * increasingX: false - * }; - * ``` - * - * @memberof Chartist.Core - * @param {Array} pathCoordinates List of point coordinates to be split in the form [x1, y1, x2, y2 ... xn, yn] - * @param {Array} valueData List of associated point values in the form [v1, v2 .. vn] - * @param {Object} [options] Options set by user - * @return {Array} List of segments, each containing a pathCoordinates and valueData property. - */ -function splitIntoSegments(pathCoordinates, valueData, options) { - var defaultOptions = { - increasingX: false, - fillHoles: false - }; - - options = extend({}, defaultOptions, options); - - var segments = []; - var hole = true; - - for (var i = 0; i < pathCoordinates.length; i += 2) { - // If this value is a "hole" we set the hole flag - if (getMultiValue(valueData[i / 2].value) === undefined) { - // if(valueData[i / 2].value === undefined) { - if (!options.fillHoles) { - hole = true; - } - } else { - if (options.increasingX && i >= 2 && pathCoordinates[i] <= pathCoordinates[i - 2]) { - // X is not increasing, so we need to make sure we start a new segment - hole = true; - } - - // If it's a valid value we need to check if we're coming out of a hole and create a new empty segment - if (hole) { - segments.push({ - pathCoordinates: [], - valueData: [] - }); - // As we have a valid value now, we are not in a "hole" anymore - hole = false; - } - - // Add to the segment pathCoordinates and valueData - segments[segments.length - 1].pathCoordinates.push(pathCoordinates[i], pathCoordinates[i + 1]); - segments[segments.length - 1].valueData.push(valueData[i / 2]); - } - } - - return segments; -} - -/** - * Get highest and lowest value of data array. This Array contains the data that will be visualized in the chart. - * - * @memberof Chartist.Core - * @param {Array} data The array that contains the data to be visualized in the chart - * @param {Object} options The Object that contains the chart options - * @param {String} dimension Axis dimension 'x' or 'y' used to access the correct value and high / low configuration - * @return {Object} An object that contains the highest and lowest value that will be visualized on the chart. - */ -function getHighLow(data, options, dimension) { - // TODO: Remove workaround for deprecated global high / low config. Axis high / low configuration is preferred - options = extend({}, options, dimension ? options['axis' + dimension.toUpperCase()] : {}); - - var highLow = { - high: options.high === undefined ? -Number.MAX_VALUE : +options.high, - low: options.low === undefined ? Number.MAX_VALUE : +options.low - }; - var findHigh = options.high === undefined; - var findLow = options.low === undefined; - - // Function to recursively walk through arrays and find highest and lowest number - function recursiveHighLow(sourceData) { - if (sourceData === undefined) { - return undefined; - } else if (sourceData instanceof Array) { - for (var i = 0; i < sourceData.length; i++) { - recursiveHighLow(sourceData[i]); - } - } else { - var value = dimension ? +sourceData[dimension] : +sourceData; - - if (findHigh && value > highLow.high) { - highLow.high = value; - } - - if (findLow && value < highLow.low) { - highLow.low = value; - } - } - } - - // Start to find highest and lowest number recursively - if (findHigh || findLow) { - recursiveHighLow(data); - } - - // Overrides of high / low based on reference value, it will make sure that the invisible reference value is - // used to generate the chart. This is useful when the chart always needs to contain the position of the - // invisible reference value in the view i.e. for bipolar scales. - if (options.referenceValue || options.referenceValue === 0) { - highLow.high = Math.max(options.referenceValue, highLow.high); - highLow.low = Math.min(options.referenceValue, highLow.low); - } - - // If high and low are the same because of misconfiguration or flat data (only the same value) we need - // to set the high or low to 0 depending on the polarity - if (highLow.high <= highLow.low) { - // If both values are 0 we set high to 1 - if (highLow.low === 0) { - highLow.high = 1; - } else if (highLow.low < 0) { - // If we have the same negative value for the bounds we set bounds.high to 0 - highLow.high = 0; - } else if (highLow.high > 0) { - // If we have the same positive value for the bounds we set bounds.low to 0 - highLow.low = 0; - } else { - // If data array was empty, values are Number.MAX_VALUE and -Number.MAX_VALUE. Set bounds to prevent errors - highLow.high = 1; - highLow.low = 0; - } - } - - return highLow; -} - -/** - * Calculate and retrieve all the bounds for the chart and return them in one array - * - * @memberof Chartist.Core - * @param {Number} axisLength The length of the Axis used for - * @param {Object} highLow An object containing a high and low property indicating the value range of the chart. - * @param {Number} scaleMinSpace The minimum projected length a step should result in - * @param {Boolean} onlyInteger - * @return {Object} All the values to set the bounds of the chart - */ -function getBounds(axisLength, highLow, scaleMinSpace, onlyInteger) { - var bounds = { - high: highLow.high, - low: highLow.low - }; - - bounds.valueRange = bounds.high - bounds.low; - bounds.oom = orderOfMagnitude(bounds.valueRange); - bounds.step = Math.pow(10, bounds.oom); - bounds.min = Math.floor(bounds.low / bounds.step) * bounds.step; - bounds.max = Math.ceil(bounds.high / bounds.step) * bounds.step; - bounds.range = bounds.max - bounds.min; - bounds.numberOfSteps = Math.round(bounds.range / bounds.step); - - // Optimize scale step by checking if subdivision is possible based on horizontalGridMinSpace - // If we are already below the scaleMinSpace value we will scale up - var length = projectLength(axisLength, bounds.step, bounds); - var scaleUp = length < scaleMinSpace; - var smallestFactor = onlyInteger ? rho(bounds.range) : 0; - - // First check if we should only use integer steps and if step 1 is still larger than scaleMinSpace so we can use 1 - if (onlyInteger && projectLength(axisLength, 1, bounds) >= scaleMinSpace) { - bounds.step = 1; - } else if (onlyInteger && smallestFactor < bounds.step && projectLength(axisLength, smallestFactor, bounds) >= scaleMinSpace) { - // If step 1 was too small, we can try the smallest factor of range - // If the smallest factor is smaller than the current bounds.step and the projected length of smallest factor - // is larger than the scaleMinSpace we should go for it. - bounds.step = smallestFactor; - } else { - // Trying to divide or multiply by 2 and find the best step value - var optimizationCounter = 0; - while (true) { - if (scaleUp && projectLength(axisLength, bounds.step, bounds) <= scaleMinSpace) { - bounds.step *= 2; - } else if (!scaleUp && projectLength(axisLength, bounds.step / 2, bounds) >= scaleMinSpace) { - bounds.step /= 2; - if (onlyInteger && bounds.step % 1 !== 0) { - bounds.step *= 2; - break; - } - } else { - break; - } - - if (optimizationCounter++ > 1000) { - throw new Error('Exceeded maximum number of iterations while optimizing scale step!'); - } - } - } - - bounds.step = Math.max(bounds.step, EPSILON); - function safeIncrement(value, increment) { - // If increment is too small use *= (1+EPSILON) as a simple nextafter - if (value === (value += increment)) { - value *= 1 + (increment > 0 ? EPSILON : -EPSILON); - } - return value; - } - - // Narrow min and max based on new step - var newMin = bounds.min; - var newMax = bounds.max; - while (newMin + bounds.step <= bounds.low) { - newMin = safeIncrement(newMin, bounds.step); - } - while (newMax - bounds.step >= bounds.high) { - newMax = safeIncrement(newMax, -bounds.step); - } - bounds.min = newMin; - bounds.max = newMax; - bounds.range = bounds.max - bounds.min; - - var values = []; - for (var i = bounds.min; i <= bounds.max; i = safeIncrement(i, bounds.step)) { - var value = roundWithPrecision(i); - if (value !== values[values.length - 1]) { - values.push(value); - } - } - bounds.values = values; - - return bounds; -} - -var _classCallCheck = (function (instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -}); - -var _createClass = (function () { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - Object.defineProperty(target, descriptor.key, descriptor); - } - } - - return function (Constructor, protoProps, staticProps) { - if (protoProps) defineProperties(Constructor.prototype, protoProps); - if (staticProps) defineProperties(Constructor, staticProps); - return Constructor; - }; -})(); - -/** - * This helper class is to wrap multiple `Svg` elements into a list where you can call the `Svg` functions on all elements in the list with one call. This is helpful when you'd like to perform calls with `Svg` on multiple elements. - * An instance of this class is also returned by `Svg.querySelectorAll`. - * - * @memberof Svg - * @param {Array|NodeList} nodeList An Array of SVG DOM nodes or a SVG DOM NodeList (as returned by document.querySelectorAll) - * @constructor - */ -var SvgList = function SvgList(nodeList) { - var _arguments = arguments; - - _classCallCheck(this, SvgList); - - var list = this; - - this.svgElements = []; - for (var i = 0; i < nodeList.length; i++) { - this.svgElements.push(new Svg(nodeList[i])); - } - - // Add delegation methods for Svg - Object.keys(Svg.prototype).filter(function (prototypeProperty) { - return ['constructor', 'parent', 'querySelector', 'querySelectorAll', 'replace', 'append', 'classes', 'height', 'width'].indexOf(prototypeProperty) === -1; - }).forEach(function (prototypeProperty) { - list[prototypeProperty] = function () { - var args = Array.from(_arguments); - list.svgElements.forEach(function (element) { - return Svg.prototype[prototypeProperty].apply(element, args); - }); - return list; - }; - }); -}; - -/** - * Svg creates a new SVG object wrapper with a starting element. You can use the wrapper to fluently create sub-elements and modify them. - * - * @memberof Svg - * @constructor - * @param {String|Element} name The name of the SVG element to create or an SVG dom element which should be wrapped into Svg - * @param {Object} attributes An object with properties that will be added as attributes to the SVG element that is created. Attributes with undefined values will not be added. - * @param {String} className This class or class list will be added to the SVG element - * @param {Object} parent The parent SVG wrapper object where this newly created wrapper and it's element will be attached to as child - * @param {Boolean} insertFirst If this param is set to true in conjunction with a parent element the newly created element will be added as first child element in the parent element - */ -var Svg = function () { - function Svg(name, attributes, className, parent, insertFirst) { - _classCallCheck(this, Svg); - - // If Svg is getting called with an SVG element we just return the wrapper - if (name instanceof Element) { - this._node = name; - } else { - this._node = document.createElementNS(namespaces.svg, name); - - // If this is an SVG element created then custom namespace - if (name === 'svg') { - this.attr({ - 'xmlns:ct': namespaces.ct - }); - } - } - - if (attributes) { - this.attr(attributes); - } - - if (className) { - this.addClass(className); - } - - if (parent) { - if (insertFirst && parent._node.firstChild) { - parent._node.insertBefore(this._node, parent._node.firstChild); - } else { - parent._node.appendChild(this._node); - } - } - } - - /** - * Set attributes on the current SVG element of the wrapper you're currently working on. - * - * @memberof Svg - * @param {Object|String} attributes An object with properties that will be added as attributes to the SVG element that is created. Attributes with undefined values will not be added. If this parameter is a String then the function is used as a getter and will return the attribute value. - * @param {String} [ns] If specified, the attribute will be obtained using getAttributeNs. In order to write namepsaced attributes you can use the namespace:attribute notation within the attributes object. - * @return {Object|String} The current wrapper object will be returned so it can be used for chaining or the attribute value if used as getter function. - */ - - _createClass(Svg, [{ - key: 'attr', - value: function attr(attributes, ns) { - if (typeof attributes === 'string') { - if (ns) { - return this._node.getAttributeNS(ns, attributes); - } else { - return this._node.getAttribute(attributes); - } - } - - Object.keys(attributes).forEach(function (key) { - // If the attribute value is undefined we can skip this one - if (attributes[key] === undefined) { - return; - } - - if (key.indexOf(':') !== -1) { - var namespacedAttribute = key.split(':'); - this._node.setAttributeNS(namespaces[namespacedAttribute[0]], key, attributes[key]); - } else { - this._node.setAttribute(key, attributes[key]); - } - }.bind(this)); - - return this; - } - - /** - * Create a new SVG element whose wrapper object will be selected for further operations. This way you can also create nested groups easily. - * - * @memberof Svg - * @param {String} name The name of the SVG element that should be created as child element of the currently selected element wrapper - * @param {Object} [attributes] An object with properties that will be added as attributes to the SVG element that is created. Attributes with undefined values will not be added. - * @param {String} [className] This class or class list will be added to the SVG element - * @param {Boolean} [insertFirst] If this param is set to true in conjunction with a parent element the newly created element will be added as first child element in the parent element - * @return {Svg} Returns a Svg wrapper object that can be used to modify the containing SVG data - */ - - }, { - key: 'elem', - value: function elem(name, attributes, className, insertFirst) { - return new Svg(name, attributes, className, this, insertFirst); - } - - /** - * Returns the parent Chartist.SVG wrapper object - * - * @memberof Svg - * @return {Svg} Returns a Svg wrapper around the parent node of the current node. If the parent node is not existing or it's not an SVG node then this function will return null. - */ - - }, { - key: 'parent', - value: function parent() { - return this._node.parentNode instanceof SVGElement ? new Svg(this._node.parentNode) : null; - } - - /** - * This method returns a Svg wrapper around the root SVG element of the current tree. - * - * @memberof Svg - * @return {Svg} The root SVG element wrapped in a Svg element - */ - - }, { - key: 'root', - value: function root() { - var node = this._node; - while (node.nodeName !== 'svg') { - node = node.parentNode; - } - return new Svg(node); - } - - /** - * Find the first child SVG element of the current element that matches a CSS selector. The returned object is a Svg wrapper. - * - * @memberof Svg - * @param {String} selector A CSS selector that is used to query for child SVG elements - * @return {Svg} The SVG wrapper for the element found or null if no element was found - */ - - }, { - key: 'querySelector', - value: function querySelector$$1(selector) { - var foundNode = this._node.querySelector(selector); - return foundNode ? new Svg(foundNode) : null; - } - - /** - * Find the all child SVG elements of the current element that match a CSS selector. The returned object is a Svg.List wrapper. - * - * @memberof Svg - * @param {String} selector A CSS selector that is used to query for child SVG elements - * @return {SvgList} The SVG wrapper list for the element found or null if no element was found - */ - - }, { - key: 'querySelectorAll', - value: function querySelectorAll(selector) { - var foundNodes = this._node.querySelectorAll(selector); - return foundNodes.length ? new SvgList(foundNodes) : null; - } - - /** - * Returns the underlying SVG node for the current element. - * - * @memberof Svg - * @returns {Node} - */ - - }, { - key: 'getNode', - value: function getNode() { - return this._node; - } - - /** - * This method creates a foreignObject (see https://developer.mozilla.org/en-US/docs/Web/SVG/Element/foreignObject) that allows to embed HTML content into a SVG graphic. With the help of foreignObjects you can enable the usage of regular HTML elements inside of SVG where they are subject for SVG positioning and transformation but the Browser will use the HTML rendering capabilities for the containing DOM. - * - * @memberof Svg - * @param {Node|String} content The DOM Node, or HTML string that will be converted to a DOM Node, that is then placed into and wrapped by the foreignObject - * @param {String} [attributes] An object with properties that will be added as attributes to the foreignObject element that is created. Attributes with undefined values will not be added. - * @param {String} [className] This class or class list will be added to the SVG element - * @param {Boolean} [insertFirst] Specifies if the foreignObject should be inserted as first child - * @return {Svg} New wrapper object that wraps the foreignObject element - */ - - }, { - key: 'foreignObject', - value: function foreignObject(content, attributes, className, insertFirst) { - // If content is string then we convert it to DOM - // TODO: Handle case where content is not a string nor a DOM Node - if (typeof content === 'string') { - var container = document.createElement('div'); - container.innerHTML = content; - content = container.firstChild; - } - - // Adding namespace to content element - content.setAttribute('xmlns', namespaces.xmlns); - - // Creating the foreignObject without required extension attribute (as described here - // http://www.w3.org/TR/SVG/extend.html#ForeignObjectElement) - var fnObj = this.elem('foreignObject', attributes, className, insertFirst); - - // Add content to foreignObjectElement - fnObj._node.appendChild(content); - - return fnObj; - } - - /** - * This method adds a new text element to the current Svg wrapper. - * - * @memberof Svg - * @param {String} t The text that should be added to the text element that is created - * @return {Svg} The same wrapper object that was used to add the newly created element - */ - - }, { - key: 'text', - value: function text(t) { - this._node.appendChild(document.createTextNode(t)); - return this; - } - - /** - * This method will clear all child nodes of the current wrapper object. - * - * @memberof Svg - * @return {Svg} The same wrapper object that got emptied - */ - - }, { - key: 'empty', - value: function empty() { - while (this._node.firstChild) { - this._node.removeChild(this._node.firstChild); - } - - return this; - } - - /** - * This method will cause the current wrapper to remove itself from its parent wrapper. Use this method if you'd like to get rid of an element in a given DOM structure. - * - * @memberof Svg - * @return {Svg} The parent wrapper object of the element that got removed - */ - - }, { - key: 'remove', - value: function remove() { - this._node.parentNode.removeChild(this._node); - return this.parent(); - } - - /** - * This method will replace the element with a new element that can be created outside of the current DOM. - * - * @memberof Svg - * @param {Svg} newElement The new Svg object that will be used to replace the current wrapper object - * @return {Svg} The wrapper of the new element - */ - - }, { - key: 'replace', - value: function replace(newElement) { - this._node.parentNode.replaceChild(newElement._node, this._node); - return newElement; - } - - /** - * This method will append an element to the current element as a child. - * - * @memberof Svg - * @param {Svg} element The Svg element that should be added as a child - * @param {Boolean} [insertFirst] Specifies if the element should be inserted as first child - * @return {Svg} The wrapper of the appended object - */ - - }, { - key: 'append', - value: function append(element, insertFirst) { - if (insertFirst && this._node.firstChild) { - this._node.insertBefore(element._node, this._node.firstChild); - } else { - this._node.appendChild(element._node); - } - - return this; - } - - /** - * Returns an array of class names that are attached to the current wrapper element. This method can not be chained further. - * - * @memberof Svg - * @return {Array} A list of classes or an empty array if there are no classes on the current element - */ - - }, { - key: 'classes', - value: function classes() { - return this._node.getAttribute('class') ? this._node.getAttribute('class').trim().split(/\s+/) : []; - } - - /** - * Adds one or a space separated list of classes to the current element and ensures the classes are only existing once. - * - * @memberof Svg - * @param {String} names A white space separated list of class names - * @return {Svg} The wrapper of the current element - */ - - }, { - key: 'addClass', - value: function addClass(names) { - this._node.setAttribute('class', this.classes().concat(names.trim().split(/\s+/)).filter(function (elem, pos, self) { - return self.indexOf(elem) === pos; - }).join(' ')); - - return this; - } - - /** - * Removes one or a space separated list of classes from the current element. - * - * @memberof Svg - * @param {String} names A white space separated list of class names - * @return {Svg} The wrapper of the current element - */ - - }, { - key: 'removeClass', - value: function removeClass(names) { - var removedClasses = names.trim().split(/\s+/); - - this._node.setAttribute('class', this.classes().filter(function (name) { - return removedClasses.indexOf(name) === -1; - }).join(' ')); - - return this; - } - - /** - * Removes all classes from the current element. - * - * @memberof Svg - * @return {Svg} The wrapper of the current element - */ - - }, { - key: 'removeAllClasses', - value: function removeAllClasses() { - this._node.setAttribute('class', ''); - return this; - } - - /** - * Get element height using `getBoundingClientRect` - * - * @memberof Svg - * @return {Number} The elements height in pixels - */ - - }, { - key: 'height', - value: function height() { - return this._node.getBoundingClientRect().height; - } - - /** - * Get element width using `getBoundingClientRect` - * - * @memberof Chartist.Core - * @return {Number} The elements width in pixels - */ - - }, { - key: 'width', - value: function width() { - return this._node.getBoundingClientRect().width; - } - - /** - * The animate function lets you animate the current element with SMIL animations. You can add animations for multiple attributes at the same time by using an animation definition object. This object should contain SMIL animation attributes. Please refer to http://www.w3.org/TR/SVG/animate.html for a detailed specification about the available animation attributes. Additionally an easing property can be passed in the animation definition object. This can be a string with a name of an easing function in `Svg.Easing` or an array with four numbers specifying a cubic Bézier curve. - * **An animations object could look like this:** - * ```javascript - * element.animate({ - * opacity: { - * dur: 1000, - * from: 0, - * to: 1 - * }, - * x1: { - * dur: '1000ms', - * from: 100, - * to: 200, - * easing: 'easeOutQuart' - * }, - * y1: { - * dur: '2s', - * from: 0, - * to: 100 - * } - * }); - * ``` - * **Automatic unit conversion** - * For the `dur` and the `begin` animate attribute you can also omit a unit by passing a number. The number will automatically be converted to milli seconds. - * **Guided mode** - * The default behavior of SMIL animations with offset using the `begin` attribute is that the attribute will keep it's original value until the animation starts. Mostly this behavior is not desired as you'd like to have your element attributes already initialized with the animation `from` value even before the animation starts. Also if you don't specify `fill="freeze"` on an animate element or if you delete the animation after it's done (which is done in guided mode) the attribute will switch back to the initial value. This behavior is also not desired when performing simple one-time animations. For one-time animations you'd want to trigger animations immediately instead of relative to the document begin time. That's why in guided mode Svg will also use the `begin` property to schedule a timeout and manually start the animation after the timeout. If you're using multiple SMIL definition objects for an attribute (in an array), guided mode will be disabled for this attribute, even if you explicitly enabled it. - * If guided mode is enabled the following behavior is added: - * - Before the animation starts (even when delayed with `begin`) the animated attribute will be set already to the `from` value of the animation - * - `begin` is explicitly set to `indefinite` so it can be started manually without relying on document begin time (creation) - * - The animate element will be forced to use `fill="freeze"` - * - The animation will be triggered with `beginElement()` in a timeout where `begin` of the definition object is interpreted in milli seconds. If no `begin` was specified the timeout is triggered immediately. - * - After the animation the element attribute value will be set to the `to` value of the animation - * - The animate element is deleted from the DOM - * - * @memberof Svg - * @param {Object} animations An animations object where the property keys are the attributes you'd like to animate. The properties should be objects again that contain the SMIL animation attributes (usually begin, dur, from, and to). The property begin and dur is auto converted (see Automatic unit conversion). You can also schedule multiple animations for the same attribute by passing an Array of SMIL definition objects. Attributes that contain an array of SMIL definition objects will not be executed in guided mode. - * @param {Boolean} guided Specify if guided mode should be activated for this animation (see Guided mode). If not otherwise specified, guided mode will be activated. - * @param {Object} eventEmitter If specified, this event emitter will be notified when an animation starts or ends. - * @return {Svg} The current element where the animation was added - */ - - }, { - key: 'animate', - value: function animate(animations, guided, eventEmitter) { - var _this = this; - - if (guided === undefined) { - guided = true; - } - - Object.keys(animations).forEach(function (attribute) { - - var createAnimate = function createAnimate(animationDefinition, createGuided) { - var attributeProperties = {}; - var animationEasing = void 0; - var timeout = void 0; - - // Check if an easing is specified in the definition object and delete it from the object as it will not - // be part of the animate element attributes. - if (animationDefinition.easing) { - // If already an easing Bézier curve array we take it or we lookup a easing array in the Easing object - animationEasing = animationDefinition.easing instanceof Array ? animationDefinition.easing : easings[animationDefinition.easing]; - delete animationDefinition.easing; - } - - // If numeric dur or begin was provided we assume milli seconds - animationDefinition.begin = ensureUnit(animationDefinition.begin, 'ms'); - animationDefinition.dur = ensureUnit(animationDefinition.dur, 'ms'); - - if (animationEasing) { - animationDefinition.calcMode = 'spline'; - animationDefinition.keySplines = animationEasing.join(' '); - animationDefinition.keyTimes = '0;1'; - } - - // Adding "fill: freeze" if we are in guided mode and set initial attribute values - if (createGuided) { - animationDefinition.fill = 'freeze'; - // Animated property on our element should already be set to the animation from value in guided mode - attributeProperties[attribute] = animationDefinition.from; - _this.attr(attributeProperties); - - // In guided mode we also set begin to indefinite so we can trigger the start manually and put the begin - // which needs to be in ms aside - timeout = quantity(animationDefinition.begin || 0).value; - animationDefinition.begin = 'indefinite'; - } - - var animate = _this.elem('animate', extend({ - attributeName: attribute - }, animationDefinition)); - - if (createGuided) { - // If guided we take the value that was put aside in timeout and trigger the animation manually with a timeout - setTimeout(function () { - // If beginElement fails we set the animated attribute to the end position and remove the animate element - // This happens if the SMIL ElementTimeControl interface is not supported or any other problems occurred in - // the browser. (Currently FF 34 does not support animate elements in foreignObjects) - try { - animate._node.beginElement(); - } catch (err) { - // Set animated attribute to current animated value - attributeProperties[attribute] = animationDefinition.to; - _this.attr(attributeProperties); - // Remove the animate element as it's no longer required - animate.remove(); - } - }, timeout); - } - - if (eventEmitter) { - animate._node.addEventListener('beginEvent', function () { - return eventEmitter.emit('animationBegin', { - element: _this, - animate: animate._node, - params: animationDefinition - }); - }); - } - - animate._node.addEventListener('endEvent', function () { - if (eventEmitter) { - eventEmitter.emit('animationEnd', { - element: _this, - animate: animate._node, - params: animationDefinition - }); - } - - if (createGuided) { - // Set animated attribute to current animated value - attributeProperties[attribute] = animationDefinition.to; - _this.attr(attributeProperties); - // Remove the animate element as it's no longer required - animate.remove(); - } - }); - }; - - // If current attribute is an array of definition objects we create an animate for each and disable guided mode - if (animations[attribute] instanceof Array) { - animations[attribute].forEach(function (animationDefinition) { - return createAnimate(animationDefinition, false); - }); - } else { - createAnimate(animations[attribute], guided); - } - }); - - return this; - } - }]); - - return Svg; -}(); - -/** - * This method checks for support of a given SVG feature like Extensibility, SVG-animation or the like. Check http://www.w3.org/TR/SVG11/feature for a detailed list. - * - * @memberof Svg - * @param {String} feature The SVG 1.1 feature that should be checked for support. - * @return {Boolean} True of false if the feature is supported or not - */ -function isSupported(feature) { - return document.implementation.hasFeature('http://www.w3.org/TR/SVG11/feature#' + feature, '1.1'); -} - -/** - * This Object contains some standard easing cubic bezier curves. Then can be used with their name in the `Svg.animate`. You can also extend the list and use your own name in the `animate` function. Click the show code button to see the available bezier functions. - * - * @memberof Svg - */ -var easings = { - easeInSine: [0.47, 0, 0.745, 0.715], - easeOutSine: [0.39, 0.575, 0.565, 1], - easeInOutSine: [0.445, 0.05, 0.55, 0.95], - easeInQuad: [0.55, 0.085, 0.68, 0.53], - easeOutQuad: [0.25, 0.46, 0.45, 0.94], - easeInOutQuad: [0.455, 0.03, 0.515, 0.955], - easeInCubic: [0.55, 0.055, 0.675, 0.19], - easeOutCubic: [0.215, 0.61, 0.355, 1], - easeInOutCubic: [0.645, 0.045, 0.355, 1], - easeInQuart: [0.895, 0.03, 0.685, 0.22], - easeOutQuart: [0.165, 0.84, 0.44, 1], - easeInOutQuart: [0.77, 0, 0.175, 1], - easeInQuint: [0.755, 0.05, 0.855, 0.06], - easeOutQuint: [0.23, 1, 0.32, 1], - easeInOutQuint: [0.86, 0, 0.07, 1], - easeInExpo: [0.95, 0.05, 0.795, 0.035], - easeOutExpo: [0.19, 1, 0.22, 1], - easeInOutExpo: [1, 0, 0, 1], - easeInCirc: [0.6, 0.04, 0.98, 0.335], - easeOutCirc: [0.075, 0.82, 0.165, 1], - easeInOutCirc: [0.785, 0.135, 0.15, 0.86], - easeInBack: [0.6, -0.28, 0.735, 0.045], - easeOutBack: [0.175, 0.885, 0.32, 1.275], - easeInOutBack: [0.68, -0.55, 0.265, 1.55] -}; - -/** - * Create or reinitialize the SVG element for the chart - * - * @memberof Chartist.Core - * @param {Node} container The containing DOM Node object that will be used to plant the SVG element - * @param {String} width Set the width of the SVG element. Default is 100% - * @param {String} height Set the height of the SVG element. Default is 100% - * @param {String} className Specify a class to be added to the SVG element - * @return {Object} The created/reinitialized SVG element - */ -function createSvg(container) { - var width = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '100%'; - var height = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '100%'; - var className = arguments[3]; - - // Check if there is a previous SVG element in the container that contains the Chartist XML namespace and remove it - // Since the DOM API does not support namespaces we need to manually search the returned list http://www.w3.org/TR/selectors-api/ - Array.from(container.querySelectorAll('svg')).filter(function (svg) { - return svg.getAttributeNS(namespaces.xmlns, 'ct'); - }).forEach(function (svg) { - return container.removeChild(svg); - }); - - // Create svg object with width and height or use 100% as default - var svg = new Svg('svg').attr({ - width: width, - height: height - }).addClass(className).attr({ - // TODO: Check better solution (browser support) and remove inline styles due to CSP - style: 'width: ' + width + '; height: ' + height + ';' - }); - - // Add the DOM node to our container - container.appendChild(svg._node); - - return svg; -} - -/** - * Converts a number into a padding object. - * - * @memberof Chartist.Core - * @param {Object|Number} padding - * @param {Number} [fallback] This value is used to fill missing values if a incomplete padding object was passed - * @returns {Object} Returns a padding object containing top, right, bottom, left properties filled with the padding number passed in as argument. If the argument is something else than a number (presumably already a correct padding object) then this argument is directly returned. - */ -function normalizePadding(padding) { - var fallback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; - - return typeof padding === 'number' ? { - top: padding, - right: padding, - bottom: padding, - left: padding - } : { - top: typeof padding.top === 'number' ? padding.top : fallback, - right: typeof padding.right === 'number' ? padding.right : fallback, - bottom: typeof padding.bottom === 'number' ? padding.bottom : fallback, - left: typeof padding.left === 'number' ? padding.left : fallback - }; -} - -/** - * Initialize chart drawing rectangle (area where chart is drawn) x1,y1 = bottom left / x2,y2 = top right - * - * @memberof Chartist.Core - * @param {Object} svg The svg element for the chart - * @param {Object} options The Object that contains all the optional values for the chart - * @param {Number} [fallbackPadding] The fallback padding if partial padding objects are used - * @return {Object} The chart rectangles coordinates inside the svg element plus the rectangles measurements - */ -function createChartRect(svg, options, fallbackPadding) { - var hasAxis = !!(options.axisX || options.axisY); - var yAxisOffset = hasAxis ? options.axisY.offset : 0; - var xAxisOffset = hasAxis ? options.axisX.offset : 0; - // If width or height results in invalid value (including 0) we fallback to the unitless settings or even 0 - var width = svg.width() || quantity(options.width).value || 0; - var height = svg.height() || quantity(options.height).value || 0; - var normalizedPadding = normalizePadding(options.chartPadding, fallbackPadding); - - // If settings were to small to cope with offset (legacy) and padding, we'll adjust - width = Math.max(width, yAxisOffset + normalizedPadding.left + normalizedPadding.right); - height = Math.max(height, xAxisOffset + normalizedPadding.top + normalizedPadding.bottom); - - var chartRect = { - padding: normalizedPadding, - width: function width() { - return this.x2 - this.x1; - }, - height: function height() { - return this.y1 - this.y2; - } - }; - - if (hasAxis) { - if (options.axisX.position === 'start') { - chartRect.y2 = normalizedPadding.top + xAxisOffset; - chartRect.y1 = Math.max(height - normalizedPadding.bottom, chartRect.y2 + 1); - } else { - chartRect.y2 = normalizedPadding.top; - chartRect.y1 = Math.max(height - normalizedPadding.bottom - xAxisOffset, chartRect.y2 + 1); - } - - if (options.axisY.position === 'start') { - chartRect.x1 = normalizedPadding.left + yAxisOffset; - chartRect.x2 = Math.max(width - normalizedPadding.right, chartRect.x1 + 1); - } else { - chartRect.x1 = normalizedPadding.left; - chartRect.x2 = Math.max(width - normalizedPadding.right - yAxisOffset, chartRect.x1 + 1); - } - } else { - chartRect.x1 = normalizedPadding.left; - chartRect.x2 = Math.max(width - normalizedPadding.right, chartRect.x1 + 1); - chartRect.y2 = normalizedPadding.top; - chartRect.y1 = Math.max(height - normalizedPadding.bottom, chartRect.y2 + 1); - } - - return chartRect; -} - -/** - * Creates a grid line based on a projected value. - * - * @memberof Chartist.Core - * @param position - * @param index - * @param axis - * @param offset - * @param length - * @param group - * @param classes - * @param eventEmitter - */ -function createGrid(position, index, axis, offset, length, group, classes, eventEmitter) { - var positionalData = {}; - positionalData[axis.units.pos + '1'] = position; - positionalData[axis.units.pos + '2'] = position; - positionalData[axis.counterUnits.pos + '1'] = offset; - positionalData[axis.counterUnits.pos + '2'] = offset + length; - - var gridElement = group.elem('line', positionalData, classes.join(' ')); - - // Event for grid draw - eventEmitter.emit('draw', extend({ - type: 'grid', - axis: axis, - index: index, - group: group, - element: gridElement - }, positionalData)); -} - -/** - * Creates a grid background rect and emits the draw event. - * - * @memberof Chartist.Core - * @param gridGroup - * @param chartRect - * @param className - * @param eventEmitter - */ -function createGridBackground(gridGroup, chartRect, className, eventEmitter) { - var gridBackground = gridGroup.elem('rect', { - x: chartRect.x1, - y: chartRect.y2, - width: chartRect.width(), - height: chartRect.height() - }, className, true); - - // Event for grid background draw - eventEmitter.emit('draw', { - type: 'gridBackground', - group: gridGroup, - element: gridBackground - }); -} - -/** - * Creates a label based on a projected value and an axis. - * - * @memberof Chartist.Core - * @param position - * @param length - * @param index - * @param labels - * @param axis - * @param axisOffset - * @param labelOffset - * @param group - * @param classes - * @param useForeignObject - * @param eventEmitter - */ -function createLabel(position, length, index, labels, axis, axisOffset, labelOffset, group, classes, useForeignObject, eventEmitter) { - var labelElement = void 0; - var positionalData = {}; - - positionalData[axis.units.pos] = position + labelOffset[axis.units.pos]; - positionalData[axis.counterUnits.pos] = labelOffset[axis.counterUnits.pos]; - positionalData[axis.units.len] = length; - positionalData[axis.counterUnits.len] = Math.max(0, axisOffset - 10); - - if (useForeignObject) { - // We need to set width and height explicitly to px as span will not expand with width and height being - // 100% in all browsers - var stepLength = Math.round(positionalData[axis.units.len]); - var stepCounterLength = Math.round(positionalData[axis.counterUnits.len]); - var content = ('\n \n ' + labels[index] + '\n \n ').trim(); - - labelElement = group.foreignObject(content, extend({ - style: 'overflow: visible;' - }, positionalData)); - } else { - labelElement = group.elem('text', positionalData, classes.join(' ')).text(labels[index]); - } - - eventEmitter.emit('draw', extend({ - type: 'label', - axis: axis, - index: index, - group: group, - element: labelElement, - text: labels[index] - }, positionalData)); -} - -/** - * Provides options handling functionality with callback for options changes triggered by responsive options and media query matches - * - * @memberof Chartist.Core - * @param {Object} options Options set by user - * @param {Array} responsiveOptions Optional functions to add responsive behavior to chart - * @param {Object} eventEmitter The event emitter that will be used to emit the options changed events - * @return {Object} The consolidated options object from the defaults, base and matching responsive options - */ -function optionsProvider(options, responsiveOptions, eventEmitter) { - var baseOptions = extend({}, options); - var currentOptions = void 0; - var mediaQueryListeners = []; - - function updateCurrentOptions(mediaEvent) { - var previousOptions = currentOptions; - currentOptions = extend({}, baseOptions); - - if (responsiveOptions) { - responsiveOptions.forEach(function (responsiveOption) { - var mql = window.matchMedia(responsiveOption[0]); - if (mql.matches) { - currentOptions = extend(currentOptions, responsiveOption[1]); - } - }); - } - - if (eventEmitter && mediaEvent) { - eventEmitter.emit('optionsChanged', { - previousOptions: previousOptions, - currentOptions: currentOptions - }); - } - } - - function removeMediaQueryListeners() { - mediaQueryListeners.forEach(function (mql) { - return mql.removeListener(updateCurrentOptions); - }); - } - - if (!window.matchMedia) { - throw 'window.matchMedia not found! Make sure you\'re using a polyfill.'; - } else if (responsiveOptions) { - responsiveOptions.forEach(function (responsiveOption) { - var mql = window.matchMedia(responsiveOption[0]); - mql.addListener(updateCurrentOptions); - mediaQueryListeners.push(mql); - }); - } - // Execute initially without an event argument so we get the correct options - updateCurrentOptions(); - - return { - removeMediaQueryListeners: removeMediaQueryListeners, - getCurrentOptions: function getCurrentOptions() { - return extend({}, currentOptions); - } - }; -} - -var EventEmitter = function () { - function EventEmitter() { - _classCallCheck(this, EventEmitter); - - this.handlers = []; - } - - /** - * Add an event handler for a specific event - * - * @memberof Chartist.Event - * @param {String} event The event name - * @param {Function} handler A event handler function - */ - - _createClass(EventEmitter, [{ - key: 'addEventHandler', - value: function addEventHandler(event, handler) { - this.handlers[event] = this.handlers[event] || []; - this.handlers[event].push(handler); - } - - /** - * Remove an event handler of a specific event name or remove all event handlers for a specific event. - * - * @memberof Chartist.Event - * @param {String} event The event name where a specific or all handlers should be removed - * @param {Function} [handler] An optional event handler function. If specified only this specific handler will be removed and otherwise all handlers are removed. - */ - - }, { - key: 'removeEventHandler', - value: function removeEventHandler(event, handler) { - // Only do something if there are event handlers with this name existing - if (this.handlers[event]) { - // If handler is set we will look for a specific handler and only remove this - if (handler) { - this.handlers[event].splice(this.handlers[event].indexOf(handler), 1); - if (this.handlers[event].length === 0) { - delete this.handlers[event]; - } - } else { - // If no handler is specified we remove all handlers for this event - delete this.handlers[event]; - } - } - } - - /** - * Use this function to emit an event. All handlers that are listening for this event will be triggered with the data parameter. - * - * @memberof Chartist.Event - * @param {String} event The event name that should be triggered - * @param {*} data Arbitrary data that will be passed to the event handler callback functions - */ - - }, { - key: 'emit', - value: function emit(event, data) { - // Only do something if there are event handlers with this name existing - if (this.handlers[event]) { - this.handlers[event].forEach(function (handler) { - return handler(data); - }); - } - - // Emit event to star event handlers - if (this.handlers['*']) { - this.handlers['*'].forEach(function (starHandler) { - return starHandler(event, data); - }); - } - } - }]); - - return EventEmitter; -}(); - -var BaseChart = function () { - /** - * Constructor of chart base class. - * - * @param query - * @param data - * @param defaultOptions - * @param options - * @param responsiveOptions - * @constructor - */ - function BaseChart(query, data, defaultOptions, options, responsiveOptions) { - var _this = this; - - _classCallCheck(this, BaseChart); - - this.container = querySelector(query); - this.data = data || {}; - this.data.labels = this.data.labels || []; - this.data.series = this.data.series || []; - this.defaultOptions = defaultOptions; - this.options = options; - this.responsiveOptions = responsiveOptions; - this.eventEmitter = new EventEmitter(); - this.supportsForeignObject = isSupported('Extensibility'); - this.supportsAnimations = isSupported('AnimationEventsAttribute'); - this.resizeListener = function () { - return _this.update(); - }; - - if (this.container) { - // If chartist was already initialized in this container we are detaching all event listeners first - if (this.container.__chartist__) { - this.container.__chartist__.detach(); - } - - this.container.__chartist__ = this; - } - - // Using event loop for first draw to make it possible to register event listeners in the same call stack where - // the chart was created. - this.initializeTimeoutId = setTimeout(function () { - return _this.initialize(); - }, 0); - } - - _createClass(BaseChart, [{ - key: 'createChart', - value: function createChart() { - throw new Error('Base chart type can\'t be instantiated!'); - } - - // TODO: Currently we need to re-draw the chart on window resize. This is usually very bad and will affect performance. - // This is done because we can't work with relative coordinates when drawing the chart because SVG Path does not - // work with relative positions yet. We need to check if we can do a viewBox hack to switch to percentage. - // See http://mozilla.6506.n7.nabble.com/Specyfing-paths-with-percentages-unit-td247474.html - // Update: can be done using the above method tested here: http://codepen.io/gionkunz/pen/KDvLj - // The problem is with the label offsets that can't be converted into percentage and affecting the chart container - /** - * Updates the chart which currently does a full reconstruction of the SVG DOM - * - * @param {Object} [data] Optional data you'd like to set for the chart before it will update. If not specified the update method will use the data that is already configured with the chart. - * @param {Object} [options] Optional options you'd like to add to the previous options for the chart before it will update. If not specified the update method will use the options that have been already configured with the chart. - * @param {Boolean} [override] If set to true, the passed options will be used to extend the options that have been configured already. Otherwise the chart default options will be used as the base - * @memberof Chartist.Base - */ - - }, { - key: 'update', - value: function update(data, options, override) { - if (data) { - this.data = data || {}; - this.data.labels = this.data.labels || []; - this.data.series = this.data.series || []; - // Event for data transformation that allows to manipulate the data before it gets rendered in the charts - this.eventEmitter.emit('data', { - type: 'update', - data: this.data - }); - } - - if (options) { - this.options = extend({}, override ? this.options : this.defaultOptions, options); - - // If chartist was not initialized yet, we just set the options and leave the rest to the initialization - // Otherwise we re-create the optionsProvider at this point - if (!this.initializeTimeoutId) { - this.optionsProvider.removeMediaQueryListeners(); - this.optionsProvider = optionsProvider(this.options, this.responsiveOptions, this.eventEmitter); - } - } - - // Only re-created the chart if it has been initialized yet - if (!this.initializeTimeoutId) { - this.createChart(this.optionsProvider.getCurrentOptions()); - } - - // Return a reference to the chart object to chain up calls - return this; - } - - /** - * This method can be called on the API object of each chart and will un-register all event listeners that were added to other components. This currently includes a window.resize listener as well as media query listeners if any responsive options have been provided. Use this function if you need to destroy and recreate Chartist charts dynamically. - * - * @memberof Chartist.Base - */ - - }, { - key: 'detach', - value: function detach() { - // Only detach if initialization already occurred on this chart. If this chart still hasn't initialized (therefore - // the initializationTimeoutId is still a valid timeout reference, we will clear the timeout - if (!this.initializeTimeoutId) { - window.removeEventListener('resize', this.resizeListener); - this.optionsProvider.removeMediaQueryListeners(); - } else { - window.clearTimeout(this.initializeTimeoutId); - } - - return this; - } - - /** - * Use this function to register event handlers. The handler callbacks are synchronous and will run in the main thread rather than the event loop. - * - * @memberof Chartist.Base - * @param {String} event Name of the event. Check the examples for supported events. - * @param {Function} handler The handler function that will be called when an event with the given name was emitted. This function will receive a data argument which contains event data. See the example for more details. - */ - - }, { - key: 'on', - value: function on(event, handler) { - this.eventEmitter.addEventHandler(event, handler); - return this; - } - - /** - * Use this function to un-register event handlers. If the handler function parameter is omitted all handlers for the given event will be un-registered. - * - * @memberof Chartist.Base - * @param {String} event Name of the event for which a handler should be removed - * @param {Function} [handler] The handler function that that was previously used to register a new event handler. This handler will be removed from the event handler list. If this parameter is omitted then all event handlers for the given event are removed from the list. - */ - - }, { - key: 'off', - value: function off(event, handler) { - this.eventEmitter.removeEventHandler(event, handler); - return this; - } - }, { - key: 'initialize', - value: function initialize() { - var _this2 = this; - - // Add window resize listener that re-creates the chart - window.addEventListener('resize', this.resizeListener); - - // Obtain current options based on matching media queries (if responsive options are given) - // This will also register a listener that is re-creating the chart based on media changes - this.optionsProvider = optionsProvider(this.options, this.responsiveOptions, this.eventEmitter); - // Register options change listener that will trigger a chart update - this.eventEmitter.addEventHandler('optionsChanged', function () { - return _this2.update(); - }); - - // Before the first chart creation we need to register us with all plugins that are configured - // Initialize all relevant plugins with our chart object and the plugin options specified in the config - if (this.options.plugins) { - this.options.plugins.forEach(function (plugin) { - if (plugin instanceof Array) { - plugin[0](_this2, plugin[1]); - } else { - plugin(_this2); - } - }); - } - - // Event for data transformation that allows to manipulate the data before it gets rendered in the charts - this.eventEmitter.emit('data', { - type: 'initial', - data: this.data - }); - - // Create the first chart - this.createChart(this.optionsProvider.getCurrentOptions()); - - // As chart is initialized from the event loop now we can reset our timeout reference - // This is important if the chart gets initialized on the same element twice - this.initializeTimeoutId = undefined; - } - }]); - - return BaseChart; -}(); - -var _possibleConstructorReturn = (function (self, call) { - if (!self) { - throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); - } - - return call && (typeof call === "object" || typeof call === "function") ? call : self; -}); - -var _inherits = (function (subClass, superClass) { - if (typeof superClass !== "function" && superClass !== null) { - throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); - } - - subClass.prototype = Object.create(superClass && superClass.prototype, { - constructor: { - value: subClass, - enumerable: false, - writable: true, - configurable: true - } - }); - if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; -}); - -var axisUnits = { - x: { - pos: 'x', - len: 'width', - dir: 'horizontal', - rectStart: 'x1', - rectEnd: 'x2', - rectOffset: 'y2' - }, - y: { - pos: 'y', - len: 'height', - dir: 'vertical', - rectStart: 'y2', - rectEnd: 'y1', - rectOffset: 'x1' - } -}; - -var Axis = function () { - function Axis() { - _classCallCheck(this, Axis); - } - - _createClass(Axis, [{ - key: 'initialize', - value: function initialize(units, chartRect, ticks, options) { - this.units = units; - this.counterUnits = units === axisUnits.x ? axisUnits.y : axisUnits.x; - this.options = options; - this.chartRect = chartRect; - this.axisLength = chartRect[this.units.rectEnd] - chartRect[this.units.rectStart]; - this.gridOffset = chartRect[this.units.rectOffset]; - this.ticks = ticks; - } - }, { - key: 'projectValue', - value: function projectValue(value, index, data) { - throw new Error('Base axis can\'t be instantiated!'); - } - }, { - key: 'createGridAndLabels', - value: function createGridAndLabels(gridGroup, labelGroup, useForeignObject, chartOptions, eventEmitter) { - var _this = this; - - var axisOptions = chartOptions['axis' + this.units.pos.toUpperCase()]; - var projectedValues = this.ticks.map(this.projectValue.bind(this)); - var labelValues = this.ticks.map(axisOptions.labelInterpolationFnc); - - projectedValues.forEach(function (projectedValue, index) { - var labelOffset = { - x: 0, - y: 0 - }; - - // TODO: Find better solution for solving this problem - // Calculate how much space we have available for the label - var labelLength = void 0; - if (projectedValues[index + 1]) { - // If we still have one label ahead, we can calculate the distance to the next tick / label - labelLength = projectedValues[index + 1] - projectedValue; - } else { - // If we don't have a label ahead and we have only two labels in total, we just take the remaining distance to - // on the whole axis length. We limit that to a minimum of 30 pixel, so that labels close to the border will - // still be visible inside of the chart padding. - labelLength = Math.max(_this.axisLength - projectedValue, 30); - } - - // Skip grid lines and labels where interpolated label values are falsey (except for 0) - if (isFalseyButZero(labelValues[index]) && labelValues[index] !== '') { - return; - } - - // Transform to global coordinates using the chartRect - // We also need to set the label offset for the createLabel function - if (_this.units.pos === 'x') { - projectedValue = _this.chartRect.x1 + projectedValue; - labelOffset.x = chartOptions.axisX.labelOffset.x; - - // If the labels should be positioned in start position (top side for vertical axis) we need to set a - // different offset as for positioned with end (bottom) - if (chartOptions.axisX.position === 'start') { - labelOffset.y = _this.chartRect.padding.top + chartOptions.axisX.labelOffset.y + (useForeignObject ? 5 : 20); - } else { - labelOffset.y = _this.chartRect.y1 + chartOptions.axisX.labelOffset.y + (useForeignObject ? 5 : 20); - } - } else { - projectedValue = _this.chartRect.y1 - projectedValue; - labelOffset.y = chartOptions.axisY.labelOffset.y - (useForeignObject ? labelLength : 0); - - // If the labels should be positioned in start position (left side for horizontal axis) we need to set a - // different offset as for positioned with end (right side) - if (chartOptions.axisY.position === 'start') { - labelOffset.x = useForeignObject ? _this.chartRect.padding.left + chartOptions.axisY.labelOffset.x : _this.chartRect.x1 - 10; - } else { - labelOffset.x = _this.chartRect.x2 + chartOptions.axisY.labelOffset.x + 10; - } - } - - if (axisOptions.showGrid) { - createGrid(projectedValue, index, _this, _this.gridOffset, _this.chartRect[_this.counterUnits.len](), gridGroup, [chartOptions.classNames.grid, chartOptions.classNames[_this.units.dir]], eventEmitter); - } - - if (axisOptions.showLabel) { - createLabel(projectedValue, labelLength, index, labelValues, _this, axisOptions.offset, labelOffset, labelGroup, [chartOptions.classNames.label, chartOptions.classNames[_this.units.dir], axisOptions.position === 'start' ? chartOptions.classNames[axisOptions.position] : chartOptions.classNames.end], useForeignObject, eventEmitter); - } - }); - } - }]); - - return Axis; -}(); - -var _get = (function get(object, property, receiver) { - if (object === null) object = Function.prototype; - var desc = Object.getOwnPropertyDescriptor(object, property); - - if (desc === undefined) { - var parent = Object.getPrototypeOf(object); - - if (parent === null) { - return undefined; - } else { - return get(parent, property, receiver); - } - } else if ("value" in desc) { - return desc.value; - } else { - var getter = desc.get; - - if (getter === undefined) { - return undefined; - } - - return getter.call(receiver); - } -}); - -var AutoScaleAxis = function (_Axis) { - _inherits(AutoScaleAxis, _Axis); - - function AutoScaleAxis(axisUnit, data, chartRect, options) { - _classCallCheck(this, AutoScaleAxis); - - // Usually we calculate highLow based on the data but this can be overriden by a highLow object in the options - var _this = _possibleConstructorReturn(this, (AutoScaleAxis.__proto__ || Object.getPrototypeOf(AutoScaleAxis)).call(this)); - - var highLow = options.highLow || getHighLow(data, options, axisUnit.pos); - _this.bounds = getBounds(chartRect[axisUnit.rectEnd] - chartRect[axisUnit.rectStart], highLow, options.scaleMinSpace || 20, options.onlyInteger); - _this.range = { - min: _this.bounds.min, - max: _this.bounds.max - }; - - _get(AutoScaleAxis.prototype.__proto__ || Object.getPrototypeOf(AutoScaleAxis.prototype), 'initialize', _this).call(_this, axisUnit, chartRect, _this.bounds.values, options); - return _this; - } - - _createClass(AutoScaleAxis, [{ - key: 'projectValue', - value: function projectValue(value) { - return this.axisLength * (+getMultiValue(value, this.units.pos) - this.bounds.min) / this.bounds.range; - } - }]); - - return AutoScaleAxis; -}(Axis); - -var FixedScaleAxis = function (_Axis) { - _inherits(FixedScaleAxis, _Axis); - - function FixedScaleAxis(axisUnit, data, chartRect, options) { - _classCallCheck(this, FixedScaleAxis); - - var _this = _possibleConstructorReturn(this, (FixedScaleAxis.__proto__ || Object.getPrototypeOf(FixedScaleAxis)).call(this)); - - var highLow = options.highLow || getHighLow(data, options, axisUnit.pos); - _this.divisor = options.divisor || 1; - _this.ticks = options.ticks || times(_this.divisor).map(function (value, index) { - return highLow.low + (highLow.high - highLow.low) / _this.divisor * index; - }); - _this.ticks.sort(function (a, b) { - return a - b; - }); - _this.range = { - min: highLow.low, - max: highLow.high - }; - - _get(FixedScaleAxis.prototype.__proto__ || Object.getPrototypeOf(FixedScaleAxis.prototype), 'initialize', _this).call(_this, axisUnit, chartRect, _this.ticks, options); - - _this.stepLength = _this.axisLength / _this.divisor; - return _this; - } - - _createClass(FixedScaleAxis, [{ - key: 'projectValue', - value: function projectValue(value) { - return this.axisLength * (+getMultiValue(value, this.units.pos) - this.range.min) / (this.range.max - this.range.min); - } - }]); - - return FixedScaleAxis; -}(Axis); - -var StepAxis = function (_Axis) { - _inherits(StepAxis, _Axis); - - function StepAxis(axisUnit, data, chartRect, options) { - _classCallCheck(this, StepAxis); - - var _this = _possibleConstructorReturn(this, (StepAxis.__proto__ || Object.getPrototypeOf(StepAxis)).call(this)); - - _get(StepAxis.prototype.__proto__ || Object.getPrototypeOf(StepAxis.prototype), 'initialize', _this).call(_this, axisUnit, chartRect, options.ticks, options); - - var calc = Math.max(1, options.ticks.length - (options.stretch ? 1 : 0)); - _this.stepLength = _this.axisLength / calc; - return _this; - } - - _createClass(StepAxis, [{ - key: 'projectValue', - value: function projectValue(value, index) { - return this.stepLength * index; - } - }]); - - return StepAxis; -}(Axis); - -/** - * Contains the descriptors of supported element types in a SVG path. Currently only move, line and curve are supported. - * - * @memberof SvgPath - * @type {Object} - */ -var elementDescriptions = { - m: ['x', 'y'], - l: ['x', 'y'], - c: ['x1', 'y1', 'x2', 'y2', 'x', 'y'], - a: ['rx', 'ry', 'xAr', 'lAf', 'sf', 'x', 'y'] -}; - -/** - * Default options for newly created SVG path objects. - * - * @memberof SvgPath - * @type {Object} - */ -var defaultOptions = { - // The accuracy in digit count after the decimal point. This will be used to round numbers in the SVG path. If this option is set to false then no rounding will be performed. - accuracy: 3 -}; - -function element(command, params, pathElements, pos, relative, data) { - var pathElement = extend({ - command: relative ? command.toLowerCase() : command.toUpperCase() - }, params, data ? { data: data } : {}); - - pathElements.splice(pos, 0, pathElement); -} - -function forEachParam(pathElements, cb) { - pathElements.forEach(function (pathElement, pathElementIndex) { - elementDescriptions[pathElement.command.toLowerCase()].forEach(function (paramName, paramIndex) { - cb(pathElement, paramName, pathElementIndex, paramIndex, pathElements); - }); - }); -} - -/** - * Used to construct a new path object. - * - * @memberof SvgPath - * @param {Boolean} close If set to true then this path will be closed when stringified (with a Z at the end) - * @param {Object} options Options object that overrides the default objects. See default options for more details. - * @constructor - */ -var SvgPath = function () { - _createClass(SvgPath, null, [{ - key: 'join', - - /** - * This static function on `SvgPath` is joining multiple paths together into one paths. - * - * @memberof SvgPath - * @param {Array} paths A list of paths to be joined together. The order is important. - * @param {boolean} [close] If the newly created path should be a closed path - * @param {Object} [options] Path options for the newly created path. - * @return {SvgPath} - */ - value: function join(paths, close, options) { - var joinedPath = new SvgPath(close, options); - for (var i = 0; i < paths.length; i++) { - var path = paths[i]; - for (var j = 0; j < path.pathElements.length; j++) { - joinedPath.pathElements.push(path.pathElements[j]); - } - } - return joinedPath; - } - }]); - - function SvgPath(close, options) { - _classCallCheck(this, SvgPath); - - this.pathElements = []; - this.pos = 0; - this.close = close; - this.options = extend({}, defaultOptions, options); - } - - /** - * Gets or sets the current position (cursor) inside of the path. You can move around the cursor freely but limited to 0 or the count of existing elements. All modifications with element functions will insert new elements at the position of this cursor. - * - * @memberof SvgPath - * @param {Number} [pos] If a number is passed then the cursor is set to this position in the path element array. - * @return {SvgPath|Number} If the position parameter was passed then the return value will be the path object for easy call chaining. If no position parameter was passed then the current position is returned. - */ - - _createClass(SvgPath, [{ - key: 'position', - value: function position(pos) { - if (pos !== undefined) { - this.pos = Math.max(0, Math.min(this.pathElements.length, pos)); - return this; - } else { - return this.pos; - } - } - - /** - * Removes elements from the path starting at the current position. - * - * @memberof SvgPath - * @param {Number} count Number of path elements that should be removed from the current position. - * @return {SvgPath} The current path object for easy call chaining. - */ - - }, { - key: 'remove', - value: function remove(count) { - this.pathElements.splice(this.pos, count); - return this; - } - - /** - * Use this function to add a new move SVG path element. - * - * @memberof SvgPath - * @param {Number} x The x coordinate for the move element. - * @param {Number} y The y coordinate for the move element. - * @param {Boolean} [relative] If set to true the move element will be created with relative coordinates (lowercase letter) - * @param {*} [data] Any data that should be stored with the element object that will be accessible in pathElement - * @return {SvgPath} The current path object for easy call chaining. - */ - - }, { - key: 'move', - value: function move(x, y, relative, data) { - element('M', { - x: +x, - y: +y - }, this.pathElements, this.pos++, relative, data); - return this; - } - - /** - * Use this function to add a new line SVG path element. - * - * @memberof SvgPath - * @param {Number} x The x coordinate for the line element. - * @param {Number} y The y coordinate for the line element. - * @param {Boolean} [relative] If set to true the line element will be created with relative coordinates (lowercase letter) - * @param {*} [data] Any data that should be stored with the element object that will be accessible in pathElement - * @return {SvgPath} The current path object for easy call chaining. - */ - - }, { - key: 'line', - value: function line(x, y, relative, data) { - element('L', { - x: +x, - y: +y - }, this.pathElements, this.pos++, relative, data); - return this; - } - - /** - * Use this function to add a new curve SVG path element. - * - * @memberof SvgPath - * @param {Number} x1 The x coordinate for the first control point of the bezier curve. - * @param {Number} y1 The y coordinate for the first control point of the bezier curve. - * @param {Number} x2 The x coordinate for the second control point of the bezier curve. - * @param {Number} y2 The y coordinate for the second control point of the bezier curve. - * @param {Number} x The x coordinate for the target point of the curve element. - * @param {Number} y The y coordinate for the target point of the curve element. - * @param {Boolean} [relative] If set to true the curve element will be created with relative coordinates (lowercase letter) - * @param {*} [data] Any data that should be stored with the element object that will be accessible in pathElement - * @return {SvgPath} The current path object for easy call chaining. - */ - - }, { - key: 'curve', - value: function curve(x1, y1, x2, y2, x, y, relative, data) { - element('C', { - x1: +x1, - y1: +y1, - x2: +x2, - y2: +y2, - x: +x, - y: +y - }, this.pathElements, this.pos++, relative, data); - return this; - } - - /** - * Use this function to add a new non-bezier curve SVG path element. - * - * @memberof SvgPath - * @param {Number} rx The radius to be used for the x-axis of the arc. - * @param {Number} ry The radius to be used for the y-axis of the arc. - * @param {Number} xAr Defines the orientation of the arc - * @param {Number} lAf Large arc flag - * @param {Number} sf Sweep flag - * @param {Number} x The x coordinate for the target point of the curve element. - * @param {Number} y The y coordinate for the target point of the curve element. - * @param {Boolean} [relative] If set to true the curve element will be created with relative coordinates (lowercase letter) - * @param {*} [data] Any data that should be stored with the element object that will be accessible in pathElement - * @return {SvgPath} The current path object for easy call chaining. - */ - - }, { - key: 'arc', - value: function arc(rx, ry, xAr, lAf, sf, x, y, relative, data) { - element('A', { - rx: +rx, - ry: +ry, - xAr: +xAr, - lAf: +lAf, - sf: +sf, - x: +x, - y: +y - }, this.pathElements, this.pos++, relative, data); - return this; - } - - /** - * Parses an SVG path seen in the d attribute of path elements, and inserts the parsed elements into the existing path object at the current cursor position. Any closing path indicators (Z at the end of the path) will be ignored by the parser as this is provided by the close option in the options of the path object. - * - * @memberof SvgPath - * @param {String} path Any SVG path that contains move (m), line (l) or curve (c) components. - * @return {SvgPath} The current path object for easy call chaining. - */ - - }, { - key: 'parse', - value: function parse(path) { - var _pathElements; - - // Parsing the SVG path string into an array of arrays [['M', '10', '10'], ['L', '100', '100']] - var chunks = path.replace(/([A-Za-z])([0-9])/g, '$1 $2').replace(/([0-9])([A-Za-z])/g, '$1 $2').split(/[\s,]+/).reduce(function (result, pathElement) { - if (pathElement.match(/[A-Za-z]/)) { - result.push([]); - } - - result[result.length - 1].push(pathElement); - return result; - }, []); - - // If this is a closed path we remove the Z at the end because this is determined by the close option - if (chunks[chunks.length - 1][0].toUpperCase() === 'Z') { - chunks.pop(); - } - - // Using svgPathElementDescriptions to map raw path arrays into objects that contain the command and the parameters - // For example {command: 'M', x: '10', y: '10'} - var elements = chunks.map(function (chunk) { - var command = chunk.shift(); - var description = elementDescriptions[command.toLowerCase()]; - - return extend({ - command: command - }, description.reduce(function (result, paramName, index) { - result[paramName] = +chunk[index]; - return result; - }, {})); - }); - - // Preparing a splice call with the elements array as var arg params and insert the parsed elements at the current position - (_pathElements = this.pathElements).splice.apply(_pathElements, [this.pos, 0].concat(_toConsumableArray(elements))); - // Increase the internal position by the element count - this.pos += elements.length; - - return this; - } - - /** - * This function renders to current SVG path object into a final SVG string that can be used in the d attribute of SVG path elements. It uses the accuracy option to round big decimals. If the close parameter was set in the constructor of this path object then a path closing Z will be appended to the output string. - * - * @memberof SvgPath - * @return {String} - */ - - }, { - key: 'stringify', - value: function stringify() { - var _this = this; - - var accuracyMultiplier = Math.pow(10, this.options.accuracy); - - return this.pathElements.reduce(function (path, pathElement) { - var params = elementDescriptions[pathElement.command.toLowerCase()].map(function (paramName) { - return _this.options.accuracy ? Math.round(pathElement[paramName] * accuracyMultiplier) / accuracyMultiplier : pathElement[paramName]; - }); - - return path + pathElement.command + params.join(','); - }, '') + (this.close ? 'Z' : ''); - } - - /** - * Scales all elements in the current SVG path object. There is an individual parameter for each coordinate. Scaling will also be done for control points of curves, affecting the given coordinate. - * - * @memberof SvgPath - * @param {Number} x The number which will be used to scale the x, x1 and x2 of all path elements. - * @param {Number} y The number which will be used to scale the y, y1 and y2 of all path elements. - * @return {SvgPath} The current path object for easy call chaining. - */ - - }, { - key: 'scale', - value: function scale(x, y) { - forEachParam(this.pathElements, function (pathElement, paramName) { - return pathElement[paramName] *= paramName[0] === 'x' ? x : y; - }); - return this; - } - - /** - * Translates all elements in the current SVG path object. The translation is relative and there is an individual parameter for each coordinate. Translation will also be done for control points of curves, affecting the given coordinate. - * - * @memberof SvgPath - * @param {Number} x The number which will be used to translate the x, x1 and x2 of all path elements. - * @param {Number} y The number which will be used to translate the y, y1 and y2 of all path elements. - * @return {SvgPath} The current path object for easy call chaining. - */ - - }, { - key: 'translate', - value: function translate(x, y) { - forEachParam(this.pathElements, function (pathElement, paramName) { - return pathElement[paramName] += paramName[0] === 'x' ? x : y; - }); - return this; - } - - /** - * This function will run over all existing path elements and then loop over their attributes. The callback function will be called for every path element attribute that exists in the current path. - * The method signature of the callback function looks like this: - * ```javascript - * function(pathElement, paramName, pathElementIndex, paramIndex, pathElements) - * ``` - * If something else than undefined is returned by the callback function, this value will be used to replace the old value. This allows you to build custom transformations of path objects that can't be achieved using the basic transformation functions scale and translate. - * - * @memberof SvgPath - * @param {Function} transformFnc The callback function for the transformation. Check the signature in the function description. - * @return {SvgPath} The current path object for easy call chaining. - */ - - }, { - key: 'transform', - value: function transform(transformFnc) { - forEachParam(this.pathElements, function (pathElement, paramName, pathElementIndex, paramIndex, pathElements) { - var transformed = transformFnc(pathElement, paramName, pathElementIndex, paramIndex, pathElements); - if (transformed || transformed === 0) { - pathElement[paramName] = transformed; - } - }); - return this; - } - - /** - * This function clones a whole path object with all its properties. This is a deep clone and path element objects will also be cloned. - * - * @memberof SvgPath - * @param {Boolean} [close] Optional option to set the new cloned path to closed. If not specified or false, the original path close option will be used. - * @return {SvgPath} - */ - - }, { - key: 'clone', - value: function clone(close) { - var clone = new SvgPath(close || this.close); - clone.pos = this.pos; - clone.pathElements = this.pathElements.slice().map(function (pathElement) { - return extend({}, pathElement); - }); - clone.options = extend({}, this.options); - return clone; - } - - /** - * Split a Svg.Path object by a specific command in the path chain. The path chain will be split and an array of newly created paths objects will be returned. This is useful if you'd like to split an SVG path by it's move commands, for example, in order to isolate chunks of drawings. - * - * @memberof SvgPath - * @param {String} command The command you'd like to use to split the path - * @return {Array} - */ - - }, { - key: 'splitByCommand', - value: function splitByCommand(command) { - var split = [new SvgPath()]; - - this.pathElements.forEach(function (pathElement) { - if (pathElement.command === command.toUpperCase() && split[split.length - 1].pathElements.length !== 0) { - split.push(new SvgPath()); - } - - split[split.length - 1].pathElements.push(pathElement); - }); - - return split; - } - }]); - - return SvgPath; -}(); - -/** - * This interpolation function does not smooth the path and the result is only containing lines and no curves. - * - * @example - * var chart = new Chartist.Line('.ct-chart', { - * labels: [1, 2, 3, 4, 5], - * series: [[1, 2, 8, 1, 7]] - * }, { - * lineSmooth: Chartist.Interpolation.none({ - * fillHoles: false - * }) - * }); - * - * - * @memberof Chartist.Interpolation - * @return {Function} - */ -function none(options) { - var defaultOptions = { - fillHoles: false - }; - - options = extend({}, defaultOptions, options); - - return function noneInterpolation(pathCoordinates, valueData) { - var path = new SvgPath(); - var hole = true; - - for (var i = 0; i < pathCoordinates.length; i += 2) { - var currX = pathCoordinates[i]; - var currY = pathCoordinates[i + 1]; - var currData = valueData[i / 2]; - - if (getMultiValue(currData.value) !== undefined) { - - if (hole) { - path.move(currX, currY, false, currData); - } else { - path.line(currX, currY, false, currData); - } - - hole = false; - } else if (!options.fillHoles) { - hole = true; - } - } - - return path; - }; -} - -/** - * Simple smoothing creates horizontal handles that are positioned with a fraction of the length between two data points. You can use the divisor option to specify the amount of smoothing. - * - * Simple smoothing can be used instead of `Chartist.Smoothing.cardinal` if you'd like to get rid of the artifacts it produces sometimes. Simple smoothing produces less flowing lines but is accurate by hitting the points and it also doesn't swing below or above the given data point. - * - * All smoothing functions within Chartist are factory functions that accept an options parameter. The simple interpolation function accepts one configuration parameter `divisor`, between 1 and ∞, which controls the smoothing characteristics. - * - * @example - * var chart = new Chartist.Line('.ct-chart', { - * labels: [1, 2, 3, 4, 5], - * series: [[1, 2, 8, 1, 7]] - * }, { - * lineSmooth: Chartist.Interpolation.simple({ - * divisor: 2, - * fillHoles: false - * }) - * }); - * - * - * @memberof Chartist.Interpolation - * @param {Object} options The options of the simple interpolation factory function. - * @return {Function} - */ -function simple(options) { - var defaultOptions = { - divisor: 2, - fillHoles: false - }; - - options = extend({}, defaultOptions, options); - - var d = 1 / Math.max(1, options.divisor); - - return function simpleInterpolation(pathCoordinates, valueData) { - var path = new SvgPath(); - var prevX = void 0; - var prevY = void 0; - var prevData = void 0; - - for (var i = 0; i < pathCoordinates.length; i += 2) { - var currX = pathCoordinates[i]; - var currY = pathCoordinates[i + 1]; - var length = (currX - prevX) * d; - var currData = valueData[i / 2]; - - if (currData.value !== undefined) { - - if (prevData === undefined) { - path.move(currX, currY, false, currData); - } else { - path.curve(prevX + length, prevY, currX - length, currY, currX, currY, false, currData); - } - - prevX = currX; - prevY = currY; - prevData = currData; - } else if (!options.fillHoles) { - prevX = prevY = prevData = undefined; - } - } - - return path; - }; -} - -/** - * Step interpolation will cause the line chart to move in steps rather than diagonal or smoothed lines. This interpolation will create additional points that will also be drawn when the `showPoint` option is enabled. - * - * All smoothing functions within Chartist are factory functions that accept an options parameter. The step interpolation function accepts one configuration parameter `postpone`, that can be `true` or `false`. The default value is `true` and will cause the step to occur where the value actually changes. If a different behaviour is needed where the step is shifted to the left and happens before the actual value, this option can be set to `false`. - * - * @example - * var chart = new Chartist.Line('.ct-chart', { - * labels: [1, 2, 3, 4, 5], - * series: [[1, 2, 8, 1, 7]] - * }, { - * lineSmooth: Chartist.Interpolation.step({ - * postpone: true, - * fillHoles: false - * }) - * }); - * - * @memberof Chartist.Interpolation - * @param options - * @returns {Function} - */ -function step(options) { - var defaultOptions = { - postpone: true, - fillHoles: false - }; - - options = extend({}, defaultOptions, options); - - return function stepInterpolation(pathCoordinates, valueData) { - var path = new SvgPath(); - - var prevX = void 0; - var prevY = void 0; - var prevData = void 0; - - for (var i = 0; i < pathCoordinates.length; i += 2) { - var currX = pathCoordinates[i]; - var currY = pathCoordinates[i + 1]; - var currData = valueData[i / 2]; - - // If the current point is also not a hole we can draw the step lines - if (currData.value !== undefined) { - if (prevData === undefined) { - path.move(currX, currY, false, currData); - } else { - if (options.postpone) { - // If postponed we should draw the step line with the value of the previous value - path.line(currX, prevY, false, prevData); - } else { - // If not postponed we should draw the step line with the value of the current value - path.line(prevX, currY, false, currData); - } - // Line to the actual point (this should only be a Y-Axis movement - path.line(currX, currY, false, currData); - } - - prevX = currX; - prevY = currY; - prevData = currData; - } else if (!options.fillHoles) { - prevX = prevY = prevData = undefined; - } - } - - return path; - }; -} - -/** - * Cardinal / Catmull-Rome spline interpolation is the default smoothing function in Chartist. It produces nice results where the splines will always meet the points. It produces some artifacts though when data values are increased or decreased rapidly. The line may not follow a very accurate path and if the line should be accurate this smoothing function does not produce the best results. - * - * Cardinal splines can only be created if there are more than two data points. If this is not the case this smoothing will fallback to `Chartist.Smoothing.none`. - * - * All smoothing functions within Chartist are factory functions that accept an options parameter. The cardinal interpolation function accepts one configuration parameter `tension`, between 0 and 1, which controls the smoothing intensity. - * - * @example - * var chart = new Chartist.Line('.ct-chart', { - * labels: [1, 2, 3, 4, 5], - * series: [[1, 2, 8, 1, 7]] - * }, { - * lineSmooth: Chartist.Interpolation.cardinal({ - * tension: 1, - * fillHoles: false - * }) - * }); - * - * @memberof Chartist.Interpolation - * @param {Object} options The options of the cardinal factory function. - * @return {Function} - */ -function cardinal(options) { - var defaultOptions = { - tension: 1, - fillHoles: false - }; - - options = extend({}, defaultOptions, options); - - var t = Math.min(1, Math.max(0, options.tension)); - var c = 1 - t; - - return function cardinalInterpolation(pathCoordinates, valueData) { - // First we try to split the coordinates into segments - // This is necessary to treat "holes" in line charts - var segments = splitIntoSegments(pathCoordinates, valueData, { - fillHoles: options.fillHoles - }); - - if (!segments.length) { - // If there were no segments return 'none' interpolation - return none()([]); - } else if (segments.length > 1) { - // If the split resulted in more that one segment we need to interpolate each segment individually and join them - // afterwards together into a single path. - // For each segment we will recurse the cardinal function - // Join the segment path data into a single path and return - return SvgPath.join(segments.map(function (segment) { - return cardinalInterpolation(segment.pathCoordinates, segment.valueData); - })); - } else { - // If there was only one segment we can proceed regularly by using pathCoordinates and valueData from the first - // segment - pathCoordinates = segments[0].pathCoordinates; - valueData = segments[0].valueData; - - // If less than two points we need to fallback to no smoothing - if (pathCoordinates.length <= 4) { - return none()(pathCoordinates, valueData); - } - - var path = new SvgPath().move(pathCoordinates[0], pathCoordinates[1], false, valueData[0]); - var z = void 0; - - for (var i = 0, iLen = pathCoordinates.length; iLen - 2 * !z > i; i += 2) { - var p = [{ x: +pathCoordinates[i - 2], y: +pathCoordinates[i - 1] }, { x: +pathCoordinates[i], y: +pathCoordinates[i + 1] }, { x: +pathCoordinates[i + 2], y: +pathCoordinates[i + 3] }, { x: +pathCoordinates[i + 4], y: +pathCoordinates[i + 5] }]; - - if (z) { - if (!i) { - p[0] = { x: +pathCoordinates[iLen - 2], y: +pathCoordinates[iLen - 1] }; - } else if (iLen - 4 === i) { - p[3] = { x: +pathCoordinates[0], y: +pathCoordinates[1] }; - } else if (iLen - 2 === i) { - p[2] = { x: +pathCoordinates[0], y: +pathCoordinates[1] }; - p[3] = { x: +pathCoordinates[2], y: +pathCoordinates[3] }; - } - } else { - if (iLen - 4 === i) { - p[3] = p[2]; - } else if (!i) { - p[0] = { x: +pathCoordinates[i], y: +pathCoordinates[i + 1] }; - } - } - - path.curve(t * (-p[0].x + 6 * p[1].x + p[2].x) / 6 + c * p[2].x, t * (-p[0].y + 6 * p[1].y + p[2].y) / 6 + c * p[2].y, t * (p[1].x + 6 * p[2].x - p[3].x) / 6 + c * p[2].x, t * (p[1].y + 6 * p[2].y - p[3].y) / 6 + c * p[2].y, p[2].x, p[2].y, false, valueData[(i + 2) / 2]); - } - - return path; - } - }; -} - -/** - * Monotone Cubic spline interpolation produces a smooth curve which preserves monotonicity. Unlike cardinal splines, the curve will not extend beyond the range of y-values of the original data points. - * - * Monotone Cubic splines can only be created if there are more than two data points. If this is not the case this smoothing will fallback to `Chartist.Smoothing.none`. - * - * The x-values of subsequent points must be increasing to fit a Monotone Cubic spline. If this condition is not met for a pair of adjacent points, then there will be a break in the curve between those data points. - * - * All smoothing functions within Chartist are factory functions that accept an options parameter. - * - * @example - * var chart = new Chartist.Line('.ct-chart', { - * labels: [1, 2, 3, 4, 5], - * series: [[1, 2, 8, 1, 7]] - * }, { - * lineSmooth: Chartist.Interpolation.monotoneCubic({ - * fillHoles: false - * }) - * }); - * - * @memberof Chartist.Interpolation - * @param {Object} [options] The options of the monotoneCubic factory function. - * @return {Function} - */ -function monotoneCubic(options) { - var defaultOptions = { - fillHoles: false - }; - - options = extend({}, defaultOptions, options); - - return function monotoneCubicInterpolation(pathCoordinates, valueData) { - // First we try to split the coordinates into segments - // This is necessary to treat "holes" in line charts - var segments = splitIntoSegments(pathCoordinates, valueData, { - fillHoles: options.fillHoles, - increasingX: true - }); - - if (!segments.length) { - // If there were no segments return 'Chartist.Interpolation.none' - return none()([]); - } else if (segments.length > 1) { - // If the split resulted in more that one segment we need to interpolate each segment individually and join them - // afterwards together into a single path. - // For each segment we will recurse the monotoneCubic fn function - // Join the segment path data into a single path and return - return SvgPath.join(segments.map(function (segment) { - return monotoneCubicInterpolation(segment.pathCoordinates, segment.valueData); - })); - } else { - // If there was only one segment we can proceed regularly by using pathCoordinates and valueData from the first - // segment - pathCoordinates = segments[0].pathCoordinates; - valueData = segments[0].valueData; - - // If less than three points we need to fallback to no smoothing - if (pathCoordinates.length <= 4) { - return none()(pathCoordinates, valueData); - } - - var xs = []; - var ys = []; - var n = pathCoordinates.length / 2; - var ms = []; - var ds = []; - var dys = []; - var dxs = []; - - // Populate x and y coordinates into separate arrays, for readability - for (var i = 0; i < n; i++) { - xs[i] = pathCoordinates[i * 2]; - ys[i] = pathCoordinates[i * 2 + 1]; - } - - // Calculate deltas and derivative - for (var _i = 0; _i < n - 1; _i++) { - dys[_i] = ys[_i + 1] - ys[_i]; - dxs[_i] = xs[_i + 1] - xs[_i]; - ds[_i] = dys[_i] / dxs[_i]; - } - - // Determine desired slope (m) at each point using Fritsch-Carlson method - // See: http://math.stackexchange.com/questions/45218/implementation-of-monotone-cubic-interpolation - ms[0] = ds[0]; - ms[n - 1] = ds[n - 2]; - - for (var _i2 = 1; _i2 < n - 1; _i2++) { - if (ds[_i2] === 0 || ds[_i2 - 1] === 0 || ds[_i2 - 1] > 0 !== ds[_i2] > 0) { - ms[_i2] = 0; - } else { - ms[_i2] = 3 * (dxs[_i2 - 1] + dxs[_i2]) / ((2 * dxs[_i2] + dxs[_i2 - 1]) / ds[_i2 - 1] + (dxs[_i2] + 2 * dxs[_i2 - 1]) / ds[_i2]); - - if (!isFinite(ms[_i2])) { - ms[_i2] = 0; - } - } - } - - // Now build a path from the slopes - var path = new SvgPath().move(xs[0], ys[0], false, valueData[0]); - - for (var _i3 = 0; _i3 < n - 1; _i3++) { - path.curve( - // First control point - xs[_i3] + dxs[_i3] / 3, ys[_i3] + ms[_i3] * dxs[_i3] / 3, - // Second control point - xs[_i3 + 1] - dxs[_i3] / 3, ys[_i3 + 1] - ms[_i3 + 1] * dxs[_i3] / 3, - // End point - xs[_i3 + 1], ys[_i3 + 1], false, valueData[_i3 + 1]); - } - - return path; - } - }; -} - - - -var interpolation = /*#__PURE__*/Object.freeze({ - none: none, - simple: simple, - step: step, - cardinal: cardinal, - monotoneCubic: monotoneCubic -}); - -/** - * Default options in line charts. Expand the code view to see a detailed list of options with comments. - * - * @memberof Chartist.Line - */ -var defaultOptions$1 = { - // Options for X-Axis - axisX: { - // The offset of the labels to the chart area - offset: 30, - // Position where labels are placed. Can be set to `start` or `end` where `start` is equivalent to left or top on vertical axis and `end` is equivalent to right or bottom on horizontal axis. - position: 'end', - // Allows you to correct label positioning on this axis by positive or negative x and y offset. - labelOffset: { - x: 0, - y: 0 - }, - // If labels should be shown or not - showLabel: true, - // If the axis grid should be drawn or not - showGrid: true, - // Interpolation function that allows you to intercept the value from the axis label - labelInterpolationFnc: noop, - // Set the axis type to be used to project values on this axis. If not defined, Chartist.StepAxis will be used for the X-Axis, where the ticks option will be set to the labels in the data and the stretch option will be set to the global fullWidth option. This type can be changed to any axis constructor available (e.g. Chartist.FixedScaleAxis), where all axis options should be present here. - type: undefined - }, - // Options for Y-Axis - axisY: { - // The offset of the labels to the chart area - offset: 40, - // Position where labels are placed. Can be set to `start` or `end` where `start` is equivalent to left or top on vertical axis and `end` is equivalent to right or bottom on horizontal axis. - position: 'start', - // Allows you to correct label positioning on this axis by positive or negative x and y offset. - labelOffset: { - x: 0, - y: 0 - }, - // If labels should be shown or not - showLabel: true, - // If the axis grid should be drawn or not - showGrid: true, - // Interpolation function that allows you to intercept the value from the axis label - labelInterpolationFnc: noop, - // Set the axis type to be used to project values on this axis. If not defined, Chartist.AutoScaleAxis will be used for the Y-Axis, where the high and low options will be set to the global high and low options. This type can be changed to any axis constructor available (e.g. Chartist.FixedScaleAxis), where all axis options should be present here. - type: undefined, - // This value specifies the minimum height in pixel of the scale steps - scaleMinSpace: 20, - // Use only integer values (whole numbers) for the scale steps - onlyInteger: false - }, - // Specify a fixed width for the chart as a string (i.e. '100px' or '50%') - width: undefined, - // Specify a fixed height for the chart as a string (i.e. '100px' or '50%') - height: undefined, - // If the line should be drawn or not - showLine: true, - // If dots should be drawn or not - showPoint: true, - // If the line chart should draw an area - showArea: false, - // The base for the area chart that will be used to close the area shape (is normally 0) - areaBase: 0, - // Specify if the lines should be smoothed. This value can be true or false where true will result in smoothing using the default smoothing interpolation function Chartist.Interpolation.cardinal and false results in Chartist.Interpolation.none. You can also choose other smoothing / interpolation functions available in the Chartist.Interpolation module, or write your own interpolation function. Check the examples for a brief description. - lineSmooth: true, - // If the line chart should add a background fill to the .ct-grids group. - showGridBackground: false, - // Overriding the natural low of the chart allows you to zoom in or limit the charts lowest displayed value - low: undefined, - // Overriding the natural high of the chart allows you to zoom in or limit the charts highest displayed value - high: undefined, - // Padding of the chart drawing area to the container element and labels as a number or padding object {top: 5, right: 5, bottom: 5, left: 5} - chartPadding: { - top: 15, - right: 15, - bottom: 5, - left: 10 - }, - // When set to true, the last grid line on the x-axis is not drawn and the chart elements will expand to the full available width of the chart. For the last label to be drawn correctly you might need to add chart padding or offset the last label with a draw event handler. - fullWidth: false, - // If true the whole data is reversed including labels, the series order as well as the whole series data arrays. - reverseData: false, - // Override the class names that get used to generate the SVG structure of the chart - classNames: { - chart: 'ct-chart-line', - label: 'ct-label', - labelGroup: 'ct-labels', - series: 'ct-series', - line: 'ct-line', - point: 'ct-point', - area: 'ct-area', - grid: 'ct-grid', - gridGroup: 'ct-grids', - gridBackground: 'ct-grid-background', - vertical: 'ct-vertical', - horizontal: 'ct-horizontal', - start: 'ct-start', - end: 'ct-end' - } -}; - -var LineChart = function (_BaseChart) { - _inherits(LineChart, _BaseChart); - - /** - * This method creates a new line chart. - * - * @memberof Chartist.Line - * @param {String|Node} query A selector query string or directly a DOM element - * @param {Object} data The data object that needs to consist of a labels and a series array - * @param {Object} [options] The options object with options that override the default options. Check the examples for a detailed list. - * @param {Array} [responsiveOptions] Specify an array of responsive option arrays which are a media query and options object pair => [[mediaQueryString, optionsObject],[more...]] - * @return {Object} An object which exposes the API for the created chart - * - * @example - * // Create a simple line chart - * var data = { - * // A labels array that can contain any sort of values - * labels: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri'], - * // Our series array that contains series objects or in this case series data arrays - * series: [ - * [5, 2, 4, 2, 0] - * ] - * }; - * - * // As options we currently only set a static size of 300x200 px - * var options = { - * width: '300px', - * height: '200px' - * }; - * - * // In the global name space Chartist we call the Line function to initialize a line chart. As a first parameter we pass in a selector where we would like to get our chart created. Second parameter is the actual data object and as a third parameter we pass in our options - * new Chartist.Line('.ct-chart', data, options); - * - * @example - * // Use specific interpolation function with configuration from the Chartist.Interpolation module - * - * var chart = new Chartist.Line('.ct-chart', { - * labels: [1, 2, 3, 4, 5], - * series: [ - * [1, 1, 8, 1, 7] - * ] - * }, { - * lineSmooth: Chartist.Interpolation.cardinal({ - * tension: 0.2 - * }) - * }); - * - * @example - * // Create a line chart with responsive options - * - * var data = { - * // A labels array that can contain any sort of values - * labels: ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'], - * // Our series array that contains series objects or in this case series data arrays - * series: [ - * [5, 2, 4, 2, 0] - * ] - * }; - * - * // In addition to the regular options we specify responsive option overrides that will override the default configutation based on the matching media queries. - * var responsiveOptions = [ - * ['screen and (min-width: 641px) and (max-width: 1024px)', { - * showPoint: false, - * axisX: { - * labelInterpolationFnc: function(value) { - * // Will return Mon, Tue, Wed etc. on medium screens - * return value.slice(0, 3); - * } - * } - * }], - * ['screen and (max-width: 640px)', { - * showLine: false, - * axisX: { - * labelInterpolationFnc: function(value) { - * // Will return M, T, W etc. on small screens - * return value[0]; - * } - * } - * }] - * ]; - * - * new Chartist.Line('.ct-chart', data, null, responsiveOptions); - * - */ - function LineChart(query, data, options, responsiveOptions) { - _classCallCheck(this, LineChart); - - return _possibleConstructorReturn(this, (LineChart.__proto__ || Object.getPrototypeOf(LineChart)).call(this, query, data, defaultOptions$1, extend({}, defaultOptions$1, options), responsiveOptions)); - } - - /** - * Creates a new chart - * - */ - - _createClass(LineChart, [{ - key: 'createChart', - value: function createChart(options) { - var _this2 = this; - - var data = normalizeData(this.data, options.reverseData, true); - - // Create new svg object - this.svg = createSvg(this.container, options.width, options.height, options.classNames.chart); - // Create groups for labels, grid and series - var gridGroup = this.svg.elem('g').addClass(options.classNames.gridGroup); - var seriesGroup = this.svg.elem('g'); - var labelGroup = this.svg.elem('g').addClass(options.classNames.labelGroup); - - var chartRect = createChartRect(this.svg, options, defaultOptions$1.padding); - var axisX = void 0; - var axisY = void 0; - - if (options.axisX.type === undefined) { - axisX = new StepAxis(axisUnits.x, data.normalized.series, chartRect, extend({}, options.axisX, { - ticks: data.normalized.labels, - stretch: options.fullWidth - })); - } else { - axisX = new options.axisX.type(axisUnits.x, data.normalized.series, chartRect, options.axisX); - } - - if (options.axisY.type === undefined) { - axisY = new AutoScaleAxis(axisUnits.y, data.normalized.series, chartRect, extend({}, options.axisY, { - high: isNumeric(options.high) ? options.high : options.axisY.high, - low: isNumeric(options.low) ? options.low : options.axisY.low - })); - } else { - axisY = new options.axisY.type(axisUnits.y, data.normalized.series, chartRect, options.axisY); - } - - axisX.createGridAndLabels(gridGroup, labelGroup, this.supportsForeignObject, options, this.eventEmitter); - axisY.createGridAndLabels(gridGroup, labelGroup, this.supportsForeignObject, options, this.eventEmitter); - - if (options.showGridBackground) { - createGridBackground(gridGroup, chartRect, options.classNames.gridBackground, this.eventEmitter); - } - - // Draw the series - data.raw.series.forEach(function (series, seriesIndex) { - var seriesElement = seriesGroup.elem('g'); - - // Write attributes to series group element. If series name or meta is undefined the attributes will not be written - seriesElement.attr({ - 'ct:series-name': series.name, - 'ct:meta': serialize(series.meta) - }); - - // Use series class from series data or if not set generate one - seriesElement.addClass([options.classNames.series, series.className || options.classNames.series + '-' + alphaNumerate(seriesIndex)].join(' ')); - - var pathCoordinates = []; - var pathData = []; - - data.normalized.series[seriesIndex].forEach(function (value, valueIndex) { - var p = { - x: chartRect.x1 + axisX.projectValue(value, valueIndex, data.normalized.series[seriesIndex]), - y: chartRect.y1 - axisY.projectValue(value, valueIndex, data.normalized.series[seriesIndex]) - }; - pathCoordinates.push(p.x, p.y); - pathData.push({ - value: value, - valueIndex: valueIndex, - meta: getMetaData(series, valueIndex) - }); - }); - - var seriesOptions = { - lineSmooth: getSeriesOption(series, options, 'lineSmooth'), - showPoint: getSeriesOption(series, options, 'showPoint'), - showLine: getSeriesOption(series, options, 'showLine'), - showArea: getSeriesOption(series, options, 'showArea'), - areaBase: getSeriesOption(series, options, 'areaBase') - }; - - var smoothing = void 0; - if (typeof seriesOptions.lineSmooth === 'function') { - smoothing = seriesOptions.lineSmooth; - } else { - smoothing = seriesOptions.lineSmooth ? monotoneCubic() : none(); - } - - // Interpolating path where pathData will be used to annotate each path element so we can trace back the original - // index, value and meta data - var path = smoothing(pathCoordinates, pathData); - - // If we should show points we need to create them now to avoid secondary loop - // Points are drawn from the pathElements returned by the interpolation function - // Small offset for Firefox to render squares correctly - if (seriesOptions.showPoint) { - - path.pathElements.forEach(function (pathElement) { - var point = seriesElement.elem('line', { - x1: pathElement.x, - y1: pathElement.y, - x2: pathElement.x + 0.01, - y2: pathElement.y - }, options.classNames.point).attr({ - 'ct:value': [pathElement.data.value.x, pathElement.data.value.y].filter(isNumeric).join(','), - 'ct:meta': serialize(pathElement.data.meta) - }); - - _this2.eventEmitter.emit('draw', { - type: 'point', - value: pathElement.data.value, - index: pathElement.data.valueIndex, - meta: pathElement.data.meta, - series: series, - seriesIndex: seriesIndex, - axisX: axisX, - axisY: axisY, - group: seriesElement, - element: point, - x: pathElement.x, - y: pathElement.y - }); - }); - } - - if (seriesOptions.showLine) { - var line = seriesElement.elem('path', { - d: path.stringify() - }, options.classNames.line, true); - - _this2.eventEmitter.emit('draw', { - type: 'line', - values: data.normalized.series[seriesIndex], - path: path.clone(), - chartRect: chartRect, - // TODO: Remove redundant - index: seriesIndex, - series: series, - seriesIndex: seriesIndex, - seriesMeta: series.meta, - axisX: axisX, - axisY: axisY, - group: seriesElement, - element: line - }); - } - - // Area currently only works with axes that support a range! - if (seriesOptions.showArea && axisY.range) { - (function () { - // If areaBase is outside the chart area (< min or > max) we need to set it respectively so that - // the area is not drawn outside the chart area. - var areaBase = Math.max(Math.min(seriesOptions.areaBase, axisY.range.max), axisY.range.min); - - // We project the areaBase value into screen coordinates - var areaBaseProjected = chartRect.y1 - axisY.projectValue(areaBase); - - // In order to form the area we'll first split the path by move commands so we can chunk it up into segments - path.splitByCommand('M') - // We filter only "solid" segments that contain more than one point. Otherwise there's no need for an area - .filter(function (pathSegment) { - return pathSegment.pathElements.length > 1; - }).map(function (solidPathSegments) { - // Receiving the filtered solid path segments we can now convert those segments into fill areas - var firstElement = solidPathSegments.pathElements[0]; - var lastElement = solidPathSegments.pathElements[solidPathSegments.pathElements.length - 1]; - - // Cloning the solid path segment with closing option and removing the first move command from the clone - // We then insert a new move that should start at the area base and draw a straight line up or down - // at the end of the path we add an additional straight line to the projected area base value - // As the closing option is set our path will be automatically closed - return solidPathSegments.clone(true).position(0).remove(1).move(firstElement.x, areaBaseProjected).line(firstElement.x, firstElement.y).position(solidPathSegments.pathElements.length + 1).line(lastElement.x, areaBaseProjected); - }).forEach(function (areaPath) { - // For each of our newly created area paths, we'll now create path elements by stringifying our path objects - // and adding the created DOM elements to the correct series group - var area = seriesElement.elem('path', { - d: areaPath.stringify() - }, options.classNames.area, true); - - // Emit an event for each area that was drawn - _this2.eventEmitter.emit('draw', { - type: 'area', - values: data.normalized.series[seriesIndex], - path: areaPath.clone(), - series: series, - seriesIndex: seriesIndex, - axisX: axisX, - axisY: axisY, - chartRect: chartRect, - // TODO: Remove redundant - index: seriesIndex, - group: seriesElement, - element: area - }); - }); - })(); - } - }); - - this.eventEmitter.emit('created', { - // TODO: Remove redundant - bounds: axisY.bounds, - chartRect: chartRect, - axisX: axisX, - axisY: axisY, - svg: this.svg, - options: options - }); - } - }]); - - return LineChart; -}(BaseChart); - -/** - * Default options in bar charts. Expand the code view to see a detailed list of options with comments. - * - * @memberof Chartist.Bar - */ -var defaultOptions$2 = { - // Options for X-Axis - axisX: { - // The offset of the chart drawing area to the border of the container - offset: 30, - // Position where labels are placed. Can be set to `start` or `end` where `start` is equivalent to left or top on vertical axis and `end` is equivalent to right or bottom on horizontal axis. - position: 'end', - // Allows you to correct label positioning on this axis by positive or negative x and y offset. - labelOffset: { - x: 0, - y: 0 - }, - // If labels should be shown or not - showLabel: true, - // If the axis grid should be drawn or not - showGrid: true, - // Interpolation function that allows you to intercept the value from the axis label - labelInterpolationFnc: noop, - // This value specifies the minimum width in pixel of the scale steps - scaleMinSpace: 30, - // Use only integer values (whole numbers) for the scale steps - onlyInteger: false - }, - // Options for Y-Axis - axisY: { - // The offset of the chart drawing area to the border of the container - offset: 40, - // Position where labels are placed. Can be set to `start` or `end` where `start` is equivalent to left or top on vertical axis and `end` is equivalent to right or bottom on horizontal axis. - position: 'start', - // Allows you to correct label positioning on this axis by positive or negative x and y offset. - labelOffset: { - x: 0, - y: 0 - }, - // If labels should be shown or not - showLabel: true, - // If the axis grid should be drawn or not - showGrid: true, - // Interpolation function that allows you to intercept the value from the axis label - labelInterpolationFnc: noop, - // This value specifies the minimum height in pixel of the scale steps - scaleMinSpace: 20, - // Use only integer values (whole numbers) for the scale steps - onlyInteger: false - }, - // Specify a fixed width for the chart as a string (i.e. '100px' or '50%') - width: undefined, - // Specify a fixed height for the chart as a string (i.e. '100px' or '50%') - height: undefined, - // Overriding the natural high of the chart allows you to zoom in or limit the charts highest displayed value - high: undefined, - // Overriding the natural low of the chart allows you to zoom in or limit the charts lowest displayed value - low: undefined, - // Unless low/high are explicitly set, bar chart will be centered at zero by default. Set referenceValue to null to auto scale. - referenceValue: 0, - // Padding of the chart drawing area to the container element and labels as a number or padding object {top: 5, right: 5, bottom: 5, left: 5} - chartPadding: { - top: 15, - right: 15, - bottom: 5, - left: 10 - }, - // Specify the distance in pixel of bars in a group - seriesBarDistance: 15, - // If set to true this property will cause the series bars to be stacked. Check the `stackMode` option for further stacking options. - stackBars: false, - // If set to 'overlap' this property will force the stacked bars to draw from the zero line. - // If set to 'accumulate' this property will form a total for each series point. This will also influence the y-axis and the overall bounds of the chart. In stacked mode the seriesBarDistance property will have no effect. - stackMode: 'accumulate', - // Inverts the axes of the bar chart in order to draw a horizontal bar chart. Be aware that you also need to invert your axis settings as the Y Axis will now display the labels and the X Axis the values. - horizontalBars: false, - // If set to true then each bar will represent a series and the data array is expected to be a one dimensional array of data values rather than a series array of series. This is useful if the bar chart should represent a profile rather than some data over time. - distributeSeries: false, - // If true the whole data is reversed including labels, the series order as well as the whole series data arrays. - reverseData: false, - // If the bar chart should add a background fill to the .ct-grids group. - showGridBackground: false, - // Override the class names that get used to generate the SVG structure of the chart - classNames: { - chart: 'ct-chart-bar', - horizontalBars: 'ct-horizontal-bars', - label: 'ct-label', - labelGroup: 'ct-labels', - series: 'ct-series', - bar: 'ct-bar', - grid: 'ct-grid', - gridGroup: 'ct-grids', - gridBackground: 'ct-grid-background', - vertical: 'ct-vertical', - horizontal: 'ct-horizontal', - start: 'ct-start', - end: 'ct-end' - } -}; - -var BarChart = function (_BaseChart) { - _inherits(BarChart, _BaseChart); - - /** - * This method creates a new bar chart and returns API object that you can use for later changes. - * - * @memberof Chartist.Bar - * @param {String|Node} query A selector query string or directly a DOM element - * @param {Object} data The data object that needs to consist of a labels and a series array - * @param {Object} [options] The options object with options that override the default options. Check the examples for a detailed list. - * @param {Array} [responsiveOptions] Specify an array of responsive option arrays which are a media query and options object pair => [[mediaQueryString, optionsObject],[more...]] - * @return {Object} An object which exposes the API for the created chart - * - * @example - * // Create a simple bar chart - * var data = { - * labels: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri'], - * series: [ - * [5, 2, 4, 2, 0] - * ] - * }; - * - * // In the global name space Chartist we call the Bar function to initialize a bar chart. As a first parameter we pass in a selector where we would like to get our chart created and as a second parameter we pass our data object. - * new Chartist.Bar('.ct-chart', data); - * - * @example - * // This example creates a bipolar grouped bar chart where the boundaries are limitted to -10 and 10 - * new Chartist.Bar('.ct-chart', { - * labels: [1, 2, 3, 4, 5, 6, 7], - * series: [ - * [1, 3, 2, -5, -3, 1, -6], - * [-5, -2, -4, -1, 2, -3, 1] - * ] - * }, { - * seriesBarDistance: 12, - * low: -10, - * high: 10 - * }); - * - */ - function BarChart(query, data, options, responsiveOptions) { - _classCallCheck(this, BarChart); - - return _possibleConstructorReturn(this, (BarChart.__proto__ || Object.getPrototypeOf(BarChart)).call(this, query, data, defaultOptions$2, extend({}, defaultOptions$2, options), responsiveOptions)); - } - - /** - * Creates a new chart - * - */ - - _createClass(BarChart, [{ - key: 'createChart', - value: function createChart(options) { - var _arguments = arguments, - _this2 = this; - - var data = void 0; - var highLow = void 0; - - if (options.distributeSeries) { - data = normalizeData(this.data, options.reverseData, options.horizontalBars ? 'x' : 'y'); - data.normalized.series = data.normalized.series.map(function (value) { - return [value]; - }); - } else { - data = normalizeData(this.data, options.reverseData, options.horizontalBars ? 'x' : 'y'); - } - - // Create new svg element - this.svg = createSvg(this.container, options.width, options.height, options.classNames.chart + (options.horizontalBars ? ' ' + options.classNames.horizontalBars : '')); - - // Drawing groups in correct order - var gridGroup = this.svg.elem('g').addClass(options.classNames.gridGroup); - var seriesGroup = this.svg.elem('g'); - var labelGroup = this.svg.elem('g').addClass(options.classNames.labelGroup); - - if (options.stackBars && data.normalized.series.length !== 0) { - // If stacked bars we need to calculate the high low from stacked values from each series - var serialSums = serialMap(data.normalized.series, function () { - return Array.from(_arguments).map(function (value) { - return value; - }).reduce(function (prev, curr) { - return { - x: prev.x + (curr && curr.x) || 0, - y: prev.y + (curr && curr.y) || 0 - }; - }, { x: 0, y: 0 }); - }); - - highLow = getHighLow([serialSums], options, options.horizontalBars ? 'x' : 'y'); - } else { - highLow = getHighLow(data.normalized.series, options, options.horizontalBars ? 'x' : 'y'); - } - - // Overrides of high / low from settings - highLow.high = +options.high || (options.high === 0 ? 0 : highLow.high); - highLow.low = +options.low || (options.low === 0 ? 0 : highLow.low); - - var chartRect = createChartRect(this.svg, options, defaultOptions$2.padding); - var valueAxis = void 0; - var labelAxisTicks = void 0; - var labelAxis = void 0; - var axisX = void 0; - var axisY = void 0; - - // We need to set step count based on some options combinations - if (options.distributeSeries && options.stackBars) { - // If distributed series are enabled and bars need to be stacked, we'll only have one bar and therefore should - // use only the first label for the step axis - labelAxisTicks = data.normalized.labels.slice(0, 1); - } else { - // If distributed series are enabled but stacked bars aren't, we should use the series labels - // If we are drawing a regular bar chart with two dimensional series data, we just use the labels array - // as the bars are normalized - labelAxisTicks = data.normalized.labels; - } - - // Set labelAxis and valueAxis based on the horizontalBars setting. This setting will flip the axes if necessary. - if (options.horizontalBars) { - if (options.axisX.type === undefined) { - valueAxis = axisX = new AutoScaleAxis(axisUnits.x, data.normalized.series, chartRect, extend({}, options.axisX, { - highLow: highLow, - referenceValue: 0 - })); - } else { - valueAxis = axisX = new options.axisX.type(axisUnits.x, data.normalized.series, chartRect, extend({}, options.axisX, { - highLow: highLow, - referenceValue: 0 - })); - } - - if (options.axisY.type === undefined) { - labelAxis = axisY = new StepAxis(axisUnits.y, data.normalized.series, chartRect, { - ticks: labelAxisTicks - }); - } else { - labelAxis = axisY = new options.axisY.type(axisUnits.y, data.normalized.series, chartRect, options.axisY); - } - } else { - if (options.axisX.type === undefined) { - labelAxis = axisX = new StepAxis(axisUnits.x, data.normalized.series, chartRect, { - ticks: labelAxisTicks - }); - } else { - labelAxis = axisX = new options.axisX.type(axisUnits.x, data.normalized.series, chartRect, options.axisX); - } - - if (options.axisY.type === undefined) { - valueAxis = axisY = new AutoScaleAxis(axisUnits.y, data.normalized.series, chartRect, extend({}, options.axisY, { - highLow: highLow, - referenceValue: 0 - })); - } else { - valueAxis = axisY = new options.axisY.type(axisUnits.y, data.normalized.series, chartRect, extend({}, options.axisY, { - highLow: highLow, - referenceValue: 0 - })); - } - } - - // Projected 0 point - var zeroPoint = options.horizontalBars ? chartRect.x1 + valueAxis.projectValue(0) : chartRect.y1 - valueAxis.projectValue(0); - // Used to track the screen coordinates of stacked bars - var stackedBarValues = []; - - labelAxis.createGridAndLabels(gridGroup, labelGroup, this.supportsForeignObject, options, this.eventEmitter); - valueAxis.createGridAndLabels(gridGroup, labelGroup, this.supportsForeignObject, options, this.eventEmitter); - - if (options.showGridBackground) { - createGridBackground(gridGroup, chartRect, options.classNames.gridBackground, this.eventEmitter); - } - - // Draw the series - data.raw.series.forEach(function (series, seriesIndex) { - // Calculating bi-polar value of index for seriesOffset. For i = 0..4 biPol will be -1.5, -0.5, 0.5, 1.5 etc. - var biPol = seriesIndex - (data.raw.series.length - 1) / 2; - // Half of the period width between vertical grid lines used to position bars - var periodHalfLength = void 0; - - // We need to set periodHalfLength based on some options combinations - if (options.distributeSeries && !options.stackBars) { - // If distributed series are enabled but stacked bars aren't, we need to use the length of the normaizedData array - // which is the series count and divide by 2 - periodHalfLength = labelAxis.axisLength / data.normalized.series.length / 2; - } else if (options.distributeSeries && options.stackBars) { - // If distributed series and stacked bars are enabled we'll only get one bar so we should just divide the axis - // length by 2 - periodHalfLength = labelAxis.axisLength / 2; - } else { - // On regular bar charts we should just use the series length - periodHalfLength = labelAxis.axisLength / data.normalized.series[seriesIndex].length / 2; - } - - // Adding the series group to the series element - var seriesElement = seriesGroup.elem('g'); - - // Write attributes to series group element. If series name or meta is undefined the attributes will not be written - seriesElement.attr({ - 'ct:series-name': series.name, - 'ct:meta': serialize(series.meta) - }); - - // Use series class from series data or if not set generate one - seriesElement.addClass([options.classNames.series, series.className || options.classNames.series + '-' + alphaNumerate(seriesIndex)].join(' ')); - - data.normalized.series[seriesIndex].forEach(function (value, valueIndex) { - var labelAxisValueIndex = void 0; - // We need to set labelAxisValueIndex based on some options combinations - if (options.distributeSeries && !options.stackBars) { - // If distributed series are enabled but stacked bars aren't, we can use the seriesIndex for later projection - // on the step axis for label positioning - labelAxisValueIndex = seriesIndex; - } else if (options.distributeSeries && options.stackBars) { - // If distributed series and stacked bars are enabled, we will only get one bar and therefore always use - // 0 for projection on the label step axis - labelAxisValueIndex = 0; - } else { - // On regular bar charts we just use the value index to project on the label step axis - labelAxisValueIndex = valueIndex; - } - - var projected = void 0; - // We need to transform coordinates differently based on the chart layout - if (options.horizontalBars) { - projected = { - x: chartRect.x1 + valueAxis.projectValue(value && value.x ? value.x : 0, valueIndex, data.normalized.series[seriesIndex]), - y: chartRect.y1 - labelAxis.projectValue(value && value.y ? value.y : 0, labelAxisValueIndex, data.normalized.series[seriesIndex]) - }; - } else { - projected = { - x: chartRect.x1 + labelAxis.projectValue(value && value.x ? value.x : 0, labelAxisValueIndex, data.normalized.series[seriesIndex]), - y: chartRect.y1 - valueAxis.projectValue(value && value.y ? value.y : 0, valueIndex, data.normalized.series[seriesIndex]) - }; - } - - // If the label axis is a step based axis we will offset the bar into the middle of between two steps using - // the periodHalfLength value. Also we do arrange the different series so that they align up to each other using - // the seriesBarDistance. If we don't have a step axis, the bar positions can be chosen freely so we should not - // add any automated positioning. - if (labelAxis instanceof StepAxis) { - // Offset to center bar between grid lines, but only if the step axis is not stretched - if (!labelAxis.options.stretch) { - projected[labelAxis.units.pos] += periodHalfLength * (options.horizontalBars ? -1 : 1); - } - // Using bi-polar offset for multiple series if no stacked bars or series distribution is used - projected[labelAxis.units.pos] += options.stackBars || options.distributeSeries ? 0 : biPol * options.seriesBarDistance * (options.horizontalBars ? -1 : 1); - } - - // Enter value in stacked bar values used to remember previous screen value for stacking up bars - var previousStack = stackedBarValues[valueIndex] || zeroPoint; - stackedBarValues[valueIndex] = previousStack - (zeroPoint - projected[labelAxis.counterUnits.pos]); - - // Skip if value is undefined - if (value === undefined) { - return; - } - - var positions = {}; - positions[labelAxis.units.pos + '1'] = projected[labelAxis.units.pos]; - positions[labelAxis.units.pos + '2'] = projected[labelAxis.units.pos]; - - if (options.stackBars && (options.stackMode === 'accumulate' || !options.stackMode)) { - // Stack mode: accumulate (default) - // If bars are stacked we use the stackedBarValues reference and otherwise base all bars off the zero line - // We want backwards compatibility, so the expected fallback without the 'stackMode' option - // to be the original behaviour (accumulate) - positions[labelAxis.counterUnits.pos + '1'] = previousStack; - positions[labelAxis.counterUnits.pos + '2'] = stackedBarValues[valueIndex]; - } else { - // Draw from the zero line normally - // This is also the same code for Stack mode: overlap - positions[labelAxis.counterUnits.pos + '1'] = zeroPoint; - positions[labelAxis.counterUnits.pos + '2'] = projected[labelAxis.counterUnits.pos]; - } - - // Limit x and y so that they are within the chart rect - positions.x1 = Math.min(Math.max(positions.x1, chartRect.x1), chartRect.x2); - positions.x2 = Math.min(Math.max(positions.x2, chartRect.x1), chartRect.x2); - positions.y1 = Math.min(Math.max(positions.y1, chartRect.y2), chartRect.y1); - positions.y2 = Math.min(Math.max(positions.y2, chartRect.y2), chartRect.y1); - - var metaData = getMetaData(series, valueIndex); - - // Create bar element - var bar = seriesElement.elem('line', positions, options.classNames.bar).attr({ - 'ct:value': [value.x, value.y].filter(isNumeric).join(','), - 'ct:meta': serialize(metaData) - }); - - _this2.eventEmitter.emit('draw', extend({ - type: 'bar', - value: value, - index: valueIndex, - meta: metaData, - series: series, - seriesIndex: seriesIndex, - axisX: axisX, - axisY: axisY, - chartRect: chartRect, - group: seriesElement, - element: bar - }, positions)); - }); - }); - - this.eventEmitter.emit('created', { - bounds: valueAxis.bounds, - chartRect: chartRect, - axisX: axisX, - axisY: axisY, - svg: this.svg, - options: options - }); - } - }]); - - return BarChart; -}(BaseChart); - -/** - * Default options in line charts. Expand the code view to see a detailed list of options with comments. - * - * @memberof Chartist.Pie - */ -var defaultOptions$3 = { - // Specify a fixed width for the chart as a string (i.e. '100px' or '50%') - width: undefined, - // Specify a fixed height for the chart as a string (i.e. '100px' or '50%') - height: undefined, - // Padding of the chart drawing area to the container element and labels as a number or padding object {top: 5, right: 5, bottom: 5, left: 5} - chartPadding: 5, - // Override the class names that are used to generate the SVG structure of the chart - classNames: { - chartPie: 'ct-chart-pie', - chartDonut: 'ct-chart-donut', - series: 'ct-series', - slicePie: 'ct-slice-pie', - sliceDonut: 'ct-slice-donut', - label: 'ct-label' - }, - // The start angle of the pie chart in degrees where 0 points north. A higher value offsets the start angle clockwise. - startAngle: 0, - // An optional total you can specify. By specifying a total value, the sum of the values in the series must be this total in order to draw a full pie. You can use this parameter to draw only parts of a pie or gauge charts. - total: undefined, - // If specified the donut CSS classes will be used and strokes will be drawn instead of pie slices. - donut: false, - // Specify the donut stroke width, currently done in javascript for convenience. May move to CSS styles in the future. - // This option can be set as number or string to specify a relative width (i.e. 100 or '30%'). - donutWidth: 60, - // If a label should be shown or not - showLabel: true, - // Label position offset from the standard position which is half distance of the radius. This value can be either positive or negative. Positive values will position the label away from the center. - labelOffset: 0, - // This option can be set to 'inside', 'outside' or 'center'. Positioned with 'inside' the labels will be placed on half the distance of the radius to the border of the Pie by respecting the 'labelOffset'. The 'outside' option will place the labels at the border of the pie and 'center' will place the labels in the absolute center point of the chart. The 'center' option only makes sense in conjunction with the 'labelOffset' option. - labelPosition: 'inside', - // An interpolation function for the label value - labelInterpolationFnc: noop, - // Label direction can be 'neutral', 'explode' or 'implode'. The labels anchor will be positioned based on those settings as well as the fact if the labels are on the right or left side of the center of the chart. Usually explode is useful when labels are positioned far away from the center. - labelDirection: 'neutral', - // If true the whole data is reversed including labels, the series order as well as the whole series data arrays. - reverseData: false, - // If true empty values will be ignored to avoid drawing unncessary slices and labels - ignoreEmptyValues: false -}; - -/** - * Determines SVG anchor position based on direction and center parameter - * - * @param center - * @param label - * @param direction - * @return {string} - */ -function determineAnchorPosition(center, label, direction) { - var toTheRight = label.x > center.x; - - if (toTheRight && direction === 'explode' || !toTheRight && direction === 'implode') { - return 'start'; - } else if (toTheRight && direction === 'implode' || !toTheRight && direction === 'explode') { - return 'end'; - } else { - return 'middle'; - } -} - -var PieChart = function (_BaseChart) { - _inherits(PieChart, _BaseChart); - - /** - * This method creates a new pie chart and returns an object that can be used to redraw the chart. - * - * @memberof Chartist.Pie - * @param {String|Node} query A selector query string or directly a DOM element - * @param {Object} data The data object in the pie chart needs to have a series property with a one dimensional data array. The values will be normalized against each other and don't necessarily need to be in percentage. The series property can also be an array of value objects that contain a value property and a className property to override the CSS class name for the series group. - * @param {Object} [options] The options object with options that override the default options. Check the examples for a detailed list. - * @param {Array} [responsiveOptions] Specify an array of responsive option arrays which are a media query and options object pair => [[mediaQueryString, optionsObject],[more...]] - * @return {Object} An object with a version and an update method to manually redraw the chart - * - * @example - * // Simple pie chart example with four series - * new Chartist.Pie('.ct-chart', { - * series: [10, 2, 4, 3] - * }); - * - * @example - * // Drawing a donut chart - * new Chartist.Pie('.ct-chart', { - * series: [10, 2, 4, 3] - * }, { - * donut: true - * }); - * - * @example - * // Using donut, startAngle and total to draw a gauge chart - * new Chartist.Pie('.ct-chart', { - * series: [20, 10, 30, 40] - * }, { - * donut: true, - * donutWidth: 20, - * startAngle: 270, - * total: 200 - * }); - * - * @example - * // Drawing a pie chart with padding and labels that are outside the pie - * new Chartist.Pie('.ct-chart', { - * series: [20, 10, 30, 40] - * }, { - * chartPadding: 30, - * labelOffset: 50, - * labelDirection: 'explode' - * }); - * - * @example - * // Overriding the class names for individual series as well as a name and meta data. - * // The name will be written as ct:series-name attribute and the meta data will be serialized and written - * // to a ct:meta attribute. - * new Chartist.Pie('.ct-chart', { - * series: [{ - * value: 20, - * name: 'Series 1', - * className: 'my-custom-class-one', - * meta: 'Meta One' - * }, { - * value: 10, - * name: 'Series 2', - * className: 'my-custom-class-two', - * meta: 'Meta Two' - * }, { - * value: 70, - * name: 'Series 3', - * className: 'my-custom-class-three', - * meta: 'Meta Three' - * }] - * }); - */ - function PieChart(query, data, options, responsiveOptions) { - _classCallCheck(this, PieChart); - - return _possibleConstructorReturn(this, (PieChart.__proto__ || Object.getPrototypeOf(PieChart)).call(this, query, data, defaultOptions$3, extend({}, defaultOptions$3, options), responsiveOptions)); - } - - /** - * Creates the pie chart - * - * @param options - */ - - _createClass(PieChart, [{ - key: 'createChart', - value: function createChart(options) { - var _this2 = this; - - var data = normalizeData(this.data); - var seriesGroups = []; - var labelsGroup = void 0; - var labelRadius = void 0; - var startAngle = options.startAngle; - - // Create SVG.js draw - this.svg = createSvg(this.container, options.width, options.height, options.donut ? options.classNames.chartDonut : options.classNames.chartPie); - // Calculate charting rect - var chartRect = createChartRect(this.svg, options, defaultOptions$3.padding); - // Get biggest circle radius possible within chartRect - var radius = Math.min(chartRect.width() / 2, chartRect.height() / 2); - // Calculate total of all series to get reference value or use total reference from optional options - var totalDataSum = options.total || data.normalized.series.reduce(sum, 0); - - var donutWidth = quantity(options.donutWidth); - if (donutWidth.unit === '%') { - donutWidth.value *= radius / 100; - } - - // If this is a donut chart we need to adjust our radius to enable strokes to be drawn inside - // Unfortunately this is not possible with the current SVG Spec - // See this proposal for more details: http://lists.w3.org/Archives/Public/www-svg/2003Oct/0000.html - radius -= options.donut ? donutWidth.value / 2 : 0; - - // If labelPosition is set to `outside` or a donut chart is drawn then the label position is at the radius, - // if regular pie chart it's half of the radius - if (options.labelPosition === 'outside' || options.donut) { - labelRadius = radius; - } else if (options.labelPosition === 'center') { - // If labelPosition is center we start with 0 and will later wait for the labelOffset - labelRadius = 0; - } else { - // Default option is 'inside' where we use half the radius so the label will be placed in the center of the pie - // slice - labelRadius = radius / 2; - } - // Add the offset to the labelRadius where a negative offset means closed to the center of the chart - labelRadius += options.labelOffset; - - // Calculate end angle based on total sum and current data value and offset with padding - var center = { - x: chartRect.x1 + chartRect.width() / 2, - y: chartRect.y2 + chartRect.height() / 2 - }; - - // Check if there is only one non-zero value in the series array. - var hasSingleValInSeries = data.raw.series.filter(function (val) { - return val.hasOwnProperty('value') ? val.value !== 0 : val !== 0; - }).length === 1; - - // Creating the series groups - data.raw.series.forEach(function (series, index) { - return seriesGroups[index] = _this2.svg.elem('g', null, null); - }); - // if we need to show labels we create the label group now - if (options.showLabel) { - labelsGroup = this.svg.elem('g', null, null); - } - - // Draw the series - // initialize series groups - data.raw.series.forEach(function (series, index) { - // If current value is zero and we are ignoring empty values then skip to next value - if (data.normalized.series[index] === 0 && options.ignoreEmptyValues) { - return; - } - - // If the series is an object and contains a name or meta data we add a custom attribute - seriesGroups[index].attr({ - 'ct:series-name': series.name - }); - - // Use series class from series data or if not set generate one - seriesGroups[index].addClass([options.classNames.series, series.className || options.classNames.series + '-' + alphaNumerate(index)].join(' ')); - - // If the whole dataset is 0 endAngle should be zero. Can't divide by 0. - var endAngle = totalDataSum > 0 ? startAngle + data.normalized.series[index] / totalDataSum * 360 : 0; - - // Use slight offset so there are no transparent hairline issues - var overlappigStartAngle = Math.max(0, startAngle - (index === 0 || hasSingleValInSeries ? 0 : 0.2)); - - // If we need to draw the arc for all 360 degrees we need to add a hack where we close the circle - // with Z and use 359.99 degrees - if (endAngle - overlappigStartAngle >= 359.99) { - endAngle = overlappigStartAngle + 359.99; - } - - var start = polarToCartesian(center.x, center.y, radius, overlappigStartAngle); - var end = polarToCartesian(center.x, center.y, radius, endAngle); - - // Create a new path element for the pie chart. If this isn't a donut chart we should close the path for a correct stroke - var path = new SvgPath(!options.donut).move(end.x, end.y).arc(radius, radius, 0, endAngle - startAngle > 180, 0, start.x, start.y); - - // If regular pie chart (no donut) we add a line to the center of the circle for completing the pie - if (!options.donut) { - path.line(center.x, center.y); - } - - // Create the SVG path - // If this is a donut chart we add the donut class, otherwise just a regular slice - var pathElement = seriesGroups[index].elem('path', { - d: path.stringify() - }, options.donut ? options.classNames.sliceDonut : options.classNames.slicePie); - - // Adding the pie series value to the path - pathElement.attr({ - 'ct:value': data.normalized.series[index], - 'ct:meta': serialize(series.meta) - }); - - // If this is a donut, we add the stroke-width as style attribute - if (options.donut) { - pathElement.attr({ - 'style': 'stroke-width: ' + donutWidth.value + 'px' - }); - } - - // Fire off draw event - _this2.eventEmitter.emit('draw', { - type: 'slice', - value: data.normalized.series[index], - totalDataSum: totalDataSum, - index: index, - meta: series.meta, - series: series, - group: seriesGroups[index], - element: pathElement, - path: path.clone(), - center: center, - radius: radius, - startAngle: startAngle, - endAngle: endAngle - }); - - // If we need to show labels we need to add the label for this slice now - if (options.showLabel) { - var labelPosition = void 0; - - if (data.raw.series.length === 1) { - // If we have only 1 series, we can position the label in the center of the pie - labelPosition = { - x: center.x, - y: center.y - }; - } else { - // Position at the labelRadius distance from center and between start and end angle - labelPosition = polarToCartesian(center.x, center.y, labelRadius, startAngle + (endAngle - startAngle) / 2); - } - - var rawValue = void 0; - if (data.normalized.labels && !isFalseyButZero(data.normalized.labels[index])) { - rawValue = data.normalized.labels[index]; - } else { - rawValue = data.normalized.series[index]; - } - - var interpolatedValue = options.labelInterpolationFnc(rawValue, index); - - if (interpolatedValue || interpolatedValue === 0) { - var labelElement = labelsGroup.elem('text', { - dx: labelPosition.x, - dy: labelPosition.y, - 'text-anchor': determineAnchorPosition(center, labelPosition, options.labelDirection) - }, options.classNames.label).text('' + interpolatedValue); - - // Fire off draw event - _this2.eventEmitter.emit('draw', { - type: 'label', - index: index, - group: labelsGroup, - element: labelElement, - text: '' + interpolatedValue, - x: labelPosition.x, - y: labelPosition.y - }); - } - } - - // Set next startAngle to current endAngle. - // (except for last slice) - startAngle = endAngle; - }); - - this.eventEmitter.emit('created', { - chartRect: chartRect, - svg: this.svg, - options: options - }); - } - }]); - - return PieChart; -}(BaseChart); - -export { interpolation as Interpolation, EventEmitter, extend, optionsProvider, namespaces, precision, escapingMap, replaceAll, querySelector, safeHasProperty, isNumeric, isFalseyButZero, getNumberOrUndefined, ensureUnit, quantity, alphaNumerate, noop, times, sum, serialMap, EPSILON, orderOfMagnitude, projectLength, roundWithPrecision, rho, polarToCartesian, serialize, deserialize, normalizeData, getMetaData, isDataHoleValue, reverseData, getDataArray, isMultiValue, getMultiValue, getSeriesOption, splitIntoSegments, getHighLow, getBounds, createSvg, normalizePadding, createChartRect, createGrid, createGridBackground, createLabel, BaseChart, LineChart, BarChart, PieChart, Axis, axisUnits, AutoScaleAxis, FixedScaleAxis, StepAxis, Svg, isSupported, easings, SvgList, SvgPath }; - -//# sourceMappingURL=chartist.esm.js.map \ No newline at end of file diff --git a/dist/chartist.esm.js.map b/dist/chartist.esm.js.map deleted file mode 100644 index 520b2c8c..00000000 --- a/dist/chartist.esm.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":[],"names":[],"mappings":"","file":"chartist.esm.js"} \ No newline at end of file diff --git a/dist/chartist.umd.js b/dist/chartist.umd.js deleted file mode 100644 index 655d1c13..00000000 --- a/dist/chartist.umd.js +++ /dev/null @@ -1,8 +0,0 @@ -/* Chartist.js 1.0.0 - * Copyright © 2022 Gion Kunz - * Free to use under either the WTFPL license or the MIT license. - * https://raw.githubusercontent.com/chartist-js/chartist/master/LICENSE-WTFPL - * https://raw.githubusercontent.com/chartist-js/chartist/master/LICENSE-MIT - */ -!function(a,b){"object"==typeof exports&&"undefined"!=typeof module?b(exports):"function"==typeof define&&define.amd?define(["exports"],b):b(a.Chartist={})}(this,function(a){"use strict";function b(a,b,c){return a.replace(new RegExp(b,"g"),c)}function c(a){return a instanceof Node?a:document.querySelector(a)}function d(a,b){return null!==a&&"object"==typeof a&&a.hasOwnProperty(b)}function e(a){return null!==a&&isFinite(a)}function f(a){return!a&&0!==a}function g(a){return e(a)?+a:void 0}function h(a,b){return"number"==typeof a&&(a+=b),a}function i(a){if("string"==typeof a){var b=/^(\d+)\s*(.*)$/g.exec(a);return{value:+b[1],unit:b[2]||void 0}}return{value:a}}function j(a){return String.fromCharCode(97+a%26)}function k(a){return Math.floor(Math.log(Math.abs(a))/Math.LN10)}function l(a,b,c){return b/c.range*a}function m(a,b){var c=Math.pow(10,b||U);return Math.round(a*c)/c}function n(a){function b(a,c){return a%c==0?c:b(c,a%c)}function c(a){return a*a+1}if(1===a)return a;var d=2,e=2,f=void 0;if(a%2==0)return 2;do{d=c(d)%a,e=c(c(e))%a,f=b(Math.abs(d-e),a)}while(1===f);return f}function o(a,b,c,d){var e=(d-90)*Math.PI/180;return{x:a+c*Math.cos(e),y:b+c*Math.sin(e)}}function p(){var a=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};a=a||{};for(var b=arguments.length,c=Array(b>1?b-1:0),d=1;d1&&void 0!==arguments[1]?arguments[1]:"y";return g(x(a)?a[b]:a)}function z(a,b,c){if(a.name&&b.series&&b.series[a.name]){var d=b.series[a.name];return d.hasOwnProperty(c)?d[c]:b[c]}return b[c]}function A(a,b,c){c=p({},{increasingX:!1,fillHoles:!1},c);for(var d=[],e=!0,f=0;f=2&&a[f]<=a[f-2]&&(e=!0),e&&(d.push({pathCoordinates:[],valueData:[]}),e=!1),d[d.length-1].pathCoordinates.push(a[f],a[f+1]),d[d.length-1].valueData.push(b[f/2]));return d}function B(a,b,c){function d(a){if(void 0!==a)if(a instanceof Array)for(var b=0;be.high&&(e.high=h),g&&h0?e.low=0:(e.high=1,e.low=0)),e}function C(a,b,c,d){function e(a,b){return a===(a+=b)&&(a*=1+(b>0?_:-_)),a}var f={high:b.high,low:b.low};f.valueRange=f.high-f.low,f.oom=k(f.valueRange),f.step=Math.pow(10,f.oom),f.min=Math.floor(f.low/f.step)*f.step,f.max=Math.ceil(f.high/f.step)*f.step,f.range=f.max-f.min,f.numberOfSteps=Math.round(f.range/f.step);var g=l(a,f.step,f),h=g=c)f.step=1;else if(d&&i=c)f.step=i;else for(var j=0;;){if(h&&l(a,f.step,f)<=c)f.step*=2;else{if(h||!(l(a,f.step/2,f)>=c))break;if(f.step/=2,d&&f.step%1!=0){f.step*=2;break}}if(j++>1e3)throw new Error("Exceeded maximum number of iterations while optimizing scale step!")}f.step=Math.max(f.step,_);for(var o=f.min,p=f.max;o+f.step<=f.low;)o=e(o,f.step);for(;p-f.step>=f.high;)p=e(p,-f.step);f.min=o,f.max=p,f.range=f.max-f.min;for(var q=[],r=f.min;r<=f.max;r=e(r,f.step)){var s=m(r);s!==q[q.length-1]&&q.push(s)}return f.values=q,f}function D(a){return document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#"+a,"1.1")}function E(a){var b=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"100%",c=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"100%",d=arguments[3];Array.from(a.querySelectorAll("svg")).filter(function(a){return a.getAttributeNS(T.xmlns,"ct")}).forEach(function(b){return a.removeChild(b)});var e=new da("svg").attr({width:b,height:c}).addClass(d).attr({style:"width: "+b+"; height: "+c+";"});return a.appendChild(e._node),e}function F(a){var b=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;return"number"==typeof a?{top:a,right:a,bottom:a,left:a}:{top:"number"==typeof a.top?a.top:b,right:"number"==typeof a.right?a.right:b,bottom:"number"==typeof a.bottom?a.bottom:b,left:"number"==typeof a.left?a.left:b}}function G(a,b,c){var d=!(!b.axisX&&!b.axisY),e=d?b.axisY.offset:0,f=d?b.axisX.offset:0,g=a.width()||i(b.width).value||0,h=a.height()||i(b.height).value||0,j=F(b.chartPadding,c);g=Math.max(g,e+j.left+j.right),h=Math.max(h,f+j.top+j.bottom);var k={padding:j,width:function(){return this.x2-this.x1},height:function(){return this.y1-this.y2}};return d?("start"===b.axisX.position?(k.y2=j.top+f,k.y1=Math.max(h-j.bottom,k.y2+1)):(k.y2=j.top,k.y1=Math.max(h-j.bottom-f,k.y2+1)),"start"===b.axisY.position?(k.x1=j.left+e,k.x2=Math.max(g-j.right,k.x1+1)):(k.x1=j.left,k.x2=Math.max(g-j.right-e,k.x1+1))):(k.x1=j.left,k.x2=Math.max(g-j.right,k.x1+1),k.y2=j.top,k.y1=Math.max(h-j.bottom,k.y2+1)),k}function H(a,b,c,d,e,f,g,h){var i={};i[c.units.pos+"1"]=a,i[c.units.pos+"2"]=a,i[c.counterUnits.pos+"1"]=d,i[c.counterUnits.pos+"2"]=d+e;var j=f.elem("line",i,g.join(" "));h.emit("draw",p({type:"grid",axis:c,index:b,group:f,element:j},i))}function I(a,b,c,d){var e=a.elem("rect",{x:b.x1,y:b.y2,width:b.width(),height:b.height()},c,!0);d.emit("draw",{type:"gridBackground",group:a,element:e})}function J(a,b,c,d,e,f,g,h,i,j,k){var l=void 0,m={};if(m[e.units.pos]=a+g[e.units.pos],m[e.counterUnits.pos]=g[e.counterUnits.pos],m[e.units.len]=b,m[e.counterUnits.len]=Math.max(0,f-10),j){var n=Math.round(m[e.units.len]),o=Math.round(m[e.counterUnits.len]),q=('\n \n '+d[c]+"\n \n ").trim();l=h.foreignObject(q,p({style:"overflow: visible;"},m))}else l=h.elem("text",m,i.join(" ")).text(d[c]);k.emit("draw",p({type:"label",axis:e,index:c,group:h,element:l,text:d[c]},m))}function K(a,b,c){function d(a){var d=g;g=p({},f),b&&b.forEach(function(a){window.matchMedia(a[0]).matches&&(g=p(g,a[1]))}),c&&a&&c.emit("optionsChanged",{previousOptions:d,currentOptions:g})}function e(){h.forEach(function(a){return a.removeListener(d)})}var f=p({},a),g=void 0,h=[];if(!window.matchMedia)throw"window.matchMedia not found! Make sure you're using a polyfill.";return b&&b.forEach(function(a){var b=window.matchMedia(a[0]);b.addListener(d),h.push(b)}),d(),{removeMediaQueryListeners:e,getCurrentOptions:function(){return p({},g)}}}function L(a,b,c,d,e,f){var g=p({command:e?a.toLowerCase():a.toUpperCase()},b,f?{data:f}:{});c.splice(d,0,g)}function M(a,b){a.forEach(function(c,d){pa[c.command.toLowerCase()].forEach(function(e,f){b(c,e,d,f,a)})})}function N(a){return a=p({},{fillHoles:!1},a),function(b,c){for(var d=new ra,e=!0,f=0;f1)return ra.join(g.map(function(a){return d(a.pathCoordinates,a.valueData)}));if(e=g[0].pathCoordinates,f=g[0].valueData,e.length<=4)return N()(e,f);for(var h=(new ra).move(e[0],e[1],!1,f[0]),i=void 0,j=0,k=e.length;k-2*!i>j;j+=2){var l=[{x:+e[j-2],y:+e[j-1]},{x:+e[j],y:+e[j+1]},{x:+e[j+2],y:+e[j+3]},{x:+e[j+4],y:+e[j+5]}];i?j?k-4===j?l[3]={x:+e[0],y:+e[1]}:k-2===j&&(l[2]={x:+e[0],y:+e[1]},l[3]={x:+e[2],y:+e[3]}):l[0]={x:+e[k-2],y:+e[k-1]}:k-4===j?l[3]=l[2]:j||(l[0]={x:+e[j],y:+e[j+1]}),h.curve(b*(-l[0].x+6*l[1].x+l[2].x)/6+c*l[2].x,b*(-l[0].y+6*l[1].y+l[2].y)/6+c*l[2].y,b*(l[1].x+6*l[2].x-l[3].x)/6+c*l[2].x,b*(l[1].y+6*l[2].y-l[3].y)/6+c*l[2].y,l[2].x,l[2].y,!1,f[(j+2)/2])}return h}return N()([])}}function R(a){return a=p({},{fillHoles:!1},a),function b(c,d){var e=A(c,d,{fillHoles:a.fillHoles,increasingX:!0});if(e.length){if(e.length>1)return ra.join(e.map(function(a){return b(a.pathCoordinates,a.valueData)}));if(c=e[0].pathCoordinates,d=e[0].valueData,c.length<=4)return N()(c,d);for(var f=[],g=[],h=c.length/2,i=[],j=[],k=[],l=[],m=0;m0!=j[o]>0?i[o]=0:(i[o]=3*(l[o-1]+l[o])/((2*l[o]+l[o-1])/j[o-1]+(l[o]+2*l[o-1])/j[o]),isFinite(i[o])||(i[o]=0));for(var p=(new ra).move(f[0],g[0],!1,d[0]),q=0;qa.x;return d&&"explode"===c||!d&&"implode"===c?"start":d&&"implode"===c||!d&&"explode"===c?"end":"middle"}var T={svg:"http://www.w3.org/2000/svg",xmlns:"http://www.w3.org/2000/xmlns/",xhtml:"http://www.w3.org/1999/xhtml",xlink:"http://www.w3.org/1999/xlink",ct:"http://gionkunz.github.com/chartist-js/ct"},U=8,V={"&":"&","<":"<",">":">",'"':""","'":"'"},W=function(a){if(Array.isArray(a)){for(var b=0,c=Array(a.length);b1}).map(function(a){var b=a.pathElements[0],c=a.pathElements[a.pathElements.length-1];return a.clone(!0).position(0).remove(1).move(b.x,f).line(b.x,b.y).position(a.pathElements.length+1).line(c.x,f)}).forEach(function(e){var f=l.elem("path",{d:e.stringify()},a.classNames.area,!0);b.eventEmitter.emit("draw",{type:"area",values:c.normalized.series[g],path:e.clone(),series:d,seriesIndex:g,axisX:i,axisY:k,chartRect:h,index:g,group:l,element:f})})}()}),this.eventEmitter.emit("created",{bounds:k.bounds,chartRect:h,axisX:i,axisY:k,svg:this.svg,options:a})}}]),b}(ga),va={axisX:{offset:30,position:"end",labelOffset:{x:0,y:0},showLabel:!0,showGrid:!0,labelInterpolationFnc:X,scaleMinSpace:30,onlyInteger:!1},axisY:{offset:40,position:"start",labelOffset:{x:0,y:0},showLabel:!0,showGrid:!0,labelInterpolationFnc:X,scaleMinSpace:20,onlyInteger:!1},width:void 0,height:void 0,high:void 0,low:void 0,referenceValue:0,chartPadding:{top:15,right:15,bottom:5,left:10},seriesBarDistance:15,stackBars:!1,stackMode:"accumulate",horizontalBars:!1,distributeSeries:!1,reverseData:!1,showGridBackground:!1,classNames:{chart:"ct-chart-bar",horizontalBars:"ct-horizontal-bars",label:"ct-label",labelGroup:"ct-labels",series:"ct-series",bar:"ct-bar",grid:"ct-grid",gridGroup:"ct-grids",gridBackground:"ct-grid-background",vertical:"ct-vertical",horizontal:"ct-horizontal",start:"ct-start",end:"ct-end"}},wa=function(a){function b(a,c,d,e){return aa(this,b),ha(this,(b.__proto__||Object.getPrototypeOf(b)).call(this,a,c,va,p({},va,d),e))}return ia(b,a),ba(b,[{key:"createChart",value:function(a){var b=arguments,c=this,d=void 0,f=void 0;a.distributeSeries?(d=s(this.data,a.reverseData,a.horizontalBars?"x":"y"),d.normalized.series=d.normalized.series.map(function(a){return[a]})):d=s(this.data,a.reverseData,a.horizontalBars?"x":"y"),this.svg=E(this.container,a.width,a.height,a.classNames.chart+(a.horizontalBars?" "+a.classNames.horizontalBars:""));var g=this.svg.elem("g").addClass(a.classNames.gridGroup),h=this.svg.elem("g"),i=this.svg.elem("g").addClass(a.classNames.labelGroup);if(a.stackBars&&0!==d.normalized.series.length){f=B([$(d.normalized.series,function(){return Array.from(b).map(function(a){return a}).reduce(function(a,b){return{x:a.x+(b&&b.x)||0,y:a.y+(b&&b.y)||0}},{x:0,y:0})})],a,a.horizontalBars?"x":"y")}else f=B(d.normalized.series,a,a.horizontalBars?"x":"y");f.high=+a.high||(0===a.high?0:f.high),f.low=+a.low||(0===a.low?0:f.low);var k=G(this.svg,a,va.padding),l=void 0,m=void 0,n=void 0,o=void 0,r=void 0;m=a.distributeSeries&&a.stackBars?d.normalized.labels.slice(0,1):d.normalized.labels,a.horizontalBars?(l=o=void 0===a.axisX.type?new ma(ja.x,d.normalized.series,k,p({},a.axisX,{highLow:f,referenceValue:0})):new a.axisX.type(ja.x,d.normalized.series,k,p({},a.axisX,{highLow:f,referenceValue:0})),n=r=void 0===a.axisY.type?new oa(ja.y,d.normalized.series,k,{ticks:m}):new a.axisY.type(ja.y,d.normalized.series,k,a.axisY)):(n=o=void 0===a.axisX.type?new oa(ja.x,d.normalized.series,k,{ticks:m}):new a.axisX.type(ja.x,d.normalized.series,k,a.axisX),l=r=void 0===a.axisY.type?new ma(ja.y,d.normalized.series,k,p({},a.axisY,{highLow:f,referenceValue:0})):new a.axisY.type(ja.y,d.normalized.series,k,p({},a.axisY,{highLow:f,referenceValue:0})));var u=a.horizontalBars?k.x1+l.projectValue(0):k.y1-l.projectValue(0),v=[];n.createGridAndLabels(g,i,this.supportsForeignObject,a,this.eventEmitter),l.createGridAndLabels(g,i,this.supportsForeignObject,a,this.eventEmitter),a.showGridBackground&&I(g,k,a.classNames.gridBackground,this.eventEmitter),d.raw.series.forEach(function(b,f){var g=f-(d.raw.series.length-1)/2,i=void 0;i=a.distributeSeries&&!a.stackBars?n.axisLength/d.normalized.series.length/2:a.distributeSeries&&a.stackBars?n.axisLength/2:n.axisLength/d.normalized.series[f].length/2;var m=h.elem("g");m.attr({"ct:series-name":b.name,"ct:meta":q(b.meta)}),m.addClass([a.classNames.series,b.className||a.classNames.series+"-"+j(f)].join(" ")),d.normalized.series[f].forEach(function(h,j){var s=void 0;s=a.distributeSeries&&!a.stackBars?f:a.distributeSeries&&a.stackBars?0:j;var w=void 0;w=a.horizontalBars?{x:k.x1+l.projectValue(h&&h.x?h.x:0,j,d.normalized.series[f]),y:k.y1-n.projectValue(h&&h.y?h.y:0,s,d.normalized.series[f])}:{x:k.x1+n.projectValue(h&&h.x?h.x:0,s,d.normalized.series[f]),y:k.y1-l.projectValue(h&&h.y?h.y:0,j,d.normalized.series[f])},n instanceof oa&&(n.options.stretch||(w[n.units.pos]+=i*(a.horizontalBars?-1:1)),w[n.units.pos]+=a.stackBars||a.distributeSeries?0:g*a.seriesBarDistance*(a.horizontalBars?-1:1));var x=v[j]||u;if(v[j]=x-(u-w[n.counterUnits.pos]),void 0!==h){var y={};y[n.units.pos+"1"]=w[n.units.pos],y[n.units.pos+"2"]=w[n.units.pos],!a.stackBars||"accumulate"!==a.stackMode&&a.stackMode?(y[n.counterUnits.pos+"1"]=u,y[n.counterUnits.pos+"2"]=w[n.counterUnits.pos]):(y[n.counterUnits.pos+"1"]=x,y[n.counterUnits.pos+"2"]=v[j]),y.x1=Math.min(Math.max(y.x1,k.x1),k.x2),y.x2=Math.min(Math.max(y.x2,k.x1),k.x2),y.y1=Math.min(Math.max(y.y1,k.y2),k.y1),y.y2=Math.min(Math.max(y.y2,k.y2),k.y1);var z=t(b,j),A=m.elem("line",y,a.classNames.bar).attr({"ct:value":[h.x,h.y].filter(e).join(","),"ct:meta":q(z)});c.eventEmitter.emit("draw",p({type:"bar",value:h,index:j,meta:z,series:b,seriesIndex:f,axisX:o,axisY:r,chartRect:k,group:m,element:A},y))}})}),this.eventEmitter.emit("created",{bounds:l.bounds,chartRect:k,axisX:o,axisY:r,svg:this.svg,options:a})}}]),b}(ga),xa={width:void 0,height:void 0,chartPadding:5,classNames:{chartPie:"ct-chart-pie",chartDonut:"ct-chart-donut",series:"ct-series",slicePie:"ct-slice-pie",sliceDonut:"ct-slice-donut",label:"ct-label"},startAngle:0,total:void 0,donut:!1,donutWidth:60,showLabel:!0,labelOffset:0,labelPosition:"inside",labelInterpolationFnc:X,labelDirection:"neutral",reverseData:!1,ignoreEmptyValues:!1},ya=function(a){function b(a,c,d,e){return aa(this,b),ha(this,(b.__proto__||Object.getPrototypeOf(b)).call(this,a,c,xa,p({},xa,d),e))}return ia(b,a),ba(b,[{key:"createChart",value:function(a){var b=this,c=s(this.data),d=[],e=void 0,g=void 0,h=a.startAngle;this.svg=E(this.container,a.width,a.height,a.donut?a.classNames.chartDonut:a.classNames.chartPie);var k=G(this.svg,a,xa.padding),l=Math.min(k.width()/2,k.height()/2),m=a.total||c.normalized.series.reduce(Z,0),n=i(a.donutWidth);"%"===n.unit&&(n.value*=l/100),l-=a.donut?n.value/2:0,g="outside"===a.labelPosition||a.donut?l:"center"===a.labelPosition?0:l/2,g+=a.labelOffset;var p={x:k.x1+k.width()/2,y:k.y2+k.height()/2},r=1===c.raw.series.filter(function(a){return a.hasOwnProperty("value")?0!==a.value:0!==a}).length;c.raw.series.forEach(function(a,c){return d[c]=b.svg.elem("g",null,null)}),a.showLabel&&(e=this.svg.elem("g",null,null)),c.raw.series.forEach(function(i,k){if(0!==c.normalized.series[k]||!a.ignoreEmptyValues){d[k].attr({"ct:series-name":i.name}),d[k].addClass([a.classNames.series,i.className||a.classNames.series+"-"+j(k)].join(" "));var s=m>0?h+c.normalized.series[k]/m*360:0,t=Math.max(0,h-(0===k||r?0:.2));s-t>=359.99&&(s=t+359.99);var u=o(p.x,p.y,l,t),v=o(p.x,p.y,l,s),w=new ra(!a.donut).move(v.x,v.y).arc(l,l,0,s-h>180,0,u.x,u.y);a.donut||w.line(p.x,p.y);var x=d[k].elem("path",{d:w.stringify()},a.donut?a.classNames.sliceDonut:a.classNames.slicePie);if(x.attr({"ct:value":c.normalized.series[k],"ct:meta":q(i.meta)}),a.donut&&x.attr({style:"stroke-width: "+n.value+"px"}),b.eventEmitter.emit("draw",{type:"slice",value:c.normalized.series[k],totalDataSum:m,index:k,meta:i.meta,series:i,group:d[k],element:x,path:w.clone(),center:p,radius:l,startAngle:h,endAngle:s}),a.showLabel){var y=void 0;y=1===c.raw.series.length?{x:p.x,y:p.y}:o(p.x,p.y,g,h+(s-h)/2);var z=void 0;z=c.normalized.labels&&!f(c.normalized.labels[k])?c.normalized.labels[k]:c.normalized.series[k];var A=a.labelInterpolationFnc(z,k);if(A||0===A){var B=e.elem("text",{dx:y.x,dy:y.y,"text-anchor":S(p,y,a.labelDirection)},a.classNames.label).text(""+A);b.eventEmitter.emit("draw",{type:"label",index:k,group:e,element:B,text:""+A,x:y.x,y:y.y})}}h=s}}),this.eventEmitter.emit("created",{chartRect:k,svg:this.svg,options:a})}}]),b}(ga);a.Interpolation=sa,a.EventEmitter=fa,a.extend=p,a.optionsProvider=K,a.namespaces=T,a.precision=U,a.escapingMap=V,a.replaceAll=b,a.querySelector=c,a.safeHasProperty=d,a.isNumeric=e,a.isFalseyButZero=f,a.getNumberOrUndefined=g,a.ensureUnit=h,a.quantity=i,a.alphaNumerate=j,a.noop=X,a.times=Y,a.sum=Z,a.serialMap=$,a.EPSILON=_,a.orderOfMagnitude=k,a.projectLength=l,a.roundWithPrecision=m,a.rho=n,a.polarToCartesian=o,a.serialize=q,a.deserialize=r,a.normalizeData=s,a.getMetaData=t,a.isDataHoleValue=u,a.reverseData=v,a.getDataArray=w,a.isMultiValue=x,a.getMultiValue=y,a.getSeriesOption=z,a.splitIntoSegments=A,a.getHighLow=B,a.getBounds=C,a.createSvg=E,a.normalizePadding=F,a.createChartRect=G,a.createGrid=H,a.createGridBackground=I,a.createLabel=J,a.BaseChart=ga,a.LineChart=ua,a.BarChart=wa,a.PieChart=ya,a.Axis=ka,a.axisUnits=ja,a.AutoScaleAxis=ma,a.FixedScaleAxis=na,a.StepAxis=oa,a.Svg=da,a.isSupported=D,a.easings=ea,a.SvgList=ca,a.SvgPath=ra,Object.defineProperty(a,"__esModule",{value:!0})}); -//# sourceMappingURL=chartist.umd.js.map \ No newline at end of file diff --git a/dist/chartist.umd.js.map b/dist/chartist.umd.js.map deleted file mode 100644 index b524e9ed..00000000 --- a/dist/chartist.umd.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":[],"names":[],"mappings":"","file":"chartist.umd.js"} \ No newline at end of file diff --git a/jspm.config.js b/jspm.config.js deleted file mode 100644 index 545d667c..00000000 --- a/jspm.config.js +++ /dev/null @@ -1,47 +0,0 @@ -SystemJS.config({ - paths: { - "npm:": "jspm_packages/npm/", - "github:": "jspm_packages/github/", - "chartist/": "src/" - }, - browserConfig: { - "baseURL": "/" - }, - devConfig: { - "map": { - "plugin-babel": "npm:systemjs-plugin-babel@0.0.16" - } - }, - transpiler: "plugin-babel", - packages: { - "chartist": { - "main": "index.js", - "defaultExtension": "js", - "format": "esm", - "meta": { - "*.js": { - "loader": "plugin-babel" - } - } - } - } -}); - -SystemJS.config({ - packageConfigPaths: [ - "npm:@*/*.json", - "npm:*.json", - "github:*/*.json" - ], - map: { - "text": "github:systemjs/plugin-text@0.0.9" - }, - packages: {} -}); - -// Manually added -SystemJS.config({ - map: { - "version": "tooling/system-loaders/version-loader-plugin.js" - } -}); diff --git a/package.json b/package.json index 9beaf622..d623b1a0 100644 --- a/package.json +++ b/package.json @@ -1,10 +1,20 @@ { "name": "chartist", - "title": "Chartist.js", - "description": "Simple, responsive charts", "version": "1.0.0", + "description": "Simple, responsive charts", "author": "Gion Kunz", "homepage": "https://chartist-js.github.io", + "license": "MIT OR WTFPL", + "licenses": [ + { + "type": "WTFPL", + "url": "https://github.com/chartist-js/chartist/blob/master/LICENSE-WTFPL" + }, + { + "type": "MIT", + "url": "https://github.com/chartist-js/chartist/blob/master/LICENSE-MIT" + } + ], "repository": { "type": "git", "url": "https://github.com/chartist-js/chartist.git" @@ -18,40 +28,55 @@ "charts", "charting" ], + "engines": { + "node": ">=14" + }, + "sideEffects": false, + "style": "./src/styles/chartist.scss", + "main": "./src/index.js", + "publishConfig": { + "style": "./dist/chartist.css", + "main": "./dist/index.cjs", + "module": "./dist/index.js", + "exports": { + "require": "./dist/index.cjs", + "import": "./dist/index.js" + }, + "directory": "package" + }, "files": [ "dist", "LICENSE-WTFPL", - "LICENSE-MIT", - "package.json", - "README.md" - ], - "style": "dist/chartist.min.css", - "main": "dist/chartist.umd.js", - "browser": "dist/chartist.umd.js", - "license": "MIT OR WTFPL", - "licenses": [ - { - "type": "WTFPL", - "url": "https://github.com/chartist-js/chartist/blob/master/LICENSE-WTFPL" - }, - { - "type": "MIT", - "url": "https://github.com/chartist-js/chartist/blob/master/LICENSE-MIT" - } + "LICENSE-MIT" ], + "scripts": { + "build:styles": "./scripts/styles.js src/styles/chartist.scss dist", + "build": "rollup -c & pnpm build:styles", + "start:storybook": "start-storybook -p 6006 --ci", + "build:storybook": "del ./storybook-static; NODE_ENV=production build-storybook", + "test": "karma start karma.ci.config.js", + "test-watch": "karma start karma.watch.config.js", + "lint": "eslint src", + "commit": "cz", + "updateGitHooks": "simple-git-hooks" + }, "devDependencies": { "@babel/core": "^7.17.9", "@commitlint/cli": "^16.2.3", "@commitlint/config-conventional": "^16.2.1", "@commitlint/cz-commitlint": "^16.2.3", + "@rollup/plugin-node-resolve": "^13.2.0", "@storybook/addon-actions": "^6.4.22", "@storybook/addon-controls": "^6.4.22", "@storybook/addon-docs": "^6.4.22", "@storybook/html": "^6.4.22", "@storybook/preset-scss": "^1.0.3", + "@swc/core": "^1.2.165", + "@swc/helpers": "^0.3.8", "autoprefixer": "^10.4.4", "babel-eslint": "^7.1.0", "babel-loader": "^8.2.4", + "browserslist": "^4.20.2", "chokidar": "^3.5.3", "commitizen": "^4.2.4", "css-loader": "^5.0.0", @@ -71,39 +96,12 @@ "karma-phantomjs-launcher": "^1.0.4", "node-sass": "^7.0.1", "postcss": "^8.4.12", + "rollup": "^2.70.1", + "rollup-plugin-swc": "^0.2.1", "sass": "^1.50.0", "sass-loader": "^10.0.0", "simple-git-hooks": "^2.7.0", "style-loader": "^2.0.0" }, - "engines": { - "node": ">=6.9.0" - }, - "jspm": { - "name": "chartist", - "main": "chartist", - "dependencies": { - "text": "github:systemjs/plugin-text@^0.0.9" - }, - "devDependencies": { - "plugin-babel": "npm:systemjs-plugin-babel@^0.0.16" - } - }, - "scripts": { - "start:storybook": "start-storybook -p 6006 --ci", - "build:storybook": "del ./storybook-static; NODE_ENV=production build-storybook", - "test": "karma start karma.ci.config.js", - "test-watch": "karma start karma.watch.config.js", - "styles-watch": "./tooling/node/styles-watch.js", - "lint": "eslint src", - "build": "pnpm build-styles && pnpm build-umd && pnpm build-esm", - "build-umd": "jspm build chartist dist/chartist.umd.js --format umd --global-name Chartist --minify --source-map-contents && ./tooling/node/banner.js dist/chartist.umd.js dist/chartist.umd.js", - "build-esm": "jspm build chartist dist/chartist.esm.js --format esm && ./tooling/node/banner.js dist/chartist.esm.js dist/chartist.esm.js", - "build-styles": "./tooling/node/styles.js src/styles/chartist.scss dist", - "commit": "cz", - "updateGitHooks": "simple-git-hooks" - }, - "config": { - "banner": "/* Chartist.js {pkg.version}\n * Copyright © {year} Gion Kunz\n * Free to use under either the WTFPL license or the MIT license.\n * https://raw.githubusercontent.com/chartist-js/chartist/master/LICENSE-WTFPL\n * https://raw.githubusercontent.com/chartist-js/chartist/master/LICENSE-MIT\n */\n" - } + "readme": "" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 48987b61..a9110cfc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,14 +5,18 @@ specifiers: '@commitlint/cli': ^16.2.3 '@commitlint/config-conventional': ^16.2.1 '@commitlint/cz-commitlint': ^16.2.3 + '@rollup/plugin-node-resolve': ^13.2.0 '@storybook/addon-actions': ^6.4.22 '@storybook/addon-controls': ^6.4.22 '@storybook/addon-docs': ^6.4.22 '@storybook/html': ^6.4.22 '@storybook/preset-scss': ^1.0.3 + '@swc/core': ^1.2.165 + '@swc/helpers': ^0.3.8 autoprefixer: ^10.4.4 babel-eslint: ^7.1.0 babel-loader: ^8.2.4 + browserslist: ^4.20.2 chokidar: ^3.5.3 commitizen: ^4.2.4 css-loader: ^5.0.0 @@ -32,6 +36,8 @@ specifiers: karma-phantomjs-launcher: ^1.0.4 node-sass: ^7.0.1 postcss: ^8.4.12 + rollup: ^2.70.1 + rollup-plugin-swc: ^0.2.1 sass: ^1.50.0 sass-loader: ^10.0.0 simple-git-hooks: ^2.7.0 @@ -39,19 +45,23 @@ specifiers: devDependencies: '@babel/core': 7.17.9 - '@commitlint/cli': 16.2.3 + '@commitlint/cli': 16.2.3_@swc+core@1.2.165 '@commitlint/config-conventional': 16.2.1 - '@commitlint/cz-commitlint': 16.2.3_commitizen@4.2.4+inquirer@8.2.2 + '@commitlint/cz-commitlint': 16.2.3_d728995458426a93696f083845656c00 + '@rollup/plugin-node-resolve': 13.2.0_rollup@2.70.1 '@storybook/addon-actions': 6.4.22 '@storybook/addon-controls': 6.4.22_eslint@8.13.0 '@storybook/addon-docs': 6.4.22_7fd729fae3ed30395c91a6c3899e19ab '@storybook/html': 6.4.22_@babel+core@7.17.9+eslint@8.13.0 '@storybook/preset-scss': 1.0.3_98fb4723ddb8cb1321f7deacb3be93bc + '@swc/core': 1.2.165 + '@swc/helpers': 0.3.8 autoprefixer: 10.4.4_postcss@8.4.12 babel-eslint: 7.2.3 babel-loader: 8.2.4_@babel+core@7.17.9 + browserslist: 4.20.2 chokidar: 3.5.3 - commitizen: 4.2.4 + commitizen: 4.2.4_@swc+core@1.2.165 css-loader: 5.2.7 cssnano: 5.1.7_postcss@8.4.12 debounce: 1.2.1 @@ -69,6 +79,8 @@ devDependencies: karma-phantomjs-launcher: 1.0.4_karma@6.3.18 node-sass: 7.0.1 postcss: 8.4.12 + rollup: 2.70.1 + rollup-plugin-swc: 0.2.1_@swc+core@1.2.165+rollup@2.70.1 sass: 1.50.0 sass-loader: 10.2.1_node-sass@7.0.1+sass@1.50.0 simple-git-hooks: 2.7.0 @@ -1473,14 +1485,14 @@ packages: engines: {node: '>=0.1.90'} dev: true - /@commitlint/cli/16.2.3: + /@commitlint/cli/16.2.3_@swc+core@1.2.165: resolution: {integrity: sha512-VsJBQLvhhlOgEfxs/Z5liYuK0dXqLE5hz1VJzLBxiOxG31kL/X5Q4OvK292BmO7IGZcm1yJE3XQPWSiFaEHbWA==} engines: {node: '>=v12'} hasBin: true dependencies: '@commitlint/format': 16.2.1 '@commitlint/lint': 16.2.1 - '@commitlint/load': 16.2.3 + '@commitlint/load': 16.2.3_@swc+core@1.2.165 '@commitlint/read': 16.2.1 '@commitlint/types': 16.2.1 lodash: 4.17.21 @@ -1507,7 +1519,7 @@ packages: ajv: 6.12.6 dev: true - /@commitlint/cz-commitlint/16.2.3_commitizen@4.2.4+inquirer@8.2.2: + /@commitlint/cz-commitlint/16.2.3_d728995458426a93696f083845656c00: resolution: {integrity: sha512-G9rRnBJ/5te7RiOzp7EdqII9rQYvtsfsqwMxcoK4B7l0Rc57nFCOlf0e4Bn70E4aOsLeMzNe+PvVVrEsPStEHg==} engines: {node: '>=v12'} peerDependencies: @@ -1515,10 +1527,10 @@ packages: inquirer: ^8.0.0 dependencies: '@commitlint/ensure': 16.2.1 - '@commitlint/load': 16.2.3 + '@commitlint/load': 16.2.3_@swc+core@1.2.165 '@commitlint/types': 16.2.1 chalk: 4.1.2 - commitizen: 4.2.4 + commitizen: 4.2.4_@swc+core@1.2.165 inquirer: 8.2.2 lodash: 4.17.21 word-wrap: 1.2.3 @@ -1566,7 +1578,7 @@ packages: '@commitlint/types': 16.2.1 dev: true - /@commitlint/load/16.2.3: + /@commitlint/load/16.2.3_@swc+core@1.2.165: resolution: {integrity: sha512-Hb4OUlMnBUK6UxJEZ/VJ5k0LocIS7PtEMbRXEAA7eSpOgORIFexC4K/RaRpVd5UTtu3M0ST3ddPPijF9rdW6nw==} engines: {node: '>=v12'} dependencies: @@ -1577,7 +1589,7 @@ packages: '@types/node': 17.0.23 chalk: 4.1.2 cosmiconfig: 7.0.1 - cosmiconfig-typescript-loader: 1.0.9_ee885bc7281b682b6adbed6ae09ee090 + cosmiconfig-typescript-loader: 1.0.9_f533c3387680131348857b0baefd0f31 lodash: 4.17.21 resolve-from: 5.0.0 typescript: 4.6.3 @@ -2009,6 +2021,41 @@ packages: resolution: {integrity: sha512-9X2obfABZuDVLCgPK9aX0a/x4jaOEweTTWE2+9sr0Qqqevj2Uv5XorvusThmc9XGYpS9yI+fhh8RTafBtGposw==} dev: true + /@rollup/plugin-node-resolve/13.2.0_rollup@2.70.1: + resolution: {integrity: sha512-GuUIUyIKq7EjQxB51XSn6zPHYo+cILQQBYOGYvFFNxws2OVOqCBShAoof2hFrV8bAZzZGDBDQ8m2iUt8SLOUkg==} + engines: {node: '>= 10.0.0'} + peerDependencies: + rollup: ^2.42.0 + dependencies: + '@rollup/pluginutils': 3.1.0_rollup@2.70.1 + '@types/resolve': 1.17.1 + builtin-modules: 3.2.0 + deepmerge: 4.2.2 + is-module: 1.0.0 + resolve: 1.22.0 + rollup: 2.70.1 + dev: true + + /@rollup/pluginutils/3.1.0_rollup@2.70.1: + resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} + engines: {node: '>= 8.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0 + dependencies: + '@types/estree': 0.0.39 + estree-walker: 1.0.1 + picomatch: 2.3.1 + rollup: 2.70.1 + dev: true + + /@rollup/pluginutils/4.2.1: + resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} + engines: {node: '>= 8.0.0'} + dependencies: + estree-walker: 2.0.2 + picomatch: 2.3.1 + dev: true + /@socket.io/base64-arraybuffer/1.0.2: resolution: {integrity: sha512-dOlCBKnDw4iShaIsH/bxujKTM18+2TOAsYz+KSc11Am38H4q5Xw8Bbz97ZYdrVNM+um3p7w86Bvvmcn9q+5+eQ==} engines: {node: '>= 0.6.0'} @@ -3611,6 +3658,147 @@ packages: - '@types/react' dev: true + /@swc/core-android-arm-eabi/1.2.165: + resolution: {integrity: sha512-DjX1/5qElHOnlrqhefcZsD1LEspJWDLpW31SKv9cNT2T13U76MkcrHi5ePI50NhG/bWDpHuWFWfuEmgcU+mwHA==} + engines: {node: '>=10'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@swc/core-android-arm64/1.2.165: + resolution: {integrity: sha512-lPgG+td9/JlV3ZQiHZtdtqn+lZzGly+s/VQXfnaXgaHQE4JjWU2B4rhTVkVOQxEYbA/Cd9pszNWWxjJSrXytMA==} + engines: {node: '>=10'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@swc/core-darwin-arm64/1.2.165: + resolution: {integrity: sha512-O6eFbCD4lZ4ZW2E1a4CsIo3zVTI5Tu2MpTbaVan7LvYyv2RK+tot9xjysVbOx/1nfgYDym9JLHU9gY/ayrdOtA==} + engines: {node: '>=10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@swc/core-darwin-x64/1.2.165: + resolution: {integrity: sha512-R1WRiDnkmXWBkyNGR09WDq+mCFIujhdUs3e4QiHJih1HY2rKGXU0SZKoqaBTjeVerk/IYXaEnZM3Bx7sb0oyEQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@swc/core-freebsd-x64/1.2.165: + resolution: {integrity: sha512-bL7Jxy2is/+YLZedQsF5a7swpbq9RGsvtXJmx5Bi0JqaavqWpbICmQtTr9I2S97taw16S/k8vOJ6DPzEvgJWWQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-arm-gnueabihf/1.2.165: + resolution: {integrity: sha512-6m+X7a0iw5G97WfkJBKNy7/KfSEivRVRHbWB4VvJgRanNIO4tb//LxlUJFn58frQJg+H7bMFyOXhDJ/taRYAyg==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-arm64-gnu/1.2.165: + resolution: {integrity: sha512-4roZScf8UZLhKTYBEqqbTNasZPqs3zDA2LF+SJuc4eFUGJyyrl9KgeVC08vTMtkAI47EebT15FgcQ+9LhtMlkg==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-arm64-musl/1.2.165: + resolution: {integrity: sha512-xM5MDECEnptdsClSitld/f+azudbkeT8nNCkXCP+vFsurex9ISJ2DCWTvw7hgpkFElVv/qFEagDCucgESHcUzw==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-x64-gnu/1.2.165: + resolution: {integrity: sha512-MTEhtso3De+HP+qZKZw1DfPTbngn4ms3+7XG6jqUs6CKpmLTJkvnpPJ5swlXGvpKyDq367O2Aicft52Uoaoq+Q==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-x64-musl/1.2.165: + resolution: {integrity: sha512-T2ZSApYoK4VTMTTqhUKcrNcv68ChoAOZDKUNfOik8zXcN1pMttus/VaqfZjxT2+orviRTD5Bkdsc3UvrhHqHnw==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-win32-arm64-msvc/1.2.165: + resolution: {integrity: sha512-Icg6dtQpQZKjAUG6kME4WuYpG6cqZjUzzmiZPQ9wWOw7wY8EYFPwC2ZjTg8KwbOJFkAKN6cjk3O2IAFsOWuUGg==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@swc/core-win32-ia32-msvc/1.2.165: + resolution: {integrity: sha512-ldrTYG1zydyJP54YmYie3VMGcU7gCT2dZ7S1uZ1Tab+10GzZtdvePGGlQ/39jJVpr36/DZ34L6PsjwQkPG7AOw==} + engines: {node: '>=10'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@swc/core-win32-x64-msvc/1.2.165: + resolution: {integrity: sha512-gi2ZELsRLC3RfQFk+qwccL0VZ6ZgprMOP/phCVd8sA2MZsVVrFu6QBEJNGO0Z6hEqQ2BWrva6+cMF/eHSzuAsQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@swc/core/1.2.165: + resolution: {integrity: sha512-+Z/FquMEUQLOOVWJY4B2QnHvcAIgBKKJMVtVQLVlIwfC4Ez8OvzGPTfL1W4ixYlUoIaTbAd1956kjBXalr4wEg==} + engines: {node: '>=10'} + hasBin: true + optionalDependencies: + '@swc/core-android-arm-eabi': 1.2.165 + '@swc/core-android-arm64': 1.2.165 + '@swc/core-darwin-arm64': 1.2.165 + '@swc/core-darwin-x64': 1.2.165 + '@swc/core-freebsd-x64': 1.2.165 + '@swc/core-linux-arm-gnueabihf': 1.2.165 + '@swc/core-linux-arm64-gnu': 1.2.165 + '@swc/core-linux-arm64-musl': 1.2.165 + '@swc/core-linux-x64-gnu': 1.2.165 + '@swc/core-linux-x64-musl': 1.2.165 + '@swc/core-win32-arm64-msvc': 1.2.165 + '@swc/core-win32-ia32-msvc': 1.2.165 + '@swc/core-win32-x64-msvc': 1.2.165 + dev: true + + /@swc/helpers/0.3.8: + resolution: {integrity: sha512-aWItSZvJj4+GI6FWkjZR13xPNPctq2RRakzo+O6vN7bC2yjwdg5EFpgaSAUn95b7BGSgcflvzVDPoKmJv24IOg==} + dev: true + /@tootallnate/once/1.1.2: resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} engines: {node: '>= 6'} @@ -3663,6 +3851,10 @@ packages: resolution: {integrity: sha512-F/v7t1LwS4vnXuPooJQGBRKRGIoxWUTmA4VHfqjOccFsNDThD5bfUNpITive6s352O7o384wcpEaDV8rHCehDA==} dev: true + /@types/estree/0.0.39: + resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} + dev: true + /@types/glob/7.2.0: resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} dependencies: @@ -3785,6 +3977,12 @@ packages: csstype: 3.0.11 dev: true + /@types/resolve/1.17.1: + resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} + dependencies: + '@types/node': 17.0.23 + dev: true + /@types/scheduler/0.16.2: resolution: {integrity: sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==} dev: true @@ -5114,6 +5312,11 @@ packages: ieee754: 1.2.1 dev: true + /builtin-modules/3.2.0: + resolution: {integrity: sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==} + engines: {node: '>=6'} + dev: true + /builtin-status-codes/3.0.0: resolution: {integrity: sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=} dev: true @@ -5591,13 +5794,13 @@ packages: engines: {node: '>= 10'} dev: true - /commitizen/4.2.4: + /commitizen/4.2.4_@swc+core@1.2.165: resolution: {integrity: sha512-LlZChbDzg3Ir3O2S7jSo/cgWp5/QwylQVr59K4xayVq8S4/RdKzSyJkghAiZZHfhh5t4pxunUoyeg0ml1q/7aw==} engines: {node: '>= 10'} hasBin: true dependencies: cachedir: 2.2.0 - cz-conventional-changelog: 3.2.0 + cz-conventional-changelog: 3.2.0_@swc+core@1.2.165 dedent: 0.7.0 detect-indent: 6.0.0 find-node-modules: 2.1.3 @@ -5817,7 +6020,7 @@ packages: vary: 1.1.2 dev: true - /cosmiconfig-typescript-loader/1.0.9_ee885bc7281b682b6adbed6ae09ee090: + /cosmiconfig-typescript-loader/1.0.9_f533c3387680131348857b0baefd0f31: resolution: {integrity: sha512-tRuMRhxN4m1Y8hP9SNYfz7jRwt8lZdWxdjg/ohg5esKmsndJIn4yT96oJVcf5x0eA11taXl+sIp+ielu529k6g==} engines: {node: '>=12', npm: '>=6'} peerDependencies: @@ -5826,7 +6029,7 @@ packages: dependencies: '@types/node': 17.0.23 cosmiconfig: 7.0.1 - ts-node: 10.7.0_ee885bc7281b682b6adbed6ae09ee090 + ts-node: 10.7.0_f533c3387680131348857b0baefd0f31 typescript: 4.6.3 transitivePeerDependencies: - '@swc/core' @@ -6108,18 +6311,18 @@ packages: resolution: {integrity: sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=} dev: true - /cz-conventional-changelog/3.2.0: + /cz-conventional-changelog/3.2.0_@swc+core@1.2.165: resolution: {integrity: sha512-yAYxeGpVi27hqIilG1nh4A9Bnx4J3Ov+eXy4koL3drrR+IO9GaWPsKjik20ht608Asqi8TQPf0mczhEeyAtMzg==} engines: {node: '>= 10'} dependencies: chalk: 2.4.2 - commitizen: 4.2.4 + commitizen: 4.2.4_@swc+core@1.2.165 conventional-commit-types: 3.0.0 lodash.map: 4.6.0 longest: 2.0.1 word-wrap: 1.2.3 optionalDependencies: - '@commitlint/load': 16.2.3 + '@commitlint/load': 16.2.3_@swc+core@1.2.165 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' @@ -6946,6 +7149,14 @@ packages: engines: {node: '>=4.0'} dev: true + /estree-walker/1.0.1: + resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==} + dev: true + + /estree-walker/2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + dev: true + /esutils/2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} @@ -8874,6 +9085,10 @@ packages: resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} dev: true + /is-module/1.0.0: + resolution: {integrity: sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=} + dev: true + /is-negative-zero/2.0.2: resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} engines: {node: '>= 0.4'} @@ -12532,6 +12747,17 @@ packages: inherits: 2.0.4 dev: true + /rollup-plugin-swc/0.2.1_@swc+core@1.2.165+rollup@2.70.1: + resolution: {integrity: sha512-wWRYt9tC0aIBvRQHNnVtwJ6DRPDj9XYpOAcOyFB11sKSkR/R+NAmbrjBACCPNVmZcxg6joV29wXgb5mU1DI7eA==} + peerDependencies: + '@swc/core': '>=1.0' + rollup: '>=1.5.0' + dependencies: + '@rollup/pluginutils': 4.2.1 + '@swc/core': 1.2.165 + rollup: 2.70.1 + dev: true + /rollup/0.58.2: resolution: {integrity: sha512-RZVvCWm9BHOYloaE6LLiE/ibpjv1CmI8F8k0B0Cp+q1eezo3cswszJH1DN0djgzSlo0hjuuCmyeI+1XOYLl4wg==} hasBin: true @@ -12540,6 +12766,14 @@ packages: '@types/node': 17.0.23 dev: true + /rollup/2.70.1: + resolution: {integrity: sha512-CRYsI5EuzLbXdxC6RnYhOuRdtz4bhejPMSWjsFLfVM/7w/85n2szZv6yExqUXsBdz5KT8eoubeyDUDjhLHEslA==} + engines: {node: '>=10.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: true + /rsvp/3.6.2: resolution: {integrity: sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==} engines: {node: 0.12.* || 4.* || 6.* || >= 7.*} @@ -13800,7 +14034,7 @@ packages: engines: {node: '>=6.10'} dev: true - /ts-node/10.7.0_ee885bc7281b682b6adbed6ae09ee090: + /ts-node/10.7.0_f533c3387680131348857b0baefd0f31: resolution: {integrity: sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A==} hasBin: true peerDependencies: @@ -13815,6 +14049,7 @@ packages: optional: true dependencies: '@cspotcode/source-map-support': 0.7.0 + '@swc/core': 1.2.165 '@tsconfig/node10': 1.0.8 '@tsconfig/node12': 1.0.9 '@tsconfig/node14': 1.0.1 diff --git a/rollup.config.js b/rollup.config.js new file mode 100644 index 00000000..77703b74 --- /dev/null +++ b/rollup.config.js @@ -0,0 +1,56 @@ +import swc from 'rollup-plugin-swc'; +import { nodeResolve } from '@rollup/plugin-node-resolve'; +import pkg from './package.json'; + +const extensions = ['.js', '.ts', '.tsx']; +const external = _ => /node_modules/.test(_) && !/@swc\/helpers/.test(_); +const plugins = targets => [ + nodeResolve({ + extensions, + }), + swc({ + jsc: { + parser: { + syntax: 'typescript', + tsx: true, + }, + transform: { + react: { + useBuiltins: true, + }, + }, + externalHelpers: true, + }, + env: { + targets, + }, + module: { + type: 'es6', + }, + sourceMaps: true, + }), +]; + +export default [ + { + input: pkg.main, + plugins: plugins('defaults, not ie 11, not ie_mob 11'), + external, + output: { + file: pkg.publishConfig.main, + format: 'cjs', + exports: 'named', + sourcemap: true, + }, + }, + { + input: pkg.main, + plugins: plugins('defaults and supports es6-module'), + external, + output: { + file: pkg.publishConfig.module, + format: 'es', + sourcemap: true, + }, + }, +]; diff --git a/tooling/node/compile-sass.js b/scripts/compile-sass.js similarity index 100% rename from tooling/node/compile-sass.js rename to scripts/compile-sass.js diff --git a/tooling/node/styles.js b/scripts/styles.js similarity index 100% rename from tooling/node/styles.js rename to scripts/styles.js diff --git a/src/testing/fixtures.js b/test/fixtures.js similarity index 100% rename from src/testing/fixtures.js rename to test/fixtures.js diff --git a/src/testing/jasmine-dom-matchers.js b/test/jasmine-dom-matchers.js similarity index 100% rename from src/testing/jasmine-dom-matchers.js rename to test/jasmine-dom-matchers.js diff --git a/src/testing/spec/fixture-with-multiple-elements.html b/test/spec/fixture-with-multiple-elements.html similarity index 100% rename from src/testing/spec/fixture-with-multiple-elements.html rename to test/spec/fixture-with-multiple-elements.html diff --git a/src/testing/spec/fixture-with-single-element.html b/test/spec/fixture-with-single-element.html similarity index 100% rename from src/testing/spec/fixture-with-single-element.html rename to test/spec/fixture-with-single-element.html diff --git a/src/testing/spec/fixtures.spec.js b/test/spec/fixtures.spec.js similarity index 100% rename from src/testing/spec/fixtures.spec.js rename to test/spec/fixtures.spec.js diff --git a/tooling/node/banner.js b/tooling/node/banner.js deleted file mode 100755 index 549b8fb3..00000000 --- a/tooling/node/banner.js +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/env node - -const fsp = require('fs-promise'); -const interpolate = require('interpolate'); -const pkg = require('../../package.json'); -let content = interpolate(pkg.config.banner, { - pkg, - year: new Date().getFullYear() -}); - -fsp.readFile(process.argv[2]) - .then((data) => fsp.writeFile(process.argv[3], content + data)); diff --git a/tooling/node/styles-watch.js b/tooling/node/styles-watch.js deleted file mode 100755 index f74ed8c8..00000000 --- a/tooling/node/styles-watch.js +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/env node - -const chokidar = require('chokidar'); -const compileSass = require('./compile-sass'); -const debounce = require('debounce'); - -const compileStyles = debounce(() => { - console.log(`Compiling styles.`); - compileSass('src/styles/chartist.scss', 'dist'); -}, 200); - -chokidar.watch('./src/**/*.scss') - .on('all', (event, path) => { - console.log(`Changes on path ${path}`); - compileStyles(); - }); diff --git a/tooling/system-loaders/version-loader-plugin.js b/tooling/system-loaders/version-loader-plugin.js deleted file mode 100644 index 884fa294..00000000 --- a/tooling/system-loaders/version-loader-plugin.js +++ /dev/null @@ -1,3 +0,0 @@ -export function translate(load) { - return `export const version = '${JSON.parse(load.source).version}'`; -} From 72cb296f0efaa5180bcf73662d396a5f7f184c31 Mon Sep 17 00:00:00 2001 From: Dan Onoshko Date: Fri, 22 Apr 2022 01:42:56 +0700 Subject: [PATCH 13/44] test: use Jest (#6) --- dist/chartist.css | 550 ---- dist/chartist.css.map | 1 - dist/chartist.min.css | 2 - dist/chartist.min.css.map | 1 - jest.config.json | 24 + karma.ci.config.js | 28 - karma.watch.config.js | 28 - package.json | 16 +- pnpm-lock.yaml | 2720 ++++++++--------- src/axes/axis.spec.js | 154 +- src/axes/fixed-scale-axis.spec.js | 78 +- src/axes/step-axis.spec.js | 48 +- src/charts/bar.spec.js | 418 ++- src/charts/bar.stories.js | 26 + src/charts/line.spec.js | 863 +++--- src/charts/pie.spec.js | 511 ++-- src/core/creation.spec.js | 360 +-- src/core/data.js | 4 + src/core/data.spec.js | 610 ++-- src/core/lang.spec.js | 36 +- src/core/options-provider.js | 2 +- src/svg/svg-path.spec.js | 326 +- test/jasmine-dom-matchers.js | 32 - test/{fixtures.js => mock.js} | 35 +- test/setup.js | 3 + test/spec/fixture-with-multiple-elements.html | 1 - test/spec/fixture-with-single-element.html | 1 - test/spec/fixtures.spec.js | 47 - 28 files changed, 2976 insertions(+), 3949 deletions(-) delete mode 100644 dist/chartist.css delete mode 100644 dist/chartist.css.map delete mode 100644 dist/chartist.min.css delete mode 100644 dist/chartist.min.css.map create mode 100644 jest.config.json delete mode 100644 karma.ci.config.js delete mode 100644 karma.watch.config.js delete mode 100644 test/jasmine-dom-matchers.js rename test/{fixtures.js => mock.js} (50%) create mode 100644 test/setup.js delete mode 100644 test/spec/fixture-with-multiple-elements.html delete mode 100644 test/spec/fixture-with-single-element.html delete mode 100644 test/spec/fixtures.spec.js diff --git a/dist/chartist.css b/dist/chartist.css deleted file mode 100644 index 71e2415a..00000000 --- a/dist/chartist.css +++ /dev/null @@ -1,550 +0,0 @@ -.ct-label { - fill: rgba(0, 0, 0, 0.4); - color: rgba(0, 0, 0, 0.4); - font-size: 0.75rem; - line-height: 1; } - -.ct-chart-line .ct-label, -.ct-chart-bar .ct-label { - display: block; - display: flex; } - -.ct-chart-pie .ct-label, -.ct-chart-donut .ct-label { - dominant-baseline: central; } - -.ct-label.ct-horizontal.ct-start { - align-items: flex-end; - justify-content: flex-start; - text-align: left; - text-anchor: start; } - -.ct-label.ct-horizontal.ct-end { - align-items: flex-start; - justify-content: flex-start; - text-align: left; - text-anchor: start; } - -.ct-label.ct-vertical.ct-start { - align-items: flex-end; - justify-content: flex-end; - text-align: right; - text-anchor: end; } - -.ct-label.ct-vertical.ct-end { - align-items: flex-end; - justify-content: flex-start; - text-align: left; - text-anchor: start; } - -.ct-chart-bar .ct-label.ct-horizontal.ct-start { - align-items: flex-end; - justify-content: center; - text-align: center; - text-anchor: start; } - -.ct-chart-bar .ct-label.ct-horizontal.ct-end { - align-items: flex-start; - justify-content: center; - text-align: center; - text-anchor: start; } - -.ct-chart-bar.ct-horizontal-bars .ct-label.ct-horizontal.ct-start { - align-items: flex-end; - justify-content: flex-start; - text-align: left; - text-anchor: start; } - -.ct-chart-bar.ct-horizontal-bars .ct-label.ct-horizontal.ct-end { - align-items: flex-start; - justify-content: flex-start; - text-align: left; - text-anchor: start; } - -.ct-chart-bar.ct-horizontal-bars .ct-label.ct-vertical.ct-start { - align-items: center; - justify-content: flex-end; - text-align: right; - text-anchor: end; } - -.ct-chart-bar.ct-horizontal-bars .ct-label.ct-vertical.ct-end { - align-items: center; - justify-content: flex-start; - text-align: left; - text-anchor: end; } - -.ct-grid { - stroke: rgba(0, 0, 0, 0.2); - stroke-width: 1px; - stroke-dasharray: 2px; } - -.ct-grid-background { - fill: none; } - -.ct-point { - stroke-width: 10px; - stroke-linecap: round; } - -.ct-line { - fill: none; - stroke-width: 4px; } - -.ct-area { - stroke: none; - fill-opacity: 0.1; } - -.ct-bar { - fill: none; - stroke-width: 10px; } - -.ct-slice-donut { - fill: none; - stroke-width: 60px; } - -.ct-series-a .ct-point, .ct-series-a .ct-line, .ct-series-a .ct-bar, .ct-series-a .ct-slice-donut { - stroke: #d70206; } - -.ct-series-a .ct-slice-pie, .ct-series-a .ct-area { - fill: #d70206; } - -.ct-series-b .ct-point, .ct-series-b .ct-line, .ct-series-b .ct-bar, .ct-series-b .ct-slice-donut { - stroke: #f05b4f; } - -.ct-series-b .ct-slice-pie, .ct-series-b .ct-area { - fill: #f05b4f; } - -.ct-series-c .ct-point, .ct-series-c .ct-line, .ct-series-c .ct-bar, .ct-series-c .ct-slice-donut { - stroke: #f4c63d; } - -.ct-series-c .ct-slice-pie, .ct-series-c .ct-area { - fill: #f4c63d; } - -.ct-series-d .ct-point, .ct-series-d .ct-line, .ct-series-d .ct-bar, .ct-series-d .ct-slice-donut { - stroke: #d17905; } - -.ct-series-d .ct-slice-pie, .ct-series-d .ct-area { - fill: #d17905; } - -.ct-series-e .ct-point, .ct-series-e .ct-line, .ct-series-e .ct-bar, .ct-series-e .ct-slice-donut { - stroke: #453d3f; } - -.ct-series-e .ct-slice-pie, .ct-series-e .ct-area { - fill: #453d3f; } - -.ct-series-f .ct-point, .ct-series-f .ct-line, .ct-series-f .ct-bar, .ct-series-f .ct-slice-donut { - stroke: #59922b; } - -.ct-series-f .ct-slice-pie, .ct-series-f .ct-area { - fill: #59922b; } - -.ct-series-g .ct-point, .ct-series-g .ct-line, .ct-series-g .ct-bar, .ct-series-g .ct-slice-donut { - stroke: #0544d3; } - -.ct-series-g .ct-slice-pie, .ct-series-g .ct-area { - fill: #0544d3; } - -.ct-series-h .ct-point, .ct-series-h .ct-line, .ct-series-h .ct-bar, .ct-series-h .ct-slice-donut { - stroke: #6b0392; } - -.ct-series-h .ct-slice-pie, .ct-series-h .ct-area { - fill: #6b0392; } - -.ct-series-i .ct-point, .ct-series-i .ct-line, .ct-series-i .ct-bar, .ct-series-i .ct-slice-donut { - stroke: #f05b4f; } - -.ct-series-i .ct-slice-pie, .ct-series-i .ct-area { - fill: #f05b4f; } - -.ct-series-j .ct-point, .ct-series-j .ct-line, .ct-series-j .ct-bar, .ct-series-j .ct-slice-donut { - stroke: #dda458; } - -.ct-series-j .ct-slice-pie, .ct-series-j .ct-area { - fill: #dda458; } - -.ct-series-k .ct-point, .ct-series-k .ct-line, .ct-series-k .ct-bar, .ct-series-k .ct-slice-donut { - stroke: #eacf7d; } - -.ct-series-k .ct-slice-pie, .ct-series-k .ct-area { - fill: #eacf7d; } - -.ct-series-l .ct-point, .ct-series-l .ct-line, .ct-series-l .ct-bar, .ct-series-l .ct-slice-donut { - stroke: #86797d; } - -.ct-series-l .ct-slice-pie, .ct-series-l .ct-area { - fill: #86797d; } - -.ct-series-m .ct-point, .ct-series-m .ct-line, .ct-series-m .ct-bar, .ct-series-m .ct-slice-donut { - stroke: #b2c326; } - -.ct-series-m .ct-slice-pie, .ct-series-m .ct-area { - fill: #b2c326; } - -.ct-series-n .ct-point, .ct-series-n .ct-line, .ct-series-n .ct-bar, .ct-series-n .ct-slice-donut { - stroke: #6188e2; } - -.ct-series-n .ct-slice-pie, .ct-series-n .ct-area { - fill: #6188e2; } - -.ct-series-o .ct-point, .ct-series-o .ct-line, .ct-series-o .ct-bar, .ct-series-o .ct-slice-donut { - stroke: #a748ca; } - -.ct-series-o .ct-slice-pie, .ct-series-o .ct-area { - fill: #a748ca; } - -.ct-square { - display: block; - position: relative; - width: 100%; } - .ct-square:before { - display: block; - float: left; - content: ""; - width: 0; - height: 0; - padding-bottom: 100%; } - .ct-square:after { - content: ""; - display: table; - clear: both; } - .ct-square > svg { - display: block; - position: absolute; - top: 0; - left: 0; } - -.ct-minor-second { - display: block; - position: relative; - width: 100%; } - .ct-minor-second:before { - display: block; - float: left; - content: ""; - width: 0; - height: 0; - padding-bottom: 93.75%; } - .ct-minor-second:after { - content: ""; - display: table; - clear: both; } - .ct-minor-second > svg { - display: block; - position: absolute; - top: 0; - left: 0; } - -.ct-major-second { - display: block; - position: relative; - width: 100%; } - .ct-major-second:before { - display: block; - float: left; - content: ""; - width: 0; - height: 0; - padding-bottom: 88.88889%; } - .ct-major-second:after { - content: ""; - display: table; - clear: both; } - .ct-major-second > svg { - display: block; - position: absolute; - top: 0; - left: 0; } - -.ct-minor-third { - display: block; - position: relative; - width: 100%; } - .ct-minor-third:before { - display: block; - float: left; - content: ""; - width: 0; - height: 0; - padding-bottom: 83.33333%; } - .ct-minor-third:after { - content: ""; - display: table; - clear: both; } - .ct-minor-third > svg { - display: block; - position: absolute; - top: 0; - left: 0; } - -.ct-major-third { - display: block; - position: relative; - width: 100%; } - .ct-major-third:before { - display: block; - float: left; - content: ""; - width: 0; - height: 0; - padding-bottom: 80%; } - .ct-major-third:after { - content: ""; - display: table; - clear: both; } - .ct-major-third > svg { - display: block; - position: absolute; - top: 0; - left: 0; } - -.ct-perfect-fourth { - display: block; - position: relative; - width: 100%; } - .ct-perfect-fourth:before { - display: block; - float: left; - content: ""; - width: 0; - height: 0; - padding-bottom: 75%; } - .ct-perfect-fourth:after { - content: ""; - display: table; - clear: both; } - .ct-perfect-fourth > svg { - display: block; - position: absolute; - top: 0; - left: 0; } - -.ct-perfect-fifth { - display: block; - position: relative; - width: 100%; } - .ct-perfect-fifth:before { - display: block; - float: left; - content: ""; - width: 0; - height: 0; - padding-bottom: 66.66667%; } - .ct-perfect-fifth:after { - content: ""; - display: table; - clear: both; } - .ct-perfect-fifth > svg { - display: block; - position: absolute; - top: 0; - left: 0; } - -.ct-minor-sixth { - display: block; - position: relative; - width: 100%; } - .ct-minor-sixth:before { - display: block; - float: left; - content: ""; - width: 0; - height: 0; - padding-bottom: 62.5%; } - .ct-minor-sixth:after { - content: ""; - display: table; - clear: both; } - .ct-minor-sixth > svg { - display: block; - position: absolute; - top: 0; - left: 0; } - -.ct-golden-section { - display: block; - position: relative; - width: 100%; } - .ct-golden-section:before { - display: block; - float: left; - content: ""; - width: 0; - height: 0; - padding-bottom: 61.8047%; } - .ct-golden-section:after { - content: ""; - display: table; - clear: both; } - .ct-golden-section > svg { - display: block; - position: absolute; - top: 0; - left: 0; } - -.ct-major-sixth { - display: block; - position: relative; - width: 100%; } - .ct-major-sixth:before { - display: block; - float: left; - content: ""; - width: 0; - height: 0; - padding-bottom: 60%; } - .ct-major-sixth:after { - content: ""; - display: table; - clear: both; } - .ct-major-sixth > svg { - display: block; - position: absolute; - top: 0; - left: 0; } - -.ct-minor-seventh { - display: block; - position: relative; - width: 100%; } - .ct-minor-seventh:before { - display: block; - float: left; - content: ""; - width: 0; - height: 0; - padding-bottom: 56.25%; } - .ct-minor-seventh:after { - content: ""; - display: table; - clear: both; } - .ct-minor-seventh > svg { - display: block; - position: absolute; - top: 0; - left: 0; } - -.ct-major-seventh { - display: block; - position: relative; - width: 100%; } - .ct-major-seventh:before { - display: block; - float: left; - content: ""; - width: 0; - height: 0; - padding-bottom: 53.33333%; } - .ct-major-seventh:after { - content: ""; - display: table; - clear: both; } - .ct-major-seventh > svg { - display: block; - position: absolute; - top: 0; - left: 0; } - -.ct-octave { - display: block; - position: relative; - width: 100%; } - .ct-octave:before { - display: block; - float: left; - content: ""; - width: 0; - height: 0; - padding-bottom: 50%; } - .ct-octave:after { - content: ""; - display: table; - clear: both; } - .ct-octave > svg { - display: block; - position: absolute; - top: 0; - left: 0; } - -.ct-major-tenth { - display: block; - position: relative; - width: 100%; } - .ct-major-tenth:before { - display: block; - float: left; - content: ""; - width: 0; - height: 0; - padding-bottom: 40%; } - .ct-major-tenth:after { - content: ""; - display: table; - clear: both; } - .ct-major-tenth > svg { - display: block; - position: absolute; - top: 0; - left: 0; } - -.ct-major-eleventh { - display: block; - position: relative; - width: 100%; } - .ct-major-eleventh:before { - display: block; - float: left; - content: ""; - width: 0; - height: 0; - padding-bottom: 37.5%; } - .ct-major-eleventh:after { - content: ""; - display: table; - clear: both; } - .ct-major-eleventh > svg { - display: block; - position: absolute; - top: 0; - left: 0; } - -.ct-major-twelfth { - display: block; - position: relative; - width: 100%; } - .ct-major-twelfth:before { - display: block; - float: left; - content: ""; - width: 0; - height: 0; - padding-bottom: 33.33333%; } - .ct-major-twelfth:after { - content: ""; - display: table; - clear: both; } - .ct-major-twelfth > svg { - display: block; - position: absolute; - top: 0; - left: 0; } - -.ct-double-octave { - display: block; - position: relative; - width: 100%; } - .ct-double-octave:before { - display: block; - float: left; - content: ""; - width: 0; - height: 0; - padding-bottom: 25%; } - .ct-double-octave:after { - content: ""; - display: table; - clear: both; } - .ct-double-octave > svg { - display: block; - position: absolute; - top: 0; - left: 0; } -/*# sourceMappingURL=chartist.css.map */ \ No newline at end of file diff --git a/dist/chartist.css.map b/dist/chartist.css.map deleted file mode 100644 index 6a838f9b..00000000 --- a/dist/chartist.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["src/styles/chartist.scss","src/styles/settings/_chartist-settings.scss"],"names":[],"mappings":"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","file":"chartist.css"} \ No newline at end of file diff --git a/dist/chartist.min.css b/dist/chartist.min.css deleted file mode 100644 index e7f3e339..00000000 --- a/dist/chartist.min.css +++ /dev/null @@ -1,2 +0,0 @@ -.ct-label{fill:rgba(0,0,0,.4);color:rgba(0,0,0,.4);font-size:.75rem;line-height:1}.ct-chart-bar .ct-label,.ct-chart-line .ct-label{display:block;display:flex}.ct-chart-donut .ct-label,.ct-chart-pie .ct-label{dominant-baseline:central}.ct-label.ct-horizontal.ct-start{text-anchor:start;align-items:flex-end;justify-content:flex-start;text-align:left}.ct-label.ct-horizontal.ct-end{text-anchor:start;align-items:flex-start;justify-content:flex-start;text-align:left}.ct-label.ct-vertical.ct-start{text-anchor:end;align-items:flex-end;justify-content:flex-end;text-align:right}.ct-label.ct-vertical.ct-end{text-anchor:start;align-items:flex-end;justify-content:flex-start;text-align:left}.ct-chart-bar .ct-label.ct-horizontal.ct-start{text-anchor:start;align-items:flex-end;justify-content:center;text-align:center}.ct-chart-bar .ct-label.ct-horizontal.ct-end{text-anchor:start;align-items:flex-start;justify-content:center;text-align:center}.ct-chart-bar.ct-horizontal-bars .ct-label.ct-horizontal.ct-start{text-anchor:start;align-items:flex-end;justify-content:flex-start;text-align:left}.ct-chart-bar.ct-horizontal-bars .ct-label.ct-horizontal.ct-end{text-anchor:start;align-items:flex-start;justify-content:flex-start;text-align:left}.ct-chart-bar.ct-horizontal-bars .ct-label.ct-vertical.ct-start{text-anchor:end;align-items:center;justify-content:flex-end;text-align:right}.ct-chart-bar.ct-horizontal-bars .ct-label.ct-vertical.ct-end{text-anchor:end;align-items:center;justify-content:flex-start;text-align:left}.ct-grid{stroke:rgba(0,0,0,.2);stroke-width:1px;stroke-dasharray:2px}.ct-grid-background{fill:none}.ct-point{stroke-width:10px;stroke-linecap:round}.ct-line{fill:none;stroke-width:4px}.ct-area{stroke:none;fill-opacity:.1}.ct-bar{fill:none;stroke-width:10px}.ct-slice-donut{fill:none;stroke-width:60px}.ct-series-a .ct-bar,.ct-series-a .ct-line,.ct-series-a .ct-point,.ct-series-a .ct-slice-donut{stroke:#d70206}.ct-series-a .ct-area,.ct-series-a .ct-slice-pie{fill:#d70206}.ct-series-b .ct-bar,.ct-series-b .ct-line,.ct-series-b .ct-point,.ct-series-b .ct-slice-donut{stroke:#f05b4f}.ct-series-b .ct-area,.ct-series-b .ct-slice-pie{fill:#f05b4f}.ct-series-c .ct-bar,.ct-series-c .ct-line,.ct-series-c .ct-point,.ct-series-c .ct-slice-donut{stroke:#f4c63d}.ct-series-c .ct-area,.ct-series-c .ct-slice-pie{fill:#f4c63d}.ct-series-d .ct-bar,.ct-series-d .ct-line,.ct-series-d .ct-point,.ct-series-d .ct-slice-donut{stroke:#d17905}.ct-series-d .ct-area,.ct-series-d .ct-slice-pie{fill:#d17905}.ct-series-e .ct-bar,.ct-series-e .ct-line,.ct-series-e .ct-point,.ct-series-e .ct-slice-donut{stroke:#453d3f}.ct-series-e .ct-area,.ct-series-e .ct-slice-pie{fill:#453d3f}.ct-series-f .ct-bar,.ct-series-f .ct-line,.ct-series-f .ct-point,.ct-series-f .ct-slice-donut{stroke:#59922b}.ct-series-f .ct-area,.ct-series-f .ct-slice-pie{fill:#59922b}.ct-series-g .ct-bar,.ct-series-g .ct-line,.ct-series-g .ct-point,.ct-series-g .ct-slice-donut{stroke:#0544d3}.ct-series-g .ct-area,.ct-series-g .ct-slice-pie{fill:#0544d3}.ct-series-h .ct-bar,.ct-series-h .ct-line,.ct-series-h .ct-point,.ct-series-h .ct-slice-donut{stroke:#6b0392}.ct-series-h .ct-area,.ct-series-h .ct-slice-pie{fill:#6b0392}.ct-series-i .ct-bar,.ct-series-i .ct-line,.ct-series-i .ct-point,.ct-series-i .ct-slice-donut{stroke:#f05b4f}.ct-series-i .ct-area,.ct-series-i .ct-slice-pie{fill:#f05b4f}.ct-series-j .ct-bar,.ct-series-j .ct-line,.ct-series-j .ct-point,.ct-series-j .ct-slice-donut{stroke:#dda458}.ct-series-j .ct-area,.ct-series-j .ct-slice-pie{fill:#dda458}.ct-series-k .ct-bar,.ct-series-k .ct-line,.ct-series-k .ct-point,.ct-series-k .ct-slice-donut{stroke:#eacf7d}.ct-series-k .ct-area,.ct-series-k .ct-slice-pie{fill:#eacf7d}.ct-series-l .ct-bar,.ct-series-l .ct-line,.ct-series-l .ct-point,.ct-series-l .ct-slice-donut{stroke:#86797d}.ct-series-l .ct-area,.ct-series-l .ct-slice-pie{fill:#86797d}.ct-series-m .ct-bar,.ct-series-m .ct-line,.ct-series-m .ct-point,.ct-series-m .ct-slice-donut{stroke:#b2c326}.ct-series-m .ct-area,.ct-series-m .ct-slice-pie{fill:#b2c326}.ct-series-n .ct-bar,.ct-series-n .ct-line,.ct-series-n .ct-point,.ct-series-n .ct-slice-donut{stroke:#6188e2}.ct-series-n .ct-area,.ct-series-n .ct-slice-pie{fill:#6188e2}.ct-series-o .ct-bar,.ct-series-o .ct-line,.ct-series-o .ct-point,.ct-series-o .ct-slice-donut{stroke:#a748ca}.ct-series-o .ct-area,.ct-series-o .ct-slice-pie{fill:#a748ca}.ct-square{display:block;position:relative;width:100%}.ct-square:before{content:"";display:block;float:left;height:0;padding-bottom:100%;width:0}.ct-square:after{clear:both;content:"";display:table}.ct-square>svg{display:block;left:0;position:absolute;top:0}.ct-minor-second{display:block;position:relative;width:100%}.ct-minor-second:before{content:"";display:block;float:left;height:0;padding-bottom:93.75%;width:0}.ct-minor-second:after{clear:both;content:"";display:table}.ct-minor-second>svg{display:block;left:0;position:absolute;top:0}.ct-major-second{display:block;position:relative;width:100%}.ct-major-second:before{content:"";display:block;float:left;height:0;padding-bottom:88.88889%;width:0}.ct-major-second:after{clear:both;content:"";display:table}.ct-major-second>svg{display:block;left:0;position:absolute;top:0}.ct-minor-third{display:block;position:relative;width:100%}.ct-minor-third:before{content:"";display:block;float:left;height:0;padding-bottom:83.33333%;width:0}.ct-minor-third:after{clear:both;content:"";display:table}.ct-minor-third>svg{display:block;left:0;position:absolute;top:0}.ct-major-third{display:block;position:relative;width:100%}.ct-major-third:before{content:"";display:block;float:left;height:0;padding-bottom:80%;width:0}.ct-major-third:after{clear:both;content:"";display:table}.ct-major-third>svg{display:block;left:0;position:absolute;top:0}.ct-perfect-fourth{display:block;position:relative;width:100%}.ct-perfect-fourth:before{content:"";display:block;float:left;height:0;padding-bottom:75%;width:0}.ct-perfect-fourth:after{clear:both;content:"";display:table}.ct-perfect-fourth>svg{display:block;left:0;position:absolute;top:0}.ct-perfect-fifth{display:block;position:relative;width:100%}.ct-perfect-fifth:before{content:"";display:block;float:left;height:0;padding-bottom:66.66667%;width:0}.ct-perfect-fifth:after{clear:both;content:"";display:table}.ct-perfect-fifth>svg{display:block;left:0;position:absolute;top:0}.ct-minor-sixth{display:block;position:relative;width:100%}.ct-minor-sixth:before{content:"";display:block;float:left;height:0;padding-bottom:62.5%;width:0}.ct-minor-sixth:after{clear:both;content:"";display:table}.ct-minor-sixth>svg{display:block;left:0;position:absolute;top:0}.ct-golden-section{display:block;position:relative;width:100%}.ct-golden-section:before{content:"";display:block;float:left;height:0;padding-bottom:61.8047%;width:0}.ct-golden-section:after{clear:both;content:"";display:table}.ct-golden-section>svg{display:block;left:0;position:absolute;top:0}.ct-major-sixth{display:block;position:relative;width:100%}.ct-major-sixth:before{content:"";display:block;float:left;height:0;padding-bottom:60%;width:0}.ct-major-sixth:after{clear:both;content:"";display:table}.ct-major-sixth>svg{display:block;left:0;position:absolute;top:0}.ct-minor-seventh{display:block;position:relative;width:100%}.ct-minor-seventh:before{content:"";display:block;float:left;height:0;padding-bottom:56.25%;width:0}.ct-minor-seventh:after{clear:both;content:"";display:table}.ct-minor-seventh>svg{display:block;left:0;position:absolute;top:0}.ct-major-seventh{display:block;position:relative;width:100%}.ct-major-seventh:before{content:"";display:block;float:left;height:0;padding-bottom:53.33333%;width:0}.ct-major-seventh:after{clear:both;content:"";display:table}.ct-major-seventh>svg{display:block;left:0;position:absolute;top:0}.ct-octave{display:block;position:relative;width:100%}.ct-octave:before{content:"";display:block;float:left;height:0;padding-bottom:50%;width:0}.ct-octave:after{clear:both;content:"";display:table}.ct-octave>svg{display:block;left:0;position:absolute;top:0}.ct-major-tenth{display:block;position:relative;width:100%}.ct-major-tenth:before{content:"";display:block;float:left;height:0;padding-bottom:40%;width:0}.ct-major-tenth:after{clear:both;content:"";display:table}.ct-major-tenth>svg{display:block;left:0;position:absolute;top:0}.ct-major-eleventh{display:block;position:relative;width:100%}.ct-major-eleventh:before{content:"";display:block;float:left;height:0;padding-bottom:37.5%;width:0}.ct-major-eleventh:after{clear:both;content:"";display:table}.ct-major-eleventh>svg{display:block;left:0;position:absolute;top:0}.ct-major-twelfth{display:block;position:relative;width:100%}.ct-major-twelfth:before{content:"";display:block;float:left;height:0;padding-bottom:33.33333%;width:0}.ct-major-twelfth:after{clear:both;content:"";display:table}.ct-major-twelfth>svg{display:block;left:0;position:absolute;top:0}.ct-double-octave{display:block;position:relative;width:100%}.ct-double-octave:before{content:"";display:block;float:left;height:0;padding-bottom:25%;width:0}.ct-double-octave:after{clear:both;content:"";display:table}.ct-double-octave>svg{display:block;left:0;position:absolute;top:0} -/*# sourceMappingURL=chartist.min.css.map */ \ No newline at end of file diff --git a/dist/chartist.min.css.map b/dist/chartist.min.css.map deleted file mode 100644 index 805445ad..00000000 --- a/dist/chartist.min.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["src/styles/chartist.scss","src/styles/settings/_chartist-settings.scss"],"names":[],"mappings":"AAoHE,UAxDA,mBC9BgC,CD+BhC,oBC/BgC,CDgChC,gBC/BoB,CDgCpB,aC7BqB,CDsFrB,iDArEA,aAAc,CAKd,YAAa,CAqEb,kDAEE,yBAA0B,CAG5B,iCAGE,iBAAkB,CAnGpB,oBAiGoC,CA7FpC,0BA6FgD,CA1F9C,eA4FkB,CAGpB,+BAGE,iBAAkB,CAzGpB,sBAuGsC,CAnGtC,0BAmGkD,CAhGhD,eAkGkB,CAGpB,+BAGE,eAAgB,CA/GlB,oBA6GoC,CAzGpC,wBAyG8C,CApG5C,gBAsGgB,CAGlB,6BAGE,iBAAkB,CArHpB,oBAmHoC,CA/GpC,0BA+GgD,CA5G9C,eA8GkB,CAGpB,+CAGE,iBAAkB,CA3HpB,oBAyHoC,CArHpC,sBAqH4C,CA9G1C,iBAgHkB,CAGpB,6CAGE,iBAAkB,CAjIpB,sBA+HsC,CA3HtC,sBA2H8C,CApH5C,iBAsHkB,CAGpB,kEAGE,iBAAkB,CAvIpB,oBAqIoC,CAjIpC,0BAiIgD,CA9H9C,eAgIkB,CAGpB,gEAGE,iBAAkB,CA7IpB,sBA2IsC,CAvItC,0BAuIkD,CApIhD,eAsIkB,CAGpB,gEAIE,eAAgB,CApJlB,kBAkJkC,CA9IlC,wBA8I4C,CAzI1C,gBA2IgB,CAGlB,8DAGE,eAAgB,CA1JlB,kBAwJkC,CApJlC,0BAoJ8C,CAjJ5C,eAmJgB,CAGlB,SA5HA,qBC9BgC,CD+BhC,gBC7BiB,CDgCf,oBCjCmB,CD6JrB,oBACE,SC5J0B,CD+J5B,UA3HA,iBC/BkB,CDgClB,oBC9BoB,CD4JpB,SA1HA,SAAU,CACV,gBCvCiB,CDoKjB,SArHA,WAAY,CACZ,eC1CmB,CDkKnB,QApHA,SAAU,CACV,iBC5CiB,CDmKjB,gBAnHA,SAAU,CACV,iBC9CmB,CDkDnB,+FACE,cCnCK,CDsCP,iDACE,YCvCK,CDkCP,+FACE,cClCK,CDqCP,iDACE,YCtCK,CDiCP,+FACE,cCjCK,CDoCP,iDACE,YCrCK,CDgCP,+FACE,cChCK,CDmCP,iDACE,YCpCK,CD+BP,+FACE,cC/BK,CDkCP,iDACE,YCnCK,CD8BP,+FACE,cC9BK,CDiCP,iDACE,YClCK,CD6BP,+FACE,cC7BK,CDgCP,iDACE,YCjCK,CD4BP,+FACE,cC5BK,CD+BP,iDACE,YChCK,CD2BP,+FACE,cC3BK,CD8BP,iDACE,YC/BK,CD0BP,+FACE,cC1BK,CD6BP,iDACE,YC9BK,CDyBP,+FACE,cCzBK,CD4BP,iDACE,YC7BK,CDwBP,+FACE,cCxBK,CD2BP,iDACE,YC5BK,CDuBP,+FACE,cCvBK,CD0BP,iDACE,YC3BK,CDsBP,+FACE,cCtBK,CDyBP,iDACE,YC1BK,CDqBP,+FACE,cCrBK,CDwBP,iDACE,YCzBK,CDsJH,WAxOJ,aAAc,CACd,iBAAkB,CAClB,UAH6C,CAK7C,kBAGE,UAAW,CAFX,aAAc,CACd,UAAW,CAGX,QAAS,CACT,mBAA6B,CAF7B,OAE6B,CAG/B,iBAGE,UAAW,CAFX,UAAW,CACX,aACW,CAGb,eACE,aAAc,CAGd,MAAO,CAFP,iBAAkB,CAClB,KACO,CAiNL,iBAxOJ,aAAc,CACd,iBAAkB,CAClB,UAH6C,CAK7C,wBAGE,UAAW,CAFX,aAAc,CACd,UAAW,CAGX,QAAS,CACT,qBAA6B,CAF7B,OAE6B,CAG/B,uBAGE,UAAW,CAFX,UAAW,CACX,aACW,CAGb,qBACE,aAAc,CAGd,MAAO,CAFP,iBAAkB,CAClB,KACO,CAiNL,iBAxOJ,aAAc,CACd,iBAAkB,CAClB,UAH6C,CAK7C,wBAGE,UAAW,CAFX,aAAc,CACd,UAAW,CAGX,QAAS,CACT,wBAA6B,CAF7B,OAE6B,CAG/B,uBAGE,UAAW,CAFX,UAAW,CACX,aACW,CAGb,qBACE,aAAc,CAGd,MAAO,CAFP,iBAAkB,CAClB,KACO,CAiNL,gBAxOJ,aAAc,CACd,iBAAkB,CAClB,UAH6C,CAK7C,uBAGE,UAAW,CAFX,aAAc,CACd,UAAW,CAGX,QAAS,CACT,wBAA6B,CAF7B,OAE6B,CAG/B,sBAGE,UAAW,CAFX,UAAW,CACX,aACW,CAGb,oBACE,aAAc,CAGd,MAAO,CAFP,iBAAkB,CAClB,KACO,CAiNL,gBAxOJ,aAAc,CACd,iBAAkB,CAClB,UAH6C,CAK7C,uBAGE,UAAW,CAFX,aAAc,CACd,UAAW,CAGX,QAAS,CACT,kBAA6B,CAF7B,OAE6B,CAG/B,sBAGE,UAAW,CAFX,UAAW,CACX,aACW,CAGb,oBACE,aAAc,CAGd,MAAO,CAFP,iBAAkB,CAClB,KACO,CAiNL,mBAxOJ,aAAc,CACd,iBAAkB,CAClB,UAH6C,CAK7C,0BAGE,UAAW,CAFX,aAAc,CACd,UAAW,CAGX,QAAS,CACT,kBAA6B,CAF7B,OAE6B,CAG/B,yBAGE,UAAW,CAFX,UAAW,CACX,aACW,CAGb,uBACE,aAAc,CAGd,MAAO,CAFP,iBAAkB,CAClB,KACO,CAiNL,kBAxOJ,aAAc,CACd,iBAAkB,CAClB,UAH6C,CAK7C,yBAGE,UAAW,CAFX,aAAc,CACd,UAAW,CAGX,QAAS,CACT,wBAA6B,CAF7B,OAE6B,CAG/B,wBAGE,UAAW,CAFX,UAAW,CACX,aACW,CAGb,sBACE,aAAc,CAGd,MAAO,CAFP,iBAAkB,CAClB,KACO,CAiNL,gBAxOJ,aAAc,CACd,iBAAkB,CAClB,UAH6C,CAK7C,uBAGE,UAAW,CAFX,aAAc,CACd,UAAW,CAGX,QAAS,CACT,oBAA6B,CAF7B,OAE6B,CAG/B,sBAGE,UAAW,CAFX,UAAW,CACX,aACW,CAGb,oBACE,aAAc,CAGd,MAAO,CAFP,iBAAkB,CAClB,KACO,CAiNL,mBAxOJ,aAAc,CACd,iBAAkB,CAClB,UAH6C,CAK7C,0BAGE,UAAW,CAFX,aAAc,CACd,UAAW,CAGX,QAAS,CACT,uBAA6B,CAF7B,OAE6B,CAG/B,yBAGE,UAAW,CAFX,UAAW,CACX,aACW,CAGb,uBACE,aAAc,CAGd,MAAO,CAFP,iBAAkB,CAClB,KACO,CAiNL,gBAxOJ,aAAc,CACd,iBAAkB,CAClB,UAH6C,CAK7C,uBAGE,UAAW,CAFX,aAAc,CACd,UAAW,CAGX,QAAS,CACT,kBAA6B,CAF7B,OAE6B,CAG/B,sBAGE,UAAW,CAFX,UAAW,CACX,aACW,CAGb,oBACE,aAAc,CAGd,MAAO,CAFP,iBAAkB,CAClB,KACO,CAiNL,kBAxOJ,aAAc,CACd,iBAAkB,CAClB,UAH6C,CAK7C,yBAGE,UAAW,CAFX,aAAc,CACd,UAAW,CAGX,QAAS,CACT,qBAA6B,CAF7B,OAE6B,CAG/B,wBAGE,UAAW,CAFX,UAAW,CACX,aACW,CAGb,sBACE,aAAc,CAGd,MAAO,CAFP,iBAAkB,CAClB,KACO,CAiNL,kBAxOJ,aAAc,CACd,iBAAkB,CAClB,UAH6C,CAK7C,yBAGE,UAAW,CAFX,aAAc,CACd,UAAW,CAGX,QAAS,CACT,wBAA6B,CAF7B,OAE6B,CAG/B,wBAGE,UAAW,CAFX,UAAW,CACX,aACW,CAGb,sBACE,aAAc,CAGd,MAAO,CAFP,iBAAkB,CAClB,KACO,CAiNL,WAxOJ,aAAc,CACd,iBAAkB,CAClB,UAH6C,CAK7C,kBAGE,UAAW,CAFX,aAAc,CACd,UAAW,CAGX,QAAS,CACT,kBAA6B,CAF7B,OAE6B,CAG/B,iBAGE,UAAW,CAFX,UAAW,CACX,aACW,CAGb,eACE,aAAc,CAGd,MAAO,CAFP,iBAAkB,CAClB,KACO,CAiNL,gBAxOJ,aAAc,CACd,iBAAkB,CAClB,UAH6C,CAK7C,uBAGE,UAAW,CAFX,aAAc,CACd,UAAW,CAGX,QAAS,CACT,kBAA6B,CAF7B,OAE6B,CAG/B,sBAGE,UAAW,CAFX,UAAW,CACX,aACW,CAGb,oBACE,aAAc,CAGd,MAAO,CAFP,iBAAkB,CAClB,KACO,CAiNL,mBAxOJ,aAAc,CACd,iBAAkB,CAClB,UAH6C,CAK7C,0BAGE,UAAW,CAFX,aAAc,CACd,UAAW,CAGX,QAAS,CACT,oBAA6B,CAF7B,OAE6B,CAG/B,yBAGE,UAAW,CAFX,UAAW,CACX,aACW,CAGb,uBACE,aAAc,CAGd,MAAO,CAFP,iBAAkB,CAClB,KACO,CAiNL,kBAxOJ,aAAc,CACd,iBAAkB,CAClB,UAH6C,CAK7C,yBAGE,UAAW,CAFX,aAAc,CACd,UAAW,CAGX,QAAS,CACT,wBAA6B,CAF7B,OAE6B,CAG/B,wBAGE,UAAW,CAFX,UAAW,CACX,aACW,CAGb,sBACE,aAAc,CAGd,MAAO,CAFP,iBAAkB,CAClB,KACO,CAiNL,kBAxOJ,aAAc,CACd,iBAAkB,CAClB,UAH6C,CAK7C,yBAGE,UAAW,CAFX,aAAc,CACd,UAAW,CAGX,QAAS,CACT,kBAA6B,CAF7B,OAE6B,CAG/B,wBAGE,UAAW,CAFX,UAAW,CACX,aACW,CAGb,sBACE,aAAc,CAGd,MAAO,CAFP,iBAAkB,CAClB,KACO","file":"chartist.min.css"} \ No newline at end of file diff --git a/jest.config.json b/jest.config.json new file mode 100644 index 00000000..400fa54f --- /dev/null +++ b/jest.config.json @@ -0,0 +1,24 @@ +{ + "testEnvironment": "jsdom", + "testRegex": "(test|src)/.*\\.spec\\.(jsx?|tsx?)$", + "setupFilesAfterEnv": ["/test/setup.js"], + "transform": { + "^.+\\.(t|j)sx?$": ["@swc/jest", { + "env": { + "targets": { + "node": 14 + } + } + }] + }, + "collectCoverage": true, + "collectCoverageFrom": [ + "src/**/*.{js,jsx,ts,tsx}", + "!**/node_modules/**", + "!**/*.stories.*" + ], + "coverageReporters": [ + "lcovonly", + "text" + ] +} diff --git a/karma.ci.config.js b/karma.ci.config.js deleted file mode 100644 index e08d40b8..00000000 --- a/karma.ci.config.js +++ /dev/null @@ -1,28 +0,0 @@ -module.exports = function(config) { - config.set({ - basePath: './', - frameworks: ['jasmine', 'jspm'], - autoWatch: false, - singleRun: true, - browsers: ['PhantomJS'], - files: [ - 'node_modules/core-js/client/shim.min.js', - { pattern: 'src/**/*.+(js|html)', included: false }, - { pattern: 'tooling/**/*.js', included: false }, - { pattern: 'package.json', included: false }, - { pattern: 'jspm_packages/system-polyfills.js', included: false }, - 'dist/chartist.min.css' - ], - jspm: { - loadFiles: ['src/**/*.js'], - stripExtension: false, - config: 'jspm.config.js' - }, - proxies: { - '/jspm_packages/': '/base/jspm_packages/', - '/src/': '/base/src/', - '/tooling/': '/base/tooling/', - '/package.json': '/base/package.json' - } - }); -}; diff --git a/karma.watch.config.js b/karma.watch.config.js deleted file mode 100644 index 9d42a362..00000000 --- a/karma.watch.config.js +++ /dev/null @@ -1,28 +0,0 @@ -module.exports = function(config) { - config.set({ - basePath: './', - frameworks: ['jasmine', 'jspm'], - autoWatch: true, - browsers: ['PhantomJS'], - reporters: ['nyan'], - files: [ - 'node_modules/core-js/client/shim.min.js', - { pattern: 'src/**/*.+(js|html)', included: false }, - { pattern: 'tooling/**/*.js', included: false }, - { pattern: 'package.json', included: false }, - { pattern: 'jspm_packages/system-polyfills.js', included: false }, - 'dist/chartist.min.css' - ], - jspm: { - loadFiles: ['src/**/*.js'], - stripExtension: false, - config: 'jspm.config.js' - }, - proxies: { - '/jspm_packages/': '/base/jspm_packages/', - '/src/': '/base/src/', - '/tooling/': '/base/tooling/', - '/package.json': '/base/package.json' - } - }); -}; diff --git a/package.json b/package.json index d623b1a0..21a16266 100644 --- a/package.json +++ b/package.json @@ -54,8 +54,8 @@ "build": "rollup -c & pnpm build:styles", "start:storybook": "start-storybook -p 6006 --ci", "build:storybook": "del ./storybook-static; NODE_ENV=production build-storybook", - "test": "karma start karma.ci.config.js", - "test-watch": "karma start karma.watch.config.js", + "test:unit": "jest -c jest.config.json", + "test": "pnpm test:unit", "lint": "eslint src", "commit": "cz", "updateGitHooks": "simple-git-hooks" @@ -73,6 +73,8 @@ "@storybook/preset-scss": "^1.0.3", "@swc/core": "^1.2.165", "@swc/helpers": "^0.3.8", + "@swc/jest": "^0.2.20", + "@testing-library/jest-dom": "^5.16.4", "autoprefixer": "^10.4.4", "babel-eslint": "^7.1.0", "babel-loader": "^8.2.4", @@ -81,19 +83,11 @@ "commitizen": "^4.2.4", "css-loader": "^5.0.0", "cssnano": "^5.1.7", - "debounce": "^1.2.1", "del-cli": "^4.0.1", "eslint": "^8.12.0", "fs-promise": "^0.5.0", "inquirer": "^8.0.0", - "interpolate": "^0.1.0", - "jasmine-core": "^4.0.1", - "jspm": "beta", - "karma": "^6.3.17", - "karma-jasmine": "^4.0.2", - "karma-jspm": "^2.2.3", - "karma-nyan-reporter": "^0.2.5", - "karma-phantomjs-launcher": "^1.0.4", + "jest": "^27.5.1", "node-sass": "^7.0.1", "postcss": "^8.4.12", "rollup": "^2.70.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a9110cfc..5d67845a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,6 +13,8 @@ specifiers: '@storybook/preset-scss': ^1.0.3 '@swc/core': ^1.2.165 '@swc/helpers': ^0.3.8 + '@swc/jest': ^0.2.20 + '@testing-library/jest-dom': ^5.16.4 autoprefixer: ^10.4.4 babel-eslint: ^7.1.0 babel-loader: ^8.2.4 @@ -21,19 +23,11 @@ specifiers: commitizen: ^4.2.4 css-loader: ^5.0.0 cssnano: ^5.1.7 - debounce: ^1.2.1 del-cli: ^4.0.1 eslint: ^8.12.0 fs-promise: ^0.5.0 inquirer: ^8.0.0 - interpolate: ^0.1.0 - jasmine-core: ^4.0.1 - jspm: beta - karma: ^6.3.17 - karma-jasmine: ^4.0.2 - karma-jspm: ^2.2.3 - karma-nyan-reporter: ^0.2.5 - karma-phantomjs-launcher: ^1.0.4 + jest: ^27.5.1 node-sass: ^7.0.1 postcss: ^8.4.12 rollup: ^2.70.1 @@ -56,6 +50,8 @@ devDependencies: '@storybook/preset-scss': 1.0.3_98fb4723ddb8cb1321f7deacb3be93bc '@swc/core': 1.2.165 '@swc/helpers': 0.3.8 + '@swc/jest': 0.2.20_@swc+core@1.2.165 + '@testing-library/jest-dom': 5.16.4 autoprefixer: 10.4.4_postcss@8.4.12 babel-eslint: 7.2.3 babel-loader: 8.2.4_@babel+core@7.17.9 @@ -64,19 +60,11 @@ devDependencies: commitizen: 4.2.4_@swc+core@1.2.165 css-loader: 5.2.7 cssnano: 5.1.7_postcss@8.4.12 - debounce: 1.2.1 del-cli: 4.0.1 eslint: 8.13.0 fs-promise: 0.5.0 inquirer: 8.2.2 - interpolate: 0.1.0 - jasmine-core: 4.1.0 - jspm: 0.17.0-beta.49 - karma: 6.3.18 - karma-jasmine: 4.0.2_karma@6.3.18 - karma-jspm: 2.2.3 - karma-nyan-reporter: 0.2.5_karma@6.3.18 - karma-phantomjs-launcher: 1.0.4_karma@6.3.18 + jest: 27.5.1 node-sass: 7.0.1 postcss: 8.4.12 rollup: 2.70.1 @@ -677,6 +665,15 @@ packages: '@babel/helper-plugin-utils': 7.16.7 dev: true + /@babel/plugin-syntax-bigint/7.8.3_@babel+core@7.17.9: + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.17.9: resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: @@ -734,6 +731,15 @@ packages: '@babel/helper-plugin-utils': 7.16.7 dev: true + /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.17.9: + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.9 + '@babel/helper-plugin-utils': 7.16.7 + dev: true + /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.17.9: resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: @@ -1471,6 +1477,10 @@ packages: resolution: {integrity: sha512-4iri8i1AqYHJE2DstZYkyEprg6Pq6sKx3xn5FpySk9sNhH7qN2LLlHJCfDTZRILNwQNPD7mATWM0TBui7uC1pA==} dev: true + /@bcoe/v8-coverage/0.2.3: + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + dev: true + /@cnakazawa/watch/1.0.4: resolution: {integrity: sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==} engines: {node: '>=0.1.95'} @@ -1484,6 +1494,7 @@ packages: resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} engines: {node: '>=0.1.90'} dev: true + optional: true /@commitlint/cli/16.2.3_@swc+core@1.2.165: resolution: {integrity: sha512-VsJBQLvhhlOgEfxs/Z5liYuK0dXqLE5hz1VJzLBxiOxG31kL/X5Q4OvK292BmO7IGZcm1yJE3XQPWSiFaEHbWA==} @@ -1871,6 +1882,170 @@ packages: engines: {node: '>=8'} dev: true + /@jest/console/27.5.1: + resolution: {integrity: sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + '@types/node': 17.0.23 + chalk: 4.1.2 + jest-message-util: 27.5.1 + jest-util: 27.5.1 + slash: 3.0.0 + dev: true + + /@jest/core/27.5.1: + resolution: {integrity: sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/console': 27.5.1 + '@jest/reporters': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 17.0.23 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.8.1 + exit: 0.1.2 + graceful-fs: 4.2.10 + jest-changed-files: 27.5.1 + jest-config: 27.5.1 + jest-haste-map: 27.5.1 + jest-message-util: 27.5.1 + jest-regex-util: 27.5.1 + jest-resolve: 27.5.1 + jest-resolve-dependencies: 27.5.1 + jest-runner: 27.5.1 + jest-runtime: 27.5.1 + jest-snapshot: 27.5.1 + jest-util: 27.5.1 + jest-validate: 27.5.1 + jest-watcher: 27.5.1 + micromatch: 4.0.5 + rimraf: 3.0.2 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + dev: true + + /@jest/create-cache-key-function/27.5.1: + resolution: {integrity: sha512-dmH1yW+makpTSURTy8VzdUwFnfQh1G8R+DxO2Ho2FFmBbKFEVm+3jWdvFhE2VqB/LATCTokkP0dotjyQyw5/AQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + dev: true + + /@jest/environment/27.5.1: + resolution: {integrity: sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/fake-timers': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 17.0.23 + jest-mock: 27.5.1 + dev: true + + /@jest/fake-timers/27.5.1: + resolution: {integrity: sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + '@sinonjs/fake-timers': 8.1.0 + '@types/node': 17.0.23 + jest-message-util: 27.5.1 + jest-mock: 27.5.1 + jest-util: 27.5.1 + dev: true + + /@jest/globals/27.5.1: + resolution: {integrity: sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.5.1 + '@jest/types': 27.5.1 + expect: 27.5.1 + dev: true + + /@jest/reporters/27.5.1: + resolution: {integrity: sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 17.0.23 + chalk: 4.1.2 + collect-v8-coverage: 1.0.1 + exit: 0.1.2 + glob: 7.2.0 + graceful-fs: 4.2.10 + istanbul-lib-coverage: 3.2.0 + istanbul-lib-instrument: 5.1.0 + istanbul-lib-report: 3.0.0 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.4 + jest-haste-map: 27.5.1 + jest-resolve: 27.5.1 + jest-util: 27.5.1 + jest-worker: 27.5.1 + slash: 3.0.0 + source-map: 0.6.1 + string-length: 4.0.2 + terminal-link: 2.1.1 + v8-to-istanbul: 8.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/source-map/27.5.1: + resolution: {integrity: sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + callsites: 3.1.0 + graceful-fs: 4.2.10 + source-map: 0.6.1 + dev: true + + /@jest/test-result/27.5.1: + resolution: {integrity: sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/console': 27.5.1 + '@jest/types': 27.5.1 + '@types/istanbul-lib-coverage': 2.0.4 + collect-v8-coverage: 1.0.1 + dev: true + + /@jest/test-sequencer/27.5.1: + resolution: {integrity: sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/test-result': 27.5.1 + graceful-fs: 4.2.10 + jest-haste-map: 27.5.1 + jest-runtime: 27.5.1 + transitivePeerDependencies: + - supports-color + dev: true + /@jest/transform/26.6.2: resolution: {integrity: sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==} engines: {node: '>= 10.14.2'} @@ -1894,6 +2069,29 @@ packages: - supports-color dev: true + /@jest/transform/27.5.1: + resolution: {integrity: sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@babel/core': 7.17.9 + '@jest/types': 27.5.1 + babel-plugin-istanbul: 6.1.1 + chalk: 4.1.2 + convert-source-map: 1.8.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.10 + jest-haste-map: 27.5.1 + jest-regex-util: 27.5.1 + jest-util: 27.5.1 + micromatch: 4.0.5 + pirates: 4.0.5 + slash: 3.0.0 + source-map: 0.6.1 + write-file-atomic: 3.0.3 + transitivePeerDependencies: + - supports-color + dev: true + /@jest/types/26.6.2: resolution: {integrity: sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==} engines: {node: '>= 10.14.2'} @@ -1905,6 +2103,17 @@ packages: chalk: 4.1.2 dev: true + /@jest/types/27.5.1: + resolution: {integrity: sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@types/istanbul-lib-coverage': 2.0.4 + '@types/istanbul-reports': 3.0.1 + '@types/node': 17.0.23 + '@types/yargs': 16.0.4 + chalk: 4.1.2 + dev: true + /@jridgewell/resolve-uri/3.0.5: resolution: {integrity: sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==} engines: {node: '>=6.0.0'} @@ -2056,9 +2265,16 @@ packages: picomatch: 2.3.1 dev: true - /@socket.io/base64-arraybuffer/1.0.2: - resolution: {integrity: sha512-dOlCBKnDw4iShaIsH/bxujKTM18+2TOAsYz+KSc11Am38H4q5Xw8Bbz97ZYdrVNM+um3p7w86Bvvmcn9q+5+eQ==} - engines: {node: '>= 0.6.0'} + /@sinonjs/commons/1.8.3: + resolution: {integrity: sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==} + dependencies: + type-detect: 4.0.8 + dev: true + + /@sinonjs/fake-timers/8.1.0: + resolution: {integrity: sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==} + dependencies: + '@sinonjs/commons': 1.8.3 dev: true /@storybook/addon-actions/6.4.22: @@ -3799,6 +4015,31 @@ packages: resolution: {integrity: sha512-aWItSZvJj4+GI6FWkjZR13xPNPctq2RRakzo+O6vN7bC2yjwdg5EFpgaSAUn95b7BGSgcflvzVDPoKmJv24IOg==} dev: true + /@swc/jest/0.2.20_@swc+core@1.2.165: + resolution: {integrity: sha512-5qSUBYY1wyIMn7p0Vl9qqV4hMI69oJwZCIPUpBsTFWN2wlwn6RDugzdgCn+bLXVYh+Cxi8bJcZ1uumDgsoL+FA==} + engines: {npm: '>= 7.0.0'} + peerDependencies: + '@swc/core': '*' + dependencies: + '@jest/create-cache-key-function': 27.5.1 + '@swc/core': 1.2.165 + dev: true + + /@testing-library/jest-dom/5.16.4: + resolution: {integrity: sha512-Gy+IoFutbMQcky0k+bqqumXZ1cTGswLsFqmNLzNdSKkU9KGV2u9oXhukCbbJ9/LRPKiqwxEE8VpV/+YZlfkPUA==} + engines: {node: '>=8', npm: '>=6', yarn: '>=1'} + dependencies: + '@babel/runtime': 7.17.9 + '@types/testing-library__jest-dom': 5.14.3 + aria-query: 5.0.0 + chalk: 3.0.0 + css: 3.0.0 + css.escape: 1.5.1 + dom-accessibility-api: 0.5.13 + lodash: 4.17.21 + redent: 3.0.0 + dev: true + /@tootallnate/once/1.1.2: resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} engines: {node: '>= 6'} @@ -3825,30 +4066,43 @@ packages: resolution: {integrity: sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==} dev: true - /@types/color-convert/2.0.0: - resolution: {integrity: sha512-m7GG7IKKGuJUXvkZ1qqG3ChccdIM/qBBo913z+Xft0nKCX4hAU/IxKwZBU4cpRZ7GS5kV4vOblUkILtSShCPXQ==} + /@types/babel__core/7.1.19: + resolution: {integrity: sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==} dependencies: - '@types/color-name': 1.1.1 + '@babel/parser': 7.17.9 + '@babel/types': 7.17.0 + '@types/babel__generator': 7.6.4 + '@types/babel__template': 7.4.1 + '@types/babel__traverse': 7.17.0 dev: true - /@types/color-name/1.1.1: - resolution: {integrity: sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==} + /@types/babel__generator/7.6.4: + resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} + dependencies: + '@babel/types': 7.17.0 dev: true - /@types/component-emitter/1.2.11: - resolution: {integrity: sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ==} + /@types/babel__template/7.4.1: + resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} + dependencies: + '@babel/parser': 7.17.9 + '@babel/types': 7.17.0 dev: true - /@types/cookie/0.4.1: - resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==} + /@types/babel__traverse/7.17.0: + resolution: {integrity: sha512-r8aveDbd+rzGP+ykSdF3oPuTVRWRfbBiHl0rVDM2yNEmSMXfkObQLV46b4RnCv3Lra51OlfnZhkkFaDl2MIRaA==} + dependencies: + '@babel/types': 7.17.0 dev: true - /@types/cors/2.8.12: - resolution: {integrity: sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==} + /@types/color-convert/2.0.0: + resolution: {integrity: sha512-m7GG7IKKGuJUXvkZ1qqG3ChccdIM/qBBo913z+Xft0nKCX4hAU/IxKwZBU4cpRZ7GS5kV4vOblUkILtSShCPXQ==} + dependencies: + '@types/color-name': 1.1.1 dev: true - /@types/estree/0.0.38: - resolution: {integrity: sha512-F/v7t1LwS4vnXuPooJQGBRKRGIoxWUTmA4VHfqjOccFsNDThD5bfUNpITive6s352O7o384wcpEaDV8rHCehDA==} + /@types/color-name/1.1.1: + resolution: {integrity: sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==} dev: true /@types/estree/0.0.39: @@ -3898,6 +4152,13 @@ packages: '@types/istanbul-lib-report': 3.0.0 dev: true + /@types/jest/27.4.1: + resolution: {integrity: sha512-23iPJADSmicDVrWk+HT58LMJtzLAnB2AgIzplQuq/bSrGaxCrlvRFjGbXmamnnk/mAmCdLStiGqggu28ocUyiw==} + dependencies: + jest-matcher-utils: 27.5.1 + pretty-format: 27.5.1 + dev: true + /@types/json-schema/7.0.11: resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} dev: true @@ -3951,6 +4212,10 @@ packages: resolution: {integrity: sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==} dev: true + /@types/prettier/2.6.0: + resolution: {integrity: sha512-G/AdOadiZhnJp0jXCaBQU449W2h716OW/EoXeYkCytxKL06X1WCXB4DZpp8TpZ8eyIJVS1cw4lrlkkSYU21cDw==} + dev: true + /@types/pretty-hrtime/1.0.1: resolution: {integrity: sha512-VjID5MJb1eGKthz2qUerWT8+R4b9N+CHvGCzg9fn4kWZgaF9AhdYikQio3R7wV8YY1NsQKPaCwKz1Yff+aHNUQ==} dev: true @@ -3991,10 +4256,20 @@ packages: resolution: {integrity: sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==} dev: true + /@types/stack-utils/2.0.1: + resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} + dev: true + /@types/tapable/1.0.8: resolution: {integrity: sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ==} dev: true + /@types/testing-library__jest-dom/5.14.3: + resolution: {integrity: sha512-oKZe+Mf4ioWlMuzVBaXQ9WDnEm1+umLx0InILg+yvZVBBDmzV5KfZyLrCvadtWcx8+916jLmHafcmqqffl+iIw==} + dependencies: + '@types/jest': 27.4.1 + dev: true + /@types/uglify-js/3.13.2: resolution: {integrity: sha512-/xFrPIo+4zOeNGtVMbf9rUm0N+i4pDf1ynExomqtokIJmVzR3962lJ1UE+MmexMkA0cmN9oTzg5Xcbwge0Ij2Q==} dependencies: @@ -4038,6 +4313,12 @@ packages: '@types/yargs-parser': 21.0.0 dev: true + /@types/yargs/16.0.4: + resolution: {integrity: sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==} + dependencies: + '@types/yargs-parser': 21.0.0 + dev: true + /@webassemblyjs/ast/1.9.0: resolution: {integrity: sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==} dependencies: @@ -4181,6 +4462,10 @@ packages: through: 2.3.8 dev: true + /abab/2.0.6: + resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} + dev: true + /abbrev/1.1.1: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} dev: true @@ -4193,6 +4478,13 @@ packages: negotiator: 0.6.3 dev: true + /acorn-globals/6.0.0: + resolution: {integrity: sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==} + dependencies: + acorn: 7.4.1 + acorn-walk: 7.2.0 + dev: true + /acorn-jsx/5.3.2_acorn@7.4.1: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -4317,20 +4609,6 @@ packages: uri-js: 4.4.1 dev: true - /align-text/0.1.4: - resolution: {integrity: sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=} - engines: {node: '>=0.10.0'} - dependencies: - kind-of: 3.2.2 - longest: 1.0.1 - repeat-string: 1.6.1 - dev: true - - /amdefine/1.0.1: - resolution: {integrity: sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=} - engines: {node: '>=0.4.2'} - dev: true - /ansi-align/3.0.1: resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} dependencies: @@ -4399,6 +4677,11 @@ packages: color-convert: 2.0.1 dev: true + /ansi-styles/5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: true + /ansi-to-html/0.6.15: resolution: {integrity: sha512-28ijx2aHJGdzbs+O5SNQF65r6rrKYnkuwTYm8lZlChuoJ9P1vVzIpWO20sQTqTPDXYp6NFwk326vApTtLVFXpQ==} engines: {node: '>=8.0.0'} @@ -4411,13 +4694,6 @@ packages: resolution: {integrity: sha1-q8av7tzqUugJzcA3au0845Y10X8=} dev: true - /anymatch/1.3.2: - resolution: {integrity: sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==} - dependencies: - micromatch: 2.3.11 - normalize-path: 2.1.1 - dev: true - /anymatch/2.0.0: resolution: {integrity: sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==} dependencies: @@ -4475,11 +4751,9 @@ packages: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} dev: true - /arr-diff/2.0.0: - resolution: {integrity: sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=} - engines: {node: '>=0.10.0'} - dependencies: - arr-flatten: 1.1.0 + /aria-query/5.0.0: + resolution: {integrity: sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg==} + engines: {node: '>=6.0'} dev: true /arr-diff/4.0.0: @@ -4497,11 +4771,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /array-each/1.0.1: - resolution: {integrity: sha1-p5SvDAWrF1KEbudTofIRoFugxE8=} - engines: {node: '>=0.10.0'} - dev: true - /array-flatten/1.1.1: resolution: {integrity: sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=} dev: true @@ -4521,11 +4790,6 @@ packages: is-string: 1.0.7 dev: true - /array-slice/1.1.0: - resolution: {integrity: sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==} - engines: {node: '>=0.10.0'} - dev: true - /array-union/1.0.2: resolution: {integrity: sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=} engines: {node: '>=0.10.0'} @@ -4543,11 +4807,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /array-unique/0.2.1: - resolution: {integrity: sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=} - engines: {node: '>=0.10.0'} - dev: true - /array-unique/0.3.2: resolution: {integrity: sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=} engines: {node: '>=0.10.0'} @@ -4695,30 +4954,6 @@ packages: js-tokens: 3.0.2 dev: true - /babel-core/6.26.3: - resolution: {integrity: sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==} - dependencies: - babel-code-frame: 6.26.0 - babel-generator: 6.26.1 - babel-helpers: 6.24.1 - babel-messages: 6.23.0 - babel-register: 6.26.0 - babel-runtime: 6.26.0 - babel-template: 6.26.0 - babel-traverse: 6.26.0 - babel-types: 6.26.0 - babylon: 6.18.0 - convert-source-map: 1.8.0 - debug: 2.6.9 - json5: 0.5.1 - lodash: 4.17.21 - minimatch: 3.1.2 - path-is-absolute: 1.0.1 - private: 0.1.8 - slash: 1.0.0 - source-map: 0.5.7 - dev: true - /babel-eslint/7.2.3: resolution: {integrity: sha1-sv4tgBJkcPXBlELcdXJTqJdxCCc=} engines: {node: '>=4'} @@ -4730,31 +4965,23 @@ packages: babylon: 6.18.0 dev: true - /babel-generator/6.26.1: - resolution: {integrity: sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==} - dependencies: - babel-messages: 6.23.0 - babel-runtime: 6.26.0 - babel-types: 6.26.0 - detect-indent: 4.0.0 - jsesc: 1.3.0 - lodash: 4.17.21 - source-map: 0.5.7 - trim-right: 1.0.1 - dev: true - - /babel-helper-hoist-variables/6.24.1: - resolution: {integrity: sha1-HssnaJydJVE+rbyZFKc/VAi+enY=} - dependencies: - babel-runtime: 6.26.0 - babel-types: 6.26.0 - dev: true - - /babel-helpers/6.24.1: - resolution: {integrity: sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=} + /babel-jest/27.5.1_@babel+core@7.17.9: + resolution: {integrity: sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + '@babel/core': ^7.8.0 dependencies: - babel-runtime: 6.26.0 - babel-template: 6.26.0 + '@babel/core': 7.17.9 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + '@types/babel__core': 7.1.19 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 27.5.1_@babel+core@7.17.9 + chalk: 4.1.2 + graceful-fs: 4.2.10 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color dev: true /babel-loader/8.2.4_598a497cebab8e15ee8f9e5632178e63: @@ -4842,6 +5069,16 @@ packages: - supports-color dev: true + /babel-plugin-jest-hoist/27.5.1: + resolution: {integrity: sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@babel/template': 7.16.7 + '@babel/types': 7.17.0 + '@types/babel__core': 7.1.19 + '@types/babel__traverse': 7.17.0 + dev: true + /babel-plugin-macros/2.8.0: resolution: {integrity: sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==} dependencies: @@ -4907,54 +5144,39 @@ packages: - supports-color dev: true - /babel-plugin-syntax-dynamic-import/6.18.0: - resolution: {integrity: sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=} - dev: true - /babel-plugin-syntax-jsx/6.18.0: resolution: {integrity: sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=} dev: true - /babel-plugin-transform-amd-system-wrapper/0.3.7: - resolution: {integrity: sha1-Uhx4LTVkRJHJeepoPopeHK/wukI=} + /babel-preset-current-node-syntax/1.0.1_@babel+core@7.17.9: + resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} + peerDependencies: + '@babel/core': ^7.0.0 dependencies: - babel-template: 6.26.0 + '@babel/core': 7.17.9 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.17.9 + '@babel/plugin-syntax-bigint': 7.8.3_@babel+core@7.17.9 + '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.17.9 + '@babel/plugin-syntax-import-meta': 7.10.4_@babel+core@7.17.9 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.17.9 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.17.9 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.17.9 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.17.9 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.17.9 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.17.9 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.17.9 + '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.17.9 dev: true - /babel-plugin-transform-cjs-system-wrapper/0.6.2: - resolution: {integrity: sha1-vXSUd1KJQk/0k7btRV3klb1xuh0=} + /babel-preset-jest/27.5.1_@babel+core@7.17.9: + resolution: {integrity: sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + '@babel/core': ^7.0.0 dependencies: - babel-template: 6.26.0 - dev: true - - /babel-plugin-transform-es2015-modules-systemjs/6.24.1: - resolution: {integrity: sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=} - dependencies: - babel-helper-hoist-variables: 6.24.1 - babel-runtime: 6.26.0 - babel-template: 6.26.0 - dev: true - - /babel-plugin-transform-global-system-wrapper/0.3.4: - resolution: {integrity: sha1-lI3X0p/CFEfjm9NEfy3rx/L3Oqw=} - dependencies: - babel-template: 6.26.0 - dev: true - - /babel-plugin-transform-system-register/0.0.1: - resolution: {integrity: sha1-nf9AOQwnY6xRjwsq18XqT2WlviU=} - dev: true - - /babel-register/6.26.0: - resolution: {integrity: sha1-btAhFz4vy0htestFxgCahW9kcHE=} - dependencies: - babel-core: 6.26.3 - babel-runtime: 6.26.0 - core-js: 2.6.12 - home-or-tmp: 2.0.0 - lodash: 4.17.21 - mkdirp: 0.5.6 - source-map-support: 0.4.18 + '@babel/core': 7.17.9 + babel-plugin-jest-hoist: 27.5.1 + babel-preset-current-node-syntax: 1.0.1_@babel+core@7.17.9 dev: true /babel-runtime/6.26.0: @@ -4964,16 +5186,6 @@ packages: regenerator-runtime: 0.11.1 dev: true - /babel-template/6.26.0: - resolution: {integrity: sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=} - dependencies: - babel-runtime: 6.26.0 - babel-traverse: 6.26.0 - babel-types: 6.26.0 - babylon: 6.18.0 - lodash: 4.17.21 - dev: true - /babel-traverse/6.26.0: resolution: {integrity: sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=} dependencies: @@ -5027,11 +5239,6 @@ packages: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} dev: true - /base64id/2.0.0: - resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} - engines: {node: ^4.5.0 || >= 5.9} - dev: true - /batch-processor/1.0.0: resolution: {integrity: sha1-dclcMrdI4IUNEMKxaPa9vpiRrOg=} dev: true @@ -5071,13 +5278,6 @@ packages: dev: true optional: true - /bl/1.2.3: - resolution: {integrity: sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==} - dependencies: - readable-stream: 2.3.7 - safe-buffer: 5.2.1 - dev: true - /bl/4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} dependencies: @@ -5114,24 +5314,6 @@ packages: type-is: 1.6.18 dev: true - /body-parser/1.20.0: - resolution: {integrity: sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - dependencies: - bytes: 3.1.2 - content-type: 1.0.4 - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - on-finished: 2.4.1 - qs: 6.10.3 - raw-body: 2.5.1 - type-is: 1.6.18 - unpipe: 1.0.0 - dev: true - /boolbase/1.0.0: resolution: {integrity: sha1-aN/1++YMUes3cl6p4+0xDcwed24=} dev: true @@ -5157,15 +5339,6 @@ packages: concat-map: 0.0.1 dev: true - /braces/1.8.5: - resolution: {integrity: sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=} - engines: {node: '>=0.10.0'} - dependencies: - expand-range: 1.8.2 - preserve: 0.2.0 - repeat-element: 1.1.4 - dev: true - /braces/2.3.2: resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} engines: {node: '>=0.10.0'} @@ -5193,6 +5366,10 @@ packages: resolution: {integrity: sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=} dev: true + /browser-process-hrtime/1.0.0: + resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} + dev: true + /browserify-aes/1.2.0: resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} dependencies: @@ -5266,33 +5443,10 @@ packages: node-int64: 0.4.0 dev: true - /buffer-alloc-unsafe/1.1.0: - resolution: {integrity: sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==} - dev: true - - /buffer-alloc/1.2.0: - resolution: {integrity: sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==} - dependencies: - buffer-alloc-unsafe: 1.1.0 - buffer-fill: 1.0.0 - dev: true - - /buffer-crc32/0.2.13: - resolution: {integrity: sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=} - dev: true - - /buffer-fill/1.0.0: - resolution: {integrity: sha1-+PeLdniYiO858gXNY39o5wISKyw=} - dev: true - /buffer-from/1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} dev: true - /buffer-peek-stream/1.1.0: - resolution: {integrity: sha512-b3MXlJ52rPOL5xCAQsiCOy/tY9WXOP/hwATporJriUDxnT3MjJgVppDzTFegpg2Nw7NMS28MKC6IKvaXLnGr+Q==} - dev: true - /buffer-xor/1.0.3: resolution: {integrity: sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=} dev: true @@ -5442,11 +5596,6 @@ packages: type-fest: 1.4.0 dev: true - /camelcase/1.2.1: - resolution: {integrity: sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=} - engines: {node: '>=0.10.0'} - dev: true - /camelcase/5.3.1: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} @@ -5490,14 +5639,6 @@ packages: resolution: {integrity: sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==} dev: true - /center-align/0.1.3: - resolution: {integrity: sha1-qg0yYptu6XIgBBHL1EYckHvCt60=} - engines: {node: '>=0.10.0'} - dependencies: - align-text: 0.1.4 - lazy-cache: 1.0.4 - dev: true - /chalk/1.1.3: resolution: {integrity: sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=} engines: {node: '>=0.10.0'} @@ -5518,6 +5659,14 @@ packages: supports-color: 5.5.0 dev: true + /chalk/3.0.0: + resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + /chalk/4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} @@ -5526,6 +5675,11 @@ packages: supports-color: 7.2.0 dev: true + /char-regex/1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + dev: true + /character-entities-legacy/1.1.4: resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} dev: true @@ -5600,6 +5754,10 @@ packages: resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} dev: true + /ci-info/3.3.0: + resolution: {integrity: sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==} + dev: true + /cipher-base/1.0.4: resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==} dependencies: @@ -5607,6 +5765,10 @@ packages: safe-buffer: 5.2.1 dev: true + /cjs-module-lexer/1.2.2: + resolution: {integrity: sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==} + dev: true + /class-utils/0.3.6: resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==} engines: {node: '>=0.10.0'} @@ -5634,15 +5796,6 @@ packages: engines: {node: '>=6'} dev: true - /cli-color/0.3.3: - resolution: {integrity: sha1-EtW90Vj/igsNtAEZiRPAPfBp9vU=} - dependencies: - d: 0.1.1 - es5-ext: 0.10.60 - memoizee: 0.3.10 - timers-ext: 0.1.7 - dev: true - /cli-cursor/2.1.0: resolution: {integrity: sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=} engines: {node: '>=4'} @@ -5680,14 +5833,6 @@ packages: engines: {node: '>= 10'} dev: true - /cliui/2.1.0: - resolution: {integrity: sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=} - dependencies: - center-align: 0.1.3 - right-align: 0.1.3 - wordwrap: 0.0.2 - dev: true - /cliui/7.0.4: resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} dependencies: @@ -5715,10 +5860,19 @@ packages: engines: {node: '>=6'} dev: true + /co/4.6.0: + resolution: {integrity: sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + dev: true + /collapse-white-space/1.0.6: resolution: {integrity: sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==} dev: true + /collect-v8-coverage/1.0.1: + resolution: {integrity: sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==} + dev: true + /collection-visit/1.0.0: resolution: {integrity: sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=} engines: {node: '>=0.10.0'} @@ -5772,13 +5926,6 @@ packages: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} dev: true - /commander/2.9.0: - resolution: {integrity: sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=} - engines: {node: '>= 0.6.x'} - dependencies: - graceful-readlink: 1.0.1 - dev: true - /commander/4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} @@ -5871,16 +6018,6 @@ packages: typedarray: 0.0.6 dev: true - /connect/3.7.0: - resolution: {integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==} - engines: {node: '>= 0.10.0'} - dependencies: - debug: 2.6.9 - finalhandler: 1.1.2 - parseurl: 1.3.3 - utils-merge: 1.0.1 - dev: true - /console-browserify/1.2.0: resolution: {integrity: sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==} dev: true @@ -5988,11 +6125,6 @@ packages: requiresBuild: true dev: true - /core-js/1.2.7: - resolution: {integrity: sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=} - deprecated: core-js@<3.4 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Please, upgrade your dependencies to the actual version of core-js. - dev: true - /core-js/2.6.12: resolution: {integrity: sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==} deprecated: core-js@<3.4 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Please, upgrade your dependencies to the actual version of core-js. @@ -6012,14 +6144,6 @@ packages: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} dev: true - /cors/2.8.5: - resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} - engines: {node: '>= 0.10'} - dependencies: - object-assign: 4.1.1 - vary: 1.1.2 - dev: true - /cosmiconfig-typescript-loader/1.0.9_f533c3387680131348857b0baefd0f31: resolution: {integrity: sha512-tRuMRhxN4m1Y8hP9SNYfz7jRwt8lZdWxdjg/ohg5esKmsndJIn4yT96oJVcf5x0eA11taXl+sIp+ielu529k6g==} engines: {node: '>=12', npm: '>=6'} @@ -6223,6 +6347,18 @@ packages: engines: {node: '>= 6'} dev: true + /css.escape/1.5.1: + resolution: {integrity: sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s=} + dev: true + + /css/3.0.0: + resolution: {integrity: sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==} + dependencies: + inherits: 2.0.4 + source-map: 0.6.1 + source-map-resolve: 0.6.0 + dev: true + /cssesc/3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} @@ -6295,6 +6431,21 @@ packages: css-tree: 1.1.3 dev: true + /cssom/0.3.8: + resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} + dev: true + + /cssom/0.4.4: + resolution: {integrity: sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==} + dev: true + + /cssstyle/2.3.0: + resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} + engines: {node: '>=8'} + dependencies: + cssom: 0.3.8 + dev: true + /csstype/2.6.20: resolution: {integrity: sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==} dev: true @@ -6303,10 +6454,6 @@ packages: resolution: {integrity: sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==} dev: true - /custom-event/1.0.1: - resolution: {integrity: sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=} - dev: true - /cyclist/1.0.1: resolution: {integrity: sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=} dev: true @@ -6328,19 +6475,6 @@ packages: - '@swc/wasm' dev: true - /d/0.1.1: - resolution: {integrity: sha1-2hhMU10Y2O57oqoim5FACfrhEwk=} - dependencies: - es5-ext: 0.10.60 - dev: true - - /d/1.0.1: - resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==} - dependencies: - es5-ext: 0.10.60 - type: 1.2.0 - dev: true - /dargs/7.0.0: resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} engines: {node: '>=8'} @@ -6353,17 +6487,13 @@ packages: assert-plus: 1.0.0 dev: true - /data-uri-to-buffer/0.0.4: - resolution: {integrity: sha1-RuE6udqOMJdFyNAc5UchPr2y/j8=} - dev: true - - /date-format/4.0.6: - resolution: {integrity: sha512-B9vvg5rHuQ8cbUXE/RMWMyX2YA5TecT3jKF5fLtGNlzPlU7zblSPmAm2OImDbWL+LDOQ6pUm+4LOFz+ywS41Zw==} - engines: {node: '>=4.0'} - dev: true - - /debounce/1.2.1: - resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} + /data-urls/2.0.0: + resolution: {integrity: sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==} + engines: {node: '>=10'} + dependencies: + abab: 2.0.6 + whatwg-mimetype: 2.3.0 + whatwg-url: 8.7.0 dev: true /debug/2.6.9: @@ -6408,6 +6538,10 @@ packages: engines: {node: '>=10'} dev: true + /decimal.js/10.3.1: + resolution: {integrity: sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==} + dev: true + /decode-uri-component/0.2.0: resolution: {integrity: sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=} engines: {node: '>=0.10'} @@ -6502,11 +6636,6 @@ packages: engines: {node: '>= 0.6'} dev: true - /depd/2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} - dev: true - /des.js/1.0.1: resolution: {integrity: sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==} dependencies: @@ -6518,11 +6647,6 @@ packages: resolution: {integrity: sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=} dev: true - /destroy/1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - dev: true - /detab/2.0.4: resolution: {integrity: sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g==} dependencies: @@ -6534,18 +6658,16 @@ packages: engines: {node: '>=0.10.0'} dev: true - /detect-indent/4.0.0: - resolution: {integrity: sha1-920GQ1LN9Docts5hnE7jqUdd4gg=} - engines: {node: '>=0.10.0'} - dependencies: - repeating: 2.0.1 - dev: true - /detect-indent/6.0.0: resolution: {integrity: sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA==} engines: {node: '>=8'} dev: true + /detect-newline/3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} + dev: true + /detect-port/1.3.0: resolution: {integrity: sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ==} engines: {node: '>= 4.2.1'} @@ -6555,8 +6677,9 @@ packages: debug: 2.6.9 dev: true - /di/0.0.1: - resolution: {integrity: sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=} + /diff-sequences/27.5.1: + resolution: {integrity: sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dev: true /diff/4.0.2: @@ -6593,21 +6716,16 @@ packages: esutils: 2.0.3 dev: true + /dom-accessibility-api/0.5.13: + resolution: {integrity: sha512-R305kwb5CcMDIpSHUnLyIAp7SrSPBx6F0VfQFB3M75xVMHhXJJIdePYgbPPh1o57vCHNu5QztokWUPsLjWzFqw==} + dev: true + /dom-converter/0.2.0: resolution: {integrity: sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==} dependencies: utila: 0.4.0 dev: true - /dom-serialize/2.2.1: - resolution: {integrity: sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=} - dependencies: - custom-event: 1.0.1 - ent: 2.2.0 - extend: 3.0.2 - void-elements: 2.0.1 - dev: true - /dom-serializer/1.4.1: resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} dependencies: @@ -6629,6 +6747,13 @@ packages: resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} dev: true + /domexception/2.0.1: + resolution: {integrity: sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==} + engines: {node: '>=8'} + dependencies: + webidl-conversions: 5.0.0 + dev: true + /domhandler/3.3.0: resolution: {integrity: sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA==} engines: {node: '>= 4'} @@ -6741,6 +6866,11 @@ packages: minimalistic-crypto-utils: 1.0.1 dev: true + /emittery/0.8.1: + resolution: {integrity: sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==} + engines: {node: '>=10'} + dev: true + /emoji-regex/8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} dev: true @@ -6794,33 +6924,6 @@ packages: once: 1.4.0 dev: true - /engine.io-parser/5.0.3: - resolution: {integrity: sha512-BtQxwF27XUNnSafQLvDi0dQ8s3i6VgzSoQMJacpIcGNrlUdfHSKbgm3jmjCVvQluGzqwujQMPAoMai3oYSTurg==} - engines: {node: '>=10.0.0'} - dependencies: - '@socket.io/base64-arraybuffer': 1.0.2 - dev: true - - /engine.io/6.1.3: - resolution: {integrity: sha512-rqs60YwkvWTLLnfazqgZqLa/aKo+9cueVfEi/dZ8PyGyaf8TLOxj++4QMIgeG3Gn0AhrWiFXvghsoY9L9h25GA==} - engines: {node: '>=10.0.0'} - dependencies: - '@types/cookie': 0.4.1 - '@types/cors': 2.8.12 - '@types/node': 17.0.23 - accepts: 1.3.8 - base64id: 2.0.0 - cookie: 0.4.2 - cors: 2.8.5 - debug: 4.3.4 - engine.io-parser: 5.0.3 - ws: 8.2.3 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: true - /enhanced-resolve/4.5.0: resolution: {integrity: sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==} engines: {node: '>=6.9.0'} @@ -6830,10 +6933,6 @@ packages: tapable: 1.1.3 dev: true - /ent/2.2.0: - resolution: {integrity: sha1-6WQhkyWiHQX0RGai9obtbOX13R0=} - dev: true - /entities/2.2.0: resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} dev: true @@ -6843,10 +6942,6 @@ packages: engines: {node: '>=6'} dev: true - /err-code/1.1.2: - resolution: {integrity: sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=} - dev: true - /err-code/2.0.3: resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} dev: true @@ -6922,75 +7017,15 @@ packages: is-symbol: 1.0.4 dev: true - /es5-ext/0.10.60: - resolution: {integrity: sha512-jpKNXIt60htYG59/9FGf2PYT3pwMpnEbNKysU+k/4FGwyGtMotOvcZOuW+EmXXYASRqYSXQfGL5cVIthOTgbkg==} - engines: {node: '>=0.10'} - requiresBuild: true - dependencies: - es6-iterator: 2.0.3 - es6-symbol: 3.1.3 - next-tick: 1.1.0 - dev: true - /es5-shim/4.6.5: resolution: {integrity: sha512-vfQ4UAai8szn0sAubCy97xnZ4sJVDD1gt/Grn736hg8D7540wemIb1YPrYZSTqlM2H69EQX1or4HU/tSwRTI3w==} engines: {node: '>=0.4.0'} dev: true - /es6-iterator/0.1.3: - resolution: {integrity: sha1-1vWLjE/EE8JJtLqhl2j45NfIlE4=} - dependencies: - d: 0.1.1 - es5-ext: 0.10.60 - es6-symbol: 2.0.1 - dev: true - - /es6-iterator/2.0.3: - resolution: {integrity: sha1-p96IkUGgWpSwhUQDstCg+/qY87c=} - dependencies: - d: 1.0.1 - es5-ext: 0.10.60 - es6-symbol: 3.1.3 - dev: true - - /es6-promise/4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - dev: true - /es6-shim/0.35.6: resolution: {integrity: sha512-EmTr31wppcaIAgblChZiuN/l9Y7DPyw8Xtbg7fIVngn6zMW+IEBJDJngeKC3x6wr0V/vcA2wqeFnaw1bFJbDdA==} dev: true - /es6-symbol/2.0.1: - resolution: {integrity: sha1-dhtcZ8/U8dGK+yNPaR1nhoLLO/M=} - dependencies: - d: 0.1.1 - es5-ext: 0.10.60 - dev: true - - /es6-symbol/3.1.3: - resolution: {integrity: sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==} - dependencies: - d: 1.0.1 - ext: 1.6.0 - dev: true - - /es6-template-strings/2.0.1: - resolution: {integrity: sha1-sWbGpiVi9Hi7d3X2ypYQOlmbSyw=} - dependencies: - es5-ext: 0.10.60 - esniff: 1.1.0 - dev: true - - /es6-weak-map/0.1.4: - resolution: {integrity: sha1-cGzvnpmqI2undmwjnIueKG6n0ig=} - dependencies: - d: 0.1.1 - es5-ext: 0.10.60 - es6-iterator: 0.1.3 - es6-symbol: 2.0.1 - dev: true - /escalade/3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} @@ -7005,6 +7040,11 @@ packages: engines: {node: '>=0.8.0'} dev: true + /escape-string-regexp/2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + dev: true + /escape-string-regexp/4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} @@ -7103,13 +7143,6 @@ packages: - supports-color dev: true - /esniff/1.1.0: - resolution: {integrity: sha1-xmhJIp+RRk3t4uDUAgHtar9l8qw=} - dependencies: - d: 1.0.1 - es5-ext: 0.10.60 - dev: true - /espree/9.3.1: resolution: {integrity: sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -7167,17 +7200,6 @@ packages: engines: {node: '>= 0.6'} dev: true - /event-emitter/0.3.5: - resolution: {integrity: sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=} - dependencies: - d: 1.0.1 - es5-ext: 0.10.60 - dev: true - - /eventemitter3/4.0.7: - resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} - dev: true - /events/3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} @@ -7190,12 +7212,6 @@ packages: safe-buffer: 5.2.1 dev: true - /exec-sh/0.2.2: - resolution: {integrity: sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw==} - dependencies: - merge: 1.2.1 - dev: true - /exec-sh/0.3.6: resolution: {integrity: sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==} dev: true @@ -7228,11 +7244,9 @@ packages: strip-final-newline: 2.0.0 dev: true - /expand-brackets/0.1.5: - resolution: {integrity: sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=} - engines: {node: '>=0.10.0'} - dependencies: - is-posix-bracket: 0.1.1 + /exit/0.1.2: + resolution: {integrity: sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=} + engines: {node: '>= 0.8.0'} dev: true /expand-brackets/2.1.4: @@ -7248,20 +7262,6 @@ packages: to-regex: 3.0.2 dev: true - /expand-range/1.8.2: - resolution: {integrity: sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=} - engines: {node: '>=0.10.0'} - dependencies: - fill-range: 2.2.4 - dev: true - - /expand-tilde/1.2.2: - resolution: {integrity: sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=} - engines: {node: '>=0.10.0'} - dependencies: - os-homedir: 1.0.2 - dev: true - /expand-tilde/2.0.2: resolution: {integrity: sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=} engines: {node: '>=0.10.0'} @@ -7269,6 +7269,16 @@ packages: homedir-polyfill: 1.0.3 dev: true + /expect/27.5.1: + resolution: {integrity: sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + jest-get-type: 27.5.1 + jest-matcher-utils: 27.5.1 + jest-message-util: 27.5.1 + dev: true + /express/4.17.3: resolution: {integrity: sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==} engines: {node: '>= 0.10.0'} @@ -7305,12 +7315,6 @@ packages: vary: 1.1.2 dev: true - /ext/1.6.0: - resolution: {integrity: sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==} - dependencies: - type: 2.6.0 - dev: true - /extend-shallow/2.0.1: resolution: {integrity: sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=} engines: {node: '>=0.10.0'} @@ -7339,13 +7343,6 @@ packages: tmp: 0.0.33 dev: true - /extglob/0.3.2: - resolution: {integrity: sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=} - engines: {node: '>=0.10.0'} - dependencies: - is-extglob: 1.0.0 - dev: true - /extglob/2.0.4: resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==} engines: {node: '>=0.10.0'} @@ -7360,16 +7357,6 @@ packages: to-regex: 3.0.2 dev: true - /extract-zip/1.7.0: - resolution: {integrity: sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==} - hasBin: true - dependencies: - concat-stream: 1.6.2 - debug: 2.6.9 - mkdirp: 0.5.6 - yauzl: 2.10.0 - dev: true - /extsprintf/1.3.0: resolution: {integrity: sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=} engines: {'0': node >=0.6.0} @@ -7428,12 +7415,6 @@ packages: bser: 2.1.1 dev: true - /fd-slicer/1.1.0: - resolution: {integrity: sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=} - dependencies: - pend: 1.2.0 - dev: true - /figgy-pudding/3.5.2: resolution: {integrity: sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==} dev: true @@ -7483,22 +7464,6 @@ packages: dev: true optional: true - /filename-regex/2.0.1: - resolution: {integrity: sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=} - engines: {node: '>=0.10.0'} - dev: true - - /fill-range/2.2.4: - resolution: {integrity: sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==} - engines: {node: '>=0.10.0'} - dependencies: - is-number: 2.1.0 - isobject: 2.1.0 - randomatic: 3.1.1 - repeat-element: 1.1.4 - repeat-string: 1.6.1 - dev: true - /fill-range/4.0.0: resolution: {integrity: sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=} engines: {node: '>=0.10.0'} @@ -7581,16 +7546,6 @@ packages: path-exists: 4.0.0 dev: true - /findup-sync/2.0.0: - resolution: {integrity: sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=} - engines: {node: '>= 0.10'} - dependencies: - detect-file: 1.0.0 - is-glob: 3.1.0 - micromatch: 3.1.10 - resolve-dir: 1.0.1 - dev: true - /findup-sync/4.0.0: resolution: {integrity: sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==} engines: {node: '>= 8'} @@ -7601,22 +7556,6 @@ packages: resolve-dir: 1.0.1 dev: true - /fined/1.2.0: - resolution: {integrity: sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==} - engines: {node: '>= 0.10'} - dependencies: - 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 - dev: true - - /flagged-respawn/1.0.1: - resolution: {integrity: sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==} - engines: {node: '>= 0.10'} - dev: true - /flat-cache/3.0.4: resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} engines: {node: ^10.12.0 || >=12.0.0} @@ -7636,35 +7575,11 @@ packages: readable-stream: 2.3.7 dev: true - /follow-redirects/1.14.9: - resolution: {integrity: sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - dev: true - /for-in/1.0.2: resolution: {integrity: sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=} engines: {node: '>=0.10.0'} dev: true - /for-own/0.1.5: - resolution: {integrity: sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=} - engines: {node: '>=0.10.0'} - dependencies: - for-in: 1.0.2 - dev: true - - /for-own/1.0.0: - resolution: {integrity: sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=} - engines: {node: '>=0.10.0'} - dependencies: - for-in: 1.0.2 - dev: true - /forever-agent/0.6.1: resolution: {integrity: sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=} dev: true @@ -7764,10 +7679,6 @@ packages: readable-stream: 2.3.7 dev: true - /fs-constants/1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - dev: true - /fs-extra/0.26.7: resolution: {integrity: sha1-muH92UiXeY7at20JGM9C0MMYT6k=} dependencies: @@ -7788,14 +7699,6 @@ packages: rimraf: 2.7.1 dev: true - /fs-extra/1.0.0: - resolution: {integrity: sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=} - dependencies: - graceful-fs: 4.2.10 - jsonfile: 2.4.0 - klaw: 1.3.1 - dev: true - /fs-extra/10.0.1: resolution: {integrity: sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag==} engines: {node: '>=12'} @@ -8016,20 +7919,6 @@ packages: resolution: {integrity: sha512-w0dzqw/nt51xMVmlaV1+JRzN+oCa1KfcgGEWhxUG16wbdA+Xnt/yoFO8Z8x/V82ZcZ0wy6ln9QDup5avbhiDhQ==} dev: true - /glob-base/0.3.0: - resolution: {integrity: sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=} - engines: {node: '>=0.10.0'} - dependencies: - glob-parent: 2.0.0 - is-glob: 2.0.1 - dev: true - - /glob-parent/2.0.0: - resolution: {integrity: sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=} - dependencies: - is-glob: 2.0.1 - dev: true - /glob-parent/3.1.0: resolution: {integrity: sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=} dependencies: @@ -8069,37 +7958,6 @@ packages: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} dev: true - /glob/5.0.15: - resolution: {integrity: sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=} - dependencies: - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - dev: true - - /glob/6.0.4: - resolution: {integrity: sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=} - dependencies: - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - dev: true - - /glob/7.0.6: - resolution: {integrity: sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - dev: true - /glob/7.1.4: resolution: {integrity: sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==} dependencies: @@ -8230,10 +8088,6 @@ packages: resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} dev: true - /graceful-readlink/1.0.1: - resolution: {integrity: sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=} - dev: true - /handlebars/4.7.7: resolution: {integrity: sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==} engines: {node: '>=0.4.7'} @@ -8364,14 +8218,6 @@ packages: minimalistic-assert: 1.0.1 dev: true - /hasha/2.2.0: - resolution: {integrity: sha1-eNfL/B5tZjA/55g3NlmEUXsvbuE=} - engines: {node: '>=0.10.0'} - dependencies: - is-stream: 1.1.0 - pinkie-promise: 2.0.1 - dev: true - /hast-to-hyperscript/9.0.1: resolution: {integrity: sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==} dependencies: @@ -8469,14 +8315,6 @@ packages: react-is: 16.13.1 dev: true - /home-or-tmp/2.0.0: - resolution: {integrity: sha1-42w/LSyufXRqhX440Y1fMqeILbg=} - engines: {node: '>=0.10.0'} - dependencies: - os-homedir: 1.0.2 - os-tmpdir: 1.0.2 - dev: true - /homedir-polyfill/1.0.3: resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} engines: {node: '>=0.10.0'} @@ -8495,10 +8333,21 @@ packages: lru-cache: 6.0.0 dev: true + /html-encoding-sniffer/2.0.1: + resolution: {integrity: sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==} + engines: {node: '>=10'} + dependencies: + whatwg-encoding: 1.0.5 + dev: true + /html-entities/2.3.3: resolution: {integrity: sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==} dev: true + /html-escaper/2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + dev: true + /html-loader/1.3.2: resolution: {integrity: sha512-DEkUwSd0sijK5PF3kRWspYi56XP7bTNkyg5YWSzBdjaSDmvCufep5c4Vpb3PBf6lUL0YPtLwBfy9fL0t5hBAGA==} engines: {node: '>= 10.13.0'} @@ -8585,17 +8434,6 @@ packages: toidentifier: 1.0.1 dev: true - /http-errors/2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} - engines: {node: '>= 0.8'} - dependencies: - depd: 2.0.0 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 2.0.1 - toidentifier: 1.0.1 - dev: true - /http-proxy-agent/4.0.1: resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} engines: {node: '>= 6'} @@ -8607,17 +8445,6 @@ packages: - supports-color dev: true - /http-proxy/1.18.1: - resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} - engines: {node: '>=8.0.0'} - dependencies: - eventemitter3: 4.0.7 - follow-redirects: 1.14.9 - requires-port: 1.0.0 - transitivePeerDependencies: - - debug - dev: true - /http-signature/1.2.0: resolution: {integrity: sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=} engines: {node: '>=0.8', npm: '>=1.3.7'} @@ -8713,6 +8540,15 @@ packages: resolve-from: 4.0.0 dev: true + /import-local/3.1.0: + resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} + engines: {node: '>=8'} + hasBin: true + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + dev: true + /imurmurhash/0.1.4: resolution: {integrity: sha1-khi5srkoojixPcT7a21XbyMUU+o=} engines: {node: '>=0.8.19'} @@ -8807,11 +8643,6 @@ packages: side-channel: 1.0.4 dev: true - /interpolate/0.1.0: - resolution: {integrity: sha1-tgF3pLqUH7NyTIIZBdmareE9Hfk=} - engines: {node: '>= 0.6.0'} - dev: true - /interpret/2.2.0: resolution: {integrity: sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==} engines: {node: '>= 0.10'} @@ -8837,14 +8668,6 @@ packages: engines: {node: '>=8'} dev: true - /is-absolute/1.0.0: - resolution: {integrity: sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==} - engines: {node: '>=0.10.0'} - dependencies: - is-relative: 1.0.0 - is-windows: 1.0.2 - dev: true - /is-accessor-descriptor/0.1.6: resolution: {integrity: sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=} engines: {node: '>=0.10.0'} @@ -8994,18 +8817,6 @@ packages: is-window: 1.0.2 dev: true - /is-dotfile/1.0.3: - resolution: {integrity: sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=} - engines: {node: '>=0.10.0'} - dev: true - - /is-equal-shallow/0.1.3: - resolution: {integrity: sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=} - engines: {node: '>=0.10.0'} - dependencies: - is-primitive: 2.0.0 - dev: true - /is-extendable/0.1.1: resolution: {integrity: sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=} engines: {node: '>=0.10.0'} @@ -9018,21 +8829,11 @@ packages: is-plain-object: 2.0.4 dev: true - /is-extglob/1.0.0: - resolution: {integrity: sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=} - engines: {node: '>=0.10.0'} - dev: true - /is-extglob/2.1.1: resolution: {integrity: sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=} engines: {node: '>=0.10.0'} dev: true - /is-finite/1.1.0: - resolution: {integrity: sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==} - engines: {node: '>=0.10.0'} - dev: true - /is-fullwidth-code-point/2.0.0: resolution: {integrity: sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=} engines: {node: '>=4'} @@ -9047,11 +8848,9 @@ packages: resolution: {integrity: sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==} dev: true - /is-glob/2.0.1: - resolution: {integrity: sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=} - engines: {node: '>=0.10.0'} - dependencies: - is-extglob: 1.0.0 + /is-generator-fn/2.1.0: + resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} + engines: {node: '>=6'} dev: true /is-glob/3.1.0: @@ -9101,13 +8900,6 @@ packages: has-tostringtag: 1.0.0 dev: true - /is-number/2.1.0: - resolution: {integrity: sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=} - engines: {node: '>=0.10.0'} - dependencies: - kind-of: 3.2.2 - dev: true - /is-number/3.0.0: resolution: {integrity: sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=} engines: {node: '>=0.10.0'} @@ -9115,11 +8907,6 @@ packages: kind-of: 3.2.2 dev: true - /is-number/4.0.0: - resolution: {integrity: sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==} - engines: {node: '>=0.10.0'} - dev: true - /is-number/7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} @@ -9166,14 +8953,8 @@ packages: engines: {node: '>=0.10.0'} dev: true - /is-posix-bracket/0.1.1: - resolution: {integrity: sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=} - engines: {node: '>=0.10.0'} - dev: true - - /is-primitive/2.0.0: - resolution: {integrity: sha1-IHurkWOEmcB7Kt8kCkGochADRXU=} - engines: {node: '>=0.10.0'} + /is-potential-custom-element-name/1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} dev: true /is-regex/1.1.4: @@ -9184,13 +8965,6 @@ packages: has-tostringtag: 1.0.0 dev: true - /is-relative/1.0.0: - resolution: {integrity: sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==} - engines: {node: '>=0.10.0'} - dependencies: - is-unc-path: 1.0.0 - dev: true - /is-set/2.0.2: resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} dev: true @@ -9236,13 +9010,6 @@ packages: resolution: {integrity: sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=} dev: true - /is-unc-path/1.0.0: - resolution: {integrity: sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==} - engines: {node: '>=0.10.0'} - dependencies: - unc-path-regex: 0.1.2 - dev: true - /is-unicode-supported/0.1.0: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} @@ -9295,11 +9062,6 @@ packages: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} dev: true - /isbinaryfile/4.0.10: - resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==} - engines: {node: '>= 8.0.0'} - dev: true - /isexe/2.0.0: resolution: {integrity: sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=} dev: true @@ -9343,6 +9105,34 @@ packages: - supports-color dev: true + /istanbul-lib-report/3.0.0: + resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} + engines: {node: '>=8'} + dependencies: + istanbul-lib-coverage: 3.2.0 + make-dir: 3.1.0 + supports-color: 7.2.0 + dev: true + + /istanbul-lib-source-maps/4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} + dependencies: + debug: 4.3.4 + istanbul-lib-coverage: 3.2.0 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-reports/3.1.4: + resolution: {integrity: sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==} + engines: {node: '>=8'} + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.0 + dev: true + /iterate-iterator/1.0.2: resolution: {integrity: sha512-t91HubM4ZDQ70M9wqp+pcNpu8OyJ9UAtXntT/Bcsvp5tZMnz9vRa+IunKXeI8AnfZMTv0jNuVEmGeLSMjVvfPw==} dev: true @@ -9354,12 +9144,173 @@ packages: iterate-iterator: 1.0.2 dev: true - /jasmine-core/3.99.1: - resolution: {integrity: sha512-Hu1dmuoGcZ7AfyynN3LsfruwMbxMALMka+YtZeGoLuDEySVmVAPaonkNoBRIw/ectu8b9tVQCJNgp4a4knp+tg==} + /jest-changed-files/27.5.1: + resolution: {integrity: sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + execa: 5.1.1 + throat: 6.0.1 dev: true - /jasmine-core/4.1.0: - resolution: {integrity: sha512-8E8BiffCL8sBwK1zU9cbavLe8xpJAgOduSJ6N8PJVv8VosQ/nxVTuXj2kUeHxTlZBVvh24G19ga7xdiaxlceKg==} + /jest-circus/27.5.1: + resolution: {integrity: sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 17.0.23 + chalk: 4.1.2 + co: 4.6.0 + dedent: 0.7.0 + expect: 27.5.1 + is-generator-fn: 2.1.0 + jest-each: 27.5.1 + jest-matcher-utils: 27.5.1 + jest-message-util: 27.5.1 + jest-runtime: 27.5.1 + jest-snapshot: 27.5.1 + jest-util: 27.5.1 + pretty-format: 27.5.1 + slash: 3.0.0 + stack-utils: 2.0.5 + throat: 6.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-cli/27.5.1: + resolution: {integrity: sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/types': 27.5.1 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.10 + import-local: 3.1.0 + jest-config: 27.5.1 + jest-util: 27.5.1 + jest-validate: 27.5.1 + prompts: 2.4.2 + yargs: 16.2.0 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + dev: true + + /jest-config/27.5.1: + resolution: {integrity: sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + ts-node: '>=9.0.0' + peerDependenciesMeta: + ts-node: + optional: true + dependencies: + '@babel/core': 7.17.9 + '@jest/test-sequencer': 27.5.1 + '@jest/types': 27.5.1 + babel-jest: 27.5.1_@babel+core@7.17.9 + chalk: 4.1.2 + ci-info: 3.3.0 + deepmerge: 4.2.2 + glob: 7.2.0 + graceful-fs: 4.2.10 + jest-circus: 27.5.1 + jest-environment-jsdom: 27.5.1 + jest-environment-node: 27.5.1 + jest-get-type: 27.5.1 + jest-jasmine2: 27.5.1 + jest-regex-util: 27.5.1 + jest-resolve: 27.5.1 + jest-runner: 27.5.1 + jest-util: 27.5.1 + jest-validate: 27.5.1 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 27.5.1 + slash: 3.0.0 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: true + + /jest-diff/27.5.1: + resolution: {integrity: sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + chalk: 4.1.2 + diff-sequences: 27.5.1 + jest-get-type: 27.5.1 + pretty-format: 27.5.1 + dev: true + + /jest-docblock/27.5.1: + resolution: {integrity: sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + detect-newline: 3.1.0 + dev: true + + /jest-each/27.5.1: + resolution: {integrity: sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + chalk: 4.1.2 + jest-get-type: 27.5.1 + jest-util: 27.5.1 + pretty-format: 27.5.1 + dev: true + + /jest-environment-jsdom/27.5.1: + resolution: {integrity: sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.5.1 + '@jest/fake-timers': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 17.0.23 + jest-mock: 27.5.1 + jest-util: 27.5.1 + jsdom: 16.7.0 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: true + + /jest-environment-node/27.5.1: + resolution: {integrity: sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.5.1 + '@jest/fake-timers': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 17.0.23 + jest-mock: 27.5.1 + jest-util: 27.5.1 + dev: true + + /jest-get-type/27.5.1: + resolution: {integrity: sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dev: true /jest-haste-map/26.6.2: @@ -9383,11 +9334,203 @@ packages: fsevents: 2.3.2 dev: true + /jest-haste-map/27.5.1: + resolution: {integrity: sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + '@types/graceful-fs': 4.1.5 + '@types/node': 17.0.23 + anymatch: 3.1.2 + fb-watchman: 2.0.1 + graceful-fs: 4.2.10 + jest-regex-util: 27.5.1 + jest-serializer: 27.5.1 + jest-util: 27.5.1 + jest-worker: 27.5.1 + micromatch: 4.0.5 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /jest-jasmine2/27.5.1: + resolution: {integrity: sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.5.1 + '@jest/source-map': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 17.0.23 + chalk: 4.1.2 + co: 4.6.0 + expect: 27.5.1 + is-generator-fn: 2.1.0 + jest-each: 27.5.1 + jest-matcher-utils: 27.5.1 + jest-message-util: 27.5.1 + jest-runtime: 27.5.1 + jest-snapshot: 27.5.1 + jest-util: 27.5.1 + pretty-format: 27.5.1 + throat: 6.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-leak-detector/27.5.1: + resolution: {integrity: sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + jest-get-type: 27.5.1 + pretty-format: 27.5.1 + dev: true + + /jest-matcher-utils/27.5.1: + resolution: {integrity: sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + chalk: 4.1.2 + jest-diff: 27.5.1 + jest-get-type: 27.5.1 + pretty-format: 27.5.1 + dev: true + + /jest-message-util/27.5.1: + resolution: {integrity: sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@babel/code-frame': 7.16.7 + '@jest/types': 27.5.1 + '@types/stack-utils': 2.0.1 + chalk: 4.1.2 + graceful-fs: 4.2.10 + micromatch: 4.0.5 + pretty-format: 27.5.1 + slash: 3.0.0 + stack-utils: 2.0.5 + dev: true + + /jest-mock/27.5.1: + resolution: {integrity: sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + '@types/node': 17.0.23 + dev: true + + /jest-pnp-resolver/1.2.2_jest-resolve@27.5.1: + resolution: {integrity: sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + dependencies: + jest-resolve: 27.5.1 + dev: true + /jest-regex-util/26.0.0: resolution: {integrity: sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==} engines: {node: '>= 10.14.2'} dev: true + /jest-regex-util/27.5.1: + resolution: {integrity: sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dev: true + + /jest-resolve-dependencies/27.5.1: + resolution: {integrity: sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + jest-regex-util: 27.5.1 + jest-snapshot: 27.5.1 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-resolve/27.5.1: + resolution: {integrity: sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + chalk: 4.1.2 + graceful-fs: 4.2.10 + jest-haste-map: 27.5.1 + jest-pnp-resolver: 1.2.2_jest-resolve@27.5.1 + jest-util: 27.5.1 + jest-validate: 27.5.1 + resolve: 1.22.0 + resolve.exports: 1.1.0 + slash: 3.0.0 + dev: true + + /jest-runner/27.5.1: + resolution: {integrity: sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/console': 27.5.1 + '@jest/environment': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 17.0.23 + chalk: 4.1.2 + emittery: 0.8.1 + graceful-fs: 4.2.10 + jest-docblock: 27.5.1 + jest-environment-jsdom: 27.5.1 + jest-environment-node: 27.5.1 + jest-haste-map: 27.5.1 + jest-leak-detector: 27.5.1 + jest-message-util: 27.5.1 + jest-resolve: 27.5.1 + jest-runtime: 27.5.1 + jest-util: 27.5.1 + jest-worker: 27.5.1 + source-map-support: 0.5.21 + throat: 6.0.1 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: true + + /jest-runtime/27.5.1: + resolution: {integrity: sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.5.1 + '@jest/fake-timers': 27.5.1 + '@jest/globals': 27.5.1 + '@jest/source-map': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + chalk: 4.1.2 + cjs-module-lexer: 1.2.2 + collect-v8-coverage: 1.0.1 + execa: 5.1.1 + glob: 7.2.0 + graceful-fs: 4.2.10 + jest-haste-map: 27.5.1 + jest-message-util: 27.5.1 + jest-mock: 27.5.1 + jest-regex-util: 27.5.1 + jest-resolve: 27.5.1 + jest-snapshot: 27.5.1 + jest-util: 27.5.1 + slash: 3.0.0 + strip-bom: 4.0.0 + transitivePeerDependencies: + - supports-color + dev: true + /jest-serializer/26.6.2: resolution: {integrity: sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==} engines: {node: '>= 10.14.2'} @@ -9396,6 +9539,44 @@ packages: graceful-fs: 4.2.10 dev: true + /jest-serializer/27.5.1: + resolution: {integrity: sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@types/node': 17.0.23 + graceful-fs: 4.2.10 + dev: true + + /jest-snapshot/27.5.1: + resolution: {integrity: sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@babel/core': 7.17.9 + '@babel/generator': 7.17.9 + '@babel/plugin-syntax-typescript': 7.16.7_@babel+core@7.17.9 + '@babel/traverse': 7.17.9 + '@babel/types': 7.17.0 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + '@types/babel__traverse': 7.17.0 + '@types/prettier': 2.6.0 + babel-preset-current-node-syntax: 1.0.1_@babel+core@7.17.9 + chalk: 4.1.2 + expect: 27.5.1 + graceful-fs: 4.2.10 + jest-diff: 27.5.1 + jest-get-type: 27.5.1 + jest-haste-map: 27.5.1 + jest-matcher-utils: 27.5.1 + jest-message-util: 27.5.1 + jest-util: 27.5.1 + natural-compare: 1.4.0 + pretty-format: 27.5.1 + semver: 7.3.7 + transitivePeerDependencies: + - supports-color + dev: true + /jest-util/26.6.2: resolution: {integrity: sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==} engines: {node: '>= 10.14.2'} @@ -9408,6 +9589,43 @@ packages: micromatch: 4.0.5 dev: true + /jest-util/27.5.1: + resolution: {integrity: sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + '@types/node': 17.0.23 + chalk: 4.1.2 + ci-info: 3.3.0 + graceful-fs: 4.2.10 + picomatch: 2.3.1 + dev: true + + /jest-validate/27.5.1: + resolution: {integrity: sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + camelcase: 6.3.0 + chalk: 4.1.2 + jest-get-type: 27.5.1 + leven: 3.1.0 + pretty-format: 27.5.1 + dev: true + + /jest-watcher/27.5.1: + resolution: {integrity: sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/test-result': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 17.0.23 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + jest-util: 27.5.1 + string-length: 4.0.2 + dev: true + /jest-worker/26.6.2: resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} engines: {node: '>= 10.13.0'} @@ -9417,6 +9635,36 @@ packages: supports-color: 7.2.0 dev: true + /jest-worker/27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/node': 17.0.23 + merge-stream: 2.0.0 + supports-color: 8.1.1 + dev: true + + /jest/27.5.1: + resolution: {integrity: sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 27.5.1 + import-local: 3.1.0 + jest-cli: 27.5.1 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + dev: true + /js-base64/2.6.4: resolution: {integrity: sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==} dev: true @@ -9453,13 +9701,50 @@ packages: resolution: {integrity: sha1-peZUwuWi3rXyAdls77yoDA7y9RM=} dev: true - /jsesc/0.5.0: - resolution: {integrity: sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=} - hasBin: true + /jsdom/16.7.0: + resolution: {integrity: sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==} + engines: {node: '>=10'} + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: + optional: true + dependencies: + abab: 2.0.6 + acorn: 8.7.0 + acorn-globals: 6.0.0 + cssom: 0.4.4 + cssstyle: 2.3.0 + data-urls: 2.0.0 + decimal.js: 10.3.1 + domexception: 2.0.1 + escodegen: 2.0.0 + form-data: 3.0.1 + html-encoding-sniffer: 2.0.1 + http-proxy-agent: 4.0.1 + https-proxy-agent: 5.0.0 + is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.0 + parse5: 6.0.1 + saxes: 5.0.1 + symbol-tree: 3.2.4 + tough-cookie: 4.0.0 + w3c-hr-time: 1.0.2 + w3c-xmlserializer: 2.0.0 + webidl-conversions: 6.1.0 + whatwg-encoding: 1.0.5 + whatwg-mimetype: 2.3.0 + whatwg-url: 8.7.0 + ws: 7.5.7 + xml-name-validator: 3.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate dev: true - /jsesc/1.3.0: - resolution: {integrity: sha1-RsP+yMGJKxKwgz25vHYiF226s0s=} + /jsesc/0.5.0: + resolution: {integrity: sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=} hasBin: true dev: true @@ -9493,11 +9778,6 @@ packages: resolution: {integrity: sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=} dev: true - /json5/0.5.1: - resolution: {integrity: sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=} - hasBin: true - dev: true - /json5/1.0.1: resolution: {integrity: sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==} hasBin: true @@ -9536,72 +9816,6 @@ packages: engines: {'0': node >= 0.2.0} dev: true - /jspm-github/0.14.14: - resolution: {integrity: sha512-KqSUVqbyiZAlQ+EPDmRzZ1QUdFs5X8hlvo/bKU9/vyv4MsYcGGD6rOEHzcya0nETinRXQrlCRPfnZt1SzrPotQ==} - dependencies: - bluebird: 3.7.2 - expand-tilde: 1.2.2 - graceful-fs: 4.2.10 - mkdirp: 0.5.6 - netrc: 0.1.4 - request: 2.88.2 - rimraf: 2.7.1 - semver: 5.7.1 - tar-fs: 1.16.3 - which: 1.3.1 - dev: true - - /jspm-npm/0.30.5: - resolution: {integrity: sha512-3ewCGIScE4wXyqRNPg12O/qgs2rrRiLqhD4aJpRySpr+5pyNFIQuBTSbyAwTqAjjBjYEMX1f1KkuUP99Yxz+Xg==} - dependencies: - bluebird: 3.7.2 - buffer-peek-stream: 1.1.0 - graceful-fs: 4.2.10 - mkdirp: 0.5.6 - readdirp: 2.2.1 - request: 2.88.2 - semver: 5.7.1 - tar-fs: 1.16.3 - traceur: 0.0.105 - which: 1.3.1 - dev: true - - /jspm-registry/0.4.4: - resolution: {integrity: sha1-1TFmA1qHzc5YXWK6o5dWhUaZbXA=} - dependencies: - graceful-fs: 4.2.10 - rimraf: 2.7.1 - rsvp: 3.6.2 - semver: 4.3.6 - dev: true - - /jspm/0.17.0-beta.49: - resolution: {integrity: sha512-66Kr63r7VqpwSrmCzpFn0FAwmWH2AmwIkU6Y8rB0ET16zoJo73wxoDfBNPtgT1ONOG7l5gvoUqmT3K4rHtX2Xg==} - hasBin: true - dependencies: - bluebird: 3.7.2 - chalk: 1.1.3 - core-js: 1.2.7 - glob: 6.0.4 - graceful-fs: 4.2.10 - jspm-github: 0.14.14 - jspm-npm: 0.30.5 - jspm-registry: 0.4.4 - liftoff: 2.5.0 - minimatch: 3.1.2 - mkdirp: 0.5.6 - ncp: 2.0.0 - proper-lockfile: 1.2.0 - request: 2.88.2 - rimraf: 2.7.1 - sane: 1.7.0 - semver: 5.7.1 - systemjs: 0.21.4 - systemjs-builder: 0.16.13 - traceur: 0.0.105 - uglify-js: 2.8.29 - dev: true - /jsprim/1.4.2: resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} engines: {node: '>=0.6.0'} @@ -9617,81 +9831,6 @@ packages: engines: {node: '>=8'} dev: true - /karma-jasmine/4.0.2_karma@6.3.18: - resolution: {integrity: sha512-ggi84RMNQffSDmWSyyt4zxzh2CQGwsxvYYsprgyR1j8ikzIduEdOlcLvXjZGwXG/0j41KUXOWsUCBfbEHPWP9g==} - engines: {node: '>= 10'} - peerDependencies: - karma: '*' - dependencies: - jasmine-core: 3.99.1 - karma: 6.3.18 - dev: true - - /karma-jspm/2.2.3: - resolution: {integrity: sha1-uxXNDIwJAkgBE9OWICFXBBWdVQM=} - dependencies: - glob: 7.0.6 - dev: true - - /karma-nyan-reporter/0.2.5_karma@6.3.18: - resolution: {integrity: sha1-qreSXzQWbrzvkwi77hFnn1jdqjE=} - peerDependencies: - karma: '>=0.9' - dependencies: - cli-color: 0.3.3 - karma: 6.3.18 - dev: true - - /karma-phantomjs-launcher/1.0.4_karma@6.3.18: - resolution: {integrity: sha1-0jyjSAG9qYY60xjju0vUBisTrNI=} - peerDependencies: - karma: '>=0.9' - dependencies: - karma: 6.3.18 - lodash: 4.17.21 - phantomjs-prebuilt: 2.1.16 - dev: true - - /karma/6.3.18: - resolution: {integrity: sha512-YEwXVHRILKWKN7uEW9IkgTPjnYGb3YA3MDvlp04xpSRAyrNPoRmsBayLDgHykKAwBm6/mAOckj4xi/1JdQfhzQ==} - engines: {node: '>= 10'} - hasBin: true - dependencies: - '@colors/colors': 1.5.0 - body-parser: 1.20.0 - braces: 3.0.2 - chokidar: 3.5.3 - connect: 3.7.0 - di: 0.0.1 - dom-serialize: 2.2.1 - glob: 7.2.0 - graceful-fs: 4.2.10 - http-proxy: 1.18.1 - isbinaryfile: 4.0.10 - lodash: 4.17.21 - log4js: 6.4.4 - mime: 2.6.0 - minimatch: 3.1.2 - mkdirp: 0.5.6 - qjobs: 1.2.0 - range-parser: 1.2.1 - rimraf: 3.0.2 - socket.io: 4.4.1 - source-map: 0.6.1 - tmp: 0.2.1 - ua-parser-js: 0.7.31 - yargs: 16.2.0 - transitivePeerDependencies: - - bufferutil - - debug - - supports-color - - utf-8-validate - dev: true - - /kew/0.7.0: - resolution: {integrity: sha1-edk9LTM2PW/dKXCzNdkUGtWR15s=} - dev: true - /kind-of/3.2.2: resolution: {integrity: sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=} engines: {node: '>=0.10.0'} @@ -9732,11 +9871,6 @@ packages: engines: {node: '>= 8'} dev: true - /lazy-cache/1.0.4: - resolution: {integrity: sha1-odePw6UEdMuAhF07O24dpJpEbo4=} - engines: {node: '>=0.10.0'} - dev: true - /lazy-universal-dotenv/3.0.1: resolution: {integrity: sha512-prXSYk799h3GY3iOWnC6ZigYzMPjxN2svgjJ9shk7oMadSNX3wXy0B6F32PMJv7qtMnrIbUxoEHzbutvxR2LBQ==} engines: {node: '>=6.0.0', npm: '>=6.0.0', yarn: '>=1.0.0'} @@ -9748,6 +9882,11 @@ packages: dotenv-expand: 5.1.0 dev: true + /leven/3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + dev: true + /levn/0.3.0: resolution: {integrity: sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=} engines: {node: '>= 0.8.0'} @@ -9764,20 +9903,6 @@ packages: type-check: 0.4.0 dev: true - /liftoff/2.5.0: - resolution: {integrity: sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=} - engines: {node: '>= 0.8'} - dependencies: - extend: 3.0.2 - findup-sync: 2.0.0 - fined: 1.2.0 - flagged-respawn: 1.0.1 - is-plain-object: 2.0.4 - object.map: 1.0.1 - rechoir: 0.6.2 - resolve: 1.22.0 - dev: true - /lilconfig/2.0.5: resolution: {integrity: sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==} engines: {node: '>=10'} @@ -9873,24 +9998,6 @@ packages: is-unicode-supported: 0.1.0 dev: true - /log4js/6.4.4: - resolution: {integrity: sha512-ncaWPsuw9Vl1CKA406hVnJLGQKy1OHx6buk8J4rE2lVW+NW5Y82G5/DIloO7NkqLOUtNPEANaWC1kZYVjXssPw==} - engines: {node: '>=8.0'} - dependencies: - date-format: 4.0.6 - debug: 4.3.4 - flatted: 3.2.5 - rfdc: 1.3.0 - streamroller: 3.0.6 - transitivePeerDependencies: - - supports-color - dev: true - - /longest/1.0.1: - resolution: {integrity: sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=} - engines: {node: '>=0.10.0'} - dev: true - /longest/2.0.1: resolution: {integrity: sha1-eB4YMpaqlPbU2RbcM10NF676I/g=} engines: {node: '>=0.10.0'} @@ -9929,12 +10036,6 @@ packages: yallist: 4.0.0 dev: true - /lru-queue/0.1.0: - resolution: {integrity: sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=} - dependencies: - es5-ext: 0.10.60 - dev: true - /make-dir/2.1.0: resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} engines: {node: '>=6'} @@ -9978,13 +10079,6 @@ packages: - supports-color dev: true - /make-iterator/1.0.1: - resolution: {integrity: sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==} - engines: {node: '>=0.10.0'} - dependencies: - kind-of: 6.0.3 - dev: true - /makeerror/1.0.12: resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} dependencies: @@ -10037,10 +10131,6 @@ packages: react: 16.14.0 dev: true - /math-random/1.0.4: - resolution: {integrity: sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==} - dev: true - /md5.js/1.3.5: resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} dependencies: @@ -10098,18 +10188,6 @@ packages: fs-monkey: 1.0.3 dev: true - /memoizee/0.3.10: - resolution: {integrity: sha1-TsoNiu057J0Bf0xcLy9kMvQuXI8=} - dependencies: - d: 0.1.1 - es5-ext: 0.10.60 - es6-weak-map: 0.1.4 - event-emitter: 0.3.5 - lru-queue: 0.1.0 - next-tick: 0.2.2 - timers-ext: 0.1.7 - dev: true - /memoizerific/1.11.3: resolution: {integrity: sha1-fIekZGREwy11Q4VwkF8tvRsagFo=} dependencies: @@ -10192,10 +10270,6 @@ packages: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} dev: true - /merge/1.2.1: - resolution: {integrity: sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==} - dev: true - /merge/2.1.1: resolution: {integrity: sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==} dev: true @@ -10214,25 +10288,6 @@ packages: resolution: {integrity: sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g==} dev: true - /micromatch/2.3.11: - resolution: {integrity: sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=} - engines: {node: '>=0.10.0'} - dependencies: - 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.4 - dev: true - /micromatch/3.1.10: resolution: {integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==} engines: {node: '>=0.10.0'} @@ -10515,11 +10570,6 @@ packages: resolution: {integrity: sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=} dev: true - /ncp/2.0.0: - resolution: {integrity: sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=} - hasBin: true - dev: true - /negotiator/0.6.3: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} @@ -10533,18 +10583,6 @@ packages: resolution: {integrity: sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw==} dev: true - /netrc/0.1.4: - resolution: {integrity: sha1-a+lPysqNd63gqWcNxGCRTJRHJEQ=} - dev: true - - /next-tick/0.2.2: - resolution: {integrity: sha1-ddpKkn7liH45BliABltzNkE7MQ0=} - dev: true - - /next-tick/1.1.0: - resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} - dev: true - /nice-try/1.0.5: resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} dev: true @@ -10740,6 +10778,10 @@ packages: resolution: {integrity: sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=} dev: true + /nwsapi/2.2.0: + resolution: {integrity: sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==} + dev: true + /oauth-sign/0.9.0: resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} dev: true @@ -10784,16 +10826,6 @@ packages: object-keys: 1.1.1 dev: true - /object.defaults/1.1.0: - resolution: {integrity: sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=} - engines: {node: '>=0.10.0'} - dependencies: - array-each: 1.0.1 - array-slice: 1.1.0 - for-own: 1.0.0 - isobject: 3.0.1 - dev: true - /object.entries/1.1.5: resolution: {integrity: sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==} engines: {node: '>= 0.4'} @@ -10821,22 +10853,6 @@ packages: es-abstract: 1.19.5 dev: true - /object.map/1.0.1: - resolution: {integrity: sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=} - engines: {node: '>=0.10.0'} - dependencies: - for-own: 1.0.0 - make-iterator: 1.0.1 - dev: true - - /object.omit/2.0.1: - resolution: {integrity: sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=} - engines: {node: '>=0.10.0'} - dependencies: - for-own: 0.1.5 - is-extendable: 0.1.1 - dev: true - /object.pick/1.3.0: resolution: {integrity: sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=} engines: {node: '>=0.10.0'} @@ -10860,13 +10876,6 @@ packages: ee-first: 1.1.1 dev: true - /on-finished/2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} - dependencies: - ee-first: 1.1.1 - dev: true - /on-headers/1.0.2: resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} engines: {node: '>= 0.8'} @@ -10943,11 +10952,6 @@ packages: resolution: {integrity: sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=} dev: true - /os-homedir/1.0.2: - resolution: {integrity: sha1-/7xJiDNuDoM94MFox+8VISGqf7M=} - engines: {node: '>=0.10.0'} - dev: true - /os-tmpdir/1.0.2: resolution: {integrity: sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=} engines: {node: '>=0.10.0'} @@ -11096,25 +11100,6 @@ packages: is-hexadecimal: 1.0.4 dev: true - /parse-filepath/1.0.2: - resolution: {integrity: sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=} - engines: {node: '>=0.8'} - dependencies: - is-absolute: 1.0.0 - map-cache: 0.2.2 - path-root: 0.1.1 - dev: true - - /parse-glob/3.0.4: - resolution: {integrity: sha1-ssN2z7EfNVE7rdFz7wu246OIORw=} - engines: {node: '>=0.10.0'} - dependencies: - glob-base: 0.3.0 - is-dotfile: 1.0.3 - is-extglob: 1.0.0 - is-glob: 2.0.1 - dev: true - /parse-json/5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} @@ -11188,18 +11173,6 @@ packages: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} dev: true - /path-root-regex/0.1.2: - resolution: {integrity: sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=} - engines: {node: '>=0.10.0'} - dev: true - - /path-root/0.1.1: - resolution: {integrity: sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=} - engines: {node: '>=0.10.0'} - dependencies: - path-root-regex: 0.1.2 - dev: true - /path-to-regexp/0.1.7: resolution: {integrity: sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=} dev: true @@ -11227,31 +11200,10 @@ packages: sha.js: 2.4.11 dev: true - /pend/1.2.0: - resolution: {integrity: sha1-elfrVQpng/kRUzH89GY9XI4AelA=} - dev: true - /performance-now/2.1.0: resolution: {integrity: sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=} dev: true - /phantomjs-prebuilt/2.1.16: - resolution: {integrity: sha1-79ISpKOWbTZHaE6ouniFSb4q7+8=} - deprecated: this package is now deprecated - hasBin: true - requiresBuild: true - dependencies: - es6-promise: 4.2.8 - extract-zip: 1.7.0 - fs-extra: 1.0.0 - hasha: 2.2.0 - kew: 0.7.0 - progress: 1.1.8 - request: 2.88.2 - request-progress: 2.0.1 - which: 1.3.1 - dev: true - /picocolors/0.2.1: resolution: {integrity: sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==} dev: true @@ -11275,18 +11227,6 @@ packages: engines: {node: '>=6'} dev: true - /pinkie-promise/2.0.1: - resolution: {integrity: sha1-ITXW36ejWMBprJsXh3YogihFD/o=} - engines: {node: '>=0.10.0'} - dependencies: - pinkie: 2.0.4 - dev: true - - /pinkie/2.0.4: - resolution: {integrity: sha1-clVrgM+g1IqXToDnckjoDtT3+HA=} - engines: {node: '>=0.10.0'} - dev: true - /pirates/4.0.5: resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==} engines: {node: '>= 6'} @@ -11749,11 +11689,6 @@ packages: engines: {node: '>= 0.8.0'} dev: true - /preserve/0.2.0: - resolution: {integrity: sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=} - engines: {node: '>=0.10.0'} - dev: true - /prettier/2.3.0: resolution: {integrity: sha512-kXtO4s0Lz/DW/IJ9QdWhAf7/NmPWQXkFr/r/WkR3vyI+0v8amTDxiaQSLzs8NBlytfLWX/7uQUMIW677yLKl4w==} engines: {node: '>=10.13.0'} @@ -11767,6 +11702,15 @@ packages: renderkid: 2.0.7 dev: true + /pretty-format/27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + dev: true + /pretty-hrtime/1.0.3: resolution: {integrity: sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=} engines: {node: '>= 0.8'} @@ -11777,11 +11721,6 @@ packages: engines: {node: '>=6'} dev: true - /private/0.1.8: - resolution: {integrity: sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==} - engines: {node: '>= 0.6'} - dev: true - /process-nextick-args/2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} dev: true @@ -11791,11 +11730,6 @@ packages: engines: {node: '>= 0.6.0'} dev: true - /progress/1.1.8: - resolution: {integrity: sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=} - engines: {node: '>=0.4.0'} - dev: true - /promise-inflight/1.0.1: resolution: {integrity: sha1-mEcocL8igTL8vdhoEputEsPAKeM=} dev: true @@ -11845,15 +11779,6 @@ packages: react-is: 16.13.1 dev: true - /proper-lockfile/1.2.0: - resolution: {integrity: sha1-zv9d2J0+XxD7deHo52vHWAGlnDQ=} - dependencies: - err-code: 1.1.2 - extend: 3.0.2 - graceful-fs: 4.2.10 - retry: 0.10.1 - dev: true - /property-information/5.6.0: resolution: {integrity: sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==} dependencies: @@ -11887,13 +11812,6 @@ packages: safe-buffer: 5.2.1 dev: true - /pump/1.0.3: - resolution: {integrity: sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==} - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - dev: true - /pump/2.0.1: resolution: {integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==} dependencies: @@ -11934,11 +11852,6 @@ packages: engines: {node: '>=0.6.0', teleport: '>=0.2.0'} dev: true - /qjobs/1.2.0: - resolution: {integrity: sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==} - engines: {node: '>=0.9'} - dev: true - /qs/6.10.3: resolution: {integrity: sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==} engines: {node: '>=0.6'} @@ -11991,15 +11904,6 @@ packages: resolution: {integrity: sha1-oAGr7bP/YQd9T/HVd9RN536NCjU=} dev: true - /randomatic/3.1.1: - resolution: {integrity: sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==} - engines: {node: '>= 0.10.0'} - dependencies: - is-number: 4.0.0 - kind-of: 6.0.3 - math-random: 1.0.4 - dev: true - /randombytes/2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} dependencies: @@ -12013,27 +11917,17 @@ packages: safe-buffer: 5.2.1 dev: true - /range-parser/1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} - dev: true - - /raw-body/2.4.3: - resolution: {integrity: sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==} - engines: {node: '>= 0.8'} - dependencies: - bytes: 3.1.2 - http-errors: 1.8.1 - iconv-lite: 0.4.24 - unpipe: 1.0.0 + /range-parser/1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} dev: true - /raw-body/2.5.1: - resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} + /raw-body/2.4.3: + resolution: {integrity: sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==} engines: {node: '>= 0.8'} dependencies: bytes: 3.1.2 - http-errors: 2.0.0 + http-errors: 1.8.1 iconv-lite: 0.4.24 unpipe: 1.0.0 dev: true @@ -12384,6 +12278,7 @@ packages: micromatch: 3.1.10 readable-stream: 2.3.7 dev: true + optional: true /readdirp/3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} @@ -12392,13 +12287,6 @@ packages: picomatch: 2.3.1 dev: true - /rechoir/0.6.2: - resolution: {integrity: sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=} - engines: {node: '>= 0.10'} - dependencies: - resolve: 1.22.0 - dev: true - /redent/3.0.0: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} engines: {node: '>=8'} @@ -12448,13 +12336,6 @@ packages: '@babel/runtime': 7.17.9 dev: true - /regex-cache/0.4.4: - resolution: {integrity: sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==} - engines: {node: '>=0.10.0'} - dependencies: - is-equal-shallow: 0.1.3 - dev: true - /regex-not/1.0.2: resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==} engines: {node: '>=0.10.0'} @@ -12592,19 +12473,6 @@ packages: engines: {node: '>=0.10'} dev: true - /repeating/2.0.1: - resolution: {integrity: sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=} - engines: {node: '>=0.10.0'} - dependencies: - is-finite: 1.1.0 - dev: true - - /request-progress/2.0.1: - resolution: {integrity: sha1-XTa7V5YcZzqlt4jbyBQf3yO0Tgg=} - dependencies: - throttleit: 1.0.0 - dev: true - /request/2.88.2: resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==} engines: {node: '>= 6'} @@ -12637,8 +12505,11 @@ packages: engines: {node: '>=0.10.0'} dev: true - /requires-port/1.0.0: - resolution: {integrity: sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=} + /resolve-cwd/3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + dependencies: + resolve-from: 5.0.0 dev: true /resolve-dir/1.0.1: @@ -12671,6 +12542,11 @@ packages: deprecated: https://github.com/lydell/resolve-url#deprecated dev: true + /resolve.exports/1.1.0: + resolution: {integrity: sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==} + engines: {node: '>=10'} + dev: true + /resolve/1.22.0: resolution: {integrity: sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==} hasBin: true @@ -12701,10 +12577,6 @@ packages: engines: {node: '>=0.12'} dev: true - /retry/0.10.1: - resolution: {integrity: sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=} - dev: true - /retry/0.12.0: resolution: {integrity: sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=} engines: {node: '>= 4'} @@ -12715,17 +12587,6 @@ packages: engines: {iojs: '>=1.0.0', node: '>=0.10.0'} dev: true - /rfdc/1.3.0: - resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} - dev: true - - /right-align/0.1.3: - resolution: {integrity: sha1-YTObci/mo1FWiSENJOFMlhSGE+8=} - engines: {node: '>=0.10.0'} - dependencies: - align-text: 0.1.4 - dev: true - /rimraf/2.7.1: resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} hasBin: true @@ -12758,14 +12619,6 @@ packages: rollup: 2.70.1 dev: true - /rollup/0.58.2: - resolution: {integrity: sha512-RZVvCWm9BHOYloaE6LLiE/ibpjv1CmI8F8k0B0Cp+q1eezo3cswszJH1DN0djgzSlo0hjuuCmyeI+1XOYLl4wg==} - hasBin: true - dependencies: - '@types/estree': 0.0.38 - '@types/node': 17.0.23 - dev: true - /rollup/2.70.1: resolution: {integrity: sha512-CRYsI5EuzLbXdxC6RnYhOuRdtz4bhejPMSWjsFLfVM/7w/85n2szZv6yExqUXsBdz5KT8eoubeyDUDjhLHEslA==} engines: {node: '>=10.0.0'} @@ -12774,11 +12627,6 @@ packages: fsevents: 2.3.2 dev: true - /rsvp/3.6.2: - resolution: {integrity: sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==} - engines: {node: 0.12.* || 4.* || 6.* || >= 7.*} - dev: true - /rsvp/4.8.5: resolution: {integrity: sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==} engines: {node: 6.* || >= 7.*} @@ -12836,21 +12684,6 @@ packages: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} dev: true - /sane/1.7.0: - resolution: {integrity: sha1-s1ebzLRclM8gNVzIESSZDf00bjA=} - engines: {node: '>=0.6.0'} - deprecated: some dependency vulnerabilities fixed, support for node < 10 dropped, and newer ECMAScript syntax/features added - hasBin: true - dependencies: - anymatch: 1.3.2 - exec-sh: 0.2.2 - fb-watchman: 2.0.1 - minimatch: 3.1.2 - minimist: 1.2.6 - walker: 1.0.8 - watch: 0.10.0 - dev: true - /sane/4.1.0: resolution: {integrity: sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==} engines: {node: 6.* || 8.* || >= 10.*} @@ -12914,6 +12747,13 @@ packages: source-map-js: 1.0.2 dev: true + /saxes/5.0.1: + resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==} + engines: {node: '>=10'} + dependencies: + xmlchars: 2.2.0 + dev: true + /scheduler/0.19.1: resolution: {integrity: sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==} dependencies: @@ -12964,11 +12804,6 @@ packages: source-map: 0.7.3 dev: true - /semver/4.3.6: - resolution: {integrity: sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=} - hasBin: true - dev: true - /semver/5.7.1: resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} hasBin: true @@ -13139,11 +12974,6 @@ packages: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} dev: true - /slash/1.0.0: - resolution: {integrity: sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=} - engines: {node: '>=0.10.0'} - dev: true - /slash/2.0.0: resolution: {integrity: sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==} engines: {node: '>=6'} @@ -13189,37 +13019,6 @@ packages: use: 3.1.1 dev: true - /socket.io-adapter/2.3.3: - resolution: {integrity: sha512-Qd/iwn3VskrpNO60BeRyCyr8ZWw9CPZyitW4AQwmRZ8zCiyDiL+znRnWX6tDHXnWn1sJrM1+b6Mn6wEDJJ4aYQ==} - dev: true - - /socket.io-parser/4.0.4: - resolution: {integrity: sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==} - engines: {node: '>=10.0.0'} - dependencies: - '@types/component-emitter': 1.2.11 - component-emitter: 1.3.0 - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: true - - /socket.io/4.4.1: - resolution: {integrity: sha512-s04vrBswdQBUmuWJuuNTmXUVJhP0cVky8bBDhdkf8y0Ptsu7fKU2LuLbts9g+pdmAdyMMn8F/9Mf1/wbtUN0fg==} - engines: {node: '>=10.0.0'} - dependencies: - accepts: 1.3.8 - base64id: 2.0.0 - debug: 4.3.4 - engine.io: 6.1.3 - socket.io-adapter: 2.3.3 - socket.io-parser: 4.0.4 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: true - /socks-proxy-agent/6.1.1: resolution: {integrity: sha512-t8J0kG3csjA4g6FTbsMOWws+7R7vuRC8aQ/wy3/1OWmsgwA68zs/+cExQ0koSitUDXqhufF/YJr9wtNMZHw5Ew==} engines: {node: '>= 10'} @@ -13259,16 +13058,12 @@ packages: urix: 0.1.0 dev: true - /source-map-support/0.2.10: - resolution: {integrity: sha1-6lo5AKHByyUJagrozFwrSxDe09w=} - dependencies: - source-map: 0.1.32 - dev: true - - /source-map-support/0.4.18: - resolution: {integrity: sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==} + /source-map-resolve/0.6.0: + resolution: {integrity: sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==} + deprecated: See https://github.com/lydell/source-map-resolve#deprecated dependencies: - source-map: 0.5.7 + atob: 2.1.2 + decode-uri-component: 0.2.0 dev: true /source-map-support/0.5.21: @@ -13283,13 +13078,6 @@ packages: deprecated: See https://github.com/lydell/source-map-url#deprecated dev: true - /source-map/0.1.32: - resolution: {integrity: sha1-yLbBZ3l7pHQKjqMyUhYv8IWRsmY=} - engines: {node: '>=0.8.0'} - dependencies: - amdefine: 1.0.1 - dev: true - /source-map/0.5.7: resolution: {integrity: sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=} engines: {node: '>=0.10.0'} @@ -13381,6 +13169,13 @@ packages: resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} dev: true + /stack-utils/2.0.5: + resolution: {integrity: sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==} + engines: {node: '>=10'} + dependencies: + escape-string-regexp: 2.0.0 + dev: true + /state-toggle/1.0.3: resolution: {integrity: sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==} dev: true @@ -13398,11 +13193,6 @@ packages: engines: {node: '>= 0.6'} dev: true - /statuses/2.0.1: - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} - engines: {node: '>= 0.8'} - dev: true - /stdout-stream/1.4.1: resolution: {integrity: sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==} dependencies: @@ -13441,15 +13231,12 @@ packages: resolution: {integrity: sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==} dev: true - /streamroller/3.0.6: - resolution: {integrity: sha512-Qz32plKq/MZywYyhEatxyYc8vs994Gz0Hu2MSYXXLD233UyPeIeRBZARIIGwFer4Mdb8r3Y2UqKkgyDghM6QCg==} - engines: {node: '>=8.0'} + /string-length/4.0.2: + resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} + engines: {node: '>=10'} dependencies: - date-format: 4.0.6 - debug: 4.3.4 - fs-extra: 10.0.1 - transitivePeerDependencies: - - supports-color + char-regex: 1.0.2 + strip-ansi: 6.0.1 dev: true /string-width/2.1.1: @@ -13650,6 +13437,21 @@ packages: has-flag: 4.0.0 dev: true + /supports-color/8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-hyperlinks/2.2.0: + resolution: {integrity: sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + supports-color: 7.2.0 + dev: true + /supports-preserve-symlinks-flag/1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} @@ -13669,6 +13471,10 @@ packages: stable: 0.1.8 dev: true + /symbol-tree/3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + dev: true + /symbol.prototype.description/1.0.5: resolution: {integrity: sha512-x738iXRYsrAt9WBhRCVG5BtIC3B7CUkFwbHW2zOvGtwM33s7JjrCDyq8V0zgMYVb5ymsL8+qkzzpANH63CPQaQ==} engines: {node: '>= 0.11.15'} @@ -13683,65 +13489,11 @@ packages: resolution: {integrity: sha512-k8uzYIkIVwmT+TcglpdN50pS2y1BDcUnBPK9iJeGu0Pl1lOI8pD6wtzgw91Pjpe+RxtTncw32tLxs/R0yNL2Mg==} dev: true - /systemjs-builder/0.16.13: - resolution: {integrity: sha512-ual5RmcBt7yeXrmpEQIHmITZpNIf289hCTixo/gSOQpdVLLC5v7/W//qn3ZgK6YNdUBptS4szaGVrh7LxOqSHg==} - dependencies: - babel-core: 6.26.3 - babel-plugin-syntax-dynamic-import: 6.18.0 - babel-plugin-transform-amd-system-wrapper: 0.3.7 - babel-plugin-transform-cjs-system-wrapper: 0.6.2 - babel-plugin-transform-es2015-modules-systemjs: 6.24.1 - babel-plugin-transform-global-system-wrapper: 0.3.4 - babel-plugin-transform-system-register: 0.0.1 - bluebird: 3.7.2 - data-uri-to-buffer: 0.0.4 - es6-template-strings: 2.0.1 - glob: 7.2.0 - mkdirp: 0.5.6 - rollup: 0.58.2 - source-map: 0.5.7 - systemjs: 0.19.47 - traceur: 0.0.105 - uglify-js: 2.8.29 - dev: true - - /systemjs/0.19.47: - resolution: {integrity: sha1-yMk5NxgPP1SBx2nNJyB2P7SjHG8=} - dependencies: - when: 3.7.8 - dev: true - - /systemjs/0.21.4: - resolution: {integrity: sha512-l1O8boHjAIY5UG74Xk4B63LK9QbFxv/FkQa//GGGWaTeQoMhTsWnFrYwPWBScSF4xQFMO/+v9QB4i633h8Oytw==} - dev: true - /tapable/1.1.3: resolution: {integrity: sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==} engines: {node: '>=6'} dev: true - /tar-fs/1.16.3: - resolution: {integrity: sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw==} - dependencies: - chownr: 1.1.4 - mkdirp: 0.5.6 - pump: 1.0.3 - tar-stream: 1.6.2 - dev: true - - /tar-stream/1.6.2: - resolution: {integrity: sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==} - engines: {node: '>= 0.8.0'} - dependencies: - bl: 1.2.3 - buffer-alloc: 1.2.0 - end-of-stream: 1.4.4 - fs-constants: 1.0.0 - readable-stream: 2.3.7 - to-buffer: 1.1.1 - xtend: 4.0.2 - dev: true - /tar/6.1.11: resolution: {integrity: sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==} engines: {node: '>= 10'} @@ -13767,6 +13519,14 @@ packages: memoizerific: 1.11.3 dev: true + /terminal-link/2.1.1: + resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==} + engines: {node: '>=8'} + dependencies: + ansi-escapes: 4.3.2 + supports-hyperlinks: 2.2.0 + dev: true + /terser-webpack-plugin/1.4.5_webpack@4.46.0: resolution: {integrity: sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==} engines: {node: '>= 6.9.0'} @@ -13855,15 +13615,15 @@ packages: any-promise: 1.3.0 dev: true + /throat/6.0.1: + resolution: {integrity: sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==} + dev: true + /throttle-debounce/3.0.1: resolution: {integrity: sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==} engines: {node: '>=10'} dev: true - /throttleit/1.0.0: - resolution: {integrity: sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=} - dev: true - /through/2.3.8: resolution: {integrity: sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=} dev: true @@ -13888,13 +13648,6 @@ packages: setimmediate: 1.0.5 dev: true - /timers-ext/0.1.7: - resolution: {integrity: sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==} - dependencies: - es5-ext: 0.10.60 - next-tick: 1.1.0 - dev: true - /tmp/0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} @@ -13902,13 +13655,6 @@ packages: os-tmpdir: 1.0.2 dev: true - /tmp/0.2.1: - resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==} - engines: {node: '>=8.17.0'} - dependencies: - rimraf: 3.0.2 - dev: true - /tmpl/1.0.5: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} dev: true @@ -13917,10 +13663,6 @@ packages: resolution: {integrity: sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=} dev: true - /to-buffer/1.1.1: - resolution: {integrity: sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==} - dev: true - /to-fast-properties/1.0.3: resolution: {integrity: sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=} engines: {node: '>=0.10.0'} @@ -13980,20 +13722,24 @@ packages: punycode: 2.1.1 dev: true + /tough-cookie/4.0.0: + resolution: {integrity: sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==} + engines: {node: '>=6'} + dependencies: + psl: 1.8.0 + punycode: 2.1.1 + universalify: 0.1.2 + dev: true + /tr46/0.0.3: resolution: {integrity: sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=} dev: true - /traceur/0.0.105: - resolution: {integrity: sha1-XPne6D1rd4YcPWxE1ThZrterBHk=} - engines: {node: '>=0.10'} - hasBin: true + /tr46/2.1.0: + resolution: {integrity: sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==} + engines: {node: '>=8'} dependencies: - commander: 2.9.0 - glob: 5.0.15 - rsvp: 3.6.2 - semver: 4.3.6 - source-map-support: 0.2.10 + punycode: 2.1.1 dev: true /trim-newlines/3.0.1: @@ -14006,11 +13752,6 @@ packages: engines: {node: '>=12'} dev: true - /trim-right/1.0.1: - resolution: {integrity: sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=} - engines: {node: '>=0.10.0'} - dev: true - /trim-trailing-lines/1.1.4: resolution: {integrity: sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==} dev: true @@ -14112,6 +13853,11 @@ packages: prelude-ls: 1.2.1 dev: true + /type-detect/4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: true + /type-fest/0.18.1: resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} engines: {node: '>=10'} @@ -14150,14 +13896,6 @@ packages: mime-types: 2.1.35 dev: true - /type/1.2.0: - resolution: {integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==} - dev: true - - /type/2.6.0: - resolution: {integrity: sha512-eiDBDOmkih5pMbo9OqsqPRGMljLodLcwd5XD5JbtNB0o89xZAwynY9EdCDsJU7LtcVCClu9DvM7/0Ep1hYX3EQ==} - dev: true - /typedarray-to-buffer/3.1.5: resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} dependencies: @@ -14174,21 +13912,6 @@ packages: hasBin: true dev: true - /ua-parser-js/0.7.31: - resolution: {integrity: sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==} - dev: true - - /uglify-js/2.8.29: - resolution: {integrity: sha1-KcVzMUgFe7Th913zW3qcty5qWd0=} - engines: {node: '>=0.8.0'} - hasBin: true - dependencies: - source-map: 0.5.7 - yargs: 3.10.0 - optionalDependencies: - uglify-to-browserify: 1.0.2 - dev: true - /uglify-js/3.15.4: resolution: {integrity: sha512-vMOPGDuvXecPs34V74qDKk4iJ/SN4vL3Ow/23ixafENYvtrNvtbcgUeugTcUGRGsOF/5fU8/NYSL5Hyb3l1OJA==} engines: {node: '>=0.8.0'} @@ -14197,12 +13920,6 @@ packages: dev: true optional: true - /uglify-to-browserify/1.0.2: - resolution: {integrity: sha1-bgkk1r2mta/jSeOabWMoUKD4grc=} - requiresBuild: true - dev: true - optional: true - /unbox-primitive/1.0.1: resolution: {integrity: sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==} dependencies: @@ -14212,11 +13929,6 @@ packages: which-boxed-primitive: 1.0.2 dev: true - /unc-path-regex/0.1.2: - resolution: {integrity: sha1-5z3T17DXxe2G+6xrCufYxqadUPo=} - engines: {node: '>=0.10.0'} - dev: true - /unfetch/4.2.0: resolution: {integrity: sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==} dev: true @@ -14513,6 +14225,15 @@ packages: resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==} dev: true + /v8-to-istanbul/8.1.1: + resolution: {integrity: sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==} + engines: {node: '>=10.12.0'} + dependencies: + '@types/istanbul-lib-coverage': 2.0.4 + convert-source-map: 1.8.0 + source-map: 0.7.3 + dev: true + /validate-npm-package-license/3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} dependencies: @@ -14558,9 +14279,17 @@ packages: resolution: {integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==} dev: true - /void-elements/2.0.1: - resolution: {integrity: sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=} - engines: {node: '>=0.10.0'} + /w3c-hr-time/1.0.2: + resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} + dependencies: + browser-process-hrtime: 1.0.0 + dev: true + + /w3c-xmlserializer/2.0.0: + resolution: {integrity: sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==} + engines: {node: '>=10'} + dependencies: + xml-name-validator: 3.0.0 dev: true /walker/1.0.8: @@ -14575,11 +14304,6 @@ packages: loose-envify: 1.4.0 dev: true - /watch/0.10.0: - resolution: {integrity: sha1-d3mLLaD5kQ1ZXxrOWwwiWFIfIdw=} - engines: {'0': node >=0.1.95} - dev: true - /watchpack-chokidar2/2.0.1: resolution: {integrity: sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==} requiresBuild: true @@ -14620,6 +14344,16 @@ packages: resolution: {integrity: sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=} dev: true + /webidl-conversions/5.0.0: + resolution: {integrity: sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==} + engines: {node: '>=8'} + dev: true + + /webidl-conversions/6.1.0: + resolution: {integrity: sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==} + engines: {node: '>=10.4'} + dev: true + /webpack-dev-middleware/3.7.3_webpack@4.46.0: resolution: {integrity: sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==} engines: {node: '>= 6'} @@ -14711,6 +14445,16 @@ packages: webpack-sources: 1.4.3 dev: true + /whatwg-encoding/1.0.5: + resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==} + dependencies: + iconv-lite: 0.4.24 + dev: true + + /whatwg-mimetype/2.3.0: + resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} + dev: true + /whatwg-url/5.0.0: resolution: {integrity: sha1-lmRU6HZUYuN2RNNib2dCzotwll0=} dependencies: @@ -14718,8 +14462,13 @@ packages: webidl-conversions: 3.0.1 dev: true - /when/3.7.8: - resolution: {integrity: sha1-xxMLan6gRpPoQs3J56Hyqjmjn4I=} + /whatwg-url/8.7.0: + resolution: {integrity: sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==} + engines: {node: '>=10'} + dependencies: + lodash: 4.17.21 + tr46: 2.1.0 + webidl-conversions: 6.1.0 dev: true /which-boxed-primitive/1.0.2: @@ -14760,21 +14509,11 @@ packages: string-width: 4.2.3 dev: true - /window-size/0.1.0: - resolution: {integrity: sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=} - engines: {node: '>= 0.8.0'} - dev: true - /word-wrap/1.2.3: resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} engines: {node: '>=0.10.0'} dev: true - /wordwrap/0.0.2: - resolution: {integrity: sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=} - engines: {node: '>=0.4.0'} - dev: true - /wordwrap/1.0.0: resolution: {integrity: sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=} dev: true @@ -14813,6 +14552,19 @@ packages: typedarray-to-buffer: 3.1.5 dev: true + /ws/7.5.7: + resolution: {integrity: sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: true + /ws/8.2.3: resolution: {integrity: sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==} engines: {node: '>=10.0.0'} @@ -14826,6 +14578,14 @@ packages: optional: true dev: true + /xml-name-validator/3.0.0: + resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} + dev: true + + /xmlchars/2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + dev: true + /xtend/4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} @@ -14889,22 +14649,6 @@ packages: yargs-parser: 21.0.1 dev: true - /yargs/3.10.0: - resolution: {integrity: sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=} - dependencies: - camelcase: 1.2.1 - cliui: 2.1.0 - decamelize: 1.2.0 - window-size: 0.1.0 - dev: true - - /yauzl/2.10.0: - resolution: {integrity: sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=} - dependencies: - buffer-crc32: 0.2.13 - fd-slicer: 1.1.0 - dev: true - /yn/3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} diff --git a/src/axes/axis.spec.js b/src/axes/axis.spec.js index bf60703a..70c8818a 100644 --- a/src/axes/axis.spec.js +++ b/src/axes/axis.spec.js @@ -2,93 +2,95 @@ import {Svg} from '../svg/svg'; import {EventEmitter} from '../event/event-emitter'; import {Axis, axisUnits} from './axis'; -describe('Axis', () => { - let ticks, chartRect, chartOptions, eventEmitter, gridGroup, labelGroup; +describe('Axes', () => { + describe('Axis', () => { + let ticks, chartRect, chartOptions, eventEmitter, gridGroup, labelGroup; - beforeEach(() => { - eventEmitter = new EventEmitter(); - gridGroup = new Svg('g'); - labelGroup = new Svg('g'); - ticks = [1, 2]; - chartRect = { - padding: { - bottom: 5, - left: 10, - right: 15, - top: 15 - }, - y2: 15, - y1: 250, - x1: 50, - x2: 450, - width: function() { - return this.x2 - this.x1; - }, - height: function() { - return this.y1 - this.y2; - } - }; + beforeEach(() => { + eventEmitter = new EventEmitter(); + gridGroup = new Svg('g'); + labelGroup = new Svg('g'); + ticks = [1, 2]; + chartRect = { + padding: { + bottom: 5, + left: 10, + right: 15, + top: 15 + }, + y2: 15, + y1: 250, + x1: 50, + x2: 450, + width() { + return this.x2 - this.x1; + }, + height() { + return this.y1 - this.y2; + } + }; - chartOptions = { - axisX: { - offset: 30, - position: 'end', - labelOffset: { - x: 0, - y: 0 + chartOptions = { + axisX: { + offset: 30, + position: 'end', + labelOffset: { + x: 0, + y: 0 + }, + showLabel: true, + showGrid: true }, - showLabel: true, - showGrid: true - }, - classNames: { - label: 'ct-label', - labelGroup: 'ct-labels', - grid: 'ct-grid', - gridGroup: 'ct-grids', - vertical: 'ct-vertical', - horizontal: 'ct-horizontal', - start: 'ct-start', - end: 'ct-end' - } - }; - }); + classNames: { + label: 'ct-label', + labelGroup: 'ct-labels', + grid: 'ct-grid', + gridGroup: 'ct-grids', + vertical: 'ct-vertical', + horizontal: 'ct-horizontal', + start: 'ct-start', + end: 'ct-end' + } + }; + }); - it('should skip all grid lines and labels for interpolated value of null', () => { - chartOptions.axisX.labelInterpolationFnc = - (value, index) => index === 0 ? null : value; + it('should skip all grid lines and labels for interpolated value of null', () => { + chartOptions.axisX.labelInterpolationFnc = + (value, index) => index === 0 ? null : value; - const axis = new Axis(); - axis.initialize(axisUnits.x, chartRect, ticks, null); - axis.projectValue = (value) => value; + const axis = new Axis(); + axis.initialize(axisUnits.x, chartRect, ticks, null); + axis.projectValue = (value) => value; - axis.createGridAndLabels(gridGroup, labelGroup, true, chartOptions, eventEmitter); - expect(gridGroup.querySelectorAll('.ct-grid').svgElements.length).toBe(1); - expect(labelGroup.querySelectorAll('.ct-label').svgElements.length).toBe(1); - }); + axis.createGridAndLabels(gridGroup, labelGroup, true, chartOptions, eventEmitter); + expect(gridGroup.querySelectorAll('.ct-grid').svgElements.length).toBe(1); + expect(labelGroup.querySelectorAll('.ct-label').svgElements.length).toBe(1); + }); - it('should skip all grid lines and labels for interpolated value of undefined', function() { - chartOptions.axisX.labelInterpolationFnc = - (value, index) => index === 0 ? undefined : value; + it('should skip all grid lines and labels for interpolated value of undefined', () => { + chartOptions.axisX.labelInterpolationFnc = + (value, index) => index === 0 ? undefined : value; - const axis = new Axis(); - axis.initialize(axisUnits.x, chartRect, ticks, null); - axis.projectValue = (value) => value; + const axis = new Axis(); + axis.initialize(axisUnits.x, chartRect, ticks, null); + axis.projectValue = (value) => value; - axis.createGridAndLabels(gridGroup, labelGroup, true, chartOptions, eventEmitter); - expect(gridGroup.querySelectorAll('.ct-grid').svgElements.length).toBe(1); - expect(labelGroup.querySelectorAll('.ct-label').svgElements.length).toBe(1); - }); + axis.createGridAndLabels(gridGroup, labelGroup, true, chartOptions, eventEmitter); + expect(gridGroup.querySelectorAll('.ct-grid').svgElements.length).toBe(1); + expect(labelGroup.querySelectorAll('.ct-label').svgElements.length).toBe(1); + }); - it('should include all grid lines and labels for interpolated value of empty strings', function() { - chartOptions.axisX.labelInterpolationFnc = - (value, index) => index === 0 ? '' : value; + it('should include all grid lines and labels for interpolated value of empty strings', () => { + chartOptions.axisX.labelInterpolationFnc = + (value, index) => index === 0 ? '' : value; - const axis = new Axis(); - axis.initialize(axisUnits.x, chartRect, ticks, null); - axis.projectValue = (value) => value; + const axis = new Axis(); + axis.initialize(axisUnits.x, chartRect, ticks, null); + axis.projectValue = (value) => value; - axis.createGridAndLabels(gridGroup, labelGroup, true, chartOptions, eventEmitter); - expect(gridGroup.querySelectorAll('.ct-grid').svgElements.length).toBe(2); - expect(labelGroup.querySelectorAll('.ct-label').svgElements.length).toBe(2); + axis.createGridAndLabels(gridGroup, labelGroup, true, chartOptions, eventEmitter); + expect(gridGroup.querySelectorAll('.ct-grid').svgElements.length).toBe(2); + expect(labelGroup.querySelectorAll('.ct-label').svgElements.length).toBe(2); + }); }); }); diff --git a/src/axes/fixed-scale-axis.spec.js b/src/axes/fixed-scale-axis.spec.js index d1cbce6c..b7096847 100644 --- a/src/axes/fixed-scale-axis.spec.js +++ b/src/axes/fixed-scale-axis.spec.js @@ -1,42 +1,44 @@ import {FixedScaleAxis} from './fixed-scale-axis'; -describe('FixedScaleAxis', () => { - it('should order the tick array', () => { - const ticks = [10, 5, 0, -5, -10]; - const axisUnit = { - pos: 'y', - len: 'height', - dir: 'vertical', - rectStart: 'y2', - rectEnd: 'y1', - rectOffset: 'x1' - }; - const data = [ - [{x: 1, y: 10}, {x: 2, y: 5}, {x: 3, y: -5}] - ]; - const chartRect = { - padding: { - top: 15, - right: 15, - bottom: 5, - left: 10 - }, - y2: 15, - y1: 141, - x1: 50, - x2: 269 - }; - const options = { - offset: 40, - position: 'start', - labelOffset: {'x': 0, 'y': 0}, - showLabel: true, - showGrid: true, - scaleMinSpace: 20, - onlyInteger: false, - ticks - }; - const fsaxis = new FixedScaleAxis(axisUnit, data, chartRect, options); - expect(fsaxis.ticks).toEqual([-10, -5, 0, 5, 10]); +describe('Axes', () => { + describe('FixedScaleAxis', () => { + it('should order the tick array', () => { + const ticks = [10, 5, 0, -5, -10]; + const axisUnit = { + pos: 'y', + len: 'height', + dir: 'vertical', + rectStart: 'y2', + rectEnd: 'y1', + rectOffset: 'x1' + }; + const data = [ + [{x: 1, y: 10}, {x: 2, y: 5}, {x: 3, y: -5}] + ]; + const chartRect = { + padding: { + top: 15, + right: 15, + bottom: 5, + left: 10 + }, + y2: 15, + y1: 141, + x1: 50, + x2: 269 + }; + const options = { + offset: 40, + position: 'start', + labelOffset: {'x': 0, 'y': 0}, + showLabel: true, + showGrid: true, + scaleMinSpace: 20, + onlyInteger: false, + ticks + }; + const fsaxis = new FixedScaleAxis(axisUnit, data, chartRect, options); + expect(fsaxis.ticks).toEqual([-10, -5, 0, 5, 10]); + }); }); }); diff --git a/src/axes/step-axis.spec.js b/src/axes/step-axis.spec.js index 85de78e4..140406d7 100644 --- a/src/axes/step-axis.spec.js +++ b/src/axes/step-axis.spec.js @@ -1,27 +1,29 @@ import {StepAxis} from './step-axis'; -describe('StepAxis', function() { - it('should return 0 if options.ticks.length == 1', function() { - const ticks = [1]; - const axisUnit = { - pos: 'y', - len: 'height', - dir: 'vertical', - rectStart: 'y2', - rectEnd: 'y1', - rectOffset: 'x1' - }; - const data = [[1]]; - const chartRect = { - y2: 0, - y1: 15, - x1: 50, - x2: 100 - }; - const options = { - ticks - }; - const stepAxis = new StepAxis(axisUnit, data, chartRect, options); - expect(stepAxis.stepLength).toEqual(15); +describe('Axes', () => { + describe('StepAxis', () => { + it('should return 0 if options.ticks.length == 1', () => { + const ticks = [1]; + const axisUnit = { + pos: 'y', + len: 'height', + dir: 'vertical', + rectStart: 'y2', + rectEnd: 'y1', + rectOffset: 'x1' + }; + const data = [[1]]; + const chartRect = { + y2: 0, + y1: 15, + x1: 50, + x2: 100 + }; + const options = { + ticks + }; + const stepAxis = new StepAxis(axisUnit, data, chartRect, options); + expect(stepAxis.stepLength).toEqual(15); + }); }); }); diff --git a/src/charts/bar.spec.js b/src/charts/bar.spec.js index 4dd54581..505dcf92 100644 --- a/src/charts/bar.spec.js +++ b/src/charts/bar.spec.js @@ -2,200 +2,202 @@ import {AutoScaleAxis} from '../axes/axes'; import {BarChart} from './bar'; import {namespaces} from '../core/globals'; import {deserialize} from '../core/data'; -import {addFixture, destroyFixtures, initializeFixtures} from '../testing/fixtures'; - -describe('BarChart', () => { - let fixture; - let options; - let data; - - function createChart(callback) { - fixture = addFixture('
'); - const chart = new BarChart(fixture.wrapper.querySelector('.ct-chart'), data, options) - .on('created', () => { - callback && callback(); - chart.off('created'); - }); - return chart; - } - - beforeEach(() => initializeFixtures()); - afterEach(() => { - destroyFixtures(); - data = undefined; - options = undefined; - }); +import { + addMockWrapper, + destroyMockDom, + mockDom, + mockDomRects, + destroyMockDomRects +} from '../../test/mock'; + +describe('Charts', () => { + describe('BarChart', () => { + let fixture; + let chart; + let options; + let data; + + function createChart() { + return new Promise((resolve) => { + fixture = addMockWrapper('
'); + const { wrapper } = fixture + chart = new BarChart(wrapper.querySelector('.ct-chart'), data, options) + .on('created', () => { + resolve(); + chart.off('created'); + }); + }) + } - describe('grids', () => { beforeEach(() => { - data = { - series: [[ - {x: 1, y: 1}, - {x: 3, y: 5} - ]] - }; - options = { - axisX: { - type: AutoScaleAxis, - onlyInteger: true - }, - axisY: { - type: AutoScaleAxis, - onlyInteger: true - } - }; + mockDom(); + mockDomRects(); + }); + afterEach(() => { + destroyMockDom(); + destroyMockDomRects(); + data = undefined; + options = undefined; }); - it('should contain ct-grids group', (done) => { - data = null; - options = null; - createChart(() => { + describe('grids', () => { + beforeEach(() => { + data = { + series: [[ + {x: 1, y: 1}, + {x: 3, y: 5} + ]] + }; + options = { + axisX: { + type: AutoScaleAxis, + onlyInteger: true + }, + axisY: { + type: AutoScaleAxis, + onlyInteger: true + } + }; + }); + + it('should contain ct-grids group', async () => { + data = null; + options = null; + await createChart(); + expect(fixture.wrapper.querySelectorAll('g.ct-grids').length).toBe(1); - done(); }); - }); - it('should draw grid lines', (done) => { - createChart(() => { + it('should draw grid lines', async () => { + await createChart(); + expect(fixture.wrapper.querySelectorAll('g.ct-grids line.ct-grid.ct-horizontal').length).toBe(3); expect(fixture.wrapper.querySelectorAll('g.ct-grids line.ct-grid.ct-vertical').length).toBe(6); - done(); }); - }); - it('should draw grid background', (done) => { - options.showGridBackground = true; - createChart(() => { + it('should draw grid background', async () => { + options.showGridBackground = true; + await createChart(); + expect(fixture.wrapper.querySelectorAll('g.ct-grids rect.ct-grid-background').length).toBe(1); - done(); }); - }); - it('should not draw grid background if option set to false', (done) => { - options.showGridBackground = false; - createChart(() => { + it('should not draw grid background if option set to false', async () => { + options.showGridBackground = false; + await createChart(); + expect(fixture.wrapper.querySelectorAll('g.ct-grids rect.ct-grid-background').length).toBe(0); - done(); }); + }); - }); + describe('ct:value attribute', () => { + it('should contain x and y value for each bar', async () => { + data = { + series: [[ + {x: 1, y: 2}, + {x: 3, y: 4} + ]] + }; + options = { + axisX: { + type: AutoScaleAxis + } + }; + await createChart(); - describe('ct:value attribute', () => { - it('should contain x and y value for each bar', (done) => { - data = { - series: [[ - {x: 1, y: 2}, - {x: 3, y: 4} - ]] - }; - options = { - axisX: { - type: AutoScaleAxis - } - }; - - createChart(() => { const bars = fixture.wrapper.querySelectorAll('.ct-bar'); expect(bars[0].getAttributeNS(namespaces.ct, 'value')).toEqual('1,2'); expect(bars[1].getAttributeNS(namespaces.ct, 'value')).toEqual('3,4'); - done(); }); - }); - it('should render values that are zero', (done) => { - data = { - series: [[ - {x: 0, y: 1}, - {x: 2, y: 0}, - {x: 0, y: 0} - ]] - }; - options = { - axisX: { - type: AutoScaleAxis - } - }; - - createChart(() => { + it('should render values that are zero', async () => { + data = { + series: [[ + {x: 0, y: 1}, + {x: 2, y: 0}, + {x: 0, y: 0} + ]] + }; + options = { + axisX: { + type: AutoScaleAxis + } + }; + await createChart(); + const bars = fixture.wrapper.querySelectorAll('.ct-bar'); expect(bars[0].getAttributeNS(namespaces.ct, 'value')).toEqual('0,1'); expect(bars[1].getAttributeNS(namespaces.ct, 'value')).toEqual('2,0'); expect(bars[2].getAttributeNS(namespaces.ct, 'value')).toEqual('0,0'); - done(); }); }); - }); - describe('Meta data tests', () => { - it('should render meta data correctly with mixed value array', (done) => { - const meta = { - test: 'Serialized Test' - }; - - data = { - labels: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu'], - series: [ - [5, 2, 4, { - value: 2, - meta: meta - }, 0] - ] - }; - - createChart(() => { + describe('Meta data tests', () => { + it('should render meta data correctly with mixed value array', async () => { + const meta = { + test: 'Serialized Test' + }; + + data = { + labels: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu'], + series: [ + [5, 2, 4, { + value: 2, + meta: meta + }, 0] + ] + }; + await createChart(); + const bar = fixture.wrapper.querySelectorAll('.ct-bar')[3]; expect(deserialize(bar.getAttributeNS(namespaces.ct, 'meta'))).toEqual(meta); - done(); }); - }); - it('should render meta data correctly with mixed value array and different normalized data length', (done) => { - const meta = { - test: 'Serialized Test' - }; - - data = { - labels: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'], - series: [ - [5, 2, 4, { - value: 2, - meta: meta - }, 0] - ] - }; - - createChart(() => { + it('should render meta data correctly with mixed value array and different normalized data length', async () => { + const meta = { + test: 'Serialized Test' + }; + + data = { + labels: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'], + series: [ + [5, 2, 4, { + value: 2, + meta: meta + }, 0] + ] + }; + await createChart(); + const bar = fixture.wrapper.querySelectorAll('.ct-bar')[3]; expect(deserialize(bar.getAttributeNS(namespaces.ct, 'meta'))).toEqual(meta); - done(); }); - }); - it('should render meta data correctly with mixed value array and mixed series notation', (done) => { - const seriesMeta = 9999; - const valueMeta = { - test: 'Serialized Test' - }; - - data = { - labels: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'], - series: [ - [5, 2, 4, { - value: 2, - meta: valueMeta - }, 0], - { - meta: seriesMeta, - data: [5, 2, { + it('should render meta data correctly with mixed value array and mixed series notation', async () => { + const seriesMeta = 9999; + const valueMeta = { + test: 'Serialized Test' + }; + + data = { + labels: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'], + series: [ + [5, 2, 4, { value: 2, meta: valueMeta - }, 0] - } - ] - }; + }, 0], + { + meta: seriesMeta, + data: [5, 2, { + value: 2, + meta: valueMeta + }, 0] + } + ] + }; + await createChart(); - createChart(() => { expect( deserialize( fixture.wrapper.querySelectorAll('.ct-series-a .ct-bar')[3] @@ -216,66 +218,57 @@ describe('BarChart', () => { .getAttributeNS(namespaces.ct, 'meta') ) ).toEqual(valueMeta); - - done(); }); }); - }); - describe('Empty data tests', () => { - it('should render empty grid with no data', (done) => { - data = null; - options = null; + describe('Empty data tests', () => { + it('should render empty grid with no data', async () => { + data = null; + options = null; + await createChart(); - createChart(() => { // Find at least one vertical grid line expect(document.querySelector('.ct-grids .ct-grid.ct-vertical')).toBeDefined(); - done(); }); - }); - it('should render empty grid with only labels', (done) => { - data = { - labels: [1, 2, 3, 4] - }; + it('should render empty grid with only labels', async () => { + data = { + labels: [1, 2, 3, 4] + }; + await createChart(); - createChart(() => { // Find at least one vertical grid line expect(document.querySelector('.ct-grids .ct-grid.ct-vertical')).toBeDefined(); // Find exactly as many horizontal grid lines as labels were specified (Step Axis) expect(document.querySelectorAll('.ct-grids .ct-grid.ct-horizontal').length).toBe(data.labels.length); - done(); }); - }); - it('should generate labels and render empty grid with only series in data', (done) => { - data = { - series: [ - [1, 2, 3, 4], - [2, 3, 4], - [3, 4] - ] - }; + it('should generate labels and render empty grid with only series in data', async () => { + data = { + series: [ + [1, 2, 3, 4], + [2, 3, 4], + [3, 4] + ] + }; + await createChart(); - createChart(() => { // Find at least one vertical grid line expect(document.querySelector('.ct-grids .ct-grid.ct-vertical')).toBeDefined(); // Should generate the labels using the largest series count expect(document.querySelectorAll('.ct-grids .ct-grid.ct-horizontal').length) .toBe(Math.max(...data.series.map((series) => series.length))); - done(); }); - }); - it('should render empty grid with no data and specified high low', (done) => { - options = { - width: 400, - height: 300, - high: 100, - low: -100 - }; + it('should render empty grid with no data and specified high low', async () => { + options = { + width: 400, + height: 300, + high: 100, + low: -100 + }; + await createChart(); - createChart(() => { // Find first and last label const labels = document.querySelectorAll('.ct-labels .ct-label.ct-vertical'); const firstLabel = labels[0]; @@ -283,56 +276,47 @@ describe('BarChart', () => { expect(firstLabel.textContent.trim()).toBe('-100'); expect(lastLabel.textContent.trim()).toBe('100'); - done(); }); - }); - it('should render empty grid with no data and reverseData option', (done) => { - options = { - reverseData: true - }; + it('should render empty grid with no data and reverseData option', async () => { + options = { + reverseData: true + }; + await createChart(); - createChart(() => { // Find at least one vertical grid line expect(document.querySelector('.ct-grids .ct-grid.ct-vertical')).toBeDefined(); - done(); }); - }); - it('should render empty grid with no data and stackBars option', (done) => { - options = { - stackBars: true - }; + it('should render empty grid with no data and stackBars option', async () => { + options = { + stackBars: true + }; + await createChart(); - createChart(() => { // Find at least one vertical grid line expect(document.querySelector('.ct-grids .ct-grid.ct-vertical')).toBeDefined(); - done(); }); - }); - it('should render empty grid with no data and horizontalBars option', (done) => { - options = { - horizontalBars: true - }; + it('should render empty grid with no data and horizontalBars option', async () => { + options = { + horizontalBars: true + }; + await createChart(); - createChart(() => { // Find at least one vertical grid line // TODO: In theory the axis should be created with ct-horizontal class expect(document.querySelector('.ct-grids .ct-grid.ct-vertical')).toBeDefined(); - done(); }); - }); - it('should render empty grid with no data and distributeSeries option', (done) => { - options = { - distributeSeries: true - }; + it('should render empty grid with no data and distributeSeries option', async () => { + options = { + distributeSeries: true + }; + await createChart(); - createChart(() => { // Find at least one vertical grid line expect(document.querySelector('.ct-grids .ct-grid.ct-vertical')).toBeDefined(); - done(); }); }); }); diff --git a/src/charts/bar.stories.js b/src/charts/bar.stories.js index 413705c1..4739694d 100644 --- a/src/charts/bar.stories.js +++ b/src/charts/bar.stories.js @@ -1,5 +1,6 @@ import '../styles/chartist.scss'; import { BarChart } from './bar'; +import {AutoScaleAxis} from '../axes/axes'; export default { title: 'BarChart', @@ -54,3 +55,28 @@ export function Default() { return root } + +export function SimpleGrid() { + const root = document.createElement('div'); + + new BarChart(root, { + series: [[ + {x: 1, y: 1}, + {x: 3, y: 5} + ]] + }, { + axisX: { + type: AutoScaleAxis, + onlyInteger: true + }, + axisY: { + type: AutoScaleAxis, + onlyInteger: true + } + }).on('created', () => { + console.log(document.querySelectorAll('g.ct-grids line.ct-grid.ct-horizontal').length) + console.log(document.querySelectorAll('g.ct-grids line.ct-grid.ct-vertical').length) + }); + + return root +} diff --git a/src/charts/line.spec.js b/src/charts/line.spec.js index 871416b7..8e85296d 100644 --- a/src/charts/line.spec.js +++ b/src/charts/line.spec.js @@ -3,237 +3,235 @@ import {LineChart} from './line'; import * as Interpolation from '../interpolation/interpolation'; import {namespaces} from '../core/globals'; import {deserialize} from '../core/data'; -import {addFixture, destroyFixtures, initializeFixtures} from '../testing/fixtures'; - -describe('LineChart', () => { - let fixture; - let options; - let data; - - function createChart(callback) { - fixture = addFixture('
'); - const chart = new LineChart(fixture.wrapper.querySelector('.ct-chart'), data, options) - .on('created', () => { - callback && callback(); - chart.off('created'); - }); - return chart; - } - - beforeEach(() => initializeFixtures()); - afterEach(() => { - destroyFixtures(); - data = undefined; - options = undefined; - }); +import { + addMockWrapper, + destroyMockDom, + mockDom, + mockDomRects, + destroyMockDomRects +} from '../../test/mock'; + +describe('Charts', () => { + describe('LineChart', () => { + let fixture; + let chart; + let options; + let data; + + function createChart() { + return new Promise((resolve) => { + fixture = addMockWrapper('
'); + const { wrapper } = fixture + chart = new LineChart(wrapper.querySelector('.ct-chart'), data, options) + .on('created', () => { + resolve(); + chart.off('created'); + }); + }) + } - describe('grids', () => { beforeEach(() => { - data = { - series: [[ - {x: 1, y: 1}, - {x: 3, y: 5} - ]] - }; - options = { - axisX: { - type: AutoScaleAxis, - onlyInteger: true - }, - axisY: { - type: AutoScaleAxis, - onlyInteger: true - } - }; + mockDom(); + mockDomRects(); + }); + afterEach(() => { + destroyMockDom(); + destroyMockDomRects(); + data = undefined; + options = undefined; }); - it('should contain ct-grids group', (done) => { - createChart(() => { + describe('grids', () => { + beforeEach(() => { + data = { + series: [[ + {x: 1, y: 1}, + {x: 3, y: 5} + ]] + }; + options = { + axisX: { + type: AutoScaleAxis, + onlyInteger: true + }, + axisY: { + type: AutoScaleAxis, + onlyInteger: true + } + }; + }); + + it('should contain ct-grids group', async () => { + await createChart(); + expect(fixture.wrapper.querySelectorAll('.ct-grids').length).toBe(1); - done(); }); - }); - it('should draw grid lines', (done) => { - createChart(() => { + it('should draw grid lines', async () => { + await createChart(); + expect(fixture.wrapper.querySelectorAll('.ct-grids .ct-grid.ct-horizontal').length).toBe(3); expect(fixture.wrapper.querySelectorAll('.ct-grids .ct-grid.ct-vertical').length).toBe(5); - done(); }); - }); - it('should draw grid background', (done) => { - options.showGridBackground = true; - createChart(() => { + it('should draw grid background', async () => { + options.showGridBackground = true; + await createChart(); + expect(fixture.wrapper.querySelectorAll('.ct-grids .ct-grid-background').length).toBe(1); - done(); }); - }); - it('should not draw grid background if option set to false', (done) => { - options.showGridBackground = false; - createChart(() => { + it('should not draw grid background if option set to false', async () => { + options.showGridBackground = false; + await createChart(); + expect(fixture.wrapper.querySelectorAll('.ct-grids .ct-grid-background').length).toBe(0); - done(); }); }); - }); - describe('AxisY position tests', () => { - beforeEach(() => { - data = { - series: [[ - {x: 1, y: 1}, - {x: 3, y: 5} - ]] - }; - options = {}; - }); + describe('AxisY position tests', () => { + beforeEach(() => { + data = { + series: [[ + {x: 1, y: 1}, + {x: 3, y: 5} + ]] + }; + options = {}; + }); - it('should have ct-start class if position start', (done) => { - options = { - axisY: { - position: 'start' - } - }; + it('should have ct-start class if position start', async () => { + options = { + axisY: { + position: 'start' + } + }; + await createChart(); - createChart(() => { Array.from(fixture.wrapper.querySelectorAll('.ct-label.ct-vertical')) .forEach((element) => expect(element.getAttribute('class')).toBe('ct-label ct-vertical ct-start')); - done(); }); - }); - it('should have ct-end class if position is any other value than start', (done) => { - options = { - axisY: { - position: 'right' - } - }; + it('should have ct-end class if position is any other value than start', async () => { + options = { + axisY: { + position: 'right' + } + }; + await createChart(); - createChart(() => { Array.from(fixture.wrapper.querySelectorAll('.ct-label.ct-vertical')) .forEach((element) => expect(element.getAttribute('class')).toBe('ct-label ct-vertical ct-end')); - done(); }); }); - }); - describe('ct:value attribute', () => { - it('should contain x and y value for each datapoint', (done) => { - data = { - series: [[ - {x: 1, y: 2}, - {x: 3, y: 4} - ]] - }; - options = { - axisX: { - type: FixedScaleAxis - } - }; - - createChart(() => { + describe('ct:value attribute', () => { + it('should contain x and y value for each datapoint', async () => { + data = { + series: [[ + {x: 1, y: 2}, + {x: 3, y: 4} + ]] + }; + options = { + axisX: { + type: FixedScaleAxis + } + }; + await createChart(); + const points = fixture.wrapper.querySelectorAll('.ct-point'); expect(points[0].getAttributeNS(namespaces.ct, 'value')).toBe('1,2'); expect(points[1].getAttributeNS(namespaces.ct, 'value')).toBe('3,4'); - done(); }); - }); - it('should render values that are zero', (done) => { - data = { - series: [[ - {x: 0, y: 1}, - {x: 1, y: 0}, - {x: 0, y: 0} - ]] - }; - options = { - axisX: { - type: FixedScaleAxis - } - }; - - createChart(() => { + it('should render values that are zero', async () => { + data = { + series: [[ + {x: 0, y: 1}, + {x: 1, y: 0}, + {x: 0, y: 0} + ]] + }; + options = { + axisX: { + type: FixedScaleAxis + } + }; + await createChart(); + const points = fixture.wrapper.querySelectorAll('.ct-point'); expect(points[0].getAttributeNS(namespaces.ct, 'value')).toBe('0,1'); expect(points[1].getAttributeNS(namespaces.ct, 'value')).toBe('1,0'); expect(points[2].getAttributeNS(namespaces.ct, 'value')).toBe('0,0'); - done(); }); }); - }); - describe('Meta data tests', () => { - it('should render meta data correctly with mixed value array', (done) => { - const meta = { - test: 'Serialized Test' - }; - - data = { - labels: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu'], - series: [ - [5, 2, 4, { - value: 2, - meta: meta - }, 0] - ] - }; - - createChart(() => { + describe('Meta data tests', () => { + it('should render meta data correctly with mixed value array', async () => { + const meta = { + test: 'Serialized Test' + }; + + data = { + labels: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu'], + series: [ + [5, 2, 4, { + value: 2, + meta: meta + }, 0] + ] + }; + await createChart(); + const points = fixture.wrapper.querySelectorAll('.ct-point'); expect(deserialize(points[3].getAttributeNS(namespaces.ct, 'meta'))).toEqual(meta); - done(); }); - }); - it('should render meta data correctly with mixed value array and different normalized data length', (done) => { - const meta = { - test: 'Serialized Test' - }; - - data = { - labels: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'], - series: [ - [5, 2, 4, { - value: 2, - meta: meta - }, 0] - ] - }; - - createChart(() => { + it('should render meta data correctly with mixed value array and different normalized data length', async () => { + const meta = { + test: 'Serialized Test' + }; + + data = { + labels: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'], + series: [ + [5, 2, 4, { + value: 2, + meta: meta + }, 0] + ] + }; + await createChart(); + const points = fixture.wrapper.querySelectorAll('.ct-point'); expect(deserialize(points[3].getAttributeNS(namespaces.ct, 'meta'))).toEqual(meta); - done(); }); - }); - it('should render meta data correctly with mixed value array and mixed series notation', (done) => { - const seriesMeta = 9999; - const valueMeta = { - test: 'Serialized Test' - }; - - data = { - labels: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'], - series: [ - [5, 2, 4, { - value: 2, - meta: valueMeta - }, 0], - { - meta: seriesMeta, - data: [5, 2, { + it('should render meta data correctly with mixed value array and mixed series notation', async () => { + const seriesMeta = 9999; + const valueMeta = { + test: 'Serialized Test' + }; + + data = { + labels: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'], + series: [ + [5, 2, 4, { value: 2, meta: valueMeta - }, 0] - } - ] - }; + }, 0], + { + meta: seriesMeta, + data: [5, 2, { + value: 2, + meta: valueMeta + }, 0] + } + ] + }; + await createChart(); - createChart(() => { expect( deserialize( fixture.wrapper.querySelectorAll('.ct-series-a .ct-point')[3] @@ -254,288 +252,278 @@ describe('LineChart', () => { .getAttributeNS(namespaces.ct, 'meta') ) ).toEqual(valueMeta); - - done(); }); }); - }); - describe('Line charts with holes', () => { - it('should render correctly with Interpolation.none and holes everywhere', (done) => { - data = { - labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], - series: [ - [NaN, 15, 0, null, 2, 3, 4, undefined, {value: 1, meta: 'meta data'}, null] - ] - }; - options = { - lineSmooth: false - }; - - const chart = createChart(); - chart.on('draw', (context) => { - if(context.type === 'line') { - expect(context.path.pathElements.map((pathElement) => { - return { - command: pathElement.command, - data: pathElement.data - }; - })).toEqual([ - {command: 'M', data: {valueIndex: 1, value: {x: undefined, y: 15}, meta: undefined}}, - {command: 'L', data: {valueIndex: 2, value: {x: undefined, y: 0}, meta: undefined}}, - {command: 'M', data: {valueIndex: 4, value: {x: undefined, y: 2}, meta: undefined}}, - {command: 'L', data: {valueIndex: 5, value: {x: undefined, y: 3}, meta: undefined}}, - {command: 'L', data: {valueIndex: 6, value: {x: undefined, y: 4}, meta: undefined}}, - {command: 'M', data: {valueIndex: 8, value: {x: undefined, y: 1}, meta: 'meta data'}} - ]); - done(); - } + describe('Line charts with holes', () => { + it('should render correctly with Interpolation.none and holes everywhere', async () => { + data = { + labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + series: [ + [NaN, 15, 0, null, 2, 3, 4, undefined, {value: 1, meta: 'meta data'}, null] + ] + }; + options = { + lineSmooth: false + }; + + await createChart(); + + chart.on('draw', (context) => { + if(context.type === 'line') { + expect(context.path.pathElements.map((pathElement) => { + return { + command: pathElement.command, + data: pathElement.data + }; + })).toEqual([ + {command: 'M', data: {valueIndex: 1, value: {x: undefined, y: 15}, meta: undefined}}, + {command: 'L', data: {valueIndex: 2, value: {x: undefined, y: 0}, meta: undefined}}, + {command: 'M', data: {valueIndex: 4, value: {x: undefined, y: 2}, meta: undefined}}, + {command: 'L', data: {valueIndex: 5, value: {x: undefined, y: 3}, meta: undefined}}, + {command: 'L', data: {valueIndex: 6, value: {x: undefined, y: 4}, meta: undefined}}, + {command: 'M', data: {valueIndex: 8, value: {x: undefined, y: 1}, meta: 'meta data'}} + ]); + } + }); }); - }); - it('should render correctly with Interpolation.cardinal and holes everywhere', (done) => { - data = { - labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], - series: [ - [NaN, 15, 0, null, 2, 3, 4, undefined, {value: 1, meta: 'meta data'}, null] - ] - }; - options = { - lineSmooth: true - }; - - const chart = createChart(); - chart.on('draw', (context) => { - if(context.type === 'line') { - expect(context.path.pathElements.map((pathElement) => { - return { - command: pathElement.command, - data: pathElement.data - }; - })).toEqual([ - {command: 'M', data: {valueIndex: 1, value: {x: undefined, y: 15}, meta: undefined}}, - // Cardinal should create Line path segment if only one connection - {command: 'L', data: {valueIndex: 2, value: {x: undefined, y: 0}, meta: undefined}}, - {command: 'M', data: {valueIndex: 4, value: {x: undefined, y: 2}, meta: undefined}}, - // Cardinal should create Curve path segment for 2 or more connections - {command: 'C', data: {valueIndex: 5, value: {x: undefined, y: 3}, meta: undefined}}, - {command: 'C', data: {valueIndex: 6, value: {x: undefined, y: 4}, meta: undefined}}, - {command: 'M', data: {valueIndex: 8, value: {x: undefined, y: 1}, meta: 'meta data'}} - ]); - done(); - } + it('should render correctly with Interpolation.cardinal and holes everywhere', async () => { + data = { + labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + series: [ + [NaN, 15, 0, null, 2, 3, 4, undefined, {value: 1, meta: 'meta data'}, null] + ] + }; + options = { + lineSmooth: true + }; + + await createChart(); + + chart.on('draw', (context) => { + if(context.type === 'line') { + expect(context.path.pathElements.map((pathElement) => { + return { + command: pathElement.command, + data: pathElement.data + }; + })).toEqual([ + {command: 'M', data: {valueIndex: 1, value: {x: undefined, y: 15}, meta: undefined}}, + // Cardinal should create Line path segment if only one connection + {command: 'L', data: {valueIndex: 2, value: {x: undefined, y: 0}, meta: undefined}}, + {command: 'M', data: {valueIndex: 4, value: {x: undefined, y: 2}, meta: undefined}}, + // Cardinal should create Curve path segment for 2 or more connections + {command: 'C', data: {valueIndex: 5, value: {x: undefined, y: 3}, meta: undefined}}, + {command: 'C', data: {valueIndex: 6, value: {x: undefined, y: 4}, meta: undefined}}, + {command: 'M', data: {valueIndex: 8, value: {x: undefined, y: 1}, meta: 'meta data'}} + ]); + } + }); }); - }); - it('should render correctly with Interpolation.monotoneCubic and holes everywhere', (done) => { - data = { - labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], - series: [ - [NaN, 15, 0, null, 2, 3, 4, undefined, {value: 1, meta: 'meta data'}, null] - ] - }; - options = { - lineSmooth: Interpolation.monotoneCubic() - }; - - const chart = createChart(); - chart.on('draw', (context) => { - if(context.type === 'line') { - expect(context.path.pathElements.map((pathElement) => { - return { - command: pathElement.command, - data: pathElement.data - }; - })).toEqual([ - {command: 'M', data: {valueIndex: 1, value: {x: undefined, y: 15}, meta: undefined}}, - // Monotone cubic should create Line path segment if only one connection - {command: 'L', data: {valueIndex: 2, value: {x: undefined, y: 0}, meta: undefined}}, - {command: 'M', data: {valueIndex: 4, value: {x: undefined, y: 2}, meta: undefined}}, - // Monotone cubic should create Curve path segment for 2 or more connections - {command: 'C', data: {valueIndex: 5, value: {x: undefined, y: 3}, meta: undefined}}, - {command: 'C', data: {valueIndex: 6, value: {x: undefined, y: 4}, meta: undefined}}, - {command: 'M', data: {valueIndex: 8, value: {x: undefined, y: 1}, meta: 'meta data'}} - ]); - done(); - } + it('should render correctly with Interpolation.monotoneCubic and holes everywhere', async () => { + data = { + labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + series: [ + [NaN, 15, 0, null, 2, 3, 4, undefined, {value: 1, meta: 'meta data'}, null] + ] + }; + options = { + lineSmooth: Interpolation.monotoneCubic() + }; + + await createChart(); + + chart.on('draw', (context) => { + if(context.type === 'line') { + expect(context.path.pathElements.map((pathElement) => { + return { + command: pathElement.command, + data: pathElement.data + }; + })).toEqual([ + {command: 'M', data: {valueIndex: 1, value: {x: undefined, y: 15}, meta: undefined}}, + // Monotone cubic should create Line path segment if only one connection + {command: 'L', data: {valueIndex: 2, value: {x: undefined, y: 0}, meta: undefined}}, + {command: 'M', data: {valueIndex: 4, value: {x: undefined, y: 2}, meta: undefined}}, + // Monotone cubic should create Curve path segment for 2 or more connections + {command: 'C', data: {valueIndex: 5, value: {x: undefined, y: 3}, meta: undefined}}, + {command: 'C', data: {valueIndex: 6, value: {x: undefined, y: 4}, meta: undefined}}, + {command: 'M', data: {valueIndex: 8, value: {x: undefined, y: 1}, meta: 'meta data'}} + ]); + } + }); + }); + + it('should render correctly with Interpolation.simple and holes everywhere', async () => { + data = { + labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + series: [ + [NaN, 15, 0, null, 2, 3, 4, undefined, {value: 1, meta: 'meta data'}, null] + ] + }; + options = { + lineSmooth: Interpolation.simple() + }; + + await createChart(); + + chart.on('draw', (context) => { + if(context.type === 'line') { + expect(context.path.pathElements.map((pathElement) => { + return { + command: pathElement.command, + data: pathElement.data + }; + })).toEqual([ + {command: 'M', data: {valueIndex: 1, value: {x: undefined, y: 15}, meta: undefined}}, + {command: 'C', data: {valueIndex: 2, value: {x: undefined, y: 0}, meta: undefined}}, + {command: 'M', data: {valueIndex: 4, value: {x: undefined, y: 2}, meta: undefined}}, + {command: 'C', data: {valueIndex: 5, value: {x: undefined, y: 3}, meta: undefined}}, + {command: 'C', data: {valueIndex: 6, value: {x: undefined, y: 4}, meta: undefined}}, + {command: 'M', data: {valueIndex: 8, value: {x: undefined, y: 1}, meta: 'meta data'}} + ]); + } + }); }); - }); - it('should render correctly with Interpolation.simple and holes everywhere', (done) => { - data = { - labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], - series: [ - [NaN, 15, 0, null, 2, 3, 4, undefined, {value: 1, meta: 'meta data'}, null] - ] - }; - options = { - lineSmooth: Interpolation.simple() - }; - - const chart = createChart(); - chart.on('draw', (context) => { - if(context.type === 'line') { - expect(context.path.pathElements.map((pathElement) => { - return { - command: pathElement.command, - data: pathElement.data - }; - })).toEqual([ - {command: 'M', data: {valueIndex: 1, value: {x: undefined, y: 15}, meta: undefined}}, - {command: 'C', data: {valueIndex: 2, value: {x: undefined, y: 0}, meta: undefined}}, - {command: 'M', data: {valueIndex: 4, value: {x: undefined, y: 2}, meta: undefined}}, - {command: 'C', data: {valueIndex: 5, value: {x: undefined, y: 3}, meta: undefined}}, - {command: 'C', data: {valueIndex: 6, value: {x: undefined, y: 4}, meta: undefined}}, - {command: 'M', data: {valueIndex: 8, value: {x: undefined, y: 1}, meta: 'meta data'}} - ]); - done(); - } + it('should render correctly with postponed Interpolation.step and holes everywhere', async () => { + data = { + labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + series: [ + [NaN, 15, 0, null, 2, 3, 4, undefined, {value: 1, meta: 'meta data'}, null] + ] + }; + options = { + lineSmooth: Interpolation.step() + }; + + await createChart(); + + chart.on('draw', (context) => { + if(context.type === 'line') { + expect(context.path.pathElements.map((pathElement) => { + return { + command: pathElement.command, + data: pathElement.data + }; + })).toEqual([ + {command: 'M', data: {valueIndex: 1, value: {x: undefined, y: 15}, meta: undefined}}, + {command: 'L', data: {valueIndex: 1, value: {x: undefined, y: 15}, meta: undefined}}, + {command: 'L', data: {valueIndex: 2, value: {x: undefined, y: 0}, meta: undefined}}, + {command: 'M', data: {valueIndex: 4, value: {x: undefined, y: 2}, meta: undefined}}, + {command: 'L', data: {valueIndex: 4, value: {x: undefined, y: 2}, meta: undefined}}, + {command: 'L', data: {valueIndex: 5, value: {x: undefined, y: 3}, meta: undefined}}, + {command: 'L', data: {valueIndex: 5, value: {x: undefined, y: 3}, meta: undefined}}, + {command: 'L', data: {valueIndex: 6, value: {x: undefined, y: 4}, meta: undefined}}, + {command: 'M', data: {valueIndex: 8, value: {x: undefined, y: 1}, meta: 'meta data'}} + ]); + } + }); }); - }); - it('should render correctly with postponed Interpolation.step and holes everywhere', (done) => { - data = { - labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], - series: [ - [NaN, 15, 0, null, 2, 3, 4, undefined, {value: 1, meta: 'meta data'}, null] - ] - }; - options = { - lineSmooth: Interpolation.step() - }; - - const chart = createChart(); - chart.on('draw', (context) => { - if(context.type === 'line') { - expect(context.path.pathElements.map((pathElement) => { - return { - command: pathElement.command, - data: pathElement.data - }; - })).toEqual([ - {command: 'M', data: {valueIndex: 1, value: {x: undefined, y: 15}, meta: undefined}}, - {command: 'L', data: {valueIndex: 1, value: {x: undefined, y: 15}, meta: undefined}}, - {command: 'L', data: {valueIndex: 2, value: {x: undefined, y: 0}, meta: undefined}}, - {command: 'M', data: {valueIndex: 4, value: {x: undefined, y: 2}, meta: undefined}}, - {command: 'L', data: {valueIndex: 4, value: {x: undefined, y: 2}, meta: undefined}}, - {command: 'L', data: {valueIndex: 5, value: {x: undefined, y: 3}, meta: undefined}}, - {command: 'L', data: {valueIndex: 5, value: {x: undefined, y: 3}, meta: undefined}}, - {command: 'L', data: {valueIndex: 6, value: {x: undefined, y: 4}, meta: undefined}}, - {command: 'M', data: {valueIndex: 8, value: {x: undefined, y: 1}, meta: 'meta data'}} - ]); - done(); - } + it('should render correctly with preponed Interpolation.step and holes everywhere', async () => { + data = { + labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + series: [ + [NaN, 15, 0, null, 2, 3, 4, undefined, {value: 1, meta: 'meta data'}, null] + ] + }; + options = { + lineSmooth: Interpolation.step({ + postpone: false + }) + }; + + await createChart(); + + chart.on('draw', (context) => { + if(context.type === 'line') { + expect(context.path.pathElements.map((pathElement) => { + return { + command: pathElement.command, + data: pathElement.data + }; + })).toEqual([ + {command: 'M', data: {valueIndex: 1, value: {x: undefined, y: 15}, meta: undefined}}, + {command: 'L', data: {valueIndex: 2, value: {x: undefined, y: 0}, meta: undefined}}, + {command: 'L', data: {valueIndex: 2, value: {x: undefined, y: 0}, meta: undefined}}, + {command: 'M', data: {valueIndex: 4, value: {x: undefined, y: 2}, meta: undefined}}, + {command: 'L', data: {valueIndex: 5, value: {x: undefined, y: 3}, meta: undefined}}, + {command: 'L', data: {valueIndex: 5, value: {x: undefined, y: 3}, meta: undefined}}, + {command: 'L', data: {valueIndex: 6, value: {x: undefined, y: 4}, meta: undefined}}, + {command: 'L', data: {valueIndex: 6, value: {x: undefined, y: 4}, meta: undefined}}, + {command: 'M', data: {valueIndex: 8, value: {x: undefined, y: 1}, meta: 'meta data'}} + ]); + } + }); }); }); - it('should render correctly with preponed Interpolation.step and holes everywhere', (done) => { - data = { - labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], - series: [ - [NaN, 15, 0, null, 2, 3, 4, undefined, {value: 1, meta: 'meta data'}, null] - ] - }; - options = { - lineSmooth: Interpolation.step({ - postpone: false - }) - }; - - const chart = createChart(); - chart.on('draw', (context) => { - if(context.type === 'line') { - expect(context.path.pathElements.map((pathElement) => { - return { - command: pathElement.command, - data: pathElement.data - }; - })).toEqual([ - {command: 'M', data: {valueIndex: 1, value: {x: undefined, y: 15}, meta: undefined}}, - {command: 'L', data: {valueIndex: 2, value: {x: undefined, y: 0}, meta: undefined}}, - {command: 'L', data: {valueIndex: 2, value: {x: undefined, y: 0}, meta: undefined}}, - {command: 'M', data: {valueIndex: 4, value: {x: undefined, y: 2}, meta: undefined}}, - {command: 'L', data: {valueIndex: 5, value: {x: undefined, y: 3}, meta: undefined}}, - {command: 'L', data: {valueIndex: 5, value: {x: undefined, y: 3}, meta: undefined}}, - {command: 'L', data: {valueIndex: 6, value: {x: undefined, y: 4}, meta: undefined}}, - {command: 'L', data: {valueIndex: 6, value: {x: undefined, y: 4}, meta: undefined}}, - {command: 'M', data: {valueIndex: 8, value: {x: undefined, y: 1}, meta: 'meta data'}} - ]); - done(); - } + describe('Single value data tests', () => { + beforeEach(() => { + data = { + labels: [1], + series: [[1]] + }; }); - }); - }); - describe('Single value data tests', () => { - beforeEach(() => { - data = { - labels: [1], - series: [[1]] - }; - }); + it('should render without NaN values and points', async () => { + await createChart(); - it('should render without NaN values and points', (done) => { - createChart(() => { expect(document.querySelector('.ct-line').getAttribute('d')).toBe('M50,15'); expect(document.querySelector('.ct-point').getAttribute('x1')).toBe('50'); expect(document.querySelector('.ct-point').getAttribute('x2')).toBe('50.01'); - done(); }); }); - }); - describe('Empty data tests', () => { - it('should render empty grid with no data', (done) => { - createChart(() => { + describe('Empty data tests', () => { + it('should render empty grid with no data', async () => { + await createChart(); // Find at least one vertical grid line expect(document.querySelector('.ct-grids .ct-grid.ct-vertical')).toBeDefined(); - done(); }); - }); - it('should render empty grid with only labels', (done) => { - data = { - labels: [1, 2, 3, 4] - }; + it('should render empty grid with only labels', async () => { + data = { + labels: [1, 2, 3, 4] + }; + await createChart(); - createChart(() => { // Find at least one vertical grid line expect(document.querySelector('.ct-grids .ct-grid.ct-vertical')).toBeDefined(); // Find exactly as many horizontal grid lines as labels were specified (Step Axis) expect(document.querySelectorAll('.ct-grids .ct-grid.ct-horizontal').length).toBe(data.labels.length); - done(); }); - }); - it('should generate labels and render empty grid with only series in data', (done) => { - data = { - series: [ - [1, 2, 3, 4], - [2, 3, 4], - [3, 4] - ] - }; + it('should generate labels and render empty grid with only series in data', async () => { + data = { + series: [ + [1, 2, 3, 4], + [2, 3, 4], + [3, 4] + ] + }; + await createChart(); - createChart(() => { // Find at least one vertical grid line expect(document.querySelector('.ct-grids .ct-grid.ct-vertical')).toBeDefined(); // Should generate the labels using the largest series count expect(document.querySelectorAll('.ct-grids .ct-grid.ct-horizontal').length) .toBe(Math.max(...data.series.map((series) => series.length))); - done(); }); - }); - it('should render empty grid with no data and specified high low', (done) => { - data = null; - options = { - width: 400, - height: 300, - high: 100, - low: -100 - }; + it('should render empty grid with no data and specified high low', async () => { + data = null; + options = { + width: 400, + height: 300, + high: 100, + low: -100 + }; + await createChart(); - createChart(() => { // Find first and last label const labels = document.querySelectorAll('.ct-labels .ct-label.ct-vertical'); const firstLabel = labels[0]; @@ -543,39 +531,34 @@ describe('LineChart', () => { expect(firstLabel.textContent.trim()).toBe('-100'); expect(lastLabel.textContent.trim()).toBe('100'); - done(); }); - }); - it('should render empty grid with no data and reverseData option', (done) => { - data = null; - options = { - reverseData: true - }; + it('should render empty grid with no data and reverseData option', async () => { + data = null; + options = { + reverseData: true + }; + await createChart(); - createChart(() => { // Find at least one vertical grid line expect(document.querySelector('.ct-grids .ct-grid.ct-vertical')).toBeDefined(); - done(); }); }); - }); - describe('x1 and x2 attribute', () => { - it('should contain just a datapoint', (done) => { - data = { - series: [[ - {x: 1, y: 2} - ]] - }; - options = { - fullWidth: true - }; - - createChart(() => { + describe('x1 and x2 attribute', () => { + it('should contain just a datapoint', async () => { + data = { + series: [[ + {x: 1, y: 2} + ]] + }; + options = { + fullWidth: true + }; + await createChart(); + expect(document.querySelector('.ct-point').getAttribute('x1')).not.toBe('NaN'); expect(document.querySelector('.ct-point').getAttribute('x2')).not.toBe('NaN'); - done(); }); }); }); diff --git a/src/charts/pie.spec.js b/src/charts/pie.spec.js index 309a9f39..ad5fb576 100644 --- a/src/charts/pie.spec.js +++ b/src/charts/pie.spec.js @@ -1,271 +1,247 @@ -import {initializeFixtures, destroyFixtures, addFixture} from '../testing/fixtures'; import {namespaces} from '../core/globals'; import {deserialize} from '../core/data'; import {PieChart} from './pie'; - -describe('PieChart', () => { - beforeEach(() => initializeFixtures()); - afterEach(() => destroyFixtures()); - - describe('Meta data tests', () => { - - it('should render meta data correctly on slice with mixed value array', (done) => { - const fixture = addFixture('
'); - const meta = { - test: 'Serialized Test' - }; - - const data = { - labels: ['A', 'B', 'C'], - series: [5, { - value: 8, - meta: meta - }, 1] - }; - - const chartContainer = fixture.wrapper.querySelector('.ct-chart'); - const chart = new PieChart(chartContainer, data); - - chart.on('created', () => { - const metaAttribute = chartContainer - .querySelectorAll('.ct-slice-pie')[1] - .getAttributeNS(namespaces.ct, 'meta'); - expect(deserialize(metaAttribute)).toEqual(meta); - chart.off('created'); - done(); - }); - }); - }); - - describe('Simple Pie Chart', () => { - const num = '\\d+(\\.\\d*)?'; - const sum = (a, b) => a + b; - let data; - let options; +import { + addMockWrapper, + destroyMockDom, + mockDom, +} from '../../test/mock'; + +describe('Charts', () => { + describe('PieChart', () => { let fixture; + let chart; + let options; + let data; + + function createChart() { + return new Promise((resolve) => { + fixture = addMockWrapper('
'); + const { wrapper } = fixture + chart = new PieChart(wrapper.querySelector('.ct-chart'), data, options) + .on('created', () => { + resolve(); + chart.off('created'); + }); + }) + } beforeEach(() => { - data = { - series: [5, 3, 4] - }; - options = { - width: 100, - height: 100, - chartPadding: 10, - labelInterpolationFnc: (value) => `${Math.round(value / data.series.reduce(sum) * 100)}%` - }; + mockDom(); + }); + afterEach(() => { + destroyMockDom(); + data = undefined; + options = undefined; }); - function createChart(callback) { - fixture = addFixture('
'); - const chart = new PieChart(fixture.wrapper.querySelector('.ct-chart'), data, options) - .on('created', () => { - callback(); + describe('Meta data tests', () => { + + it('should render meta data correctly on slice with mixed value array', async () => { + const fixture = addMockWrapper('
'); + const meta = { + test: 'Serialized Test' + }; + + const data = { + labels: ['A', 'B', 'C'], + series: [5, { + value: 8, + meta: meta + }, 1] + }; + + const chartContainer = fixture.wrapper.querySelector('.ct-chart'); + const chart = new PieChart(chartContainer, data); + + chart.on('created', () => { + const metaAttribute = chartContainer + .querySelectorAll('.ct-slice-pie')[1] + .getAttributeNS(namespaces.ct, 'meta'); + expect(deserialize(metaAttribute)).toEqual(meta); chart.off('created'); }); - } + }); + }); + + describe('Simple Pie Chart', () => { + const num = '\\d+(\\.\\d*)?'; + const sum = (a, b) => a + b; + + beforeEach(() => { + data = { + series: [5, 3, 4] + }; + options = { + width: 100, + height: 100, + chartPadding: 10, + labelInterpolationFnc: (value) => `${Math.round(value / data.series.reduce(sum) * 100)}%` + }; + }); + + it('should render three slices', async () => { + await createChart(); - it('should render three slices', (done) => { - createChart(() => { expect(fixture.wrapper.querySelectorAll('.ct-slice-pie').length).toBe(3); - done(); }); - }); - it('should set value attribute', (done) => { - createChart(() => { + it('should set value attribute', async () => { + await createChart(); + const slices = fixture.wrapper.querySelectorAll('.ct-slice-pie'); expect(slices[0].getAttributeNS(namespaces.ct, 'value')).toBe('5'); expect(slices[1].getAttributeNS(namespaces.ct, 'value')).toBe('3'); expect(slices[2].getAttributeNS(namespaces.ct, 'value')).toBe('4'); - done(); }); - }); - it('should create slice path', (done) => { - createChart(() => { + it('should create slice path', async () => { + await createChart(); + Array.from(fixture.wrapper.querySelectorAll('.ct-slice-pie')).forEach((element) => { - const pattern = `M${num},${num}A40,40,0,0,0,${num},${num}L50,50Z$`; + const pattern = new RegExp(`M${num},${num}A40,40,0,0,0,${num},${num}L50,50Z$`); const path = element.getAttribute('d'); expect(path).toMatch(pattern); }); - done(); }); - }); - it('should add labels', (done) => { - createChart(() => { + it('should add labels', async () => { + await createChart(); + const labels = fixture.wrapper.querySelectorAll('.ct-label'); expect(labels[0].textContent).toBe('42%'); expect(labels[1].textContent).toBe('25%'); expect(labels[2].textContent).toBe('33%'); - done(); }); - }); - it('should overlap slices', (done) => { - data = { - series: [1, 1] - }; - createChart(() => { + it('should overlap slices', async () => { + data = { + series: [1, 1] + }; + await createChart(); + const [slice1, slice2] = Array.from(fixture.wrapper.querySelectorAll('.ct-slice-pie')); expect(slice1.getAttribute('d')).toMatch(/^M50,90A40,40,0,0,0,50,10L50,50Z/); expect(slice2.getAttribute('d')).toMatch(/^M50,10A40,40,0,0,0,50.\d+,90L50,50Z/); - done(); }); - }); - it('should set large arc sweep flag', (done) => { - data = { - series: [1, 2] - }; - createChart(() => { + it('should set large arc sweep flag', async () => { + data = { + series: [1, 2] + }; + await createChart(); + const slice = fixture.wrapper.querySelectorAll('.ct-slice-pie')[1]; expect(slice.getAttribute('d')).toMatch(/^M50,10A40,40,0,1,0/); - done(); - }, data); - }); + }); + + it('should draw complete circle with gap', async () => { + data = { + series: [1] + }; + await createChart(); - it('should draw complete circle with gap', (done) => { - data = { - series: [1] - }; - createChart(() => { const slice = fixture.wrapper.querySelectorAll('.ct-slice-pie')[0]; expect(slice.getAttribute('d')).toMatch(/^M49.9\d+,10A40,40,0,1,0,50,10L50,50Z/); - done(); }); - }); - it('should draw complete circle with startAngle', (done) => { - data.series = [100]; - options.startAngle = 90; - createChart(() => { + it('should draw complete circle with startAngle', async () => { + data.series = [100]; + options.startAngle = 90; + await createChart(); + const slice = fixture.wrapper.querySelectorAll('.ct-slice-pie')[0]; expect(slice.getAttribute('d')).toMatch(/^M90,49.9\d+A40,40,0,1,0,90,50L50,50Z/); - done(); }); - }); - it('should draw complete circle if values are 0', (done) => { - data = { - series: [0, 1, 0] - }; - createChart(() => { + it('should draw complete circle if values are 0', async () => { + data = { + series: [0, 1, 0] + }; + await createChart(); + const slice = fixture.wrapper.querySelectorAll('.ct-slice-pie')[1]; expect(slice.getAttribute('d')).toMatch(/^M49.9\d+,10A40,40,0,1,0,50,10L50,50Z/); - done(); }); - }); - }); - - describe('Pie with small slices', () => { - let data; - let options; - let fixture; - - beforeEach(() => { - data = { - series: [0.001, 2] - }; - options = { - width: 100, - height: 100, - chartPadding: 0 - }; }); - function createChart(callback) { - fixture = addFixture('
'); - const chart = new PieChart(fixture.wrapper.querySelector('.ct-chart'), data, options) - .on('created', () => { - callback(); - chart.off('created'); - }); - } + describe('Pie with small slices', () => { + beforeEach(() => { + data = { + series: [0.001, 2] + }; + options = { + width: 100, + height: 100, + chartPadding: 0 + }; + }); + + it('should render correctly with very small slices', async () => { + await createChart(); - it('should render correctly with very small slices', (done) => { - createChart(() => { const [slice1, slice2] = Array.from(fixture.wrapper.querySelectorAll('.ct-slice-pie')); expect(slice1.getAttribute('d')).toMatch(/^M50.1\d+,0A50,50,0,0,0,50,0/); expect(slice2.getAttribute('d')).toMatch(/^M49.9\d*,0A50,50,0,1,0,50,0/); - done(); }); - }); - it('should render correctly with very small slices on startAngle', (done) => { - options.startAngle = 90; - createChart(() => { + it('should render correctly with very small slices on startAngle', async () => { + options.startAngle = 90; + await createChart(); + const [slice1, slice2] = Array.from(fixture.wrapper.querySelectorAll('.ct-slice-pie')); expect(slice1.getAttribute('d')).toMatch(/^M100,50.1\d*A50,50,0,0,0,100,50/); expect(slice2.getAttribute('d')).toMatch(/^M100,49.97\d*A50,50,0,1,0,100,49.98\d*/); - done(); }); - }); - it('should render correctly with very small slices', (done) => { - options.donut = true; - createChart(() => { + it('should render correctly with very small slices', async () => { + options.donut = true; + await createChart(); + const [slice1, slice2] = Array.from(fixture.wrapper.querySelectorAll('.ct-slice-donut')); expect(slice1.getAttribute('d')).toMatch(/^M50.\d+,30A20,20,0,0,0,50,30/); expect(slice2.getAttribute('d')).toMatch(/^M49.9\d*,30A20,20,0,1,0,50,30/); - done(); }); }); - }); - describe('Pie with empty values', () => { - let data; - let options; - let fixture; + describe('Pie with empty values', () => { + beforeEach(() => { + data = { + series: [1, 2, 0, 4] + }; + options = { + width: 100, + height: 100, + ignoreEmptyValues: true + }; + }); - beforeEach(() => { - data = { - series: [1, 2, 0, 4] - }; - options = { - width: 100, - height: 100, - ignoreEmptyValues: true - }; - }); + it('should not render empty slices', async () => { + await createChart(); - function createChart(callback) { - fixture = addFixture('
'); - const chart = new PieChart(fixture.wrapper.querySelector('.ct-chart'), data, options) - .on('created', () => { - callback(); - chart.off('created'); - }); - } - - it('should not render empty slices', (done) => { - createChart(() => { const slices = fixture.wrapper.querySelectorAll('.ct-slice-pie'); expect(slices.length).toBe(3); expect(slices[0].getAttributeNS(namespaces.ct, 'value')).toBe('1'); expect(slices[1].getAttributeNS(namespaces.ct, 'value')).toBe('2'); expect(slices[2].getAttributeNS(namespaces.ct, 'value')).toBe('4'); - done(); }); - }); - it('should render without NaN values and points', (done) => { - data = { - series: [0, 0, 0] - }; - options = { - width: 400, - height: 400 - }; + it('should render without NaN values and points', async () => { + data = { + series: [0, 0, 0] + }; + options = { + width: 400, + height: 400 + }; + await createChart(); - createChart(() => { const slices = fixture.wrapper.querySelectorAll('.ct-slice-pie'); expect(slices.length).toBe(3); @@ -277,21 +253,19 @@ describe('PieChart', () => { expect(slices[0].getAttribute('d')).toBe('M200,5A195,195,0,0,0,200,5L200,200Z'); expect(slices[1].getAttribute('d')).toBe('M200,5A195,195,0,0,0,200,5L200,200Z'); expect(slices[2].getAttribute('d')).toBe('M200,5A195,195,0,0,0,200,5L200,200Z'); - done(); }); - }); - it('should render empty slices', (done) => { - data = { - series: [1, 2, 0, 4] - }; - options = { - width: 100, - height: 100, - ignoreEmptyValues: false - }; - - createChart(() => { + it('should render empty slices', async () => { + data = { + series: [1, 2, 0, 4] + }; + options = { + width: 100, + height: 100, + ignoreEmptyValues: false + }; + await createChart(); + const slices = fixture.wrapper.querySelectorAll('.ct-slice-pie'); expect(slices.length).toBe(4); @@ -300,142 +274,103 @@ describe('PieChart', () => { expect(slices[1].getAttributeNS(namespaces.ct, 'value')).toBe('2'); expect(slices[2].getAttributeNS(namespaces.ct, 'value')).toBe('0'); expect(slices[3].getAttributeNS(namespaces.ct, 'value')).toBe('4'); - done(); }); }); - }); - describe('Gauge Chart', () => { - let fixture; - let data; - let options; + describe('Gauge Chart', () => { + beforeEach(() => { + data = { + series: [20, 10, 30, 40] + }; + options = { + chartPadding: 50, + height: 500, + width: 500, + donut: true, + donutWidth: 60, + startAngle: 270, + total: 200, + showLabel: false + } + }); - beforeEach(() => { - data = { - series: [20, 10, 30, 40] - }; - options = { - chartPadding: 50, - height: 500, - width: 500, - donut: true, - donutWidth: 60, - startAngle: 270, - total: 200, - showLabel: false - } - }); + it('should render four strokes', async () => { + await createChart(); - function createChart(callback) { - fixture = addFixture('
'); - const chart = new PieChart(fixture.wrapper.querySelector('.ct-chart'), data, options) - .on('created', () => { - callback(); - chart.off('created'); - }); - } - - it('should render four strokes', (done) => { - createChart(() => { expect(fixture.wrapper.querySelectorAll('.ct-slice-donut').length).toBe(4); - done(); }); - }); - it('should set value attribute', (done) => { - createChart(() => { + it('should set value attribute', async () => { + await createChart(); + const slices = fixture.wrapper.querySelectorAll('.ct-slice-donut'); expect(slices[0].getAttributeNS(namespaces.ct, 'value')).toBe('20'); expect(slices[1].getAttributeNS(namespaces.ct, 'value')).toBe('10'); expect(slices[2].getAttributeNS(namespaces.ct, 'value')).toBe('30'); expect(slices[3].getAttributeNS(namespaces.ct, 'value')).toBe('40'); - done(); }); - }); - it('should create slice path', (done) => { - const num = '\\d+(\\.\\d*)?'; - const pattern = `^M${num},${num}A170,170,0,0,0,${num},${num}$`; + it('should create slice path', async () => { + const num = '\\d+(\\.\\d*)?'; + const pattern = new RegExp(`^M${num},${num}A170,170,0,0,0,${num},${num}$`); + await createChart(); - createChart(() => { Array.from(fixture.wrapper.querySelectorAll('.ct-slice-donut')) .forEach((element) => expect(element.getAttribute('d')).toMatch(pattern)); - done(); }); - }); - it('should set stroke-width', (done) => { - const strokeWidth = 'stroke-width:\\s*60px'; + it('should set stroke-width', async () => { + const strokeWidth = new RegExp('stroke-width:\\s*60px'); + await createChart(); - createChart(() => { Array.from(fixture.wrapper.querySelectorAll('.ct-slice-donut')) .forEach((element) => expect(element.getAttribute('style')).toMatch(strokeWidth)); - done(); }); - }); - it('should not add labels', (done) => { - createChart(() => { + it('should not add labels', async () => { + await createChart(); + const labels = fixture.wrapper.querySelectorAll('.ct-label'); expect(labels.length).toBe(0); - done(); }); }); - }); - - describe('Pie Chart with relative donutWidth', () => { - let fixture; - let data; - let options; - beforeEach(() => { - data = { - series: [20, 10, 30, 40] - }; - options = { - chartPadding: 50, - height: 500, - width: 500, - donut: true, - donutWidth: '25%', - showLabel: false - }; - }); + describe('Pie Chart with relative donutWidth', () => { + beforeEach(() => { + data = { + series: [20, 10, 30, 40] + }; + options = { + chartPadding: 50, + height: 500, + width: 500, + donut: true, + donutWidth: '25%', + showLabel: false + }; + }); - function createChart(callback) { - fixture = addFixture('
'); - const chart = new PieChart(fixture.wrapper.querySelector('.ct-chart'), data, options) - .on('created', () => { - callback(); - chart.off('created'); - }); - } + it('should render four strokes', async () => { + await createChart(); - it('should render four strokes', (done) => { - createChart(() => { expect(fixture.wrapper.querySelectorAll('.ct-slice-donut').length).toBe(4); - done(); }); - }); - it('should create slice path', (done) => { - const num = '\\d+(\\.\\d*)?'; - const pattern = `^M${num},${num}A175,175,0,0,0,${num},${num}$`; + it('should create slice path', async () => { + const num = '\\d+(\\.\\d*)?'; + const pattern = new RegExp(`^M${num},${num}A175,175,0,0,0,${num},${num}$`); + await createChart(); - createChart(() => { Array.from(fixture.wrapper.querySelectorAll('.ct-slice-donut')) .forEach((element) => expect(element.getAttribute('d')).toMatch(pattern)); - done(); }); - }); - it('should set stroke-width', (done) => { - const strokeWidth = 'stroke-width:\\s?50px'; + it('should set stroke-width', async () => { + const strokeWidth = new RegExp('stroke-width:\\s?50px'); + await createChart(); - createChart(() => { Array.from(fixture.wrapper.querySelectorAll('.ct-slice-donut')) .forEach((element) => expect(element.getAttribute('style')).toMatch(strokeWidth)); - done(); }); }); }); diff --git a/src/core/creation.spec.js b/src/core/creation.spec.js index 3ca3ef90..4e9b4a39 100644 --- a/src/core/creation.spec.js +++ b/src/core/creation.spec.js @@ -1,215 +1,217 @@ -import {addFixture, initializeFixtures, destroyFixtures} from '../testing/fixtures'; +import {addMockWrapper, mockDom, destroyMockDom} from '../../test/mock'; import {createSvg, createGrid, createGridBackground, normalizePadding} from './creation'; import {EventEmitter} from '../event/event-emitter'; import {Svg} from '../svg/svg'; -describe('Creation', () => { - beforeEach(() => initializeFixtures()); - afterEach(() => destroyFixtures()); - - describe('createSvg', () => { - it('should not remove non-chartist svg elements', () => { - const fixture = addFixture(` -
- -
- +describe('Core', () => { + describe('Creation', () => { + beforeEach(() => mockDom()); + afterEach(() => destroyMockDom()); + + describe('createSvg', () => { + it('should not remove non-chartist svg elements', () => { + const fixture = addMockWrapper(` +
+ +
+ +
-
- `); + `); - const container = fixture.wrapper.querySelector('#chart-container'); - const svg = createSvg(container, '500px', '400px', 'ct-fish-bar'); + const container = fixture.wrapper.querySelector('#chart-container'); + const svg = createSvg(container, '500px', '400px', 'ct-fish-bar'); - expect(svg).toBeDefined(); - expect(svg.classes()).toContain('ct-fish-bar'); - expect(container).toContainElement('#foo'); - expect(container).toContainElement('#bar'); - }); - - it('should remove previous chartist svg elements', () => { - const fixture = addFixture('
'); + expect(svg).toBeDefined(); + expect(svg.classes()).toContain('ct-fish-bar'); + expect(container).toContainElement(document.querySelector('#foo')); + expect(container).toContainElement(document.querySelector('#bar')); + }); - const container = fixture.wrapper.querySelector('#chart-container'); - const svg1 = createSvg(container, '500px', '400px', 'ct-fish-bar'); - const svg2 = createSvg(container, '800px', '200px', 'ct-snake-bar'); + it('should remove previous chartist svg elements', () => { + const fixture = addMockWrapper('
'); - expect(svg1).toBeDefined(); - expect(svg1.classes()).toContain('ct-fish-bar'); - expect(svg2).toBeDefined(); - expect(svg2.classes()).toContain('ct-snake-bar'); - expect(container).not.toContainElement('.ct-fish-bar'); - expect(container).toContainElement('.ct-snake-bar'); - }); - }); + const container = fixture.wrapper.querySelector('#chart-container'); + const svg1 = createSvg(container, '500px', '400px', 'ct-fish-bar'); + const svg2 = createSvg(container, '800px', '200px', 'ct-snake-bar'); - describe('createGrid', () => { - let group, axis, classes, eventEmitter, position, length, offset; - - beforeEach(() => { - eventEmitter = new EventEmitter(); - group = new Svg('g'); - axis = { - units: { - pos: 'x' - }, - counterUnits: { - pos: 'y' - } - }; - classes = []; - position = 10; - length = 100; - offset = 20; + expect(svg1).toBeDefined(); + expect(svg1.classes()).toContain('ct-fish-bar'); + expect(svg2).toBeDefined(); + expect(svg2.classes()).toContain('ct-snake-bar'); + expect(container).not.toContainElement(document.querySelector('.ct-fish-bar')); + expect(container).toContainElement(document.querySelector('.ct-snake-bar')); + }); }); - function onCreated(fn, done) { - eventEmitter.addEventHandler('draw', (grid) => { - fn(grid); - done(); + describe('createGrid', () => { + let group, axis, classes, eventEmitter, position, length, offset; + + beforeEach(() => { + eventEmitter = new EventEmitter(); + group = new Svg('g'); + axis = { + units: { + pos: 'x' + }, + counterUnits: { + pos: 'y' + } + }; + classes = []; + position = 10; + length = 100; + offset = 20; }); - createGrid(position, 1, axis, offset, length, group, classes, eventEmitter); - } - it('should add single grid line to group', (done) => { - onCreated(() => expect(group.querySelectorAll('line').svgElements.length).toBe(1), done); - }); + function onCreated(fn, done) { + eventEmitter.addEventHandler('draw', (grid) => { + fn(grid); + done(); + }); + createGrid(position, 1, axis, offset, length, group, classes, eventEmitter); + } - it('should draw line', (done) => { - onCreated(() => { - const line = group.querySelector('line'); - expect(line.attr('x1')).toBe('10'); - expect(line.attr('x2')).toBe('10'); - expect(line.attr('y1')).toBe('20'); - expect(line.attr('y2')).toBe('120'); - }, done); - }); + it('should add single grid line to group', (done) => { + onCreated(() => expect(group.querySelectorAll('line').svgElements.length).toBe(1), done); + }); - it('should draw horizontal line', (done) => { - axis.units.pos = 'y'; - axis.counterUnits.pos = 'x'; - onCreated(() => { - const line = group.querySelector('line'); - expect(line.attr('y1')).toBe('10'); - expect(line.attr('y2')).toBe('10'); - expect(line.attr('x1')).toBe('20'); - expect(line.attr('x2')).toBe('120'); - }, done); - }); - }); + it('should draw line', (done) => { + onCreated(() => { + const line = group.querySelector('line'); + expect(line.attr('x1')).toBe('10'); + expect(line.attr('x2')).toBe('10'); + expect(line.attr('y1')).toBe('20'); + expect(line.attr('y2')).toBe('120'); + }, done); + }); - describe('createGridBackground', () => { - let group, chartRect, className, eventEmitter; - - beforeEach(() => { - eventEmitter = new EventEmitter(); - group = new Svg('g'); - className = 'ct-test'; - chartRect = { - x1: 5, - y2: 10, - _width: 100, - _height: 50, - width() { - return this._width; - }, - height() { - return this._height; - } - }; + it('should draw horizontal line', (done) => { + axis.units.pos = 'y'; + axis.counterUnits.pos = 'x'; + onCreated(() => { + const line = group.querySelector('line'); + expect(line.attr('y1')).toBe('10'); + expect(line.attr('y2')).toBe('10'); + expect(line.attr('x1')).toBe('20'); + expect(line.attr('x2')).toBe('120'); + }, done); + }); }); - function onCreated(fn, done) { - eventEmitter.addEventHandler('draw', (data) => { - fn(data); - done(); + describe('createGridBackground', () => { + let group, chartRect, className, eventEmitter; + + beforeEach(() => { + eventEmitter = new EventEmitter(); + group = new Svg('g'); + className = 'ct-test'; + chartRect = { + x1: 5, + y2: 10, + _width: 100, + _height: 50, + width() { + return this._width; + }, + height() { + return this._height; + } + }; }); - createGridBackground(group, chartRect, className, eventEmitter); - } - - it('should add rect', (done) => { - onCreated(() => { - const rects = group.querySelectorAll('rect').svgElements; - expect(rects.length).toBe(1); - const rect = rects[0]; - expect(rect.attr('x')).toBe('5'); - expect(rect.attr('y')).toBe('10'); - expect(rect.attr('width')).toBe('100'); - expect(rect.attr('height')).toBe('50'); - expect(rect.classes()).toEqual(['ct-test']); - }, done); - }); - it('should pass grid to event', (done) => { - onCreated((data) => { - expect(data.type).toBe('gridBackground'); - const rect = data.element; - expect(rect.attr('x')).toBe('5'); - expect(rect.attr('y')).toBe('10'); - }, done); - }); - }); + function onCreated(fn, done) { + eventEmitter.addEventHandler('draw', (data) => { + fn(data); + done(); + }); + createGridBackground(group, chartRect, className, eventEmitter); + } + + it('should add rect', (done) => { + onCreated(() => { + const rects = group.querySelectorAll('rect').svgElements; + expect(rects.length).toBe(1); + const rect = rects[0]; + expect(rect.attr('x')).toBe('5'); + expect(rect.attr('y')).toBe('10'); + expect(rect.attr('width')).toBe('100'); + expect(rect.attr('height')).toBe('50'); + expect(rect.classes()).toEqual(['ct-test']); + }, done); + }); - describe('padding normalization', () => { - it('should normalize number padding', () => { - expect(normalizePadding(10)).toEqual({ - top: 10, - right: 10, - bottom: 10, - left: 10 + it('should pass grid to event', (done) => { + onCreated((data) => { + expect(data.type).toBe('gridBackground'); + const rect = data.element; + expect(rect.attr('x')).toBe('5'); + expect(rect.attr('y')).toBe('10'); + }, done); }); }); - it('should normalize number padding when 0 is passed', () => { - expect(normalizePadding(0)).toEqual({ - top: 0, - right: 0, - bottom: 0, - left: 0 + describe('padding normalization', () => { + it('should normalize number padding', () => { + expect(normalizePadding(10)).toEqual({ + top: 10, + right: 10, + bottom: 10, + left: 10 + }); }); - }); - it('should normalize empty padding object with default fallback', () => { - expect(normalizePadding({})).toEqual({ - top: 0, - right: 0, - bottom: 0, - left: 0 + it('should normalize number padding when 0 is passed', () => { + expect(normalizePadding(0)).toEqual({ + top: 0, + right: 0, + bottom: 0, + left: 0 + }); }); - }); - it('should normalize empty padding object with specified fallback', () => { - expect(normalizePadding({}, 10)).toEqual({ - top: 10, - right: 10, - bottom: 10, - left: 10 + it('should normalize empty padding object with default fallback', () => { + expect(normalizePadding({})).toEqual({ + top: 0, + right: 0, + bottom: 0, + left: 0 + }); }); - }); - it('should normalize partial padding object with specified fallback', () => { - expect(normalizePadding({ - top: 5, - left: 5 - }, 10)).toEqual({ - top: 5, - right: 10, - bottom: 10, - left: 5 + it('should normalize empty padding object with specified fallback', () => { + expect(normalizePadding({}, 10)).toEqual({ + top: 10, + right: 10, + bottom: 10, + left: 10 + }); + }); + + it('should normalize partial padding object with specified fallback', () => { + expect(normalizePadding({ + top: 5, + left: 5 + }, 10)).toEqual({ + top: 5, + right: 10, + bottom: 10, + left: 5 + }); }); - }); - it('should not modify complete padding object', () => { - expect(normalizePadding({ - top: 5, - right: 5, - bottom: 5, - left: 5 - }, 10)).toEqual({ - top: 5, - right: 5, - bottom: 5, - left: 5 + it('should not modify complete padding object', () => { + expect(normalizePadding({ + top: 5, + right: 5, + bottom: 5, + left: 5 + }, 10)).toEqual({ + top: 5, + right: 5, + bottom: 5, + left: 5 + }); }); }); }); diff --git a/src/core/data.js b/src/core/data.js index 86b7b3cd..0e5a5f80 100644 --- a/src/core/data.js +++ b/src/core/data.js @@ -37,6 +37,10 @@ export function deserialize(data) { return data; } + if(data === 'NaN') { + return NaN; + } + data = Object.keys(escapingMap) .reduce((result, key) => replaceAll(result, escapingMap[key], key), data); diff --git a/src/core/data.spec.js b/src/core/data.spec.js index 7990bce6..8b57ffa1 100644 --- a/src/core/data.spec.js +++ b/src/core/data.spec.js @@ -1,356 +1,356 @@ import {serialize, deserialize, getDataArray, getBounds, splitIntoSegments} from './data'; import {roundWithPrecision} from './math'; -describe('Data', () => { - describe('serialization', () => { - it('should serialize and deserialize regular strings', () => { - const input = 'String test'; - expect(input).toMatch(deserialize(serialize(input))); - }); +describe('Core', () => { + describe('Data', () => { + describe('serialization', () => { + it('should serialize and deserialize regular strings', () => { + const input = 'String test'; + expect(input).toMatch(deserialize(serialize(input))); + }); - it('should serialize and deserialize strings with critical characters', () => { - const input = 'String test with critical characters " < > \' & &'; - expect(input).toMatch(deserialize(serialize(input))); - }); + it('should serialize and deserialize strings with critical characters', () => { + const input = 'String test with critical characters " < > \' & &'; + expect(input).toMatch(deserialize(serialize(input))); + }); - it('should serialize and deserialize numbers', () => { - const input = 12345.6789; - expect(input).toEqual(deserialize(serialize(input))); - }); + it('should serialize and deserialize numbers', () => { + const input = 12345.6789; + expect(input).toEqual(deserialize(serialize(input))); + }); - it('should serialize and deserialize dates', () => { - const input = new Date(0); - expect(+input).toEqual(+new Date(deserialize(serialize(input)))); - }); + it('should serialize and deserialize dates', () => { + const input = new Date(0); + expect(+input).toEqual(+new Date(deserialize(serialize(input)))); + }); - it('should serialize and deserialize complex object types', () => { - const input = { - a: { - b: 100, - c: 'String test', - d: 'String test with critical characters " < > \' & &', - e: { - f: 'String test' + it('should serialize and deserialize complex object types', () => { + const input = { + a: { + b: 100, + c: 'String test', + d: 'String test with critical characters " < > \' & &', + e: { + f: 'String test' + } } - } - }; + }; - expect(input).toEqual(deserialize(serialize(input))); - }); + expect(input).toEqual(deserialize(serialize(input))); + }); - it('should serialize and deserialize null, undefined and NaN', () => { - expect(null).toEqual(deserialize(serialize(null))); - expect(undefined).toEqual(deserialize(serialize(undefined))); - expect(NaN).toMatch(deserialize(serialize('NaN'))); + it('should serialize and deserialize null, undefined and NaN', () => { + expect(null).toEqual(deserialize(serialize(null))); + expect(undefined).toEqual(deserialize(serialize(undefined))); + expect(deserialize(serialize(NaN))).toBeNaN(); + }); }); - }); - describe('data normalization', () => { - it('should normalize mixed series types correctly', () => { - const data = { - labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], - series: [ - {data: [1, 0, 3, 4, 5, 6]}, - [1, {value: 0}, 3, {value: 4}, 5, 6, 7, 8], - {data: [1, 0, {value: 3}]} - ] - }; - - expect(getDataArray(data)).toEqual( - [ - [1, 0, 3, 4, 5, 6], - [1, 0, 3, 4, 5, 6, 7, 8], - [1, 0, 3] - ] - ); - }); + describe('data normalization', () => { + it('should normalize mixed series types correctly', () => { + const data = { + labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + series: [ + {data: [1, 0, 3, 4, 5, 6]}, + [1, {value: 0}, 3, {value: 4}, 5, 6, 7, 8], + {data: [1, 0, {value: 3}]} + ] + }; - it('should normalize mixed series for pie chart correctly', () => { - const data = { - series: [1, {value: 0}, 3, {value: 4}, 5, 6, 7, 8] - }; + expect(getDataArray(data)).toEqual( + [ + [1, 0, 3, 4, 5, 6], + [1, 0, 3, 4, 5, 6, 7, 8], + [1, 0, 3] + ] + ); + }); - expect(getDataArray(data)).toEqual( - [1, 0, 3, 4, 5, 6, 7, 8] - ); - }); + it('should normalize mixed series for pie chart correctly', () => { + const data = { + series: [1, {value: 0}, 3, {value: 4}, 5, 6, 7, 8] + }; - it('should normalize mixed series with string values for pie chart correctly', () => { - const data = { - series: ['1', {value: '0'}, '3', {value: '4'}, '5', '6', '7', '8'] - }; + expect(getDataArray(data)).toEqual( + [1, 0, 3, 4, 5, 6, 7, 8] + ); + }); - expect(getDataArray(data)).toEqual( - [1, 0, 3, 4, 5, 6, 7, 8] - ); - }); + it('should normalize mixed series with string values for pie chart correctly', () => { + const data = { + series: ['1', {value: '0'}, '3', {value: '4'}, '5', '6', '7', '8'] + }; - it('should normalize mixed series types with string values correctly', () => { - const data = { - labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], - series: [ - {data: ['1', '0', '3', '4', '5', '6']}, - ['1', {value: '0'}, '3', {value: '4'}, '5', '6', '7', '8'], - {data: ['1', '0', {value: '3'}]} - ] - }; - - expect(getDataArray(data)).toEqual( - [ - [1, 0, 3, 4, 5, 6], - [1, 0, 3, 4, 5, 6, 7, 8], - [1, 0, 3] - ] - ); - }); + expect(getDataArray(data)).toEqual( + [1, 0, 3, 4, 5, 6, 7, 8] + ); + }); - it('should normalize mixed series types with weird values correctly', () => { - const data = { - labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], - series: [ - {data: [null, NaN, undefined, '4', '5', '6']}, - ['1', {value: null}, '3', {value: NaN}, '5', '6', '7', '8'], - {data: ['1', '0', {value: undefined}]} - ] - }; - - expect(getDataArray(data)).toEqual( - [ - [undefined, undefined, undefined, 4, 5, 6], - [1, undefined, 3, undefined, 5, 6, 7, 8], - [1, 0, undefined] - ] - ); - }); + it('should normalize mixed series types with string values correctly', () => { + const data = { + labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + series: [ + {data: ['1', '0', '3', '4', '5', '6']}, + ['1', {value: '0'}, '3', {value: '4'}, '5', '6', '7', '8'], + {data: ['1', '0', {value: '3'}]} + ] + }; - it('should normalize correctly with 0 values in data series array objects', () => { - const data = { - labels: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri'], - series: [{ - data: [ - {value: 1}, - {value: 4}, - {value: 2}, - {value: 7}, - {value: 2}, - {value: 0} + expect(getDataArray(data)).toEqual( + [ + [1, 0, 3, 4, 5, 6], + [1, 0, 3, 4, 5, 6, 7, 8], + [1, 0, 3] ] - }] - }; + ); + }); - expect(getDataArray(data)).toEqual( - [[1, 4, 2, 7, 2, 0]] - ); - }); + it('should normalize mixed series types with weird values correctly', () => { + const data = { + labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + series: [ + {data: [null, NaN, undefined, '4', '5', '6']}, + ['1', {value: null}, '3', {value: NaN}, '5', '6', '7', '8'], + {data: ['1', '0', {value: undefined}]} + ] + }; - it('should normalize correctly with mixed dimensional input into multi dimensional output', () => { - const data = { - labels: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri'], - series: [{ - data: [ - {value: 1}, - {value: {y: 4, x: 1}}, - {y: 2, x: 2}, - NaN, - null, - {value: 7}, - {value: 2}, - {value: null}, - {y: undefined, x: NaN} + expect(getDataArray(data)).toEqual( + [ + [undefined, undefined, undefined, 4, 5, 6], + [1, undefined, 3, undefined, 5, 6, 7, 8], + [1, 0, undefined] ] - }] - }; - - expect(getDataArray(data, false, true)).toEqual( - [[ - {x: undefined, y: 1}, - {x: 1, y: 4}, - {x: 2, y: 2}, - undefined, - undefined, - {x: undefined, y: 7}, - {x: undefined, y: 2}, - undefined, - {x: undefined, y: undefined} - ]] - ); - }); + ); + }); - it('should normalize boolean series correctly', () => { - const data = { - series: [true, false, false, true] - }; + it('should normalize correctly with 0 values in data series array objects', () => { + const data = { + labels: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri'], + series: [{ + data: [ + {value: 1}, + {value: 4}, + {value: 2}, + {value: 7}, + {value: 2}, + {value: 0} + ] + }] + }; + + expect(getDataArray(data)).toEqual( + [[1, 4, 2, 7, 2, 0]] + ); + }); - expect(getDataArray(data)).toEqual( - [1, 0, 0, 1] - ); - }); + it('should normalize correctly with mixed dimensional input into multi dimensional output', () => { + const data = { + labels: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri'], + series: [{ + data: [ + {value: 1}, + {value: {y: 4, x: 1}}, + {y: 2, x: 2}, + NaN, + null, + {value: 7}, + {value: 2}, + {value: null}, + {y: undefined, x: NaN} + ] + }] + }; + + expect(getDataArray(data, false, true)).toEqual( + [[ + {x: undefined, y: 1}, + {x: 1, y: 4}, + {x: 2, y: 2}, + undefined, + undefined, + {x: undefined, y: 7}, + {x: undefined, y: 2}, + undefined, + {x: undefined, y: undefined} + ]] + ); + }); - it('should normalize date series correctly', () => { - const data = { - series: [new Date(0), new Date(1), new Date(2), new Date(3)] - }; + it('should normalize boolean series correctly', () => { + const data = { + series: [true, false, false, true] + }; - expect(getDataArray(data)).toEqual( - [0, 1, 2, 3] - ); - }); - }); + expect(getDataArray(data)).toEqual( + [1, 0, 0, 1] + ); + }); - describe('getBounds', () => { - it('should return 10 steps', () => { - const bounds = getBounds(100, {high: 10, low: 1}, 10, false); - expect(bounds.min).toBe(1); - expect(bounds.max).toBe(10); - expect(bounds.values).toEqual([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]); - }); + it('should normalize date series correctly', () => { + const data = { + series: [new Date(0), new Date(1), new Date(2), new Date(3)] + }; - it('should return 5 steps', () => { - const bounds = getBounds(100, {high: 10, low: 1}, 20, false); - expect(bounds.min).toBe(1); - expect(bounds.max).toBe(10); - expect(bounds.values).toEqual([1, 3, 5, 7, 9]); + expect(getDataArray(data)).toEqual( + [0, 1, 2, 3] + ); + }); }); - it('should return non integer steps', () => { - const bounds = getBounds(100, {high: 2, low: 1}, 20, false); - expect(bounds.min).toBe(1); - expect(bounds.max).toBe(2); - expect(bounds.values).toEqual([1, 1.25, 1.5, 1.75, 2]); - }); + describe('getBounds', () => { + it('should return 10 steps', () => { + const bounds = getBounds(100, {high: 10, low: 1}, 10, false); + expect(bounds.min).toBe(1); + expect(bounds.max).toBe(10); + expect(bounds.values).toEqual([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]); + }); - it('should return integer steps only', () => { - const bounds = getBounds(100, {high: 3, low: 1}, 20, true); - expect(bounds.min).toBe(1); - expect(bounds.max).toBe(3); - expect(bounds.values).toEqual([1, 2, 3]); - }); + it('should return 5 steps', () => { + const bounds = getBounds(100, {high: 10, low: 1}, 20, false); + expect(bounds.min).toBe(1); + expect(bounds.max).toBe(10); + expect(bounds.values).toEqual([1, 3, 5, 7, 9]); + }); - it('should return single integer step', () => { - const bounds = getBounds(100, {high: 2, low: 1}, 20, true); - expect(bounds.min).toBe(1); - expect(bounds.max).toBe(2); - expect(bounds.values).toEqual([1, 2]); - }); + it('should return non integer steps', () => { + const bounds = getBounds(100, {high: 2, low: 1}, 20, false); + expect(bounds.min).toBe(1); + expect(bounds.max).toBe(2); + expect(bounds.values).toEqual([1, 1.25, 1.5, 1.75, 2]); + }); - it('should floor/ceil min/max', () => { - const bounds = getBounds(100, {high: 9.9, low: 1.01}, 20, false); - expect(bounds.min).toBe(1); - expect(bounds.max).toBe(10); - expect(bounds.values).toEqual([1, 3, 5, 7, 9]); - }); + it('should return integer steps only', () => { + const bounds = getBounds(100, {high: 3, low: 1}, 20, true); + expect(bounds.min).toBe(1); + expect(bounds.max).toBe(3); + expect(bounds.values).toEqual([1, 2, 3]); + }); - it('should floor/ceil min/max for non integers', () => { - const bounds = getBounds(100, {high: 2.9, low: 1.01}, 20, false); - expect(bounds.min).toBe(1); - expect(bounds.max).toBe(3); - expect(bounds.values).toEqual([1, 1.5, 2, 2.5, 3]); - }); + it('should return single integer step', () => { + const bounds = getBounds(100, {high: 2, low: 1}, 20, true); + expect(bounds.min).toBe(1); + expect(bounds.max).toBe(2); + expect(bounds.values).toEqual([1, 2]); + }); - it('should floor/ceil min/max if integers only', () => { - const bounds = getBounds(100, {high: 2.9, low: 1.01}, 20, true); - expect(bounds.min).toBe(1); - expect(bounds.max).toBe(3); - expect(bounds.values).toEqual([1, 2, 3]); - }); + it('should floor/ceil min/max', () => { + const bounds = getBounds(100, {high: 9.9, low: 1.01}, 20, false); + expect(bounds.min).toBe(1); + expect(bounds.max).toBe(10); + expect(bounds.values).toEqual([1, 3, 5, 7, 9]); + }); - it('should return neg and pos values', () => { - const bounds = getBounds(100, {high: 1.9, low: -0.9}, 20, false); - expect(bounds.min).toBe(-1); - expect(bounds.max).toBe(2); - expect(bounds.values).toEqual([-1, 0, 1, 2]); - }); + it('should floor/ceil min/max for non integers', () => { + const bounds = getBounds(100, {high: 2.9, low: 1.01}, 20, false); + expect(bounds.min).toBe(1); + expect(bounds.max).toBe(3); + expect(bounds.values).toEqual([1, 1.5, 2, 2.5, 3]); + }); - it('should return two steps if no space', () => { - const bounds = getBounds(100, {high: 5, low: 0}, 45, false); - expect(bounds.min).toBe(0); - expect(bounds.max).toBe(5); - expect(bounds.values).toEqual([0, 4]); - }); + it('should floor/ceil min/max if integers only', () => { + const bounds = getBounds(100, {high: 2.9, low: 1.01}, 20, true); + expect(bounds.min).toBe(1); + expect(bounds.max).toBe(3); + expect(bounds.values).toEqual([1, 2, 3]); + }); - it('should return single step if no space', () => { - const bounds = getBounds(100, {high: 5, low: 0}, 80, false); - expect(bounds.min).toBe(0); - expect(bounds.max).toBe(5); - expect(bounds.values).toEqual([0]); - }); + it('should return neg and pos values', () => { + const bounds = getBounds(100, {high: 1.9, low: -0.9}, 20, false); + expect(bounds.min).toBe(-1); + expect(bounds.max).toBe(2); + expect(bounds.values).toEqual([-1, 0, 1, 2]); + }); - it('should return single step if range is less than epsilon', () => { - const bounds = getBounds(100, {high: 1.0000000000000002, low: 1}, 20, false); - expect(bounds.min).toBe(1); - expect(bounds.max).toBe(1.0000000000000002); - expect(bounds.low).toBe(1); - expect(bounds.high).toBe(1.0000000000000002); - expect(bounds.values).toEqual([1]); - }); + it('should return two steps if no space', () => { + const bounds = getBounds(100, {high: 5, low: 0}, 45, false); + expect(bounds.min).toBe(0); + expect(bounds.max).toBe(5); + expect(bounds.values).toEqual([0, 4]); + }); - it('should return single step if range is less than smallest increment', () => { - const bounds = getBounds(613.234375, {high: 1000.0000000000001, low: 999.9999999999997}, 50, false); - expect(bounds.min).toBe(999.9999999999999); - expect(bounds.max).toBe(1000); - expect(bounds.low).toBe(999.9999999999997); - expect(bounds.high).toBe(1000.0000000000001); - expect(bounds.values).toEqual([roundWithPrecision(999.9999999999999)]); - }); - }); + it('should return single step if no space', () => { + const bounds = getBounds(100, {high: 5, low: 0}, 80, false); + expect(bounds.min).toBe(0); + expect(bounds.max).toBe(5); + expect(bounds.values).toEqual([0]); + }); - describe('splitIntoSegments', () => { - function makeValues(arr) { - return arr.map(function(x) { - return {value: x}; + it('should return single step if range is less than epsilon', () => { + const bounds = getBounds(100, {high: 1.0000000000000002, low: 1}, 20, false); + expect(bounds.min).toBe(1); + expect(bounds.max).toBe(1.0000000000000002); + expect(bounds.low).toBe(1); + expect(bounds.high).toBe(1.0000000000000002); + expect(bounds.values).toEqual([1]); }); - } - it('should return empty array for empty input', () => { - expect(splitIntoSegments([], [])).toEqual([]); + it('should return single step if range is less than smallest increment', () => { + const bounds = getBounds(613.234375, {high: 1000.0000000000001, low: 999.9999999999997}, 50, false); + expect(bounds.min).toBe(999.9999999999999); + expect(bounds.max).toBe(1000); + expect(bounds.low).toBe(999.9999999999997); + expect(bounds.high).toBe(1000.0000000000001); + expect(bounds.values).toEqual([roundWithPrecision(999.9999999999999)]); + }); }); - it('should remove undefined values', () => { - const coords = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]; - const values = makeValues([1, undefined, undefined, 4, undefined, 6]); - - expect(splitIntoSegments(coords, values)).toEqual([{ - pathCoordinates: [1, 2], - valueData: makeValues([1]) - }, { - pathCoordinates: [7, 8], - valueData: makeValues([4]) - }, { - pathCoordinates: [11, 12], - valueData: makeValues([6]) - }]); - }); + describe('splitIntoSegments', () => { + function makeValues(arr) { + return arr.map(x => ({value: x})); + } - it('should respect fillHoles option', () => { - const coords = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]; - const values = makeValues([1, undefined, undefined, 4, undefined, 6]); - const options = { - fillHoles: true - }; - - expect(splitIntoSegments(coords, values, options)).toEqual([{ - pathCoordinates: [1, 2, 7, 8, 11, 12], - valueData: makeValues([1, 4, 6]) - }]); - }); + it('should return empty array for empty input', () => { + expect(splitIntoSegments([], [])).toEqual([]); + }); + + it('should remove undefined values', () => { + const coords = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]; + const values = makeValues([1, undefined, undefined, 4, undefined, 6]); + + expect(splitIntoSegments(coords, values)).toEqual([{ + pathCoordinates: [1, 2], + valueData: makeValues([1]) + }, { + pathCoordinates: [7, 8], + valueData: makeValues([4]) + }, { + pathCoordinates: [11, 12], + valueData: makeValues([6]) + }]); + }); + + it('should respect fillHoles option', () => { + const coords = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]; + const values = makeValues([1, undefined, undefined, 4, undefined, 6]); + const options = { + fillHoles: true + }; + + expect(splitIntoSegments(coords, values, options)).toEqual([{ + pathCoordinates: [1, 2, 7, 8, 11, 12], + valueData: makeValues([1, 4, 6]) + }]); + }); - it('should respect increasingX option', () => { - const coords = [1, 2, 3, 4, 5, 6, 5, 6, 7, 8, 1, 2]; - const values = makeValues([1, 2, 3, 4, 5, 6]); - const options = { - increasingX: true - }; - - expect(splitIntoSegments(coords, values, options)).toEqual([{ - pathCoordinates: [1, 2, 3, 4, 5, 6], - valueData: makeValues([1, 2, 3]) - }, { - pathCoordinates: [5, 6, 7, 8], - valueData: makeValues([4, 5]) - }, { - pathCoordinates: [1, 2], - valueData: makeValues([6]) - }]); + it('should respect increasingX option', () => { + const coords = [1, 2, 3, 4, 5, 6, 5, 6, 7, 8, 1, 2]; + const values = makeValues([1, 2, 3, 4, 5, 6]); + const options = { + increasingX: true + }; + + expect(splitIntoSegments(coords, values, options)).toEqual([{ + pathCoordinates: [1, 2, 3, 4, 5, 6], + valueData: makeValues([1, 2, 3]) + }, { + pathCoordinates: [5, 6, 7, 8], + valueData: makeValues([4, 5]) + }, { + pathCoordinates: [1, 2], + valueData: makeValues([6]) + }]); + }); }); }); }); diff --git a/src/core/lang.spec.js b/src/core/lang.spec.js index 719a750a..6e011aa6 100644 --- a/src/core/lang.spec.js +++ b/src/core/lang.spec.js @@ -1,24 +1,26 @@ import {quantity} from './lang'; -describe('Lang', () => { - describe('quantity', () => { - it('should return value for numbers', () => { - expect(quantity(100)).toEqual({value: 100}); - expect(quantity(0)).toEqual({value: 0}); - expect(quantity(NaN)).toEqual({value: NaN}); - expect(quantity(null)).toEqual({value: null}); - expect(quantity(undefined)).toEqual({value: undefined}); - }); +describe('Core', () => { + describe('Lang', () => { + describe('quantity', () => { + it('should return value for numbers', () => { + expect(quantity(100)).toEqual({value: 100}); + expect(quantity(0)).toEqual({value: 0}); + expect(quantity(NaN)).toEqual({value: NaN}); + expect(quantity(null)).toEqual({value: null}); + expect(quantity(undefined)).toEqual({value: undefined}); + }); - it('should return value without unit from string', () => { - expect(quantity('100')).toEqual({value: 100, unit: undefined}); - expect(quantity('0')).toEqual({value: 0, unit: undefined}); - }); + it('should return value without unit from string', () => { + expect(quantity('100')).toEqual({value: 100, unit: undefined}); + expect(quantity('0')).toEqual({value: 0, unit: undefined}); + }); - it('should return value and unit from string', () => { - expect(quantity('100%')).toEqual({value: 100, unit: '%'}); - expect(quantity('100 %')).toEqual({value: 100, unit: '%'}); - expect(quantity('0px')).toEqual({value: 0, unit: 'px'}); + it('should return value and unit from string', () => { + expect(quantity('100%')).toEqual({value: 100, unit: '%'}); + expect(quantity('100 %')).toEqual({value: 100, unit: '%'}); + expect(quantity('0px')).toEqual({value: 0, unit: 'px'}); + }); }); }); }); diff --git a/src/core/options-provider.js b/src/core/options-provider.js index 05895064..aca37498 100644 --- a/src/core/options-provider.js +++ b/src/core/options-provider.js @@ -40,7 +40,7 @@ export function optionsProvider(options, responsiveOptions, eventEmitter) { } if(!window.matchMedia) { - throw 'window.matchMedia not found! Make sure you\'re using a polyfill.'; + throw new Error('window.matchMedia not found! Make sure you\'re using a polyfill.'); } else if(responsiveOptions) { responsiveOptions.forEach((responsiveOption) => { const mql = window.matchMedia(responsiveOption[0]); diff --git a/src/svg/svg-path.spec.js b/src/svg/svg-path.spec.js index 4d2dd487..cb5420ce 100644 --- a/src/svg/svg-path.spec.js +++ b/src/svg/svg-path.spec.js @@ -1,166 +1,168 @@ import {SvgPath} from './svg-path'; -describe('SvgPath', () => { - it('should handle position updates correctly', () => { - const path = new SvgPath(); - expect(path.position()).toBe(0); - expect(path.position(100).position()).toBe(0); - expect(path.position(-1).position()).toBe(0); - - path.pathElements = [1, 2, 3]; - expect(path.position(100).position()).toBe(3); - }); - - it('should add absolute and relative path elements correctly', () => { - const path = new SvgPath() - .move(1, 2) - .move(3, 4, true) - .line(5, 6) - .line(7, 8, true) - .curve(9, 10, 11, 12, 13, 14) - .curve(15, 16, 17, 18, 19, 20, true); - - expect(path.pathElements.length).toBe(6); - expect(path.pathElements).toEqual([ - {command: 'M', x: 1, y: 2}, - {command: 'm', x: 3, y: 4}, - {command: 'L', x: 5, y: 6}, - {command: 'l', x: 7, y: 8}, - {command: 'C', x1: 9, y1: 10, x2: 11, y2: 12, x: 13, y: 14}, - {command: 'c', x1: 15, y1: 16, x2: 17, y2: 18, x: 19, y: 20} - ]); - }); - - it('should insert new elements at correct position', () => { - const path = new SvgPath() - .move(1, 2) - .move(7, 8) - .move(9, 10) - .position(1) - .move(3, 4) - .move(5, 6) - .position(100000) - .move(11, 12) - .position(-100000) - .move(-1, 0); - - expect(path.pathElements.length).toBe(7); - expect(path.pathElements).toEqual([ - {command: 'M', x: -1, y: 0}, - {command: 'M', x: 1, y: 2}, - {command: 'M', x: 3, y: 4}, - {command: 'M', x: 5, y: 6}, - {command: 'M', x: 7, y: 8}, - {command: 'M', x: 9, y: 10}, - {command: 'M', x: 11, y: 12} - ]); - }); - - it('should stringify simple shape correctly', () => { - const path = new SvgPath(true).move(10, 10).line(10, 100).line(100, 100).line(100, 10); - expect(path.stringify()).toEqual('M10,10L10,100L100,100L100,10Z'); - }); - - it('should stringify with configured precision', () => { - const path = new SvgPath(false, { - accuracy: 2 - }).move(10.12345, 10.14345).line(10.14545, 10).line(10.14000000645, 10.3333333333); - expect(path.stringify()).toEqual('M10.12,10.14L10.15,10L10.14,10.33'); - }); - - it('should parse Chartist SVG path style correctly', () => { - const path = new SvgPath().parse('M10,10L10,100L100,100L100,10'); - expect(path.stringify()).toEqual('M10,10L10,100L100,100L100,10'); - }); - - it('should parse MDN SVG path style correctly', () => { - const path = new SvgPath().parse('M10 10 L 10 100 L 100 100 L 100 10 C 1 1, 1 1, 1 1'); - expect(path.stringify()).toEqual('M10,10L10,100L100,100L100,10C1,1,1,1,1,1'); - }); - - it('should parse path with closing command', () => { - const path = new SvgPath().parse('M10 10 L 10 100 L 100 100 L 100 10 C 1 1, 1 1, 1 1 Z'); - expect(path.stringify()).toEqual('M10,10L10,100L100,100L100,10C1,1,1,1,1,1'); - }); - - it('should parse complex path correctly', () => { - const path = new SvgPath(false, { - accuracy: false - }).parse('M7.566371681415929,313.5870318472049L15.132743362831858,322.1479887268699L22.699115044247787,292.49058976570063L30.265486725663717,284.9469379116152L37.83185840707964,277.62070141556273L45.39823008849557,285.4043086222666L52.9646017699115,295.16905806058617L60.530973451327434,288.5395967440654L68.09734513274336,282.3023155078293L75.66371681415929,276.9420221519757L83.23008849557522,271.31296300227655L90.79646017699115,273.1827546735411L98.36283185840708,282.72148250847295L105.929203539823,276.55760703185683L113.49557522123892,278.16318930715545L121.06194690265487,279.67913384762466L128.6283185840708,296.53529757775897L136.1946902654867,324.4003397770142L143.76106194690263,317.1376004332516L151.32743362831857,323.3390406432677L158.89380530973452,328.5597479599146L166.46017699115043,329.67851354926904L174.02654867256635,327.71837583373326L181.5929203539823,335.05972598190976L189.15929203539824,334.29372633331286L196.72566371681415,332.68724934321176L204.29203539823007,330.6752327006325L211.858407079646,325.971917329413L219.42477876106196,328.13057177790404L226.99115044247785,309.6546479835954L234.5575221238938,310.6637826993739L242.12389380530973,310.65221523366176L249.69026548672568,318.40285733188773L257.2566371681416,298.18154267575227L264.8230088495575,307.4788389000347L272.3893805309734,304.189264255087L279.95575221238937,289.0288876874009L287.52212389380526,300.20654714775424L295.0884955752212,298.0164127652739L302.65486725663715,287.69192345832175L310.2212389380531,293.1860711045035L317.78761061946904,300.4760502113585L325.3539823008849,297.94852206276937L332.92035398230087,305.6594311405378L340.4867256637168,306.7859423144216L348.0530973451327,275.68998851331963L355.61946902654864,286.5550640745874L363.1858407079646,288.4952543187362L370.75221238938053,290.1896066608983L378.3185840707965,277.8447927515142L385.88495575221236,282.46018876596827L393.4513274336283,261.617847596371L401.01769911504425,265.06101027918726L408.58407079646014,264.60492966286677L416.1504424778761,252.35288845280365L423.716814159292,239.29220756750195L431.283185840708,229.73170018586225L438.8495575221239,224.1580859168795L446.41592920353986,217.20551113129414L453.9823008849557,212.63435660265037L461.54867256637164,210.4425212857057L469.1150442477876,201.0077146146342L476.6814159292035,182.3934004122068L484.24778761061947,176.98732946386616L491.8141592920354,175.3660655079267L499.38053097345136,181.1589144624976L506.9469026548673,172.81581557677976L514.5132743362832,177.82343674256106L522.079646017699,183.5573714672562L529.646017699115,184.4980688436067L537.2123893805309,201.60789339862924L544.7787610619469,193.42268767053048L552.3451327433628,209.9219909677575L559.9115044247787,221.1318944868172L567.4778761061947,222.47350026973174L575.0442477876105,229.94061399967882L582.6106194690265,213.57676800697396L590.1769911504424,232.97280246785252L597.7433628318583,232.8915724787845L605.3097345132743,231.486089735319L612.8761061946902,234.26534000120475L620.4424778761062,219.90951817170736L628.0088495575221,214.36149678900725L635.5752212389381,204.7245641444236L643.1415929203539,205.04759319834227L650.7079646017698,178.61624621480792L658.2743362831858,174.30656351022486L665.8407079646017,194.06864637030463L673.4070796460177,191.38404795482728L680.9734513274336,188.88380371217903L688.5398230088496,182.47430260433697L696.1061946902654,192.70175438596493L703.6725663716813,182.37945067166908L711.2389380530973,163.80499447227572L718.8053097345132,157.4839718811134L726.3716814159292,149.57403342725343L733.9380530973451,142.6076734278762L741.5044247787611,144.9954413314636L749.070796460177,152.29112878815386L756.637168141593,150.02544379977235L764.2035398230088,139.40203164917125L771.7699115044247,149.22935357717972L779.3362831858407,155.78116263659354L786.9026548672566,145.09966219897575L794.4690265486726,157.52407467202426L802.0353982300885,147.01645902195105L809.6017699115044,141.8658056183404L817.1681415929203,134.36135158737966L824.7345132743362,127.49269525433283L832.3008849557522,120.25886939571154L839.8672566371681,118.26230310074709L847.433628318584,98.76959064327474'); - expect(path.stringify()).toEqual('M7.566371681415929,313.5870318472049L15.132743362831858,322.1479887268699L22.699115044247787,292.49058976570063L30.265486725663717,284.9469379116152L37.83185840707964,277.62070141556273L45.39823008849557,285.4043086222666L52.9646017699115,295.16905806058617L60.530973451327434,288.5395967440654L68.09734513274336,282.3023155078293L75.66371681415929,276.9420221519757L83.23008849557522,271.31296300227655L90.79646017699115,273.1827546735411L98.36283185840708,282.72148250847295L105.929203539823,276.55760703185683L113.49557522123892,278.16318930715545L121.06194690265487,279.67913384762466L128.6283185840708,296.53529757775897L136.1946902654867,324.4003397770142L143.76106194690263,317.1376004332516L151.32743362831857,323.3390406432677L158.89380530973452,328.5597479599146L166.46017699115043,329.67851354926904L174.02654867256635,327.71837583373326L181.5929203539823,335.05972598190976L189.15929203539824,334.29372633331286L196.72566371681415,332.68724934321176L204.29203539823007,330.6752327006325L211.858407079646,325.971917329413L219.42477876106196,328.13057177790404L226.99115044247785,309.6546479835954L234.5575221238938,310.6637826993739L242.12389380530973,310.65221523366176L249.69026548672568,318.40285733188773L257.2566371681416,298.18154267575227L264.8230088495575,307.4788389000347L272.3893805309734,304.189264255087L279.95575221238937,289.0288876874009L287.52212389380526,300.20654714775424L295.0884955752212,298.0164127652739L302.65486725663715,287.69192345832175L310.2212389380531,293.1860711045035L317.78761061946904,300.4760502113585L325.3539823008849,297.94852206276937L332.92035398230087,305.6594311405378L340.4867256637168,306.7859423144216L348.0530973451327,275.68998851331963L355.61946902654864,286.5550640745874L363.1858407079646,288.4952543187362L370.75221238938053,290.1896066608983L378.3185840707965,277.8447927515142L385.88495575221236,282.46018876596827L393.4513274336283,261.617847596371L401.01769911504425,265.06101027918726L408.58407079646014,264.60492966286677L416.1504424778761,252.35288845280365L423.716814159292,239.29220756750195L431.283185840708,229.73170018586225L438.8495575221239,224.1580859168795L446.41592920353986,217.20551113129414L453.9823008849557,212.63435660265037L461.54867256637164,210.4425212857057L469.1150442477876,201.0077146146342L476.6814159292035,182.3934004122068L484.24778761061947,176.98732946386616L491.8141592920354,175.3660655079267L499.38053097345136,181.1589144624976L506.9469026548673,172.81581557677976L514.5132743362832,177.82343674256106L522.079646017699,183.5573714672562L529.646017699115,184.4980688436067L537.2123893805309,201.60789339862924L544.7787610619469,193.42268767053048L552.3451327433628,209.9219909677575L559.9115044247787,221.1318944868172L567.4778761061947,222.47350026973174L575.0442477876105,229.94061399967882L582.6106194690265,213.57676800697396L590.1769911504424,232.97280246785252L597.7433628318583,232.8915724787845L605.3097345132743,231.486089735319L612.8761061946902,234.26534000120475L620.4424778761062,219.90951817170736L628.0088495575221,214.36149678900725L635.5752212389381,204.7245641444236L643.1415929203539,205.04759319834227L650.7079646017698,178.61624621480792L658.2743362831858,174.30656351022486L665.8407079646017,194.06864637030463L673.4070796460177,191.38404795482728L680.9734513274336,188.88380371217903L688.5398230088496,182.47430260433697L696.1061946902654,192.70175438596493L703.6725663716813,182.37945067166908L711.2389380530973,163.80499447227572L718.8053097345132,157.4839718811134L726.3716814159292,149.57403342725343L733.9380530973451,142.6076734278762L741.5044247787611,144.9954413314636L749.070796460177,152.29112878815386L756.637168141593,150.02544379977235L764.2035398230088,139.40203164917125L771.7699115044247,149.22935357717972L779.3362831858407,155.78116263659354L786.9026548672566,145.09966219897575L794.4690265486726,157.52407467202426L802.0353982300885,147.01645902195105L809.6017699115044,141.8658056183404L817.1681415929203,134.36135158737966L824.7345132743362,127.49269525433283L832.3008849557522,120.25886939571154L839.8672566371681,118.26230310074709L847.433628318584,98.76959064327474'); - }); - - it('should scale path along both axes', () => { - const path = new SvgPath() - .move(1, 2) - .line(3, 4) - .curve(5, 6, 7, 8, 9, 10) - .scale(10, 100); - - expect(path.pathElements).toEqual([ - {command: 'M', x: 10, y: 200}, - {command: 'L', x: 30, y: 400}, - {command: 'C', x1: 50, y1: 600, x2: 70, y2: 800, x: 90, y: 1000} - ]); - }); - - it('should translate path along both axes', () => { - const path = new SvgPath() - .move(1, 2) - .line(3, 4) - .curve(5, 6, 7, 8, 9, 10) - .translate(10, 100); - - expect(path.pathElements).toEqual([ - {command: 'M', x: 11, y: 102}, - {command: 'L', x: 13, y: 104}, - {command: 'C', x1: 15, y1: 106, x2: 17, y2: 108, x: 19, y: 110} - ]); - }); - - it('should transform path correctly with custom function', () => { - const path = new SvgPath() - .move(1, 2) - .line(3, 4) - .curve(5, 6, 7, 8, 9, 10) - .transform((element, paramName, elementIndex, paramIndex) => { - if(paramIndex > 3) { - return 0; - } else if(paramName[0] === 'y') { - return 100; - } - }); - - expect(path.pathElements).toEqual([ - {command: 'M', x: 1, y: 100}, - {command: 'L', x: 3, y: 100}, - {command: 'C', x1: 5, y1: 100, x2: 7, y2: 100, x: 0, y: 0} - ]); - }); - - it('should split correctly by move command', () => { - const paths = new SvgPath().parse('M0,0L0,0L0,0L0,0M0,0L0,0L0,0L0,0').splitByCommand('M'); - expect(paths.length).toBe(2); - expect(paths[0].pathElements[0].command).toBe('M'); - expect(paths[0].pathElements.length).toBe(4); - expect(paths[1].pathElements[0].command).toBe('M'); - expect(paths[1].pathElements.length).toBe(4); - }); - - it('should split correctly by move command and tailing move element', () => { - const paths = new SvgPath().parse('M0,0L0,0L0,0L0,0M0,0L0,0L0,0L0,0M0,0').splitByCommand('M'); - expect(paths.length).toBe(3); - expect(paths[2].pathElements[0].command).toBe('M'); - }); - - it('should split correctly by move command and leading other commands', () => { - const paths = new SvgPath().parse('L0,0C0,0,0,0,0,0M0,0L0,0L0,0L0,0M0,0L0,0L0,0L0,0').splitByCommand('M'); - expect(paths.length).toBe(3); - expect(paths[0].pathElements.length).toBe(2); - expect(paths[0].pathElements[0].command).toBe('L'); - expect(paths[0].pathElements[1].command).toBe('C'); - - expect(paths[1].pathElements.length).toBe(4); - expect(paths[1].pathElements[0].command).toBe('M'); +describe('Svg', () => { + describe('SvgPath', () => { + it('should handle position updates correctly', () => { + const path = new SvgPath(); + expect(path.position()).toBe(0); + expect(path.position(100).position()).toBe(0); + expect(path.position(-1).position()).toBe(0); + + path.pathElements = [1, 2, 3]; + expect(path.position(100).position()).toBe(3); + }); + + it('should add absolute and relative path elements correctly', () => { + const path = new SvgPath() + .move(1, 2) + .move(3, 4, true) + .line(5, 6) + .line(7, 8, true) + .curve(9, 10, 11, 12, 13, 14) + .curve(15, 16, 17, 18, 19, 20, true); + + expect(path.pathElements.length).toBe(6); + expect(path.pathElements).toEqual([ + {command: 'M', x: 1, y: 2}, + {command: 'm', x: 3, y: 4}, + {command: 'L', x: 5, y: 6}, + {command: 'l', x: 7, y: 8}, + {command: 'C', x1: 9, y1: 10, x2: 11, y2: 12, x: 13, y: 14}, + {command: 'c', x1: 15, y1: 16, x2: 17, y2: 18, x: 19, y: 20} + ]); + }); + + it('should insert new elements at correct position', () => { + const path = new SvgPath() + .move(1, 2) + .move(7, 8) + .move(9, 10) + .position(1) + .move(3, 4) + .move(5, 6) + .position(100000) + .move(11, 12) + .position(-100000) + .move(-1, 0); + + expect(path.pathElements.length).toBe(7); + expect(path.pathElements).toEqual([ + {command: 'M', x: -1, y: 0}, + {command: 'M', x: 1, y: 2}, + {command: 'M', x: 3, y: 4}, + {command: 'M', x: 5, y: 6}, + {command: 'M', x: 7, y: 8}, + {command: 'M', x: 9, y: 10}, + {command: 'M', x: 11, y: 12} + ]); + }); + + it('should stringify simple shape correctly', () => { + const path = new SvgPath(true).move(10, 10).line(10, 100).line(100, 100).line(100, 10); + expect(path.stringify()).toEqual('M10,10L10,100L100,100L100,10Z'); + }); + + it('should stringify with configured precision', () => { + const path = new SvgPath(false, { + accuracy: 2 + }).move(10.12345, 10.14345).line(10.14545, 10).line(10.14000000645, 10.3333333333); + expect(path.stringify()).toEqual('M10.12,10.14L10.15,10L10.14,10.33'); + }); + + it('should parse Chartist SVG path style correctly', () => { + const path = new SvgPath().parse('M10,10L10,100L100,100L100,10'); + expect(path.stringify()).toEqual('M10,10L10,100L100,100L100,10'); + }); + + it('should parse MDN SVG path style correctly', () => { + const path = new SvgPath().parse('M10 10 L 10 100 L 100 100 L 100 10 C 1 1, 1 1, 1 1'); + expect(path.stringify()).toEqual('M10,10L10,100L100,100L100,10C1,1,1,1,1,1'); + }); + + it('should parse path with closing command', () => { + const path = new SvgPath().parse('M10 10 L 10 100 L 100 100 L 100 10 C 1 1, 1 1, 1 1 Z'); + expect(path.stringify()).toEqual('M10,10L10,100L100,100L100,10C1,1,1,1,1,1'); + }); + + it('should parse complex path correctly', () => { + const path = new SvgPath(false, { + accuracy: false + }).parse('M7.566371681415929,313.5870318472049L15.132743362831858,322.1479887268699L22.699115044247787,292.49058976570063L30.265486725663717,284.9469379116152L37.83185840707964,277.62070141556273L45.39823008849557,285.4043086222666L52.9646017699115,295.16905806058617L60.530973451327434,288.5395967440654L68.09734513274336,282.3023155078293L75.66371681415929,276.9420221519757L83.23008849557522,271.31296300227655L90.79646017699115,273.1827546735411L98.36283185840708,282.72148250847295L105.929203539823,276.55760703185683L113.49557522123892,278.16318930715545L121.06194690265487,279.67913384762466L128.6283185840708,296.53529757775897L136.1946902654867,324.4003397770142L143.76106194690263,317.1376004332516L151.32743362831857,323.3390406432677L158.89380530973452,328.5597479599146L166.46017699115043,329.67851354926904L174.02654867256635,327.71837583373326L181.5929203539823,335.05972598190976L189.15929203539824,334.29372633331286L196.72566371681415,332.68724934321176L204.29203539823007,330.6752327006325L211.858407079646,325.971917329413L219.42477876106196,328.13057177790404L226.99115044247785,309.6546479835954L234.5575221238938,310.6637826993739L242.12389380530973,310.65221523366176L249.69026548672568,318.40285733188773L257.2566371681416,298.18154267575227L264.8230088495575,307.4788389000347L272.3893805309734,304.189264255087L279.95575221238937,289.0288876874009L287.52212389380526,300.20654714775424L295.0884955752212,298.0164127652739L302.65486725663715,287.69192345832175L310.2212389380531,293.1860711045035L317.78761061946904,300.4760502113585L325.3539823008849,297.94852206276937L332.92035398230087,305.6594311405378L340.4867256637168,306.7859423144216L348.0530973451327,275.68998851331963L355.61946902654864,286.5550640745874L363.1858407079646,288.4952543187362L370.75221238938053,290.1896066608983L378.3185840707965,277.8447927515142L385.88495575221236,282.46018876596827L393.4513274336283,261.617847596371L401.01769911504425,265.06101027918726L408.58407079646014,264.60492966286677L416.1504424778761,252.35288845280365L423.716814159292,239.29220756750195L431.283185840708,229.73170018586225L438.8495575221239,224.1580859168795L446.41592920353986,217.20551113129414L453.9823008849557,212.63435660265037L461.54867256637164,210.4425212857057L469.1150442477876,201.0077146146342L476.6814159292035,182.3934004122068L484.24778761061947,176.98732946386616L491.8141592920354,175.3660655079267L499.38053097345136,181.1589144624976L506.9469026548673,172.81581557677976L514.5132743362832,177.82343674256106L522.079646017699,183.5573714672562L529.646017699115,184.4980688436067L537.2123893805309,201.60789339862924L544.7787610619469,193.42268767053048L552.3451327433628,209.9219909677575L559.9115044247787,221.1318944868172L567.4778761061947,222.47350026973174L575.0442477876105,229.94061399967882L582.6106194690265,213.57676800697396L590.1769911504424,232.97280246785252L597.7433628318583,232.8915724787845L605.3097345132743,231.486089735319L612.8761061946902,234.26534000120475L620.4424778761062,219.90951817170736L628.0088495575221,214.36149678900725L635.5752212389381,204.7245641444236L643.1415929203539,205.04759319834227L650.7079646017698,178.61624621480792L658.2743362831858,174.30656351022486L665.8407079646017,194.06864637030463L673.4070796460177,191.38404795482728L680.9734513274336,188.88380371217903L688.5398230088496,182.47430260433697L696.1061946902654,192.70175438596493L703.6725663716813,182.37945067166908L711.2389380530973,163.80499447227572L718.8053097345132,157.4839718811134L726.3716814159292,149.57403342725343L733.9380530973451,142.6076734278762L741.5044247787611,144.9954413314636L749.070796460177,152.29112878815386L756.637168141593,150.02544379977235L764.2035398230088,139.40203164917125L771.7699115044247,149.22935357717972L779.3362831858407,155.78116263659354L786.9026548672566,145.09966219897575L794.4690265486726,157.52407467202426L802.0353982300885,147.01645902195105L809.6017699115044,141.8658056183404L817.1681415929203,134.36135158737966L824.7345132743362,127.49269525433283L832.3008849557522,120.25886939571154L839.8672566371681,118.26230310074709L847.433628318584,98.76959064327474'); + expect(path.stringify()).toEqual('M7.566371681415929,313.5870318472049L15.132743362831858,322.1479887268699L22.699115044247787,292.49058976570063L30.265486725663717,284.9469379116152L37.83185840707964,277.62070141556273L45.39823008849557,285.4043086222666L52.9646017699115,295.16905806058617L60.530973451327434,288.5395967440654L68.09734513274336,282.3023155078293L75.66371681415929,276.9420221519757L83.23008849557522,271.31296300227655L90.79646017699115,273.1827546735411L98.36283185840708,282.72148250847295L105.929203539823,276.55760703185683L113.49557522123892,278.16318930715545L121.06194690265487,279.67913384762466L128.6283185840708,296.53529757775897L136.1946902654867,324.4003397770142L143.76106194690263,317.1376004332516L151.32743362831857,323.3390406432677L158.89380530973452,328.5597479599146L166.46017699115043,329.67851354926904L174.02654867256635,327.71837583373326L181.5929203539823,335.05972598190976L189.15929203539824,334.29372633331286L196.72566371681415,332.68724934321176L204.29203539823007,330.6752327006325L211.858407079646,325.971917329413L219.42477876106196,328.13057177790404L226.99115044247785,309.6546479835954L234.5575221238938,310.6637826993739L242.12389380530973,310.65221523366176L249.69026548672568,318.40285733188773L257.2566371681416,298.18154267575227L264.8230088495575,307.4788389000347L272.3893805309734,304.189264255087L279.95575221238937,289.0288876874009L287.52212389380526,300.20654714775424L295.0884955752212,298.0164127652739L302.65486725663715,287.69192345832175L310.2212389380531,293.1860711045035L317.78761061946904,300.4760502113585L325.3539823008849,297.94852206276937L332.92035398230087,305.6594311405378L340.4867256637168,306.7859423144216L348.0530973451327,275.68998851331963L355.61946902654864,286.5550640745874L363.1858407079646,288.4952543187362L370.75221238938053,290.1896066608983L378.3185840707965,277.8447927515142L385.88495575221236,282.46018876596827L393.4513274336283,261.617847596371L401.01769911504425,265.06101027918726L408.58407079646014,264.60492966286677L416.1504424778761,252.35288845280365L423.716814159292,239.29220756750195L431.283185840708,229.73170018586225L438.8495575221239,224.1580859168795L446.41592920353986,217.20551113129414L453.9823008849557,212.63435660265037L461.54867256637164,210.4425212857057L469.1150442477876,201.0077146146342L476.6814159292035,182.3934004122068L484.24778761061947,176.98732946386616L491.8141592920354,175.3660655079267L499.38053097345136,181.1589144624976L506.9469026548673,172.81581557677976L514.5132743362832,177.82343674256106L522.079646017699,183.5573714672562L529.646017699115,184.4980688436067L537.2123893805309,201.60789339862924L544.7787610619469,193.42268767053048L552.3451327433628,209.9219909677575L559.9115044247787,221.1318944868172L567.4778761061947,222.47350026973174L575.0442477876105,229.94061399967882L582.6106194690265,213.57676800697396L590.1769911504424,232.97280246785252L597.7433628318583,232.8915724787845L605.3097345132743,231.486089735319L612.8761061946902,234.26534000120475L620.4424778761062,219.90951817170736L628.0088495575221,214.36149678900725L635.5752212389381,204.7245641444236L643.1415929203539,205.04759319834227L650.7079646017698,178.61624621480792L658.2743362831858,174.30656351022486L665.8407079646017,194.06864637030463L673.4070796460177,191.38404795482728L680.9734513274336,188.88380371217903L688.5398230088496,182.47430260433697L696.1061946902654,192.70175438596493L703.6725663716813,182.37945067166908L711.2389380530973,163.80499447227572L718.8053097345132,157.4839718811134L726.3716814159292,149.57403342725343L733.9380530973451,142.6076734278762L741.5044247787611,144.9954413314636L749.070796460177,152.29112878815386L756.637168141593,150.02544379977235L764.2035398230088,139.40203164917125L771.7699115044247,149.22935357717972L779.3362831858407,155.78116263659354L786.9026548672566,145.09966219897575L794.4690265486726,157.52407467202426L802.0353982300885,147.01645902195105L809.6017699115044,141.8658056183404L817.1681415929203,134.36135158737966L824.7345132743362,127.49269525433283L832.3008849557522,120.25886939571154L839.8672566371681,118.26230310074709L847.433628318584,98.76959064327474'); + }); + + it('should scale path along both axes', () => { + const path = new SvgPath() + .move(1, 2) + .line(3, 4) + .curve(5, 6, 7, 8, 9, 10) + .scale(10, 100); + + expect(path.pathElements).toEqual([ + {command: 'M', x: 10, y: 200}, + {command: 'L', x: 30, y: 400}, + {command: 'C', x1: 50, y1: 600, x2: 70, y2: 800, x: 90, y: 1000} + ]); + }); + + it('should translate path along both axes', () => { + const path = new SvgPath() + .move(1, 2) + .line(3, 4) + .curve(5, 6, 7, 8, 9, 10) + .translate(10, 100); + + expect(path.pathElements).toEqual([ + {command: 'M', x: 11, y: 102}, + {command: 'L', x: 13, y: 104}, + {command: 'C', x1: 15, y1: 106, x2: 17, y2: 108, x: 19, y: 110} + ]); + }); + + it('should transform path correctly with custom function', () => { + const path = new SvgPath() + .move(1, 2) + .line(3, 4) + .curve(5, 6, 7, 8, 9, 10) + .transform((element, paramName, elementIndex, paramIndex) => { + if(paramIndex > 3) { + return 0; + } else if(paramName[0] === 'y') { + return 100; + } + }); + + expect(path.pathElements).toEqual([ + {command: 'M', x: 1, y: 100}, + {command: 'L', x: 3, y: 100}, + {command: 'C', x1: 5, y1: 100, x2: 7, y2: 100, x: 0, y: 0} + ]); + }); + + it('should split correctly by move command', () => { + const paths = new SvgPath().parse('M0,0L0,0L0,0L0,0M0,0L0,0L0,0L0,0').splitByCommand('M'); + expect(paths.length).toBe(2); + expect(paths[0].pathElements[0].command).toBe('M'); + expect(paths[0].pathElements.length).toBe(4); + expect(paths[1].pathElements[0].command).toBe('M'); + expect(paths[1].pathElements.length).toBe(4); + }); + + it('should split correctly by move command and tailing move element', () => { + const paths = new SvgPath().parse('M0,0L0,0L0,0L0,0M0,0L0,0L0,0L0,0M0,0').splitByCommand('M'); + expect(paths.length).toBe(3); + expect(paths[2].pathElements[0].command).toBe('M'); + }); + + it('should split correctly by move command and leading other commands', () => { + const paths = new SvgPath().parse('L0,0C0,0,0,0,0,0M0,0L0,0L0,0L0,0M0,0L0,0L0,0L0,0').splitByCommand('M'); + expect(paths.length).toBe(3); + expect(paths[0].pathElements.length).toBe(2); + expect(paths[0].pathElements[0].command).toBe('L'); + expect(paths[0].pathElements[1].command).toBe('C'); + + expect(paths[1].pathElements.length).toBe(4); + expect(paths[1].pathElements[0].command).toBe('M'); + }); }); }); diff --git a/test/jasmine-dom-matchers.js b/test/jasmine-dom-matchers.js deleted file mode 100644 index ff671a43..00000000 --- a/test/jasmine-dom-matchers.js +++ /dev/null @@ -1,32 +0,0 @@ -function createCustomMatchers(matchers) { - return Object.keys(matchers).reduce((customMatchers, matcherName) => { - customMatchers[matcherName] = (util, customEqualityTesters) => { - return { - compare: (actual, expected) => { - return matchers[matcherName](actual, expected, util, customEqualityTesters); - } - }; - }; - return customMatchers; - }, {}); -} - -const domMatchers = { - toHaveClass(actual, expected) { - const pass = actual.classList.contains(expected); - return { - pass, - message: `Expected ${actual.classList} to contain ${expected}` - }; - }, - - toContainElement(actual, expected) { - const pass = !!actual.querySelector(expected); - return { - pass, - message: `Expected ${actual} to contain element with selector ${expected}` - }; - } -}; - -beforeEach(() => jasmine.addMatchers(createCustomMatchers(domMatchers))); diff --git a/test/fixtures.js b/test/mock.js similarity index 50% rename from test/fixtures.js rename to test/mock.js index 28c09951..ee3ed34e 100644 --- a/test/fixtures.js +++ b/test/mock.js @@ -1,6 +1,8 @@ export let container = null; -export function initializeFixtures() { +let getBoundingClientRect = SVGElement.prototype.getBoundingClientRect + +export function mockDom() { if(!container) { container = document.createElement('div'); container.setAttribute('data-fixture-container', `${+new Date()}`); @@ -8,24 +10,14 @@ export function initializeFixtures() { } } -export function destroyFixtures() { +export function destroyMockDom() { if(container) { document.body.removeChild(container); container = null; } } -export function loadFixture(path) { - if(!container) { - initializeFixtures(); - } - - return SystemJS.import(path).then((module) => { - return addFixture(module.default || module); - }); -} - -export function addFixture(fixture) { +export function addMockWrapper(fixture) { const wrapper = document.createElement('div'); wrapper.innerHTML += fixture; container.appendChild(wrapper); @@ -35,3 +27,20 @@ export function addFixture(fixture) { fixture }; } + +export function mockDomRects() { + SVGElement.prototype.getBoundingClientRect = () => ({ + x: 0, + y: 0, + width: 500, + height: 500, + top: 0, + right: 0, + bottom: 0, + left: 0, + }); +} + +export function destroyMockDomRects() { + SVGElement.prototype.getBoundingClientRect = getBoundingClientRect; +} diff --git a/test/setup.js b/test/setup.js new file mode 100644 index 00000000..d7f98bdc --- /dev/null +++ b/test/setup.js @@ -0,0 +1,3 @@ +import '@testing-library/jest-dom/extend-expect'; + +window.matchMedia = () => ({}) diff --git a/test/spec/fixture-with-multiple-elements.html b/test/spec/fixture-with-multiple-elements.html deleted file mode 100644 index bcefe8be..00000000 --- a/test/spec/fixture-with-multiple-elements.html +++ /dev/null @@ -1 +0,0 @@ -

First element-

Second element-

Third element
diff --git a/test/spec/fixture-with-single-element.html b/test/spec/fixture-with-single-element.html deleted file mode 100644 index 8bb33e88..00000000 --- a/test/spec/fixture-with-single-element.html +++ /dev/null @@ -1 +0,0 @@ -

This is a test fixture

diff --git a/test/spec/fixtures.spec.js b/test/spec/fixtures.spec.js deleted file mode 100644 index 3cbb3b3f..00000000 --- a/test/spec/fixtures.spec.js +++ /dev/null @@ -1,47 +0,0 @@ -import {loadFixture, destroyFixtures, initializeFixtures, container} from '../fixtures'; - -describe('Fixtures', () => { - beforeEach(() => initializeFixtures()); - afterEach(() => destroyFixtures()); - - it('should initialize correctly and add container to body', () => { - initializeFixtures(); - expect(document.querySelector('[data-fixture-container]')).toBe(container); - expect(container.parentNode).toBe(document.body); - }); - - it('should destroy correctly and remove any existing container', () => { - initializeFixtures(); - destroyFixtures(); - expect(document.querySelector('[data-fixture-container]')).toBeFalsy(); - expect(container).toBeFalsy(); - }); - - it('should load fixtures with single element and set wrapper, fixture and container correctly', (done) => { - loadFixture('chartist/testing/spec/fixture-with-single-element.html!text').then((context) => { - expect(context.container).toBe(container); - expect(context.wrapper.textContent.trim()).toBe('This is a test fixture'); - expect(context.fixture.trim()).toBe('

This is a test fixture

'); - done(); - }); - }); - - it('should load fixtures with multiple elements', (done) => { - loadFixture('/src/testing/spec/fixture-with-multiple-elements.html!text').then((context) => { - expect(context.container.textContent.trim()).toBe('First element-Second element-Third element'); - done(); - }); - }); - - it('should load multiple fixtures correctly', (done) => { - Promise.all([ - loadFixture('/src/testing/spec/fixture-with-single-element.html!text'), - loadFixture('/src/testing/spec/fixture-with-multiple-elements.html!text') - ]).then(() => { - expect(container.childNodes.length).toBe(2); - expect(container.childNodes[0].textContent.trim()).toBe('This is a test fixture'); - expect(container.childNodes[1].textContent.trim()).toBe('First element-Second element-Third element'); - done(); - }); - }); -}); From 6d3891a093c79effd0d26c4249e1fdb6d108c850 Mon Sep 17 00:00:00 2001 From: Dan Onoshko Date: Tue, 26 Apr 2022 02:13:12 +0700 Subject: [PATCH 14/44] build: renew styles build process (#7) --- .browserslistrc | 3 + .storybook/main.js | 17 +- package.json | 17 +- pnpm-lock.yaml | 1126 ++++++++----------- postcss.config.js | 10 + scripts/compile-sass.js | 50 - scripts/styles.js | 42 +- src/styles/settings/_chartist-settings.scss | 6 +- 8 files changed, 521 insertions(+), 750 deletions(-) create mode 100644 .browserslistrc create mode 100644 postcss.config.js delete mode 100644 scripts/compile-sass.js diff --git a/.browserslistrc b/.browserslistrc new file mode 100644 index 00000000..3427f9a3 --- /dev/null +++ b/.browserslistrc @@ -0,0 +1,3 @@ +defaults +not ie 11 +not ie_mob 11 diff --git a/.storybook/main.js b/.storybook/main.js index 6704ece0..b9fdcacb 100644 --- a/.storybook/main.js +++ b/.storybook/main.js @@ -1,9 +1,22 @@ module.exports = { stories: ['../src/**/*.stories.@(js|jsx|ts|tsx)'], addons: [ - '@storybook/preset-scss', '@storybook/addon-docs', '@storybook/addon-controls', '@storybook/addon-actions', - ] + ], + webpackFinal: async (config) => { + config.module.rules.push({ + test: /\.scss$/, + sideEffects: true, + use: [ + 'style-loader', + 'css-loader', + 'postcss-loader', + 'sass-loader' + ].map(require.resolve) + }); + + return config; + }, }; diff --git a/package.json b/package.json index 21a16266..c9894fdc 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "style": "./src/styles/chartist.scss", "main": "./src/index.js", "publishConfig": { - "style": "./dist/chartist.css", + "style": "./dist/index.css", "main": "./dist/index.cjs", "module": "./dist/index.js", "exports": { @@ -50,7 +50,7 @@ "LICENSE-MIT" ], "scripts": { - "build:styles": "./scripts/styles.js src/styles/chartist.scss dist", + "build:styles": "./scripts/styles.js", "build": "rollup -c & pnpm build:styles", "start:storybook": "start-storybook -p 6006 --ci", "build:storybook": "del ./storybook-static; NODE_ENV=production build-storybook", @@ -70,32 +70,25 @@ "@storybook/addon-controls": "^6.4.22", "@storybook/addon-docs": "^6.4.22", "@storybook/html": "^6.4.22", - "@storybook/preset-scss": "^1.0.3", "@swc/core": "^1.2.165", "@swc/helpers": "^0.3.8", "@swc/jest": "^0.2.20", "@testing-library/jest-dom": "^5.16.4", - "autoprefixer": "^10.4.4", "babel-eslint": "^7.1.0", - "babel-loader": "^8.2.4", "browserslist": "^4.20.2", - "chokidar": "^3.5.3", "commitizen": "^4.2.4", - "css-loader": "^5.0.0", "cssnano": "^5.1.7", "del-cli": "^4.0.1", "eslint": "^8.12.0", - "fs-promise": "^0.5.0", "inquirer": "^8.0.0", "jest": "^27.5.1", - "node-sass": "^7.0.1", "postcss": "^8.4.12", + "postcss-preset-env": "^7.4.3", "rollup": "^2.70.1", "rollup-plugin-swc": "^0.2.1", - "sass": "^1.50.0", + "sass": "^1.50.1", "sass-loader": "^10.0.0", - "simple-git-hooks": "^2.7.0", - "style-loader": "^2.0.0" + "simple-git-hooks": "^2.7.0" }, "readme": "" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5d67845a..b421b3da 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,32 +10,25 @@ specifiers: '@storybook/addon-controls': ^6.4.22 '@storybook/addon-docs': ^6.4.22 '@storybook/html': ^6.4.22 - '@storybook/preset-scss': ^1.0.3 '@swc/core': ^1.2.165 '@swc/helpers': ^0.3.8 '@swc/jest': ^0.2.20 '@testing-library/jest-dom': ^5.16.4 - autoprefixer: ^10.4.4 babel-eslint: ^7.1.0 - babel-loader: ^8.2.4 browserslist: ^4.20.2 - chokidar: ^3.5.3 commitizen: ^4.2.4 - css-loader: ^5.0.0 cssnano: ^5.1.7 del-cli: ^4.0.1 eslint: ^8.12.0 - fs-promise: ^0.5.0 inquirer: ^8.0.0 jest: ^27.5.1 - node-sass: ^7.0.1 postcss: ^8.4.12 + postcss-preset-env: ^7.4.3 rollup: ^2.70.1 rollup-plugin-swc: ^0.2.1 - sass: ^1.50.0 + sass: ^1.50.1 sass-loader: ^10.0.0 simple-git-hooks: ^2.7.0 - style-loader: ^2.0.0 devDependencies: '@babel/core': 7.17.9 @@ -47,32 +40,25 @@ devDependencies: '@storybook/addon-controls': 6.4.22_eslint@8.13.0 '@storybook/addon-docs': 6.4.22_7fd729fae3ed30395c91a6c3899e19ab '@storybook/html': 6.4.22_@babel+core@7.17.9+eslint@8.13.0 - '@storybook/preset-scss': 1.0.3_98fb4723ddb8cb1321f7deacb3be93bc '@swc/core': 1.2.165 '@swc/helpers': 0.3.8 '@swc/jest': 0.2.20_@swc+core@1.2.165 '@testing-library/jest-dom': 5.16.4 - autoprefixer: 10.4.4_postcss@8.4.12 babel-eslint: 7.2.3 - babel-loader: 8.2.4_@babel+core@7.17.9 browserslist: 4.20.2 - chokidar: 3.5.3 commitizen: 4.2.4_@swc+core@1.2.165 - css-loader: 5.2.7 cssnano: 5.1.7_postcss@8.4.12 del-cli: 4.0.1 eslint: 8.13.0 - fs-promise: 0.5.0 inquirer: 8.2.2 jest: 27.5.1 - node-sass: 7.0.1 postcss: 8.4.12 + postcss-preset-env: 7.4.3_postcss@8.4.12 rollup: 2.70.1 rollup-plugin-swc: 0.2.1_@swc+core@1.2.165+rollup@2.70.1 - sass: 1.50.0 - sass-loader: 10.2.1_node-sass@7.0.1+sass@1.50.0 + sass: 1.50.1 + sass-loader: 10.2.1_sass@1.50.1 simple-git-hooks: 2.7.0 - style-loader: 2.0.0 packages: @@ -1687,6 +1673,89 @@ packages: '@cspotcode/source-map-consumer': 0.8.0 dev: true + /@csstools/postcss-color-function/1.1.0_postcss@8.4.12: + resolution: {integrity: sha512-5D5ND/mZWcQoSfYnSPsXtuiFxhzmhxt6pcjrFLJyldj+p0ZN2vvRpYNX+lahFTtMhAYOa2WmkdGINr0yP0CvGA==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.4 + dependencies: + '@csstools/postcss-progressive-custom-properties': 1.3.0_postcss@8.4.12 + postcss: 8.4.12 + postcss-value-parser: 4.2.0 + dev: true + + /@csstools/postcss-font-format-keywords/1.0.0_postcss@8.4.12: + resolution: {integrity: sha512-oO0cZt8do8FdVBX8INftvIA4lUrKUSCcWUf9IwH9IPWOgKT22oAZFXeHLoDK7nhB2SmkNycp5brxfNMRLIhd6Q==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.3 + dependencies: + postcss: 8.4.12 + postcss-value-parser: 4.2.0 + dev: true + + /@csstools/postcss-hwb-function/1.0.0_postcss@8.4.12: + resolution: {integrity: sha512-VSTd7hGjmde4rTj1rR30sokY3ONJph1reCBTUXqeW1fKwETPy1x4t/XIeaaqbMbC5Xg4SM/lyXZ2S8NELT2TaA==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.3 + dependencies: + postcss: 8.4.12 + postcss-value-parser: 4.2.0 + dev: true + + /@csstools/postcss-ic-unit/1.0.0_postcss@8.4.12: + resolution: {integrity: sha512-i4yps1mBp2ijrx7E96RXrQXQQHm6F4ym1TOD0D69/sjDjZvQ22tqiEvaNw7pFZTUO5b9vWRHzbHzP9+UKuw+bA==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.3 + dependencies: + '@csstools/postcss-progressive-custom-properties': 1.3.0_postcss@8.4.12 + postcss: 8.4.12 + postcss-value-parser: 4.2.0 + dev: true + + /@csstools/postcss-is-pseudo-class/2.0.2_postcss@8.4.12: + resolution: {integrity: sha512-L9h1yxXMj7KpgNzlMrw3isvHJYkikZgZE4ASwssTnGEH8tm50L6QsM9QQT5wR4/eO5mU0rN5axH7UzNxEYg5CA==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.12 + postcss-selector-parser: 6.0.10 + dev: true + + /@csstools/postcss-normalize-display-values/1.0.0_postcss@8.4.12: + resolution: {integrity: sha512-bX+nx5V8XTJEmGtpWTO6kywdS725t71YSLlxWt78XoHUbELWgoCXeOFymRJmL3SU1TLlKSIi7v52EWqe60vJTQ==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.3 + dependencies: + postcss: 8.4.12 + postcss-value-parser: 4.2.0 + dev: true + + /@csstools/postcss-oklab-function/1.1.0_postcss@8.4.12: + resolution: {integrity: sha512-e/Q5HopQzmnQgqimG9v3w2IG4VRABsBq3itOcn4bnm+j4enTgQZ0nWsaH/m9GV2otWGQ0nwccYL5vmLKyvP1ww==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.4 + dependencies: + '@csstools/postcss-progressive-custom-properties': 1.3.0_postcss@8.4.12 + postcss: 8.4.12 + postcss-value-parser: 4.2.0 + dev: true + + /@csstools/postcss-progressive-custom-properties/1.3.0_postcss@8.4.12: + resolution: {integrity: sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.3 + dependencies: + postcss: 8.4.12 + postcss-value-parser: 4.2.0 + dev: true + /@discoveryjs/json-ext/0.5.7: resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} engines: {node: '>=10.0.0'} @@ -3577,18 +3646,6 @@ packages: core-js: 3.21.1 dev: true - /@storybook/preset-scss/1.0.3_98fb4723ddb8cb1321f7deacb3be93bc: - resolution: {integrity: sha512-o9Iz6wxPeNENrQa2mKlsDKynBfqU2uWaRP80HeWp4TkGgf7/x3DVF2O7yi9N0x/PI1qzzTTpxlQ90D62XmpiTw==} - peerDependencies: - css-loader: '*' - sass-loader: '*' - style-loader: '*' - dependencies: - css-loader: 5.2.7 - sass-loader: 10.2.1_node-sass@7.0.1+sass@1.50.0 - style-loader: 2.0.0 - dev: true - /@storybook/preview-web/6.4.22: resolution: {integrity: sha512-sWS+sgvwSvcNY83hDtWUUL75O2l2LY/GTAS0Zp2dh3WkObhtuJ/UehftzPZlZmmv7PCwhb4Q3+tZDKzMlFxnKQ==} peerDependencies: @@ -4466,10 +4523,6 @@ packages: resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} dev: true - /abbrev/1.1.1: - resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} - dev: true - /accepts/1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} @@ -4543,17 +4596,6 @@ packages: - supports-color dev: true - /agentkeepalive/4.2.1: - resolution: {integrity: sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==} - engines: {node: '>= 8.0.0'} - dependencies: - debug: 4.3.4 - depd: 1.1.2 - humanize-ms: 1.2.1 - transitivePeerDependencies: - - supports-color - dev: true - /aggregate-error/3.1.0: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} @@ -4690,10 +4732,6 @@ packages: entities: 2.2.0 dev: true - /any-promise/1.3.0: - resolution: {integrity: sha1-q8av7tzqUugJzcA3au0845Y10X8=} - dev: true - /anymatch/2.0.0: resolution: {integrity: sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==} dependencies: @@ -4729,14 +4767,6 @@ packages: readable-stream: 3.6.0 dev: true - /are-we-there-yet/3.0.0: - resolution: {integrity: sha512-0GWpv50YSOcLXaN6/FAKY3vfRbllXWV2xvfA/oKJF8pzFhWXPV+yjhJXDBbjscDYowv7Yw1A3uigpzn5iEGTyw==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16} - dependencies: - delegates: 1.0.0 - readable-stream: 3.6.0 - dev: true - /arg/4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} dev: true @@ -4862,17 +4892,6 @@ packages: safer-buffer: 2.1.2 dev: true - /asn1/0.2.6: - resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} - dependencies: - safer-buffer: 2.1.2 - dev: true - - /assert-plus/1.0.0: - resolution: {integrity: sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=} - engines: {node: '>=0.8'} - dev: true - /assert/1.5.0: resolution: {integrity: sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==} dependencies: @@ -4890,10 +4909,6 @@ packages: dev: true optional: true - /async-foreach/0.1.3: - resolution: {integrity: sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=} - dev: true - /asynckit/0.4.0: resolution: {integrity: sha1-x57Zf380y48robyXkLzDZkdLS3k=} dev: true @@ -4909,15 +4924,15 @@ packages: hasBin: true dev: true - /autoprefixer/10.4.4_postcss@8.4.12: - resolution: {integrity: sha512-Tm8JxsB286VweiZ5F0anmbyGiNI3v3wGv3mz9W+cxEDYB/6jbnj6GM9H9mK3wIL8ftgl+C07Lcwb8PG5PCCPzA==} + /autoprefixer/10.4.5_postcss@8.4.12: + resolution: {integrity: sha512-Fvd8yCoA7lNX/OUllvS+aS1I7WRBclGXsepbvT8ZaPgrH24rgXpZzF0/6Hh3ZEkwg+0AES/Osd196VZmYoEFtw==} engines: {node: ^10 || ^12 || >=14} hasBin: true peerDependencies: postcss: ^8.1.0 dependencies: browserslist: 4.20.2 - caniuse-lite: 1.0.30001331 + caniuse-lite: 1.0.30001332 fraction.js: 4.2.0 normalize-range: 0.1.2 picocolors: 1.0.0 @@ -4938,14 +4953,6 @@ packages: postcss-value-parser: 4.2.0 dev: true - /aws-sign2/0.7.0: - resolution: {integrity: sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=} - dev: true - - /aws4/1.11.0: - resolution: {integrity: sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==} - dev: true - /babel-code-frame/6.26.0: resolution: {integrity: sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=} dependencies: @@ -4999,20 +5006,6 @@ packages: webpack: 4.46.0 dev: true - /babel-loader/8.2.4_@babel+core@7.17.9: - resolution: {integrity: sha512-8dytA3gcvPPPv4Grjhnt8b5IIiTcq/zeXOPk4iTYI0SVXcsmuGg7JtBRDp8S9X+gJfhQ8ektjXZlDu1Bb33U8A==} - engines: {node: '>= 8.9'} - peerDependencies: - '@babel/core': ^7.0.0 - webpack: '>=2' - dependencies: - '@babel/core': 7.17.9 - find-cache-dir: 3.3.2 - loader-utils: 2.0.2 - make-dir: 3.1.0 - schema-utils: 2.7.1 - dev: true - /babel-messages/6.23.0: resolution: {integrity: sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=} dependencies: @@ -5243,12 +5236,6 @@ packages: resolution: {integrity: sha1-dclcMrdI4IUNEMKxaPa9vpiRrOg=} dev: true - /bcrypt-pbkdf/1.0.2: - resolution: {integrity: sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=} - dependencies: - tweetnacl: 0.14.5 - dev: true - /better-opn/2.1.1: resolution: {integrity: sha512-kIPXZS5qwyKiX/HcRvDYfmBQUa8XP17I0mYZZ0y4UhpYOSvtsLHDYqmomS+Mj20aDvD3knEiQ0ecQy2nhio3yA==} engines: {node: '>8.0.0'} @@ -5610,7 +5597,7 @@ packages: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} dependencies: browserslist: 4.20.2 - caniuse-lite: 1.0.30001331 + caniuse-lite: 1.0.30001332 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 dev: true @@ -5619,6 +5606,10 @@ packages: resolution: {integrity: sha512-Y1xk6paHpUXKP/P6YjQv1xqyTbgAP05ycHBcRdQjTcyXlWol868sJJPlmk5ylOekw2BrucWes5jk+LvVd7WZ5Q==} dev: true + /caniuse-lite/1.0.30001332: + resolution: {integrity: sha512-10T30NYOEQtN6C11YGg411yebhvpnC6Z102+B95eAsN0oB6KUs01ivE8u+G6FMIRtIrVlYXhL+LUwQ3/hXwDWw==} + dev: true + /capture-exit/2.0.0: resolution: {integrity: sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==} engines: {node: 6.* || 8.* || >= 10.*} @@ -5631,10 +5622,6 @@ packages: engines: {node: '>=4'} dev: true - /caseless/0.12.0: - resolution: {integrity: sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=} - dev: true - /ccount/1.1.0: resolution: {integrity: sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==} dev: true @@ -6136,10 +6123,6 @@ packages: requiresBuild: true dev: true - /core-util-is/1.0.2: - resolution: {integrity: sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=} - dev: true - /core-util-is/1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} dev: true @@ -6275,6 +6258,17 @@ packages: randomfill: 1.0.4 dev: true + /css-blank-pseudo/3.0.3_postcss@8.4.12: + resolution: {integrity: sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==} + engines: {node: ^12 || ^14 || >=16} + hasBin: true + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.12 + postcss-selector-parser: 6.0.10 + dev: true + /css-declaration-sorter/6.2.2_postcss@8.4.12: resolution: {integrity: sha512-Ufadglr88ZLsrvS11gjeu/40Lw74D9Am/Jpr3LlYm5Q4ZP5KdlUhG+6u2EjyXeZcxmZ2h1ebCKngDjolpeLHpg==} engines: {node: ^10 || ^12 || >=14} @@ -6284,6 +6278,17 @@ packages: postcss: 8.4.12 dev: true + /css-has-pseudo/3.0.4_postcss@8.4.12: + resolution: {integrity: sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==} + engines: {node: ^12 || ^14 || >=16} + hasBin: true + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.12 + postcss-selector-parser: 6.0.10 + dev: true + /css-loader/3.6.0_webpack@4.46.0: resolution: {integrity: sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ==} engines: {node: '>= 8.9.0'} @@ -6306,22 +6311,14 @@ packages: webpack: 4.46.0 dev: true - /css-loader/5.2.7: - resolution: {integrity: sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg==} - engines: {node: '>= 10.13.0'} + /css-prefers-color-scheme/6.0.3_postcss@8.4.12: + resolution: {integrity: sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==} + engines: {node: ^12 || ^14 || >=16} + hasBin: true peerDependencies: - webpack: ^4.27.0 || ^5.0.0 + postcss: ^8.4 dependencies: - icss-utils: 5.1.0_postcss@8.4.12 - loader-utils: 2.0.2 postcss: 8.4.12 - postcss-modules-extract-imports: 3.0.0_postcss@8.4.12 - postcss-modules-local-by-default: 4.0.0_postcss@8.4.12 - postcss-modules-scope: 3.0.0_postcss@8.4.12 - postcss-modules-values: 4.0.0_postcss@8.4.12 - postcss-value-parser: 4.2.0 - schema-utils: 3.1.1 - semver: 7.3.7 dev: true /css-select/4.3.0: @@ -6359,6 +6356,10 @@ packages: source-map-resolve: 0.6.0 dev: true + /cssdb/6.5.0: + resolution: {integrity: sha512-Rh7AAopF2ckPXe/VBcoUS9JrCZNSyc60+KpgE6X25vpVxA32TmiqvExjkfhwP4wGSb6Xe8Z/JIyGqwgx/zZYFA==} + dev: true + /cssesc/3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} @@ -6480,13 +6481,6 @@ packages: engines: {node: '>=8'} dev: true - /dashdash/1.14.1: - resolution: {integrity: sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=} - engines: {node: '>=0.10'} - dependencies: - assert-plus: 1.0.0 - dev: true - /data-urls/2.0.0: resolution: {integrity: sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==} engines: {node: '>=10'} @@ -6833,13 +6827,6 @@ packages: stream-shift: 1.0.1 dev: true - /ecc-jsbn/0.1.2: - resolution: {integrity: sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=} - dependencies: - jsbn: 0.1.1 - safer-buffer: 2.1.2 - dev: true - /ee-first/1.1.1: resolution: {integrity: sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=} dev: true @@ -6910,14 +6897,6 @@ packages: engines: {node: '>= 0.8'} dev: true - /encoding/0.1.13: - resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} - requiresBuild: true - dependencies: - iconv-lite: 0.6.3 - dev: true - optional: true - /end-of-stream/1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} dependencies: @@ -6937,15 +6916,6 @@ packages: resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} dev: true - /env-paths/2.2.1: - resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} - engines: {node: '>=6'} - dev: true - - /err-code/2.0.3: - resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} - dev: true - /errno/0.1.8: resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} hasBin: true @@ -7357,11 +7327,6 @@ packages: to-regex: 3.0.2 dev: true - /extsprintf/1.3.0: - resolution: {integrity: sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=} - engines: {'0': node >=0.6.0} - dev: true - /fast-deep-equal/3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} dev: true @@ -7580,10 +7545,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /forever-agent/0.6.1: - resolution: {integrity: sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=} - dev: true - /fork-ts-checker-webpack-plugin/4.1.6: resolution: {integrity: sha512-DUxuQaKoqfNne8iikd14SAkh5uw4+8vNifp6gmA73yYNS6ywLIWSLD/n/mBzHQRpW3J7rbATEakmiA8JvkTyZw==} engines: {node: '>=6.11.5', yarn: '>=1.0.0'} @@ -7628,15 +7589,6 @@ packages: webpack: 4.46.0 dev: true - /form-data/2.3.3: - resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} - engines: {node: '>= 0.12'} - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - dev: true - /form-data/3.0.1: resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} engines: {node: '>= 6'} @@ -7679,16 +7631,6 @@ packages: readable-stream: 2.3.7 dev: true - /fs-extra/0.26.7: - resolution: {integrity: sha1-muH92UiXeY7at20JGM9C0MMYT6k=} - dependencies: - graceful-fs: 4.2.10 - jsonfile: 2.4.0 - klaw: 1.3.1 - path-is-absolute: 1.0.1 - rimraf: 2.7.1 - dev: true - /fs-extra/0.30.0: resolution: {integrity: sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=} dependencies: @@ -7738,16 +7680,6 @@ packages: resolution: {integrity: sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==} dev: true - /fs-promise/0.5.0: - resolution: {integrity: sha1-Q0fWv2JGVacGGkMZITw5MnatPvM=} - deprecated: Use mz or fs-extra^3.0 with Promise Support - dependencies: - any-promise: 1.3.0 - fs-extra: 0.26.7 - mz: 2.7.0 - thenify-all: 1.6.0 - dev: true - /fs-write-stream-atomic/1.0.10: resolution: {integrity: sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=} dependencies: @@ -7823,27 +7755,6 @@ packages: wide-align: 1.1.5 dev: true - /gauge/4.0.4: - resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dependencies: - aproba: 2.0.0 - color-support: 1.1.3 - console-control-strings: 1.1.0 - has-unicode: 2.0.1 - signal-exit: 3.0.7 - string-width: 4.2.3 - strip-ansi: 6.0.1 - wide-align: 1.1.5 - dev: true - - /gaze/1.1.3: - resolution: {integrity: sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==} - engines: {node: '>= 4.0.0'} - dependencies: - globule: 1.3.3 - dev: true - /gensync/1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} @@ -7867,11 +7778,6 @@ packages: engines: {node: '>=8.0.0'} dev: true - /get-stdin/4.0.1: - resolution: {integrity: sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=} - engines: {node: '>=0.10.0'} - dev: true - /get-stream/4.1.0: resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} engines: {node: '>=6'} @@ -7897,12 +7803,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /getpass/0.1.7: - resolution: {integrity: sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=} - dependencies: - assert-plus: 1.0.0 - dev: true - /git-raw-commits/2.0.11: resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} engines: {node: '>=10'} @@ -7969,17 +7869,6 @@ packages: path-is-absolute: 1.0.1 dev: true - /glob/7.1.7: - resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - dev: true - /glob/7.2.0: resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} dependencies: @@ -8075,15 +7964,6 @@ packages: slash: 2.0.0 dev: true - /globule/1.3.3: - resolution: {integrity: sha512-mb1aYtDbIjTu4ShMB85m3UzjX9BVKe9WCzsnfMSZk+K5GpIbBOexgg4PPCt5eHDEG5/ZQAUX2Kct02zfiPLsKg==} - engines: {node: '>= 0.10'} - dependencies: - glob: 7.1.7 - lodash: 4.17.21 - minimatch: 3.0.8 - dev: true - /graceful-fs/4.2.10: resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} dev: true @@ -8101,20 +7981,6 @@ packages: uglify-js: 3.15.4 dev: true - /har-schema/2.0.0: - resolution: {integrity: sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=} - engines: {node: '>=4'} - dev: true - - /har-validator/5.1.5: - resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==} - engines: {node: '>=6'} - deprecated: this library is no longer supported - dependencies: - ajv: 6.12.6 - har-schema: 2.0.0 - dev: true - /hard-rejection/2.1.0: resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} engines: {node: '>=6'} @@ -8419,10 +8285,6 @@ packages: entities: 2.2.0 dev: true - /http-cache-semantics/4.1.0: - resolution: {integrity: sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==} - dev: true - /http-errors/1.8.1: resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} engines: {node: '>= 0.6'} @@ -8445,15 +8307,6 @@ packages: - supports-color dev: true - /http-signature/1.2.0: - resolution: {integrity: sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=} - engines: {node: '>=0.8', npm: '>=1.3.7'} - dependencies: - assert-plus: 1.0.0 - jsprim: 1.4.2 - sshpk: 1.17.0 - dev: true - /https-browserify/1.0.0: resolution: {integrity: sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=} dev: true @@ -8473,12 +8326,6 @@ packages: engines: {node: '>=10.17.0'} dev: true - /humanize-ms/1.2.1: - resolution: {integrity: sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=} - dependencies: - ms: 2.1.3 - dev: true - /iconv-lite/0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} @@ -8486,14 +8333,6 @@ packages: safer-buffer: 2.1.2 dev: true - /iconv-lite/0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} - dependencies: - safer-buffer: 2.1.2 - dev: true - optional: true - /icss-utils/4.1.1: resolution: {integrity: sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==} engines: {node: '>= 6'} @@ -8501,15 +8340,6 @@ packages: postcss: 7.0.39 dev: true - /icss-utils/5.1.0_postcss@8.4.12: - resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 - dependencies: - postcss: 8.4.12 - dev: true - /ieee754/1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} dev: true @@ -8876,10 +8706,6 @@ packages: engines: {node: '>=8'} dev: true - /is-lambda/1.0.1: - resolution: {integrity: sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=} - dev: true - /is-map/2.0.2: resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} dev: true @@ -9083,10 +8909,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /isstream/0.1.2: - resolution: {integrity: sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=} - dev: true - /istanbul-lib-coverage/3.2.0: resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} engines: {node: '>=8'} @@ -9665,10 +9487,6 @@ packages: - utf-8-validate dev: true - /js-base64/2.6.4: - resolution: {integrity: sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==} - dev: true - /js-string-escape/1.0.1: resolution: {integrity: sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8=} engines: {node: '>= 0.8'} @@ -9697,10 +9515,6 @@ packages: argparse: 2.0.1 dev: true - /jsbn/0.1.1: - resolution: {integrity: sha1-peZUwuWi3rXyAdls77yoDA7y9RM=} - dev: true - /jsdom/16.7.0: resolution: {integrity: sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==} engines: {node: '>=10'} @@ -9766,18 +9580,10 @@ packages: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} dev: true - /json-schema/0.4.0: - resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} - dev: true - /json-stable-stringify-without-jsonify/1.0.1: resolution: {integrity: sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=} dev: true - /json-stringify-safe/5.0.1: - resolution: {integrity: sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=} - dev: true - /json5/1.0.1: resolution: {integrity: sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==} hasBin: true @@ -9816,16 +9622,6 @@ packages: engines: {'0': node >= 0.2.0} dev: true - /jsprim/1.4.2: - resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} - engines: {node: '>=0.6.0'} - dependencies: - assert-plus: 1.0.0 - extsprintf: 1.3.0 - json-schema: 0.4.0 - verror: 1.10.0 - dev: true - /junk/3.1.0: resolution: {integrity: sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==} engines: {node: '>=8'} @@ -10055,32 +9851,8 @@ packages: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} dev: true - /make-fetch-happen/9.1.0: - resolution: {integrity: sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==} - engines: {node: '>= 10'} - dependencies: - agentkeepalive: 4.2.1 - cacache: 15.3.0 - http-cache-semantics: 4.1.0 - http-proxy-agent: 4.0.1 - https-proxy-agent: 5.0.0 - is-lambda: 1.0.1 - lru-cache: 6.0.0 - minipass: 3.1.6 - minipass-collect: 1.0.2 - minipass-fetch: 1.4.1 - minipass-flush: 1.0.5 - minipass-pipeline: 1.2.4 - negotiator: 0.6.3 - promise-retry: 2.0.1 - socks-proxy-agent: 6.1.1 - ssri: 8.0.1 - transitivePeerDependencies: - - supports-color - dev: true - - /makeerror/1.0.12: - resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + /makeerror/1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} dependencies: tmpl: 1.0.5 dev: true @@ -10244,24 +10016,6 @@ packages: yargs-parser: 20.2.9 dev: true - /meow/9.0.0: - resolution: {integrity: sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==} - engines: {node: '>=10'} - dependencies: - '@types/minimist': 1.2.2 - camelcase-keys: 6.2.2 - decamelize: 1.2.0 - decamelize-keys: 1.1.0 - hard-rejection: 2.1.0 - minimist-options: 4.1.0 - normalize-package-data: 3.0.3 - read-pkg-up: 7.0.1 - redent: 3.0.0 - trim-newlines: 3.0.1 - type-fest: 0.18.1 - yargs-parser: 20.2.9 - dev: true - /merge-descriptors/1.0.1: resolution: {integrity: sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=} dev: true @@ -10376,12 +10130,6 @@ packages: resolution: {integrity: sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=} dev: true - /minimatch/3.0.8: - resolution: {integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==} - dependencies: - brace-expansion: 1.1.11 - dev: true - /minimatch/3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: @@ -10412,17 +10160,6 @@ packages: minipass: 3.1.6 dev: true - /minipass-fetch/1.4.1: - resolution: {integrity: sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==} - engines: {node: '>=8'} - dependencies: - minipass: 3.1.6 - minipass-sized: 1.0.3 - minizlib: 2.1.2 - optionalDependencies: - encoding: 0.1.13 - dev: true - /minipass-flush/1.0.5: resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} engines: {node: '>= 8'} @@ -10437,13 +10174,6 @@ packages: minipass: 3.1.6 dev: true - /minipass-sized/1.0.3: - resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} - engines: {node: '>=8'} - dependencies: - minipass: 3.1.6 - dev: true - /minipass/3.1.6: resolution: {integrity: sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==} engines: {node: '>=8'} @@ -10531,17 +10261,10 @@ packages: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} dev: true - /mz/2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - dependencies: - any-promise: 1.3.0 - object-assign: 4.1.1 - thenify-all: 1.6.0 - dev: true - /nan/2.15.0: resolution: {integrity: sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==} dev: true + optional: true /nanoid/3.3.2: resolution: {integrity: sha512-CuHBogktKwpm5g2sRgv83jEy2ijFzBwMoYA60orPDR7ynsLijJDqgsi4RDGj3OJpy3Ieb+LYwiRmIOGyytgITA==} @@ -10606,25 +10329,6 @@ packages: whatwg-url: 5.0.0 dev: true - /node-gyp/8.4.1: - resolution: {integrity: sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==} - engines: {node: '>= 10.12.0'} - hasBin: true - dependencies: - env-paths: 2.2.1 - glob: 7.2.0 - graceful-fs: 4.2.10 - make-fetch-happen: 9.1.0 - nopt: 5.0.0 - npmlog: 6.0.1 - rimraf: 3.0.2 - semver: 7.3.7 - tar: 6.1.11 - which: 2.0.2 - transitivePeerDependencies: - - supports-color - dev: true - /node-int64/0.4.0: resolution: {integrity: sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=} dev: true @@ -10661,39 +10365,6 @@ packages: resolution: {integrity: sha512-maHFz6OLqYxz+VQyCAtA3PTX4UP/53pa05fyDNc9CwjvJ0yEh6+xBwKsgCxMNhS8taUKBFYxfuiaD9U/55iFaw==} dev: true - /node-sass/7.0.1: - resolution: {integrity: sha512-uMy+Xt29NlqKCFdFRZyXKOTqGt+QaKHexv9STj2WeLottnlqZEEWx6Bj0MXNthmFRRdM/YwyNo/8Tr46TOM0jQ==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - dependencies: - async-foreach: 0.1.3 - chalk: 4.1.2 - cross-spawn: 7.0.3 - gaze: 1.1.3 - get-stdin: 4.0.1 - glob: 7.2.0 - lodash: 4.17.21 - meow: 9.0.0 - nan: 2.15.0 - node-gyp: 8.4.1 - npmlog: 5.0.1 - request: 2.88.2 - sass-graph: 4.0.0 - stdout-stream: 1.4.1 - true-case-path: 1.0.3 - transitivePeerDependencies: - - supports-color - dev: true - - /nopt/5.0.0: - resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} - engines: {node: '>=6'} - hasBin: true - dependencies: - abbrev: 1.1.1 - dev: true - /normalize-package-data/2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} dependencies: @@ -10758,16 +10429,6 @@ packages: set-blocking: 2.0.0 dev: true - /npmlog/6.0.1: - resolution: {integrity: sha512-BTHDvY6nrRHuRfyjt1MAufLxYdVXZfd099H4+i1f0lPywNQyI4foeNXJRObB/uy+TYqUW0vAD9gbdSOXPst7Eg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16} - dependencies: - are-we-there-yet: 3.0.0 - console-control-strings: 1.1.0 - gauge: 4.0.4 - set-blocking: 2.0.0 - dev: true - /nth-check/2.0.1: resolution: {integrity: sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==} dependencies: @@ -10782,10 +10443,6 @@ packages: resolution: {integrity: sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==} dev: true - /oauth-sign/0.9.0: - resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} - dev: true - /object-assign/4.1.1: resolution: {integrity: sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=} engines: {node: '>=0.10.0'} @@ -11200,10 +10857,6 @@ packages: sha.js: 2.4.11 dev: true - /performance-now/2.1.0: - resolution: {integrity: sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=} - dev: true - /picocolors/0.2.1: resolution: {integrity: sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==} dev: true @@ -11274,6 +10927,15 @@ packages: engines: {node: '>=0.10.0'} dev: true + /postcss-attribute-case-insensitive/5.0.0_postcss@8.4.12: + resolution: {integrity: sha512-b4g9eagFGq9T5SWX4+USfVyjIb3liPnjhHHRMP7FMB2kFVpYyfEscV0wP3eaXhKlcHKUut8lt5BGoeylWA/dBQ==} + peerDependencies: + postcss: ^8.0.2 + dependencies: + postcss: 8.4.12 + postcss-selector-parser: 6.0.10 + dev: true + /postcss-calc/8.2.4_postcss@8.4.12: resolution: {integrity: sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==} peerDependencies: @@ -11284,6 +10946,46 @@ packages: postcss-value-parser: 4.2.0 dev: true + /postcss-clamp/4.1.0_postcss@8.4.12: + resolution: {integrity: sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==} + engines: {node: '>=7.6.0'} + peerDependencies: + postcss: ^8.4.6 + dependencies: + postcss: 8.4.12 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-color-functional-notation/4.2.2_postcss@8.4.12: + resolution: {integrity: sha512-DXVtwUhIk4f49KK5EGuEdgx4Gnyj6+t2jBSEmxvpIK9QI40tWrpS2Pua8Q7iIZWBrki2QOaeUdEaLPPa91K0RQ==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.12 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-color-hex-alpha/8.0.3_postcss@8.4.12: + resolution: {integrity: sha512-fESawWJCrBV035DcbKRPAVmy21LpoyiXdPTuHUfWJ14ZRjY7Y7PA6P4g8z6LQGYhU1WAxkTxjIjurXzoe68Glw==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.12 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-color-rebeccapurple/7.0.2_postcss@8.4.12: + resolution: {integrity: sha512-SFc3MaocHaQ6k3oZaFwH8io6MdypkUtEy/eXzXEB1vEQlO3S3oDc/FSZA8AsS04Z25RirQhlDlHLh3dn7XewWw==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.3 + dependencies: + postcss: 8.4.12 + postcss-value-parser: 4.2.0 + dev: true + /postcss-colormin/5.3.0_postcss@8.4.12: resolution: {integrity: sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==} engines: {node: ^10 || ^12 || >=14.0} @@ -11307,6 +11009,45 @@ packages: postcss-value-parser: 4.2.0 dev: true + /postcss-custom-media/8.0.0_postcss@8.4.12: + resolution: {integrity: sha512-FvO2GzMUaTN0t1fBULDeIvxr5IvbDXcIatt6pnJghc736nqNgsGao5NT+5+WVLAQiTt6Cb3YUms0jiPaXhL//g==} + engines: {node: '>=10.0.0'} + peerDependencies: + postcss: ^8.1.0 + dependencies: + postcss: 8.4.12 + dev: true + + /postcss-custom-properties/12.1.7_postcss@8.4.12: + resolution: {integrity: sha512-N/hYP5gSoFhaqxi2DPCmvto/ZcRDVjE3T1LiAMzc/bg53hvhcHOLpXOHb526LzBBp5ZlAUhkuot/bfpmpgStJg==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.12 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-custom-selectors/6.0.0_postcss@8.4.12: + resolution: {integrity: sha512-/1iyBhz/W8jUepjGyu7V1OPcGbc636snN1yXEQCinb6Bwt7KxsiU7/bLQlp8GwAXzCh7cobBU5odNn/2zQWR8Q==} + engines: {node: '>=10.0.0'} + peerDependencies: + postcss: ^8.1.2 + dependencies: + postcss: 8.4.12 + postcss-selector-parser: 6.0.10 + dev: true + + /postcss-dir-pseudo-class/6.0.4_postcss@8.4.12: + resolution: {integrity: sha512-I8epwGy5ftdzNWEYok9VjW9whC4xnelAtbajGv4adql4FIF09rnrxnA9Y8xSHN47y7gqFIv10C5+ImsLeJpKBw==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.12 + postcss-selector-parser: 6.0.10 + dev: true + /postcss-discard-comments/5.1.1_postcss@8.4.12: resolution: {integrity: sha512-5JscyFmvkUxz/5/+TB3QTTT9Gi9jHkcn8dcmmuN68JQcv3aQg4y88yEHHhwFB52l/NkaJ43O0dbksGMAo49nfQ==} engines: {node: ^10 || ^12 || >=14.0} @@ -11343,12 +11084,99 @@ packages: postcss: 8.4.12 dev: true + /postcss-double-position-gradients/3.1.1_postcss@8.4.12: + resolution: {integrity: sha512-jM+CGkTs4FcG53sMPjrrGE0rIvLDdCrqMzgDC5fLI7JHDO7o6QG8C5TQBtExb13hdBdoH9C2QVbG4jo2y9lErQ==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.4 + dependencies: + '@csstools/postcss-progressive-custom-properties': 1.3.0_postcss@8.4.12 + postcss: 8.4.12 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-env-function/4.0.6_postcss@8.4.12: + resolution: {integrity: sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.12 + postcss-value-parser: 4.2.0 + dev: true + /postcss-flexbugs-fixes/4.2.1: resolution: {integrity: sha512-9SiofaZ9CWpQWxOwRh1b/r85KD5y7GgvsNt1056k6OYLvWUun0czCvogfJgylC22uJTwW1KzY3Gz65NZRlvoiQ==} dependencies: postcss: 7.0.39 dev: true + /postcss-focus-visible/6.0.4_postcss@8.4.12: + resolution: {integrity: sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.12 + postcss-selector-parser: 6.0.10 + dev: true + + /postcss-focus-within/5.0.4_postcss@8.4.12: + resolution: {integrity: sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.12 + postcss-selector-parser: 6.0.10 + dev: true + + /postcss-font-variant/5.0.0_postcss@8.4.12: + resolution: {integrity: sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==} + peerDependencies: + postcss: ^8.1.0 + dependencies: + postcss: 8.4.12 + dev: true + + /postcss-gap-properties/3.0.3_postcss@8.4.12: + resolution: {integrity: sha512-rPPZRLPmEKgLk/KlXMqRaNkYTUpE7YC+bOIQFN5xcu1Vp11Y4faIXv6/Jpft6FMnl6YRxZqDZG0qQOW80stzxQ==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.12 + dev: true + + /postcss-image-set-function/4.0.6_postcss@8.4.12: + resolution: {integrity: sha512-KfdC6vg53GC+vPd2+HYzsZ6obmPqOk6HY09kttU19+Gj1nC3S3XBVEXDHxkhxTohgZqzbUb94bKXvKDnYWBm/A==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.12 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-initial/4.0.1_postcss@8.4.12: + resolution: {integrity: sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==} + peerDependencies: + postcss: ^8.0.0 + dependencies: + postcss: 8.4.12 + dev: true + + /postcss-lab-function/4.2.0_postcss@8.4.12: + resolution: {integrity: sha512-Zb1EO9DGYfa3CP8LhINHCcTTCTLI+R3t7AX2mKsDzdgVQ/GkCpHOTgOr6HBHslP7XDdVbqgHW5vvRPMdVANQ8w==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.4 + dependencies: + '@csstools/postcss-progressive-custom-properties': 1.3.0_postcss@8.4.12 + postcss: 8.4.12 + postcss-value-parser: 4.2.0 + dev: true + /postcss-loader/4.3.0_postcss@7.0.39+webpack@4.46.0: resolution: {integrity: sha512-M/dSoIiNDOo8Rk0mUqoj4kpGq91gcxCfb9PoyZVdZ76/AuhxylHDYZblNE8o+EQ9AMSASeMFEKxZf5aU6wlx1Q==} engines: {node: '>= 10.13.0'} @@ -11365,6 +11193,24 @@ packages: webpack: 4.46.0 dev: true + /postcss-logical/5.0.4_postcss@8.4.12: + resolution: {integrity: sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.12 + dev: true + + /postcss-media-minmax/5.0.0_postcss@8.4.12: + resolution: {integrity: sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + postcss: ^8.1.0 + dependencies: + postcss: 8.4.12 + dev: true + /postcss-merge-longhand/5.1.4_postcss@8.4.12: resolution: {integrity: sha512-hbqRRqYfmXoGpzYKeW0/NCZhvNyQIlQeWVSao5iKWdyx7skLvCfQFGIUsP9NUs3dSbPac2IC4Go85/zG+7MlmA==} engines: {node: ^10 || ^12 || >=14.0} @@ -11440,15 +11286,6 @@ packages: postcss: 7.0.39 dev: true - /postcss-modules-extract-imports/3.0.0_postcss@8.4.12: - resolution: {integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 - dependencies: - postcss: 8.4.12 - dev: true - /postcss-modules-local-by-default/3.0.3: resolution: {integrity: sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==} engines: {node: '>= 6'} @@ -11459,18 +11296,6 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-modules-local-by-default/4.0.0_postcss@8.4.12: - resolution: {integrity: sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 - dependencies: - icss-utils: 5.1.0_postcss@8.4.12 - postcss: 8.4.12 - postcss-selector-parser: 6.0.10 - postcss-value-parser: 4.2.0 - dev: true - /postcss-modules-scope/2.2.0: resolution: {integrity: sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==} engines: {node: '>= 6'} @@ -11479,16 +11304,6 @@ packages: postcss-selector-parser: 6.0.10 dev: true - /postcss-modules-scope/3.0.0_postcss@8.4.12: - resolution: {integrity: sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 - dependencies: - postcss: 8.4.12 - postcss-selector-parser: 6.0.10 - dev: true - /postcss-modules-values/3.0.0: resolution: {integrity: sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==} dependencies: @@ -11496,14 +11311,14 @@ packages: postcss: 7.0.39 dev: true - /postcss-modules-values/4.0.0_postcss@8.4.12: - resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} - engines: {node: ^10 || ^12 || >= 14} + /postcss-nesting/10.1.4_postcss@8.4.12: + resolution: {integrity: sha512-2ixdQ59ik/Gt1+oPHiI1kHdwEI8lLKEmui9B1nl6163ANLC+GewQn7fXMxJF2JSb4i2MKL96GU8fIiQztK4TTA==} + engines: {node: ^12 || ^14 || >=16} peerDependencies: - postcss: ^8.1.0 + postcss: ^8.4 dependencies: - icss-utils: 5.1.0_postcss@8.4.12 postcss: 8.4.12 + postcss-selector-parser: 6.0.10 dev: true /postcss-normalize-charset/5.1.0_postcss@8.4.12: @@ -11597,6 +11412,11 @@ packages: postcss-value-parser: 4.2.0 dev: true + /postcss-opacity-percentage/1.1.2: + resolution: {integrity: sha512-lyUfF7miG+yewZ8EAk9XUBIlrHyUE6fijnesuz+Mj5zrIHIEw6KcIZSOk/elVMqzLvREmXB83Zi/5QpNRYd47w==} + engines: {node: ^12 || ^14 || >=16} + dev: true + /postcss-ordered-values/5.1.1_postcss@8.4.12: resolution: {integrity: sha512-7lxgXF0NaoMIgyihL/2boNAEZKiW0+HkMhdKMTD93CjW8TdCy2hSdj8lsAo+uwm7EDG16Da2Jdmtqpedl0cMfw==} engines: {node: ^10 || ^12 || >=14.0} @@ -11608,6 +11428,95 @@ packages: postcss-value-parser: 4.2.0 dev: true + /postcss-overflow-shorthand/3.0.3_postcss@8.4.12: + resolution: {integrity: sha512-CxZwoWup9KXzQeeIxtgOciQ00tDtnylYIlJBBODqkgS/PU2jISuWOL/mYLHmZb9ZhZiCaNKsCRiLp22dZUtNsg==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.12 + dev: true + + /postcss-page-break/3.0.4_postcss@8.4.12: + resolution: {integrity: sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==} + peerDependencies: + postcss: ^8 + dependencies: + postcss: 8.4.12 + dev: true + + /postcss-place/7.0.4_postcss@8.4.12: + resolution: {integrity: sha512-MrgKeiiu5OC/TETQO45kV3npRjOFxEHthsqGtkh3I1rPbZSbXGD/lZVi9j13cYh+NA8PIAPyk6sGjT9QbRyvSg==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.12 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-preset-env/7.4.3_postcss@8.4.12: + resolution: {integrity: sha512-dlPA65g9KuGv7YsmGyCKtFkZKCPLkoVMUE3omOl6yM+qrynVHxFvf0tMuippIrXB/sB/MyhL1FgTIbrO+qMERg==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.4 + dependencies: + '@csstools/postcss-color-function': 1.1.0_postcss@8.4.12 + '@csstools/postcss-font-format-keywords': 1.0.0_postcss@8.4.12 + '@csstools/postcss-hwb-function': 1.0.0_postcss@8.4.12 + '@csstools/postcss-ic-unit': 1.0.0_postcss@8.4.12 + '@csstools/postcss-is-pseudo-class': 2.0.2_postcss@8.4.12 + '@csstools/postcss-normalize-display-values': 1.0.0_postcss@8.4.12 + '@csstools/postcss-oklab-function': 1.1.0_postcss@8.4.12 + '@csstools/postcss-progressive-custom-properties': 1.3.0_postcss@8.4.12 + autoprefixer: 10.4.5_postcss@8.4.12 + browserslist: 4.20.2 + css-blank-pseudo: 3.0.3_postcss@8.4.12 + css-has-pseudo: 3.0.4_postcss@8.4.12 + css-prefers-color-scheme: 6.0.3_postcss@8.4.12 + cssdb: 6.5.0 + postcss: 8.4.12 + postcss-attribute-case-insensitive: 5.0.0_postcss@8.4.12 + postcss-clamp: 4.1.0_postcss@8.4.12 + postcss-color-functional-notation: 4.2.2_postcss@8.4.12 + postcss-color-hex-alpha: 8.0.3_postcss@8.4.12 + postcss-color-rebeccapurple: 7.0.2_postcss@8.4.12 + postcss-custom-media: 8.0.0_postcss@8.4.12 + postcss-custom-properties: 12.1.7_postcss@8.4.12 + postcss-custom-selectors: 6.0.0_postcss@8.4.12 + postcss-dir-pseudo-class: 6.0.4_postcss@8.4.12 + postcss-double-position-gradients: 3.1.1_postcss@8.4.12 + postcss-env-function: 4.0.6_postcss@8.4.12 + postcss-focus-visible: 6.0.4_postcss@8.4.12 + postcss-focus-within: 5.0.4_postcss@8.4.12 + postcss-font-variant: 5.0.0_postcss@8.4.12 + postcss-gap-properties: 3.0.3_postcss@8.4.12 + postcss-image-set-function: 4.0.6_postcss@8.4.12 + postcss-initial: 4.0.1_postcss@8.4.12 + postcss-lab-function: 4.2.0_postcss@8.4.12 + postcss-logical: 5.0.4_postcss@8.4.12 + postcss-media-minmax: 5.0.0_postcss@8.4.12 + postcss-nesting: 10.1.4_postcss@8.4.12 + postcss-opacity-percentage: 1.1.2 + postcss-overflow-shorthand: 3.0.3_postcss@8.4.12 + postcss-page-break: 3.0.4_postcss@8.4.12 + postcss-place: 7.0.4_postcss@8.4.12 + postcss-pseudo-class-any-link: 7.1.2_postcss@8.4.12 + postcss-replace-overflow-wrap: 4.0.0_postcss@8.4.12 + postcss-selector-not: 5.0.0_postcss@8.4.12 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-pseudo-class-any-link/7.1.2_postcss@8.4.12: + resolution: {integrity: sha512-76XzEQv3g+Vgnz3tmqh3pqQyRojkcJ+pjaePsyhcyf164p9aZsu3t+NWxkZYbcHLK1ju5Qmalti2jPI5IWCe5w==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.12 + postcss-selector-parser: 6.0.10 + dev: true + /postcss-reduce-initial/5.1.0_postcss@8.4.12: resolution: {integrity: sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw==} engines: {node: ^10 || ^12 || >=14.0} @@ -11629,6 +11538,23 @@ packages: postcss-value-parser: 4.2.0 dev: true + /postcss-replace-overflow-wrap/4.0.0_postcss@8.4.12: + resolution: {integrity: sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==} + peerDependencies: + postcss: ^8.0.3 + dependencies: + postcss: 8.4.12 + dev: true + + /postcss-selector-not/5.0.0_postcss@8.4.12: + resolution: {integrity: sha512-/2K3A4TCP9orP4TNS7u3tGdRFVKqz/E6pX3aGnriPG0jU78of8wsUcqE4QAhWEU0d+WnMSF93Ah3F//vUtK+iQ==} + peerDependencies: + postcss: ^8.1.0 + dependencies: + balanced-match: 1.0.2 + postcss: 8.4.12 + dev: true + /postcss-selector-parser/6.0.10: resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} engines: {node: '>=4'} @@ -11734,14 +11660,6 @@ packages: resolution: {integrity: sha1-mEcocL8igTL8vdhoEputEsPAKeM=} dev: true - /promise-retry/2.0.1: - resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} - engines: {node: '>=10'} - dependencies: - err-code: 2.0.3 - retry: 0.12.0 - dev: true - /promise.allsettled/1.0.5: resolution: {integrity: sha512-tVDqeZPoBC0SlzJHzWGZ2NKAguVq2oiYj7gbggbiTvH2itHohijTp7njOUA0aQ/nl+0lr/r6egmhoYu63UZ/pQ==} engines: {node: '>= 0.4'} @@ -11859,11 +11777,6 @@ packages: side-channel: 1.0.4 dev: true - /qs/6.5.3: - resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} - engines: {node: '>=0.6'} - dev: true - /qs/6.9.7: resolution: {integrity: sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==} engines: {node: '>=0.6'} @@ -12473,33 +12386,6 @@ packages: engines: {node: '>=0.10'} dev: true - /request/2.88.2: - resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==} - engines: {node: '>= 6'} - deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 - dependencies: - aws-sign2: 0.7.0 - aws4: 1.11.0 - caseless: 0.12.0 - combined-stream: 1.0.8 - extend: 3.0.2 - forever-agent: 0.6.1 - form-data: 2.3.3 - har-validator: 5.1.5 - http-signature: 1.2.0 - is-typedarray: 1.0.0 - isstream: 0.1.2 - json-stringify-safe: 5.0.1 - mime-types: 2.1.35 - oauth-sign: 0.9.0 - performance-now: 2.1.0 - qs: 6.5.3 - safe-buffer: 5.2.1 - tough-cookie: 2.5.0 - tunnel-agent: 0.6.0 - uuid: 3.4.0 - dev: true - /require-directory/2.1.1: resolution: {integrity: sha1-jGStX9MNqxyXbiNE/+f3kqam30I=} engines: {node: '>=0.10.0'} @@ -12577,11 +12463,6 @@ packages: engines: {node: '>=0.12'} dev: true - /retry/0.12.0: - resolution: {integrity: sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=} - engines: {node: '>= 4'} - dev: true - /reusify/1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -12701,18 +12582,7 @@ packages: walker: 1.0.8 dev: true - /sass-graph/4.0.0: - resolution: {integrity: sha512-WSO/MfXqKH7/TS8RdkCX3lVkPFQzCgbqdGsmSKq6tlPU+GpGEsa/5aW18JqItnqh+lPtcjifqdZ/VmiILkKckQ==} - engines: {node: '>=12'} - hasBin: true - dependencies: - glob: 7.2.0 - lodash: 4.17.21 - scss-tokenizer: 0.3.0 - yargs: 17.4.1 - dev: true - - /sass-loader/10.2.1_node-sass@7.0.1+sass@1.50.0: + /sass-loader/10.2.1_sass@1.50.1: resolution: {integrity: sha512-RRvWl+3K2LSMezIsd008ErK4rk6CulIMSwrcc2aZvjymUgKo/vjXGp1rSWmfTUX7bblEOz8tst4wBwWtCGBqKA==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -12731,14 +12601,13 @@ packages: klona: 2.0.5 loader-utils: 2.0.2 neo-async: 2.6.2 - node-sass: 7.0.1 - sass: 1.50.0 + sass: 1.50.1 schema-utils: 3.1.1 semver: 7.3.7 dev: true - /sass/1.50.0: - resolution: {integrity: sha512-cLsD6MEZ5URXHStxApajEh7gW189kkjn4Rc8DQweMyF+o5HF5nfEz8QYLMlPsTOD88DknatTmBWkOcw5/LnJLQ==} + /sass/1.50.1: + resolution: {integrity: sha512-noTnY41KnlW2A9P8sdwESpDmo+KBNkukI1i8+hOK3footBUcohNHtdOJbckp46XO95nuvcHDDZ+4tmOnpK3hjw==} engines: {node: '>=12.0.0'} hasBin: true dependencies: @@ -12797,13 +12666,6 @@ packages: ajv-keywords: 3.5.2_ajv@6.12.6 dev: true - /scss-tokenizer/0.3.0: - resolution: {integrity: sha512-14Zl9GcbBvOT9057ZKjpz5yPOyUWG2ojd9D5io28wHRYsOrs7U95Q+KNL87+32p8rc+LvDpbu/i9ZYjM9Q+FsQ==} - dependencies: - js-base64: 2.6.4 - source-map: 0.7.3 - dev: true - /semver/5.7.1: resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} hasBin: true @@ -12984,11 +12846,6 @@ packages: engines: {node: '>=8'} dev: true - /smart-buffer/4.2.0: - resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} - engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} - dev: true - /snapdragon-node/2.1.1: resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==} engines: {node: '>=0.10.0'} @@ -13019,25 +12876,6 @@ packages: use: 3.1.1 dev: true - /socks-proxy-agent/6.1.1: - resolution: {integrity: sha512-t8J0kG3csjA4g6FTbsMOWws+7R7vuRC8aQ/wy3/1OWmsgwA68zs/+cExQ0koSitUDXqhufF/YJr9wtNMZHw5Ew==} - engines: {node: '>= 10'} - dependencies: - agent-base: 6.0.2 - debug: 4.3.4 - socks: 2.6.2 - transitivePeerDependencies: - - supports-color - dev: true - - /socks/2.6.2: - resolution: {integrity: sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==} - engines: {node: '>= 10.13.0', npm: '>= 3.0.0'} - dependencies: - ip: 1.1.5 - smart-buffer: 4.2.0 - dev: true - /source-list-map/2.0.1: resolution: {integrity: sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==} dev: true @@ -13136,22 +12974,6 @@ packages: resolution: {integrity: sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=} dev: true - /sshpk/1.17.0: - resolution: {integrity: sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==} - engines: {node: '>=0.10.0'} - hasBin: true - dependencies: - asn1: 0.2.6 - assert-plus: 1.0.0 - bcrypt-pbkdf: 1.0.2 - dashdash: 1.14.1 - ecc-jsbn: 0.1.2 - getpass: 0.1.7 - jsbn: 0.1.1 - safer-buffer: 2.1.2 - tweetnacl: 0.14.5 - dev: true - /ssri/6.0.2: resolution: {integrity: sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==} dependencies: @@ -13193,12 +13015,6 @@ packages: engines: {node: '>= 0.6'} dev: true - /stdout-stream/1.4.1: - resolution: {integrity: sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==} - dependencies: - readable-stream: 2.3.7 - dev: true - /store2/2.13.2: resolution: {integrity: sha512-CMtO2Uneg3SAz/d6fZ/6qbqqQHi2ynq6/KzMD/26gTkiEShCcpqFfTHgOxsE0egAq6SX3FmN4CeSqn8BzXQkJg==} dev: true @@ -13391,16 +13207,6 @@ packages: webpack: 4.46.0 dev: true - /style-loader/2.0.0: - resolution: {integrity: sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ==} - engines: {node: '>= 10.13.0'} - peerDependencies: - webpack: ^4.0.0 || ^5.0.0 - dependencies: - loader-utils: 2.0.2 - schema-utils: 3.1.1 - dev: true - /style-to-object/0.3.0: resolution: {integrity: sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==} dependencies: @@ -13602,19 +13408,6 @@ packages: resolution: {integrity: sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=} dev: true - /thenify-all/1.6.0: - resolution: {integrity: sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=} - engines: {node: '>=0.8'} - dependencies: - thenify: 3.3.1 - dev: true - - /thenify/3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - dependencies: - any-promise: 1.3.0 - dev: true - /throat/6.0.1: resolution: {integrity: sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==} dev: true @@ -13714,14 +13507,6 @@ packages: engines: {node: '>=0.6'} dev: true - /tough-cookie/2.5.0: - resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} - engines: {node: '>=0.8'} - dependencies: - psl: 1.8.0 - punycode: 2.1.1 - dev: true - /tough-cookie/4.0.0: resolution: {integrity: sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==} engines: {node: '>=6'} @@ -13764,12 +13549,6 @@ packages: resolution: {integrity: sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==} dev: true - /true-case-path/1.0.3: - resolution: {integrity: sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==} - dependencies: - glob: 7.2.0 - dev: true - /ts-dedent/2.2.0: resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} engines: {node: '>=6.10'} @@ -13829,16 +13608,6 @@ packages: resolution: {integrity: sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=} dev: true - /tunnel-agent/0.6.0: - resolution: {integrity: sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=} - dependencies: - safe-buffer: 5.2.1 - dev: true - - /tweetnacl/0.14.5: - resolution: {integrity: sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=} - dev: true - /type-check/0.3.2: resolution: {integrity: sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=} engines: {node: '>= 0.8.0'} @@ -14246,15 +14015,6 @@ packages: engines: {node: '>= 0.8'} dev: true - /verror/1.10.0: - resolution: {integrity: sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=} - engines: {'0': node >=0.6.0} - dependencies: - assert-plus: 1.0.0 - core-util-is: 1.0.2 - extsprintf: 1.3.0 - dev: true - /vfile-location/3.2.0: resolution: {integrity: sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==} dev: true diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 00000000..612cb3d4 --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,10 @@ +const isProd = process.env.NODE_ENV !== 'development' + +module.exports = { + plugins: [ + require('postcss-preset-env'), + isProd && require('cssnano')({ + preset: 'default', + }) + ].filter(Boolean), +} diff --git a/scripts/compile-sass.js b/scripts/compile-sass.js deleted file mode 100644 index 7849601e..00000000 --- a/scripts/compile-sass.js +++ /dev/null @@ -1,50 +0,0 @@ -function compileSass(inFilePath, outDirectoryPath) { - const sass = require('node-sass'); - const postcss = require('postcss'); - const fsp = require('fs-promise'); - const path = require('path'); - const baseFileName = path.basename(inFilePath, '.scss'); - const cssBaseName = `${baseFileName}.css`; - const cssMapBaseName = `${baseFileName}.css.map`; - const cssMinBaseName = `${baseFileName}.min.css`; - const cssMinMapBaseName = `${baseFileName}.min.css.map`; - - sass.render({ - file: inFilePath, - sourceMap: true, - outFile: cssBaseName - }, (err, result) => { - postcss([require('autoprefixer')]) - .process(result.css.toString(), { - from: cssBaseName, - to: cssBaseName, - map: { - prev: result.map.toString() - } - }) - .then((postCssResult) => { - return Promise.all([ - fsp.writeFile(path.join(outDirectoryPath, cssBaseName), postCssResult.css), - fsp.writeFile(path.join(outDirectoryPath, cssMapBaseName), JSON.stringify(postCssResult.map)) - ]).then(() => postCssResult) - }) - .then((postCssResult) => { - return postcss([require('cssnano')]) - .process(postCssResult.css, { - from: cssBaseName, - to: cssMinBaseName, - map: { - prev: JSON.stringify(postCssResult.map) - } - }); - }) - .then((postCssResult) => { - return Promise.all([ - fsp.writeFile(path.join(outDirectoryPath, cssMinBaseName), postCssResult.css), - fsp.writeFile(path.join(outDirectoryPath, cssMinMapBaseName), JSON.stringify(postCssResult.map)) - ]).then(() => postCssResult) - }); - }); -} - -module.exports = compileSass; diff --git a/scripts/styles.js b/scripts/styles.js index fce1010a..5f520cb9 100755 --- a/scripts/styles.js +++ b/scripts/styles.js @@ -1,3 +1,43 @@ #!/usr/bin/env node -require('./compile-sass')(process.argv[2], process.argv[3]); +const fs = require('fs').promises; +const path = require('path'); +const sass = require('sass'); +const postcss = require('postcss'); + +const { plugins } = require('../postcss.config'); +const pkg = require('../package.json'); + +const cwd = process.cwd(); +const input = pkg.style; +const output = pkg.publishConfig.style; +const sourceMapOutput = pkg.publishConfig.style.replace('.css', '.css.map'); + +(async () => { + let styles + + styles = sass.compile(pkg.style, { + sourceMap: true + }) + + styles.sourceMap.sources = styles.sourceMap.sources.map(_ => _.replace(cwd, '')) + + styles = await postcss(plugins).process(styles.css, { + from: input, + to: output, + map: { + prev: styles.sourceMap + } + }) + + const map = styles.map.toString() + const css = styles.css + `\n/*# sourceMappingURL=${path.basename(sourceMapOutput)} */` + + await fs.mkdir(path.dirname(output), { + recursive: true + }) + await Promise.all([ + fs.writeFile(output, css), + fs.writeFile(sourceMapOutput, map) + ]) +})() diff --git a/src/styles/settings/_chartist-settings.scss b/src/styles/settings/_chartist-settings.scss index 4d0370eb..9925e558 100644 --- a/src/styles/settings/_chartist-settings.scss +++ b/src/styles/settings/_chartist-settings.scss @@ -1,5 +1,7 @@ +@use "sass:math"; + // Scales for responsive SVG containers -$ct-scales: ((1), (15/16), (8/9), (5/6), (4/5), (3/4), (2/3), (5/8), (1/1.618), (3/5), (9/16), (8/15), (1/2), (2/5), (3/8), (1/3), (1/4)) !default; +$ct-scales: ((1), math.div(15, 16), math.div(8, 9), math.div(5, 6), math.div(4, 5), math.div(3, 4), math.div(2, 3), math.div(5, 8), math.div(1, 1.618), math.div(3, 5), math.div(9, 16), math.div(8, 15), math.div(1, 2), math.div(2, 5), math.div(3, 8), math.div(1, 3), math.div(1, 4)) !default; $ct-scales-names: (ct-square, ct-minor-second, ct-major-second, ct-minor-third, ct-major-third, ct-perfect-fourth, ct-perfect-fifth, ct-minor-sixth, ct-golden-section, ct-major-sixth, ct-minor-seventh, ct-major-seventh, ct-octave, ct-major-tenth, ct-major-eleventh, ct-major-twelfth, ct-double-octave) !default; // Class names to be used when generating CSS @@ -25,7 +27,7 @@ $ct-class-start: ct-start !default; $ct-class-end: ct-end !default; // Container ratio -$ct-container-ratio: (1/1.618) !default; +$ct-container-ratio: math.div(1, 1.618) !default; // Text styles for labels $ct-text-color: rgba(0, 0, 0, 0.4) !default; From 68fc818d59bd7cdb50438aa6dd5028fbfa5f4449 Mon Sep 17 00:00:00 2001 From: Dan Onoshko Date: Fri, 29 Apr 2022 15:20:43 +0700 Subject: [PATCH 15/44] test: add more stories (#8) --- package.json | 2 + pnpm-lock.yaml | 12 + src/charts/bar.stories.js | 261 ++++++++++++++++++++-- src/charts/line.stories.js | 444 ++++++++++++++++++++++++++++++++++++- src/charts/pie.stories.js | 132 ++++++++++- 5 files changed, 832 insertions(+), 19 deletions(-) diff --git a/package.json b/package.json index c9894fdc..036ea6d6 100644 --- a/package.json +++ b/package.json @@ -74,12 +74,14 @@ "@swc/helpers": "^0.3.8", "@swc/jest": "^0.2.20", "@testing-library/jest-dom": "^5.16.4", + "@types/faker": "^5.5.8", "babel-eslint": "^7.1.0", "browserslist": "^4.20.2", "commitizen": "^4.2.4", "cssnano": "^5.1.7", "del-cli": "^4.0.1", "eslint": "^8.12.0", + "faker": "^5.5.3", "inquirer": "^8.0.0", "jest": "^27.5.1", "postcss": "^8.4.12", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b421b3da..a7235992 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,12 +14,14 @@ specifiers: '@swc/helpers': ^0.3.8 '@swc/jest': ^0.2.20 '@testing-library/jest-dom': ^5.16.4 + '@types/faker': ^5.5.8 babel-eslint: ^7.1.0 browserslist: ^4.20.2 commitizen: ^4.2.4 cssnano: ^5.1.7 del-cli: ^4.0.1 eslint: ^8.12.0 + faker: ^5.5.3 inquirer: ^8.0.0 jest: ^27.5.1 postcss: ^8.4.12 @@ -44,12 +46,14 @@ devDependencies: '@swc/helpers': 0.3.8 '@swc/jest': 0.2.20_@swc+core@1.2.165 '@testing-library/jest-dom': 5.16.4 + '@types/faker': 5.5.9 babel-eslint: 7.2.3 browserslist: 4.20.2 commitizen: 4.2.4_@swc+core@1.2.165 cssnano: 5.1.7_postcss@8.4.12 del-cli: 4.0.1 eslint: 8.13.0 + faker: 5.5.3 inquirer: 8.2.2 jest: 27.5.1 postcss: 8.4.12 @@ -4166,6 +4170,10 @@ packages: resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} dev: true + /@types/faker/5.5.9: + resolution: {integrity: sha512-uCx6mP3UY5SIO14XlspxsGjgaemrxpssJI0Ol+GfhxtcKpv9pgRZYsS4eeKeHVLje6Qtc8lGszuBI461+gVZBA==} + dev: true + /@types/glob/7.2.0: resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} dependencies: @@ -7327,6 +7335,10 @@ packages: to-regex: 3.0.2 dev: true + /faker/5.5.3: + resolution: {integrity: sha512-wLTv2a28wjUyWkbnX7u/ABZBkUkIF2fCd73V6P2oFqEGEktDfzWx4UxrSqtPRw0xPRAcjeAOIiJWqZm3pP4u3g==} + dev: true + /fast-deep-equal/3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} dev: true diff --git a/src/charts/bar.stories.js b/src/charts/bar.stories.js index 4739694d..2916e1f6 100644 --- a/src/charts/bar.stories.js +++ b/src/charts/bar.stories.js @@ -1,6 +1,5 @@ import '../styles/chartist.scss'; -import { BarChart } from './bar'; -import {AutoScaleAxis} from '../axes/axes'; +import { BarChart, AutoScaleAxis, Svg, getMultiValue } from '..'; export default { title: 'BarChart', @@ -10,6 +9,205 @@ export default { export function Default() { const root = document.createElement('div'); + new BarChart(root, { + series: [[ + {x: 1, y: 1}, + {x: 3, y: 5} + ]] + }, { + axisX: { + type: AutoScaleAxis, + onlyInteger: true + }, + axisY: { + type: AutoScaleAxis, + onlyInteger: true + } + }); + + return root +} + +export function BiPolar() { + const root = document.createElement('div'); + + new BarChart(root, { + labels: ['W1', 'W2', 'W3', 'W4', 'W5', 'W6', 'W7', 'W8', 'W9', 'W10'], + series: [ + [1, 2, 4, 8, 6, -2, -1, -4, -6, -2] + ] + }, { + high: 10, + low: -10, + axisX: { + labelInterpolationFnc(value, index) { + return index % 2 === 0 ? value : null; + } + } + }); + + return root +} + +export function Labels() { + const root = document.createElement('div'); + + new BarChart(root, { + labels: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu'], + series: [ + [5, 2, 4, 2, 0] + ] + }, { + }); + + return root +} + +export function MultilineLabels() { + const root = document.createElement('div'); + + new BarChart(root, { + labels: ['First quarter of the year', 'Second quarter of the year', 'Third quarter of the year', 'Fourth quarter of the year'], + series: [ + [60000, 40000, 80000, 70000], + [40000, 30000, 70000, 65000], + [8000, 3000, 10000, 6000] + ] + }, { + seriesBarDistance: 10, + axisX: { + offset: 60 + }, + axisY: { + offset: 80, + labelInterpolationFnc(value) { + return value + ' CHF' + }, + scaleMinSpace: 15 + } + }); + + return root +} + +export function LabelsPlacement() { + const root = document.createElement('div'); + + new BarChart(root, { + labels: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'], + series: [ + [5, 4, 3, 7, 5, 10, 3], + [3, 2, 9, 5, 4, 6, 4] + ] + }, { + axisX: { + // On the x-axis start means top and end means bottom + position: 'start' + }, + axisY: { + // On the y-axis start means left and end means right + position: 'end' + } + }); + + return root +} + +export function MultiSeries() { + const root = document.createElement('div'); + + new BarChart(root, { + series: [ + [1, 2, 3, 4], + [2, 3, 4], + [3, 4] + ] + }, {}); + + return root +} + +export function DistributedSeries() { + const root = document.createElement('div'); + + new BarChart(root, { + labels: ['XS', 'S', 'M', 'L', 'XL', 'XXL', 'XXXL'], + series: [20, 60, 120, 200, 180, 20, 10] + }, { + distributeSeries: true + }); + + return root +} + +export function ReverseData() { + const root = document.createElement('div'); + + new BarChart(root, { + series: [ + [1, 2, 3, 4], + [2, 3, 4], + [3, 4] + ] + }, { + reverseData: true + }); + + return root +} + +export function Stack() { + const root = document.createElement('div'); + + new BarChart(root, { + labels: ['Q1', 'Q2', 'Q3', 'Q4'], + series: [ + [800000, 1200000, 1400000, 1300000], + [200000, 400000, 500000, 300000], + [100000, 200000, 400000, 600000] + ] + }, { + stackBars: true, + axisY: { + labelInterpolationFnc(value) { + return (value / 1000) + 'k'; + } + } + }).on('draw', (data) => { + if(data.type === 'bar') { + data.element.attr({ + style: 'stroke-width: 30px' + }); + } + }) + + return root +} + +export function Horizontal() { + const root = document.createElement('div'); + + new BarChart(root, { + labels: ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'], + series: [ + [5, 4, 3, 7, 5, 10, 3], + [3, 2, 9, 5, 4, 6, 4] + ] + }, { + seriesBarDistance: 10, + reverseData: true, + horizontalBars: true, + axisY: { + offset: 70 + } + }); + + return root +} + +export function Adaptive() { + const root = document.createElement('div'); + new BarChart(root, { labels: ['Quarter 1', 'Quarter 2', 'Quarter 3', 'Quarter 4'], series: [ @@ -56,26 +254,57 @@ export function Default() { return root } -export function SimpleGrid() { +export function OverlappingBarsOnMobile() { const root = document.createElement('div'); new BarChart(root, { - series: [[ - {x: 1, y: 1}, - {x: 3, y: 5} - ]] + labels: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], + series: [ + [5, 4, 3, 7, 5, 10, 3, 4, 8, 10, 6, 8], + [3, 2, 9, 5, 4, 6, 4, 6, 7, 8, 7, 4] + ] + }, { + seriesBarDistance: 10 + }, [ + ['screen and (max-width: 640px)', { + seriesBarDistance: 5, + axisX: { + labelInterpolationFnc(value) { + return value[0]; + } + } + }] + ]); + + return root +} + +export function PeakCircles() { + const root = document.createElement('div'); + + new BarChart(root, { + labels: ['W1', 'W2', 'W3', 'W4', 'W5', 'W6', 'W7', 'W8', 'W9', 'W10'], + series: [ + [1, 2, 4, 8, 6, -2, -1, -4, -6, -2] + ] }, { + high: 10, + low: -10, axisX: { - type: AutoScaleAxis, - onlyInteger: true - }, - axisY: { - type: AutoScaleAxis, - onlyInteger: true + labelInterpolationFnc(value, index) { + return index % 2 === 0 ? value : null; + } + } + }).on('draw', (data) => { + // If this draw event is of type bar we can use the data to create additional content + if(data.type === 'bar') { + // We use the group element of the current series to append a simple circle with the bar peek coordinates and a circle radius that is depending on the value + data.group.append(new Svg('circle', { + cx: data.x2, + cy: data.y2, + r: Math.abs(getMultiValue(data.value)) * 2 + 5 + }, 'ct-slice-pie')); } - }).on('created', () => { - console.log(document.querySelectorAll('g.ct-grids line.ct-grid.ct-horizontal').length) - console.log(document.querySelectorAll('g.ct-grids line.ct-grid.ct-vertical').length) }); return root diff --git a/src/charts/line.stories.js b/src/charts/line.stories.js index f0936132..5fa1355a 100644 --- a/src/charts/line.stories.js +++ b/src/charts/line.stories.js @@ -1,6 +1,6 @@ +import faker from 'faker' import '../styles/chartist.scss'; -import { LineChart } from './line'; -import { AutoScaleAxis } from '../axes/axes'; +import { LineChart, AutoScaleAxis, Interpolation, Svg, easings } from '..'; export default { title: 'LineChart', @@ -10,6 +10,26 @@ export default { export function Default() { const root = document.createElement('div'); + new LineChart(root, { + labels: ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'], + series: [ + [12, 9, 7, 8, 5], + [2, 1, 3.5, 7, 3], + [1, 3, 4, 5, 6] + ] + }, { + fullWidth: true, + chartPadding: { + right: 40 + } + }); + + return root +} + +export function AutoScale() { + const root = document.createElement('div'); + new LineChart(root, { series: [[ {x: 1, y: 1}, @@ -28,3 +48,423 @@ export function Default() { return root } + +export function Labels() { + const root = document.createElement('div'); + + new LineChart(root, { + labels: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu'], + series: [ + [5, 2, 4, 2, 0] + ] + }, {}); + + return root +} + +export function MultiSeries() { + const root = document.createElement('div'); + + new LineChart(root, { + labels: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'], + series: [ + [5, 2, 4, 2, 0], + [5, 2, 2, 0] + ] + }, {}); + + return root +} + +export function Holes() { + const root = document.createElement('div'); + + new LineChart(root, { + labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], + series: [ + [5, 5, 10, 8, 7, 5, 4, null, null, null, 10, 10, 7, 8, 6, 9], + [10, 15, null, 12, null, 10, 12, 15, null, null, 12, null, 14, null, null, null], + [null, null, null, null, 3, 4, 1, 3, 4, 6, 7, 9, 5, null, null, null], + [{x:3, y: 3},{x: 4, y: 3}, {x: 5, y: undefined}, {x: 6, y: 4}, {x: 7, y: null}, {x: 8, y: 4}, {x: 9, y: 4}] + ] + }, { + fullWidth: true, + chartPadding: { + right: 10 + }, + low: 0 + }); + + return root +} + +export function FilledHoles() { + const root = document.createElement('div'); + + new LineChart(root, { + labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], + series: [ + [5, 5, 10, 8, 7, 5, 4, null, null, null, 10, 10, 7, 8, 6, 9], + [10, 15, null, 12, null, 10, 12, 15, null, null, 12, null, 14, null, null, null], + [null, null, null, null, 3, 4, 1, 3, 4, 6, 7, 9, 5, null, null, null], + [{x:3, y: 3},{x: 4, y: 3}, {x: 5, y: undefined}, {x: 6, y: 4}, {x: 7, y: null}, {x: 8, y: 4}, {x: 9, y: 4}] + ] + }, { + fullWidth: true, + chartPadding: { + right: 10 + }, + lineSmooth: Interpolation.cardinal({ + fillHoles: true, + }), + low: 0 + }); + + return root +} + +export function OnlyWholeNumbers() { + const root = document.createElement('div'); + + new LineChart(root, { + labels: [1, 2, 3, 4, 5, 6, 7, 8], + series: [ + [1, 2, 3, 1, -2, 0, 1, 0], + [-2, -1, -2, -1, -3, -1, -2, -1], + [0, 0, 0, 1, 2, 3, 2, 1], + [3, 2, 1, 0.5, 1, 0, -1, -3] + ] + }, { + high: 3, + low: -3, + fullWidth: true, + // As this is axis specific we need to tell Chartist to use whole numbers only on the concerned axis + axisY: { + onlyInteger: true, + offset: 20 + } + }); + + return root +} + +export function NoInterpolationWithHoles() { + const root = document.createElement('div'); + + new LineChart(root, { + labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + series: [ + [NaN, 15, 0, null, 2, 3, 4, undefined, 1, null] + ] + }, { + lineSmooth: false + }); + + return root +} + +export function CardinalInterpolationWithHoles() { + const root = document.createElement('div'); + + new LineChart(root, { + labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + series: [ + [NaN, 15, 0, null, 2, 3, 4, undefined, 1, null] + ] + }, { + lineSmooth: true + }); + + return root +} + +export function MonotoneCubicInterpolationWithHoles() { + const root = document.createElement('div'); + + new LineChart(root, { + labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + series: [ + [NaN, 15, 0, null, 2, 3, 4, undefined, 1, null] + ] + }, { + lineSmooth: Interpolation.monotoneCubic() + }); + + return root +} + +export function SimpleInterpolationWithHoles() { + const root = document.createElement('div'); + + new LineChart(root, { + labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + series: [ + [NaN, 15, 0, null, 2, 3, 4, undefined, 1, null] + ] + }, { + lineSmooth: Interpolation.simple() + }); + + return root +} + +export function StepInterpolationWithHoles() { + const root = document.createElement('div'); + + new LineChart(root, { + labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + series: [ + [NaN, 15, 0, null, 2, 3, 4, undefined, 1, null] + ] + }, { + lineSmooth: Interpolation.step() + }); + + return root +} + +export function StepNoPostponeInterpolationWithHoles() { + const root = document.createElement('div'); + + new LineChart(root, { + labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + series: [ + [NaN, 15, 0, null, 2, 3, 4, undefined, 1, null] + ] + }, { + lineSmooth: Interpolation.step({ + postpone: false + }) + }); + + return root +} + +export function SeriesOverrides() { + const root = document.createElement('div'); + + new LineChart(root, { + labels: ['1', '2', '3', '4', '5', '6', '7', '8'], + // Naming the series with the series object array notation + series: [{ + name: 'series-1', + data: [5, 2, -4, 2, 0, -2, 5, -3] + }, { + name: 'series-2', + data: [4, 3, 5, 3, 1, 3, 6, 4] + }, { + name: 'series-3', + data: [2, 4, 3, 1, 4, 5, 3, 2] + }] + }, { + fullWidth: true, + // Within the series options you can use the series names + // to specify configuration that will only be used for the + // specific series. + series: { + 'series-1': { + lineSmooth: Interpolation.step() + }, + 'series-2': { + lineSmooth: Interpolation.simple(), + showArea: true + }, + 'series-3': { + showPoint: false + } + } + }, [ + // You can even use responsive configuration overrides to + // customize your series configuration even further! + ['screen and (max-width: 320px)', { + series: { + 'series-1': { + lineSmooth: Interpolation.none() + }, + 'series-2': { + lineSmooth: Interpolation.none(), + showArea: false + }, + 'series-3': { + lineSmooth: Interpolation.none(), + showPoint: true + } + } + }] + ]); + + return root +} + +export function ReverseData() { + const root = document.createElement('div'); + + new LineChart(root, { + series: [[ + {x: 1, y: 1}, + {x: 3, y: 5} + ]] + }, { + reverseData: true + }); + + return root +} + +export function FullWidth() { + const root = document.createElement('div'); + + new LineChart(root, { + series: [[ + {x: 1, y: 1}, + {x: 3, y: 5} + ]] + }, { + fullWidth: true + }); + + return root +} + +export function Scatter() { + const root = document.createElement('div'); + const data = Array.from({ length: 52 }).reduce((data, _, index) => { + data.labels.push(index + 1); + data.series.forEach((series) => { + series.push(faker.datatype.number({ min: 0, max: 100 })) + }); + + return data; + }, { + labels: [], + series: Array.from({ length: 4 }, () => []) + }) + + new LineChart(root, data, { + showLine: false, + axisX: { + labelInterpolationFnc(value, index) { + return index % 13 === 0 ? 'W' + value : null; + } + } + }, [ + ['screen and (min-width: 640px)', { + axisX: { + labelInterpolationFnc(value, index) { + return index % 4 === 0 ? 'W' + value : null; + } + } + }] + ]); + + return root +} + +export function Area() { + const root = document.createElement('div'); + + new LineChart(root, { + labels: [1, 2, 3, 4, 5, 6, 7, 8], + series: [ + [5, 9, 7, 8, 5, 3, 5, 4] + ] + }, { + low: 0, + showArea: true + }); + + return root +} + +export function BiPolarArea() { + const root = document.createElement('div'); + + new LineChart(root, { + labels: [1, 2, 3, 4, 5, 6, 7, 8], + series: [ + [1, 2, 3, 1, -2, 0, 1, 0], + [-2, -1, -2, -1, -2.5, -1, -2, -1], + [0, 0, 0, 1, 2, 2.5, 2, 1], + [2.5, 2, 1, 0.5, 1, 0.5, -1, -2.5] + ] + }, { + high: 3, + low: -3, + showArea: true, + showLine: false, + showPoint: false, + fullWidth: true, + axisX: { + showLabel: false, + showGrid: false + } + }); + + return root +} + +export function CustomPoints() { + const root = document.createElement('div'); + + new LineChart(root, { + labels: [1, 2, 3, 4, 5], + series: [ + [12, 9, 7, 8, 5] + ] + }).on('draw', (data) => { + // If the draw event was triggered from drawing a point on the line chart + if(data.type === 'point') { + // We are creating a new path SVG element that draws a triangle around the point coordinates + var triangle = new Svg('path', { + d: ['M', + data.x, + data.y - 15, + 'L', + data.x - 15, + data.y + 8, + 'L', + data.x + 15, + data.y + 8, + 'z'].join(' '), + style: 'fill-opacity: 1' + }, 'ct-area'); + + // With data.element we get the Chartist SVG wrapper and we can replace the original point drawn by Chartist with our newly created triangle + data.element.replace(triangle); + } + }); + + return root +} + +export function PathAnimation() { + const root = document.createElement('div'); + + new LineChart(root, { + labels: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], + series: [ + [1, 5, 2, 5, 4, 3], + [2, 3, 4, 8, 1, 2], + [5, 4, 3, 2, 1, 0.5] + ] + }, { + low: 0, + showArea: true, + showPoint: false, + fullWidth: true + }).on('draw', (data) => { + if(data.type === 'line' || data.type === 'area') { + data.element.animate({ + d: { + begin: 2000 * data.index, + dur: 2000, + from: data.path.clone().scale(1, 0).translate(0, data.chartRect.height()).stringify(), + to: data.path.clone().stringify(), + easing: easings.easeOutQuint + } + }); + } + }); + + return root +} diff --git a/src/charts/pie.stories.js b/src/charts/pie.stories.js index 01992252..63c85d9a 100644 --- a/src/charts/pie.stories.js +++ b/src/charts/pie.stories.js @@ -1,5 +1,5 @@ import '../styles/chartist.scss'; -import { PieChart } from './pie'; +import { PieChart } from '..'; export default { title: 'PieChart', @@ -19,3 +19,133 @@ export function Default() { return root } + +export function Labels() { + const root = document.createElement('div'); + + new PieChart(root, { + labels: ['A', 'B', 'C'], + series: [5, 8, 1] + }, {}); + + return root +} + +export function LabelInterpolation() { + const root = document.createElement('div'); + const data = { + series: [5, 3, 4] + }; + const sum = (a, b) => a + b; + + new PieChart(root, data, { + width: 100, + height: 100, + chartPadding: 10, + labelInterpolationFnc: (value) => `${Math.round(value / data.series.reduce(sum) * 100)}%` + }); + + return root +} + +export function StartAngle() { + const root = document.createElement('div'); + + new PieChart(root, { + series: [5, 3, 4] + }, { + startAngle: 90 + }); + + return root +} + +export function SmallSlices() { + const root = document.createElement('div'); + + new PieChart(root, { + series: [0.001, 2] + }, { + width: 100, + height: 100, + chartPadding: 0 + }); + + return root +} + +export function IgnoreEmptyValues() { + const root = document.createElement('div'); + + new PieChart(root, { + series: [1, 2, 0, 4] + }, { + ignoreEmptyValues: true + }); + + return root +} + +export function Donut() { + const root = document.createElement('div'); + + new PieChart(root, { + series: [5, 3, 4] + }, { + donut: true + }); + + return root +} + +export function GaugeDonut() { + const root = document.createElement('div'); + + new PieChart(root, { + series: [20, 10, 30, 40] + }, { + chartPadding: 50, + height: 500, + width: 500, + donut: true, + donutWidth: 60, + startAngle: 270, + total: 200, + showLabel: false + }); + + return root +} + +export function RelativeDonutWidth() { + const root = document.createElement('div'); + + new PieChart(root, { + series: [20, 10, 30, 40] + }, { + chartPadding: 50, + height: 500, + width: 500, + donut: true, + donutWidth: '25%', + showLabel: false + }); + + return root +} + +export function Solid() { + const root = document.createElement('div'); + + new PieChart(root, { + series: [20, 10, 30, 40] + }, { + donut: true, + donutWidth: 60, + donutSolid: true, + startAngle: 270, + showLabel: true + }); + + return root +} From aee9c842190f361bf547a984287c87b26b54896d Mon Sep 17 00:00:00 2001 From: Dan Onoshko Date: Thu, 12 May 2022 20:06:18 +0700 Subject: [PATCH 16/44] test: compatability mode for stories (#9) --- .storybook/main.js | 11 + package.json | 7 +- pnpm-lock.yaml | 1372 +++++++++++++++++++----------------- src/charts/bar.stories.js | 4 +- src/charts/line.stories.js | 4 +- src/charts/pie.stories.js | 4 +- test/compat.js | 15 + 7 files changed, 752 insertions(+), 665 deletions(-) create mode 100644 test/compat.js diff --git a/.storybook/main.js b/.storybook/main.js index b9fdcacb..0fb5572b 100644 --- a/.storybook/main.js +++ b/.storybook/main.js @@ -1,3 +1,7 @@ +const path = require('path'); + +const isCompatMode = process.env.CHARTIST_COMPAT === 'true' + module.exports = { stories: ['../src/**/*.stories.@(js|jsx|ts|tsx)'], addons: [ @@ -17,6 +21,13 @@ module.exports = { ].map(require.resolve) }); + config.resolve.alias['chartist-dev/styles$'] = isCompatMode + ? 'chartist/dist/chartist.css' + : path.resolve(__dirname, '..', 'src', 'styles', 'chartist.scss'); + config.resolve.alias['chartist-dev$'] = isCompatMode + ? path.resolve(__dirname, '..', 'test', 'compat.js') + : path.resolve(__dirname, '..', 'src'); + return config; }, }; diff --git a/package.json b/package.json index 036ea6d6..33dcf888 100644 --- a/package.json +++ b/package.json @@ -77,15 +77,16 @@ "@types/faker": "^5.5.8", "babel-eslint": "^7.1.0", "browserslist": "^4.20.2", + "chartist": "^0.11.4", "commitizen": "^4.2.4", - "cssnano": "^5.1.7", + "cssnano": "^4.1.11", "del-cli": "^4.0.1", "eslint": "^8.12.0", "faker": "^5.5.3", "inquirer": "^8.0.0", "jest": "^27.5.1", - "postcss": "^8.4.12", - "postcss-preset-env": "^7.4.3", + "postcss": "^7.0.39", + "postcss-preset-env": "^6.7.1", "rollup": "^2.70.1", "rollup-plugin-swc": "^0.2.1", "sass": "^1.50.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a7235992..421b6223 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,15 +17,16 @@ specifiers: '@types/faker': ^5.5.8 babel-eslint: ^7.1.0 browserslist: ^4.20.2 + chartist: ^0.11.4 commitizen: ^4.2.4 - cssnano: ^5.1.7 + cssnano: ^4.1.11 del-cli: ^4.0.1 eslint: ^8.12.0 faker: ^5.5.3 inquirer: ^8.0.0 jest: ^27.5.1 - postcss: ^8.4.12 - postcss-preset-env: ^7.4.3 + postcss: ^7.0.39 + postcss-preset-env: ^6.7.1 rollup: ^2.70.1 rollup-plugin-swc: ^0.2.1 sass: ^1.50.1 @@ -49,15 +50,16 @@ devDependencies: '@types/faker': 5.5.9 babel-eslint: 7.2.3 browserslist: 4.20.2 + chartist: 0.11.4 commitizen: 4.2.4_@swc+core@1.2.165 - cssnano: 5.1.7_postcss@8.4.12 + cssnano: 4.1.11 del-cli: 4.0.1 eslint: 8.13.0 faker: 5.5.3 inquirer: 8.2.2 jest: 27.5.1 - postcss: 8.4.12 - postcss-preset-env: 7.4.3_postcss@8.4.12 + postcss: 7.0.39 + postcss-preset-env: 6.7.1 rollup: 2.70.1 rollup-plugin-swc: 0.2.1_@swc+core@1.2.165+rollup@2.70.1 sass: 1.50.1 @@ -1677,87 +1679,9 @@ packages: '@cspotcode/source-map-consumer': 0.8.0 dev: true - /@csstools/postcss-color-function/1.1.0_postcss@8.4.12: - resolution: {integrity: sha512-5D5ND/mZWcQoSfYnSPsXtuiFxhzmhxt6pcjrFLJyldj+p0ZN2vvRpYNX+lahFTtMhAYOa2WmkdGINr0yP0CvGA==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.4 - dependencies: - '@csstools/postcss-progressive-custom-properties': 1.3.0_postcss@8.4.12 - postcss: 8.4.12 - postcss-value-parser: 4.2.0 - dev: true - - /@csstools/postcss-font-format-keywords/1.0.0_postcss@8.4.12: - resolution: {integrity: sha512-oO0cZt8do8FdVBX8INftvIA4lUrKUSCcWUf9IwH9IPWOgKT22oAZFXeHLoDK7nhB2SmkNycp5brxfNMRLIhd6Q==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.3 - dependencies: - postcss: 8.4.12 - postcss-value-parser: 4.2.0 - dev: true - - /@csstools/postcss-hwb-function/1.0.0_postcss@8.4.12: - resolution: {integrity: sha512-VSTd7hGjmde4rTj1rR30sokY3ONJph1reCBTUXqeW1fKwETPy1x4t/XIeaaqbMbC5Xg4SM/lyXZ2S8NELT2TaA==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.3 - dependencies: - postcss: 8.4.12 - postcss-value-parser: 4.2.0 - dev: true - - /@csstools/postcss-ic-unit/1.0.0_postcss@8.4.12: - resolution: {integrity: sha512-i4yps1mBp2ijrx7E96RXrQXQQHm6F4ym1TOD0D69/sjDjZvQ22tqiEvaNw7pFZTUO5b9vWRHzbHzP9+UKuw+bA==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.3 - dependencies: - '@csstools/postcss-progressive-custom-properties': 1.3.0_postcss@8.4.12 - postcss: 8.4.12 - postcss-value-parser: 4.2.0 - dev: true - - /@csstools/postcss-is-pseudo-class/2.0.2_postcss@8.4.12: - resolution: {integrity: sha512-L9h1yxXMj7KpgNzlMrw3isvHJYkikZgZE4ASwssTnGEH8tm50L6QsM9QQT5wR4/eO5mU0rN5axH7UzNxEYg5CA==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.4 - dependencies: - postcss: 8.4.12 - postcss-selector-parser: 6.0.10 - dev: true - - /@csstools/postcss-normalize-display-values/1.0.0_postcss@8.4.12: - resolution: {integrity: sha512-bX+nx5V8XTJEmGtpWTO6kywdS725t71YSLlxWt78XoHUbELWgoCXeOFymRJmL3SU1TLlKSIi7v52EWqe60vJTQ==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.3 - dependencies: - postcss: 8.4.12 - postcss-value-parser: 4.2.0 - dev: true - - /@csstools/postcss-oklab-function/1.1.0_postcss@8.4.12: - resolution: {integrity: sha512-e/Q5HopQzmnQgqimG9v3w2IG4VRABsBq3itOcn4bnm+j4enTgQZ0nWsaH/m9GV2otWGQ0nwccYL5vmLKyvP1ww==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.4 - dependencies: - '@csstools/postcss-progressive-custom-properties': 1.3.0_postcss@8.4.12 - postcss: 8.4.12 - postcss-value-parser: 4.2.0 - dev: true - - /@csstools/postcss-progressive-custom-properties/1.3.0_postcss@8.4.12: - resolution: {integrity: sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.3 - dependencies: - postcss: 8.4.12 - postcss-value-parser: 4.2.0 + /@csstools/convert-colors/1.4.0: + resolution: {integrity: sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==} + engines: {node: '>=4.0.0'} dev: true /@discoveryjs/json-ext/0.5.7: @@ -4106,11 +4030,6 @@ packages: engines: {node: '>= 6'} dev: true - /@trysound/sax/0.2.0: - resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} - engines: {node: '>=10.13.0'} - dev: true - /@tsconfig/node10/1.0.8: resolution: {integrity: sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==} dev: true @@ -4289,6 +4208,10 @@ packages: resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} dev: true + /@types/q/1.5.5: + resolution: {integrity: sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==} + dev: true + /@types/qs/6.9.7: resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} dev: true @@ -4659,6 +4582,10 @@ packages: uri-js: 4.4.1 dev: true + /alphanum-sort/1.0.2: + resolution: {integrity: sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=} + dev: true + /ansi-align/3.0.1: resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} dependencies: @@ -4932,28 +4859,12 @@ packages: hasBin: true dev: true - /autoprefixer/10.4.5_postcss@8.4.12: - resolution: {integrity: sha512-Fvd8yCoA7lNX/OUllvS+aS1I7WRBclGXsepbvT8ZaPgrH24rgXpZzF0/6Hh3ZEkwg+0AES/Osd196VZmYoEFtw==} - engines: {node: ^10 || ^12 || >=14} - hasBin: true - peerDependencies: - postcss: ^8.1.0 - dependencies: - browserslist: 4.20.2 - caniuse-lite: 1.0.30001332 - fraction.js: 4.2.0 - normalize-range: 0.1.2 - picocolors: 1.0.0 - postcss: 8.4.12 - postcss-value-parser: 4.2.0 - dev: true - /autoprefixer/9.8.8: resolution: {integrity: sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==} hasBin: true dependencies: browserslist: 4.20.2 - caniuse-lite: 1.0.30001331 + caniuse-lite: 1.0.30001332 normalize-range: 0.1.2 num2fraction: 1.2.2 picocolors: 0.2.1 @@ -5555,6 +5466,25 @@ packages: resolution: {integrity: sha1-JtII6onje1y95gJQoV8DHBak1ms=} dev: true + /caller-callsite/2.0.0: + resolution: {integrity: sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=} + engines: {node: '>=4'} + dependencies: + callsites: 2.0.0 + dev: true + + /caller-path/2.0.0: + resolution: {integrity: sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=} + engines: {node: '>=4'} + dependencies: + caller-callsite: 2.0.0 + dev: true + + /callsites/2.0.0: + resolution: {integrity: sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=} + engines: {node: '>=4'} + dev: true + /callsites/3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} @@ -5696,6 +5626,11 @@ packages: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} dev: true + /chartist/0.11.4: + resolution: {integrity: sha512-H4AimxaUD738/u9Mq8t27J4lh6STsLi4BQHt65nOtpLk3xyrBPaLiLMrHw7/WV9CmsjGA02WihjuL5qpSagLYw==} + engines: {node: '>=4.6.0'} + dev: true + /chokidar/2.1.8: resolution: {integrity: sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==} deprecated: Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies @@ -5860,6 +5795,15 @@ packages: engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} dev: true + /coa/2.0.2: + resolution: {integrity: sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==} + engines: {node: '>= 4.0'} + dependencies: + '@types/q': 1.5.5 + chalk: 2.4.2 + q: 1.5.1 + dev: true + /collapse-white-space/1.0.6: resolution: {integrity: sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==} dev: true @@ -5897,13 +5841,23 @@ packages: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} dev: true + /color-string/1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + dev: true + /color-support/1.1.3: resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} hasBin: true dev: true - /colord/2.9.2: - resolution: {integrity: sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ==} + /color/3.2.1: + resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} + dependencies: + color-convert: 1.9.3 + color-string: 1.9.1 dev: true /combined-stream/1.0.8: @@ -5931,11 +5885,6 @@ packages: engines: {node: '>= 6'} dev: true - /commander/7.2.0: - resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} - engines: {node: '>= 10'} - dev: true - /commitizen/4.2.4_@swc+core@1.2.165: resolution: {integrity: sha512-LlZChbDzg3Ir3O2S7jSo/cgWp5/QwylQVr59K4xayVq8S4/RdKzSyJkghAiZZHfhh5t4pxunUoyeg0ml1q/7aw==} engines: {node: '>= 10'} @@ -6151,6 +6100,16 @@ packages: - '@swc/wasm' dev: true + /cosmiconfig/5.2.1: + resolution: {integrity: sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==} + engines: {node: '>=4'} + dependencies: + import-fresh: 2.0.0 + is-directory: 0.3.1 + js-yaml: 3.14.1 + parse-json: 4.0.0 + dev: true + /cosmiconfig/6.0.0: resolution: {integrity: sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==} engines: {node: '>=8'} @@ -6266,35 +6225,33 @@ packages: randomfill: 1.0.4 dev: true - /css-blank-pseudo/3.0.3_postcss@8.4.12: - resolution: {integrity: sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==} - engines: {node: ^12 || ^14 || >=16} + /css-blank-pseudo/0.1.4: + resolution: {integrity: sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==} + engines: {node: '>=6.0.0'} hasBin: true - peerDependencies: - postcss: ^8.4 dependencies: - postcss: 8.4.12 - postcss-selector-parser: 6.0.10 + postcss: 7.0.39 dev: true - /css-declaration-sorter/6.2.2_postcss@8.4.12: - resolution: {integrity: sha512-Ufadglr88ZLsrvS11gjeu/40Lw74D9Am/Jpr3LlYm5Q4ZP5KdlUhG+6u2EjyXeZcxmZ2h1ebCKngDjolpeLHpg==} - engines: {node: ^10 || ^12 || >=14} - peerDependencies: - postcss: ^8.0.9 + /css-color-names/0.0.4: + resolution: {integrity: sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=} + dev: true + + /css-declaration-sorter/4.0.1: + resolution: {integrity: sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==} + engines: {node: '>4'} dependencies: - postcss: 8.4.12 + postcss: 7.0.39 + timsort: 0.3.0 dev: true - /css-has-pseudo/3.0.4_postcss@8.4.12: - resolution: {integrity: sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==} - engines: {node: ^12 || ^14 || >=16} + /css-has-pseudo/0.10.0: + resolution: {integrity: sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==} + engines: {node: '>=6.0.0'} hasBin: true - peerDependencies: - postcss: ^8.4 dependencies: - postcss: 8.4.12 - postcss-selector-parser: 6.0.10 + postcss: 7.0.39 + postcss-selector-parser: 5.0.0 dev: true /css-loader/3.6.0_webpack@4.46.0: @@ -6319,14 +6276,25 @@ packages: webpack: 4.46.0 dev: true - /css-prefers-color-scheme/6.0.3_postcss@8.4.12: - resolution: {integrity: sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==} - engines: {node: ^12 || ^14 || >=16} + /css-prefers-color-scheme/3.1.1: + resolution: {integrity: sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg==} + engines: {node: '>=6.0.0'} hasBin: true - peerDependencies: - postcss: ^8.4 dependencies: - postcss: 8.4.12 + postcss: 7.0.39 + dev: true + + /css-select-base-adapter/0.1.1: + resolution: {integrity: sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==} + dev: true + + /css-select/2.1.0: + resolution: {integrity: sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==} + dependencies: + boolbase: 1.0.0 + css-what: 3.4.2 + domutils: 1.7.0 + nth-check: 1.0.2 dev: true /css-select/4.3.0: @@ -6339,6 +6307,14 @@ packages: nth-check: 2.0.1 dev: true + /css-tree/1.0.0-alpha.37: + resolution: {integrity: sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==} + engines: {node: '>=8.0.0'} + dependencies: + mdn-data: 2.0.4 + source-map: 0.6.1 + dev: true + /css-tree/1.1.3: resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} engines: {node: '>=8.0.0'} @@ -6347,6 +6323,11 @@ packages: source-map: 0.6.1 dev: true + /css-what/3.4.2: + resolution: {integrity: sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==} + engines: {node: '>= 6'} + dev: true + /css-what/6.1.0: resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} engines: {node: '>= 6'} @@ -6364,8 +6345,14 @@ packages: source-map-resolve: 0.6.0 dev: true - /cssdb/6.5.0: - resolution: {integrity: sha512-Rh7AAopF2ckPXe/VBcoUS9JrCZNSyc60+KpgE6X25vpVxA32TmiqvExjkfhwP4wGSb6Xe8Z/JIyGqwgx/zZYFA==} + /cssdb/4.4.0: + resolution: {integrity: sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ==} + dev: true + + /cssesc/2.0.0: + resolution: {integrity: sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==} + engines: {node: '>=4'} + hasBin: true dev: true /cssesc/3.0.0: @@ -6374,63 +6361,72 @@ packages: hasBin: true dev: true - /cssnano-preset-default/5.2.7_postcss@8.4.12: - resolution: {integrity: sha512-JiKP38ymZQK+zVKevphPzNSGHSlTI+AOwlasoSRtSVMUU285O7/6uZyd5NbW92ZHp41m0sSHe6JoZosakj63uA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - css-declaration-sorter: 6.2.2_postcss@8.4.12 - cssnano-utils: 3.1.0_postcss@8.4.12 - postcss: 8.4.12 - postcss-calc: 8.2.4_postcss@8.4.12 - postcss-colormin: 5.3.0_postcss@8.4.12 - postcss-convert-values: 5.1.0_postcss@8.4.12 - postcss-discard-comments: 5.1.1_postcss@8.4.12 - postcss-discard-duplicates: 5.1.0_postcss@8.4.12 - postcss-discard-empty: 5.1.1_postcss@8.4.12 - postcss-discard-overridden: 5.1.0_postcss@8.4.12 - postcss-merge-longhand: 5.1.4_postcss@8.4.12 - postcss-merge-rules: 5.1.1_postcss@8.4.12 - postcss-minify-font-values: 5.1.0_postcss@8.4.12 - postcss-minify-gradients: 5.1.1_postcss@8.4.12 - postcss-minify-params: 5.1.2_postcss@8.4.12 - postcss-minify-selectors: 5.2.0_postcss@8.4.12 - postcss-normalize-charset: 5.1.0_postcss@8.4.12 - postcss-normalize-display-values: 5.1.0_postcss@8.4.12 - postcss-normalize-positions: 5.1.0_postcss@8.4.12 - postcss-normalize-repeat-style: 5.1.0_postcss@8.4.12 - postcss-normalize-string: 5.1.0_postcss@8.4.12 - postcss-normalize-timing-functions: 5.1.0_postcss@8.4.12 - postcss-normalize-unicode: 5.1.0_postcss@8.4.12 - postcss-normalize-url: 5.1.0_postcss@8.4.12 - postcss-normalize-whitespace: 5.1.1_postcss@8.4.12 - postcss-ordered-values: 5.1.1_postcss@8.4.12 - postcss-reduce-initial: 5.1.0_postcss@8.4.12 - postcss-reduce-transforms: 5.1.0_postcss@8.4.12 - postcss-svgo: 5.1.0_postcss@8.4.12 - postcss-unique-selectors: 5.1.1_postcss@8.4.12 - dev: true - - /cssnano-utils/3.1.0_postcss@8.4.12: - resolution: {integrity: sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.12 - dev: true - - /cssnano/5.1.7_postcss@8.4.12: - resolution: {integrity: sha512-pVsUV6LcTXif7lvKKW9ZrmX+rGRzxkEdJuVJcp5ftUjWITgwam5LMZOgaTvUrWPkcORBey6he7JKb4XAJvrpKg==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - cssnano-preset-default: 5.2.7_postcss@8.4.12 - lilconfig: 2.0.5 - postcss: 8.4.12 - yaml: 1.10.2 + /cssnano-preset-default/4.0.8: + resolution: {integrity: sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ==} + engines: {node: '>=6.9.0'} + dependencies: + css-declaration-sorter: 4.0.1 + cssnano-util-raw-cache: 4.0.1 + postcss: 7.0.39 + postcss-calc: 7.0.5 + postcss-colormin: 4.0.3 + postcss-convert-values: 4.0.1 + postcss-discard-comments: 4.0.2 + postcss-discard-duplicates: 4.0.2 + postcss-discard-empty: 4.0.1 + postcss-discard-overridden: 4.0.1 + postcss-merge-longhand: 4.0.11 + postcss-merge-rules: 4.0.3 + postcss-minify-font-values: 4.0.2 + postcss-minify-gradients: 4.0.2 + postcss-minify-params: 4.0.2 + postcss-minify-selectors: 4.0.2 + postcss-normalize-charset: 4.0.1 + postcss-normalize-display-values: 4.0.2 + postcss-normalize-positions: 4.0.2 + postcss-normalize-repeat-style: 4.0.2 + postcss-normalize-string: 4.0.2 + postcss-normalize-timing-functions: 4.0.2 + postcss-normalize-unicode: 4.0.1 + postcss-normalize-url: 4.0.1 + postcss-normalize-whitespace: 4.0.2 + postcss-ordered-values: 4.1.2 + postcss-reduce-initial: 4.0.3 + postcss-reduce-transforms: 4.0.2 + postcss-svgo: 4.0.3 + postcss-unique-selectors: 4.0.1 + dev: true + + /cssnano-util-get-arguments/4.0.0: + resolution: {integrity: sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=} + engines: {node: '>=6.9.0'} + dev: true + + /cssnano-util-get-match/4.0.0: + resolution: {integrity: sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=} + engines: {node: '>=6.9.0'} + dev: true + + /cssnano-util-raw-cache/4.0.1: + resolution: {integrity: sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==} + engines: {node: '>=6.9.0'} + dependencies: + postcss: 7.0.39 + dev: true + + /cssnano-util-same-parent/4.0.1: + resolution: {integrity: sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==} + engines: {node: '>=6.9.0'} + dev: true + + /cssnano/4.1.11: + resolution: {integrity: sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g==} + engines: {node: '>=6.9.0'} + dependencies: + cosmiconfig: 5.2.1 + cssnano-preset-default: 4.0.8 + is-resolvable: 1.1.0 + postcss: 7.0.39 dev: true /csso/4.2.0: @@ -6728,6 +6724,13 @@ packages: utila: 0.4.0 dev: true + /dom-serializer/0.2.2: + resolution: {integrity: sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==} + dependencies: + domelementtype: 2.3.0 + entities: 2.2.0 + dev: true + /dom-serializer/1.4.1: resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} dependencies: @@ -6745,6 +6748,10 @@ packages: engines: {node: '>=0.4', npm: '>=1.2'} dev: true + /domelementtype/1.3.1: + resolution: {integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==} + dev: true + /domelementtype/2.3.0: resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} dev: true @@ -6770,6 +6777,13 @@ packages: domelementtype: 2.3.0 dev: true + /domutils/1.7.0: + resolution: {integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==} + dependencies: + dom-serializer: 0.2.2 + domelementtype: 1.3.1 + dev: true + /domutils/2.8.0: resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} dependencies: @@ -7545,6 +7559,11 @@ packages: resolution: {integrity: sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==} dev: true + /flatten/1.0.3: + resolution: {integrity: sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==} + deprecated: flatten is deprecated in favor of utility frameworks such as lodash. + dev: true + /flush-write-stream/1.1.1: resolution: {integrity: sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==} dependencies: @@ -7620,10 +7639,6 @@ packages: engines: {node: '>= 0.6'} dev: true - /fraction.js/4.2.0: - resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==} - dev: true - /fragment-cache/0.2.1: resolution: {integrity: sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=} engines: {node: '>=0.10.0'} @@ -8163,6 +8178,10 @@ packages: hasBin: true dev: true + /hex-color-regex/1.1.0: + resolution: {integrity: sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==} + dev: true + /highlight.js/10.7.3: resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} dev: true @@ -8211,6 +8230,14 @@ packages: lru-cache: 6.0.0 dev: true + /hsl-regex/1.0.0: + resolution: {integrity: sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=} + dev: true + + /hsla-regex/1.0.0: + resolution: {integrity: sha1-wc56MWjIxmFAM6S194d/OyJfnDg=} + dev: true + /html-encoding-sniffer/2.0.1: resolution: {integrity: sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==} engines: {node: '>=10'} @@ -8374,6 +8401,14 @@ packages: resolution: {integrity: sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw==} dev: true + /import-fresh/2.0.0: + resolution: {integrity: sha1-2BNVwVYS04bGH53dOSLUMEgipUY=} + engines: {node: '>=4'} + dependencies: + caller-path: 2.0.0 + resolve-from: 3.0.0 + dev: true + /import-fresh/3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} @@ -8406,6 +8441,10 @@ packages: engines: {node: '>=12'} dev: true + /indexes-of/1.0.1: + resolution: {integrity: sha1-8w9xbI4r00bHtn0985FVZqfAVgc=} + dev: true + /infer-owner/1.0.4: resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} dev: true @@ -8505,6 +8544,11 @@ packages: engines: {node: '>= 0.10'} dev: true + /is-absolute-url/2.1.0: + resolution: {integrity: sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=} + engines: {node: '>=0.10.0'} + dev: true + /is-absolute-url/3.0.3: resolution: {integrity: sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==} engines: {node: '>=8'} @@ -8547,6 +8591,10 @@ packages: resolution: {integrity: sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=} dev: true + /is-arrayish/0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + dev: true + /is-bigint/1.0.4: resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} dependencies: @@ -8597,6 +8645,17 @@ packages: ci-info: 2.0.0 dev: true + /is-color-stop/1.1.0: + resolution: {integrity: sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=} + dependencies: + css-color-names: 0.0.4 + hex-color-regex: 1.1.0 + hsl-regex: 1.0.0 + hsla-regex: 1.0.0 + rgb-regex: 1.0.1 + rgba-regex: 1.0.0 + dev: true + /is-core-module/2.8.1: resolution: {integrity: sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==} dependencies: @@ -8646,6 +8705,11 @@ packages: kind-of: 6.0.3 dev: true + /is-directory/0.3.1: + resolution: {integrity: sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=} + engines: {node: '>=0.10.0'} + dev: true + /is-docker/2.2.1: resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} engines: {node: '>=8'} @@ -8803,6 +8867,10 @@ packages: has-tostringtag: 1.0.0 dev: true + /is-resolvable/1.1.0: + resolution: {integrity: sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==} + dev: true + /is-set/2.0.2: resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} dev: true @@ -9711,11 +9779,6 @@ packages: type-check: 0.4.0 dev: true - /lilconfig/2.0.5: - resolution: {integrity: sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==} - engines: {node: '>=10'} - dev: true - /lines-and-columns/1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} dev: true @@ -9956,6 +10019,10 @@ packages: resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} dev: true + /mdn-data/2.0.4: + resolution: {integrity: sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==} + dev: true + /mdurl/1.0.1: resolution: {integrity: sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=} dev: true @@ -10413,9 +10480,9 @@ packages: engines: {node: '>=0.10.0'} dev: true - /normalize-url/6.1.0: - resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} - engines: {node: '>=10'} + /normalize-url/3.3.0: + resolution: {integrity: sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==} + engines: {node: '>=6'} dev: true /npm-run-path/2.0.2: @@ -10441,6 +10508,12 @@ packages: set-blocking: 2.0.0 dev: true + /nth-check/1.0.2: + resolution: {integrity: sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==} + dependencies: + boolbase: 1.0.0 + dev: true + /nth-check/2.0.1: resolution: {integrity: sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==} dependencies: @@ -10769,6 +10842,14 @@ packages: is-hexadecimal: 1.0.4 dev: true + /parse-json/4.0.0: + resolution: {integrity: sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=} + engines: {node: '>=4'} + dependencies: + error-ex: 1.3.2 + json-parse-better-errors: 1.0.2 + dev: true + /parse-json/5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} @@ -10939,182 +11020,155 @@ packages: engines: {node: '>=0.10.0'} dev: true - /postcss-attribute-case-insensitive/5.0.0_postcss@8.4.12: - resolution: {integrity: sha512-b4g9eagFGq9T5SWX4+USfVyjIb3liPnjhHHRMP7FMB2kFVpYyfEscV0wP3eaXhKlcHKUut8lt5BGoeylWA/dBQ==} - peerDependencies: - postcss: ^8.0.2 + /postcss-attribute-case-insensitive/4.0.2: + resolution: {integrity: sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA==} dependencies: - postcss: 8.4.12 + postcss: 7.0.39 postcss-selector-parser: 6.0.10 dev: true - /postcss-calc/8.2.4_postcss@8.4.12: - resolution: {integrity: sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==} - peerDependencies: - postcss: ^8.2.2 + /postcss-calc/7.0.5: + resolution: {integrity: sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==} dependencies: - postcss: 8.4.12 + postcss: 7.0.39 postcss-selector-parser: 6.0.10 postcss-value-parser: 4.2.0 dev: true - /postcss-clamp/4.1.0_postcss@8.4.12: - resolution: {integrity: sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==} - engines: {node: '>=7.6.0'} - peerDependencies: - postcss: ^8.4.6 + /postcss-color-functional-notation/2.0.1: + resolution: {integrity: sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g==} + engines: {node: '>=6.0.0'} dependencies: - postcss: 8.4.12 - postcss-value-parser: 4.2.0 + postcss: 7.0.39 + postcss-values-parser: 2.0.1 dev: true - /postcss-color-functional-notation/4.2.2_postcss@8.4.12: - resolution: {integrity: sha512-DXVtwUhIk4f49KK5EGuEdgx4Gnyj6+t2jBSEmxvpIK9QI40tWrpS2Pua8Q7iIZWBrki2QOaeUdEaLPPa91K0RQ==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.4 + /postcss-color-gray/5.0.0: + resolution: {integrity: sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw==} + engines: {node: '>=6.0.0'} dependencies: - postcss: 8.4.12 - postcss-value-parser: 4.2.0 + '@csstools/convert-colors': 1.4.0 + postcss: 7.0.39 + postcss-values-parser: 2.0.1 dev: true - /postcss-color-hex-alpha/8.0.3_postcss@8.4.12: - resolution: {integrity: sha512-fESawWJCrBV035DcbKRPAVmy21LpoyiXdPTuHUfWJ14ZRjY7Y7PA6P4g8z6LQGYhU1WAxkTxjIjurXzoe68Glw==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.4 + /postcss-color-hex-alpha/5.0.3: + resolution: {integrity: sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==} + engines: {node: '>=6.0.0'} dependencies: - postcss: 8.4.12 - postcss-value-parser: 4.2.0 + postcss: 7.0.39 + postcss-values-parser: 2.0.1 dev: true - /postcss-color-rebeccapurple/7.0.2_postcss@8.4.12: - resolution: {integrity: sha512-SFc3MaocHaQ6k3oZaFwH8io6MdypkUtEy/eXzXEB1vEQlO3S3oDc/FSZA8AsS04Z25RirQhlDlHLh3dn7XewWw==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.3 + /postcss-color-mod-function/3.0.3: + resolution: {integrity: sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ==} + engines: {node: '>=6.0.0'} dependencies: - postcss: 8.4.12 - postcss-value-parser: 4.2.0 + '@csstools/convert-colors': 1.4.0 + postcss: 7.0.39 + postcss-values-parser: 2.0.1 dev: true - /postcss-colormin/5.3.0_postcss@8.4.12: - resolution: {integrity: sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + /postcss-color-rebeccapurple/4.0.1: + resolution: {integrity: sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g==} + engines: {node: '>=6.0.0'} + dependencies: + postcss: 7.0.39 + postcss-values-parser: 2.0.1 + dev: true + + /postcss-colormin/4.0.3: + resolution: {integrity: sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==} + engines: {node: '>=6.9.0'} dependencies: browserslist: 4.20.2 - caniuse-api: 3.0.0 - colord: 2.9.2 - postcss: 8.4.12 - postcss-value-parser: 4.2.0 + color: 3.2.1 + has: 1.0.3 + postcss: 7.0.39 + postcss-value-parser: 3.3.1 dev: true - /postcss-convert-values/5.1.0_postcss@8.4.12: - resolution: {integrity: sha512-GkyPbZEYJiWtQB0KZ0X6qusqFHUepguBCNFi9t5JJc7I2OTXG7C0twbTLvCfaKOLl3rSXmpAwV7W5txd91V84g==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + /postcss-convert-values/4.0.1: + resolution: {integrity: sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==} + engines: {node: '>=6.9.0'} dependencies: - postcss: 8.4.12 - postcss-value-parser: 4.2.0 + postcss: 7.0.39 + postcss-value-parser: 3.3.1 dev: true - /postcss-custom-media/8.0.0_postcss@8.4.12: - resolution: {integrity: sha512-FvO2GzMUaTN0t1fBULDeIvxr5IvbDXcIatt6pnJghc736nqNgsGao5NT+5+WVLAQiTt6Cb3YUms0jiPaXhL//g==} - engines: {node: '>=10.0.0'} - peerDependencies: - postcss: ^8.1.0 + /postcss-custom-media/7.0.8: + resolution: {integrity: sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==} + engines: {node: '>=6.0.0'} dependencies: - postcss: 8.4.12 + postcss: 7.0.39 dev: true - /postcss-custom-properties/12.1.7_postcss@8.4.12: - resolution: {integrity: sha512-N/hYP5gSoFhaqxi2DPCmvto/ZcRDVjE3T1LiAMzc/bg53hvhcHOLpXOHb526LzBBp5ZlAUhkuot/bfpmpgStJg==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.4 + /postcss-custom-properties/8.0.11: + resolution: {integrity: sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==} + engines: {node: '>=6.0.0'} dependencies: - postcss: 8.4.12 - postcss-value-parser: 4.2.0 + postcss: 7.0.39 + postcss-values-parser: 2.0.1 dev: true - /postcss-custom-selectors/6.0.0_postcss@8.4.12: - resolution: {integrity: sha512-/1iyBhz/W8jUepjGyu7V1OPcGbc636snN1yXEQCinb6Bwt7KxsiU7/bLQlp8GwAXzCh7cobBU5odNn/2zQWR8Q==} - engines: {node: '>=10.0.0'} - peerDependencies: - postcss: ^8.1.2 + /postcss-custom-selectors/5.1.2: + resolution: {integrity: sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w==} + engines: {node: '>=6.0.0'} dependencies: - postcss: 8.4.12 - postcss-selector-parser: 6.0.10 + postcss: 7.0.39 + postcss-selector-parser: 5.0.0 dev: true - /postcss-dir-pseudo-class/6.0.4_postcss@8.4.12: - resolution: {integrity: sha512-I8epwGy5ftdzNWEYok9VjW9whC4xnelAtbajGv4adql4FIF09rnrxnA9Y8xSHN47y7gqFIv10C5+ImsLeJpKBw==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.4 + /postcss-dir-pseudo-class/5.0.0: + resolution: {integrity: sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw==} + engines: {node: '>=4.0.0'} dependencies: - postcss: 8.4.12 - postcss-selector-parser: 6.0.10 + postcss: 7.0.39 + postcss-selector-parser: 5.0.0 dev: true - /postcss-discard-comments/5.1.1_postcss@8.4.12: - resolution: {integrity: sha512-5JscyFmvkUxz/5/+TB3QTTT9Gi9jHkcn8dcmmuN68JQcv3aQg4y88yEHHhwFB52l/NkaJ43O0dbksGMAo49nfQ==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + /postcss-discard-comments/4.0.2: + resolution: {integrity: sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==} + engines: {node: '>=6.9.0'} dependencies: - postcss: 8.4.12 + postcss: 7.0.39 dev: true - /postcss-discard-duplicates/5.1.0_postcss@8.4.12: - resolution: {integrity: sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + /postcss-discard-duplicates/4.0.2: + resolution: {integrity: sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==} + engines: {node: '>=6.9.0'} dependencies: - postcss: 8.4.12 + postcss: 7.0.39 dev: true - /postcss-discard-empty/5.1.1_postcss@8.4.12: - resolution: {integrity: sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + /postcss-discard-empty/4.0.1: + resolution: {integrity: sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==} + engines: {node: '>=6.9.0'} dependencies: - postcss: 8.4.12 + postcss: 7.0.39 dev: true - /postcss-discard-overridden/5.1.0_postcss@8.4.12: - resolution: {integrity: sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + /postcss-discard-overridden/4.0.1: + resolution: {integrity: sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==} + engines: {node: '>=6.9.0'} dependencies: - postcss: 8.4.12 + postcss: 7.0.39 dev: true - /postcss-double-position-gradients/3.1.1_postcss@8.4.12: - resolution: {integrity: sha512-jM+CGkTs4FcG53sMPjrrGE0rIvLDdCrqMzgDC5fLI7JHDO7o6QG8C5TQBtExb13hdBdoH9C2QVbG4jo2y9lErQ==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.4 + /postcss-double-position-gradients/1.0.0: + resolution: {integrity: sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==} + engines: {node: '>=6.0.0'} dependencies: - '@csstools/postcss-progressive-custom-properties': 1.3.0_postcss@8.4.12 - postcss: 8.4.12 - postcss-value-parser: 4.2.0 + postcss: 7.0.39 + postcss-values-parser: 2.0.1 dev: true - /postcss-env-function/4.0.6_postcss@8.4.12: - resolution: {integrity: sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.4 + /postcss-env-function/2.0.2: + resolution: {integrity: sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==} + engines: {node: '>=6.0.0'} dependencies: - postcss: 8.4.12 - postcss-value-parser: 4.2.0 + postcss: 7.0.39 + postcss-values-parser: 2.0.1 dev: true /postcss-flexbugs-fixes/4.2.1: @@ -11123,70 +11177,54 @@ packages: postcss: 7.0.39 dev: true - /postcss-focus-visible/6.0.4_postcss@8.4.12: - resolution: {integrity: sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.4 + /postcss-focus-visible/4.0.0: + resolution: {integrity: sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==} + engines: {node: '>=6.0.0'} dependencies: - postcss: 8.4.12 - postcss-selector-parser: 6.0.10 + postcss: 7.0.39 dev: true - /postcss-focus-within/5.0.4_postcss@8.4.12: - resolution: {integrity: sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.4 + /postcss-focus-within/3.0.0: + resolution: {integrity: sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==} + engines: {node: '>=6.0.0'} dependencies: - postcss: 8.4.12 - postcss-selector-parser: 6.0.10 + postcss: 7.0.39 dev: true - /postcss-font-variant/5.0.0_postcss@8.4.12: - resolution: {integrity: sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==} - peerDependencies: - postcss: ^8.1.0 + /postcss-font-variant/4.0.1: + resolution: {integrity: sha512-I3ADQSTNtLTTd8uxZhtSOrTCQ9G4qUVKPjHiDk0bV75QSxXjVWiJVJ2VLdspGUi9fbW9BcjKJoRvxAH1pckqmA==} dependencies: - postcss: 8.4.12 + postcss: 7.0.39 dev: true - /postcss-gap-properties/3.0.3_postcss@8.4.12: - resolution: {integrity: sha512-rPPZRLPmEKgLk/KlXMqRaNkYTUpE7YC+bOIQFN5xcu1Vp11Y4faIXv6/Jpft6FMnl6YRxZqDZG0qQOW80stzxQ==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.4 + /postcss-gap-properties/2.0.0: + resolution: {integrity: sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==} + engines: {node: '>=6.0.0'} dependencies: - postcss: 8.4.12 + postcss: 7.0.39 dev: true - /postcss-image-set-function/4.0.6_postcss@8.4.12: - resolution: {integrity: sha512-KfdC6vg53GC+vPd2+HYzsZ6obmPqOk6HY09kttU19+Gj1nC3S3XBVEXDHxkhxTohgZqzbUb94bKXvKDnYWBm/A==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.4 + /postcss-image-set-function/3.0.1: + resolution: {integrity: sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==} + engines: {node: '>=6.0.0'} dependencies: - postcss: 8.4.12 - postcss-value-parser: 4.2.0 + postcss: 7.0.39 + postcss-values-parser: 2.0.1 dev: true - /postcss-initial/4.0.1_postcss@8.4.12: - resolution: {integrity: sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==} - peerDependencies: - postcss: ^8.0.0 + /postcss-initial/3.0.4: + resolution: {integrity: sha512-3RLn6DIpMsK1l5UUy9jxQvoDeUN4gP939tDcKUHD/kM8SGSKbFAnvkpFpj3Bhtz3HGk1jWY5ZNWX6mPta5M9fg==} dependencies: - postcss: 8.4.12 + postcss: 7.0.39 dev: true - /postcss-lab-function/4.2.0_postcss@8.4.12: - resolution: {integrity: sha512-Zb1EO9DGYfa3CP8LhINHCcTTCTLI+R3t7AX2mKsDzdgVQ/GkCpHOTgOr6HBHslP7XDdVbqgHW5vvRPMdVANQ8w==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.4 + /postcss-lab-function/2.0.1: + resolution: {integrity: sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==} + engines: {node: '>=6.0.0'} dependencies: - '@csstools/postcss-progressive-custom-properties': 1.3.0_postcss@8.4.12 - postcss: 8.4.12 - postcss-value-parser: 4.2.0 + '@csstools/convert-colors': 1.4.0 + postcss: 7.0.39 + postcss-values-parser: 2.0.1 dev: true /postcss-loader/4.3.0_postcss@7.0.39+webpack@4.46.0: @@ -11205,90 +11243,80 @@ packages: webpack: 4.46.0 dev: true - /postcss-logical/5.0.4_postcss@8.4.12: - resolution: {integrity: sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.4 + /postcss-logical/3.0.0: + resolution: {integrity: sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==} + engines: {node: '>=6.0.0'} dependencies: - postcss: 8.4.12 + postcss: 7.0.39 dev: true - /postcss-media-minmax/5.0.0_postcss@8.4.12: - resolution: {integrity: sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==} - engines: {node: '>=10.0.0'} - peerDependencies: - postcss: ^8.1.0 + /postcss-media-minmax/4.0.0: + resolution: {integrity: sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==} + engines: {node: '>=6.0.0'} dependencies: - postcss: 8.4.12 + postcss: 7.0.39 dev: true - /postcss-merge-longhand/5.1.4_postcss@8.4.12: - resolution: {integrity: sha512-hbqRRqYfmXoGpzYKeW0/NCZhvNyQIlQeWVSao5iKWdyx7skLvCfQFGIUsP9NUs3dSbPac2IC4Go85/zG+7MlmA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + /postcss-merge-longhand/4.0.11: + resolution: {integrity: sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==} + engines: {node: '>=6.9.0'} dependencies: - postcss: 8.4.12 - postcss-value-parser: 4.2.0 - stylehacks: 5.1.0_postcss@8.4.12 + css-color-names: 0.0.4 + postcss: 7.0.39 + postcss-value-parser: 3.3.1 + stylehacks: 4.0.3 dev: true - /postcss-merge-rules/5.1.1_postcss@8.4.12: - resolution: {integrity: sha512-8wv8q2cXjEuCcgpIB1Xx1pIy8/rhMPIQqYKNzEdyx37m6gpq83mQQdCxgIkFgliyEnKvdwJf/C61vN4tQDq4Ww==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + /postcss-merge-rules/4.0.3: + resolution: {integrity: sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==} + engines: {node: '>=6.9.0'} dependencies: browserslist: 4.20.2 caniuse-api: 3.0.0 - cssnano-utils: 3.1.0_postcss@8.4.12 - postcss: 8.4.12 - postcss-selector-parser: 6.0.10 + cssnano-util-same-parent: 4.0.1 + postcss: 7.0.39 + postcss-selector-parser: 3.1.2 + vendors: 1.0.4 dev: true - /postcss-minify-font-values/5.1.0_postcss@8.4.12: - resolution: {integrity: sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + /postcss-minify-font-values/4.0.2: + resolution: {integrity: sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==} + engines: {node: '>=6.9.0'} dependencies: - postcss: 8.4.12 - postcss-value-parser: 4.2.0 + postcss: 7.0.39 + postcss-value-parser: 3.3.1 dev: true - /postcss-minify-gradients/5.1.1_postcss@8.4.12: - resolution: {integrity: sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + /postcss-minify-gradients/4.0.2: + resolution: {integrity: sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==} + engines: {node: '>=6.9.0'} dependencies: - colord: 2.9.2 - cssnano-utils: 3.1.0_postcss@8.4.12 - postcss: 8.4.12 - postcss-value-parser: 4.2.0 + cssnano-util-get-arguments: 4.0.0 + is-color-stop: 1.1.0 + postcss: 7.0.39 + postcss-value-parser: 3.3.1 dev: true - /postcss-minify-params/5.1.2_postcss@8.4.12: - resolution: {integrity: sha512-aEP+p71S/urY48HWaRHasyx4WHQJyOYaKpQ6eXl8k0kxg66Wt/30VR6/woh8THgcpRbonJD5IeD+CzNhPi1L8g==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + /postcss-minify-params/4.0.2: + resolution: {integrity: sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==} + engines: {node: '>=6.9.0'} dependencies: + alphanum-sort: 1.0.2 browserslist: 4.20.2 - cssnano-utils: 3.1.0_postcss@8.4.12 - postcss: 8.4.12 - postcss-value-parser: 4.2.0 + cssnano-util-get-arguments: 4.0.0 + postcss: 7.0.39 + postcss-value-parser: 3.3.1 + uniqs: 2.0.0 dev: true - /postcss-minify-selectors/5.2.0_postcss@8.4.12: - resolution: {integrity: sha512-vYxvHkW+iULstA+ctVNx0VoRAR4THQQRkG77o0oa4/mBS0OzGvvzLIvHDv/nNEM0crzN2WIyFU5X7wZhaUK3RA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + /postcss-minify-selectors/4.0.2: + resolution: {integrity: sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==} + engines: {node: '>=6.9.0'} dependencies: - postcss: 8.4.12 - postcss-selector-parser: 6.0.10 + alphanum-sort: 1.0.2 + has: 1.0.3 + postcss: 7.0.39 + postcss-selector-parser: 3.1.2 dev: true /postcss-modules-extract-imports/2.0.0: @@ -11323,248 +11351,231 @@ packages: postcss: 7.0.39 dev: true - /postcss-nesting/10.1.4_postcss@8.4.12: - resolution: {integrity: sha512-2ixdQ59ik/Gt1+oPHiI1kHdwEI8lLKEmui9B1nl6163ANLC+GewQn7fXMxJF2JSb4i2MKL96GU8fIiQztK4TTA==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.4 + /postcss-nesting/7.0.1: + resolution: {integrity: sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==} + engines: {node: '>=6.0.0'} dependencies: - postcss: 8.4.12 - postcss-selector-parser: 6.0.10 + postcss: 7.0.39 dev: true - /postcss-normalize-charset/5.1.0_postcss@8.4.12: - resolution: {integrity: sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + /postcss-normalize-charset/4.0.1: + resolution: {integrity: sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==} + engines: {node: '>=6.9.0'} dependencies: - postcss: 8.4.12 + postcss: 7.0.39 dev: true - /postcss-normalize-display-values/5.1.0_postcss@8.4.12: - resolution: {integrity: sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + /postcss-normalize-display-values/4.0.2: + resolution: {integrity: sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==} + engines: {node: '>=6.9.0'} dependencies: - postcss: 8.4.12 - postcss-value-parser: 4.2.0 + cssnano-util-get-match: 4.0.0 + postcss: 7.0.39 + postcss-value-parser: 3.3.1 dev: true - /postcss-normalize-positions/5.1.0_postcss@8.4.12: - resolution: {integrity: sha512-8gmItgA4H5xiUxgN/3TVvXRoJxkAWLW6f/KKhdsH03atg0cB8ilXnrB5PpSshwVu/dD2ZsRFQcR1OEmSBDAgcQ==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + /postcss-normalize-positions/4.0.2: + resolution: {integrity: sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==} + engines: {node: '>=6.9.0'} dependencies: - postcss: 8.4.12 - postcss-value-parser: 4.2.0 + cssnano-util-get-arguments: 4.0.0 + has: 1.0.3 + postcss: 7.0.39 + postcss-value-parser: 3.3.1 dev: true - /postcss-normalize-repeat-style/5.1.0_postcss@8.4.12: - resolution: {integrity: sha512-IR3uBjc+7mcWGL6CtniKNQ4Rr5fTxwkaDHwMBDGGs1x9IVRkYIT/M4NelZWkAOBdV6v3Z9S46zqaKGlyzHSchw==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + /postcss-normalize-repeat-style/4.0.2: + resolution: {integrity: sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==} + engines: {node: '>=6.9.0'} dependencies: - postcss: 8.4.12 - postcss-value-parser: 4.2.0 + cssnano-util-get-arguments: 4.0.0 + cssnano-util-get-match: 4.0.0 + postcss: 7.0.39 + postcss-value-parser: 3.3.1 dev: true - /postcss-normalize-string/5.1.0_postcss@8.4.12: - resolution: {integrity: sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + /postcss-normalize-string/4.0.2: + resolution: {integrity: sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==} + engines: {node: '>=6.9.0'} dependencies: - postcss: 8.4.12 - postcss-value-parser: 4.2.0 + has: 1.0.3 + postcss: 7.0.39 + postcss-value-parser: 3.3.1 dev: true - /postcss-normalize-timing-functions/5.1.0_postcss@8.4.12: - resolution: {integrity: sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + /postcss-normalize-timing-functions/4.0.2: + resolution: {integrity: sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==} + engines: {node: '>=6.9.0'} dependencies: - postcss: 8.4.12 - postcss-value-parser: 4.2.0 + cssnano-util-get-match: 4.0.0 + postcss: 7.0.39 + postcss-value-parser: 3.3.1 dev: true - /postcss-normalize-unicode/5.1.0_postcss@8.4.12: - resolution: {integrity: sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + /postcss-normalize-unicode/4.0.1: + resolution: {integrity: sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==} + engines: {node: '>=6.9.0'} dependencies: browserslist: 4.20.2 - postcss: 8.4.12 - postcss-value-parser: 4.2.0 + postcss: 7.0.39 + postcss-value-parser: 3.3.1 dev: true - /postcss-normalize-url/5.1.0_postcss@8.4.12: - resolution: {integrity: sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + /postcss-normalize-url/4.0.1: + resolution: {integrity: sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==} + engines: {node: '>=6.9.0'} dependencies: - normalize-url: 6.1.0 - postcss: 8.4.12 - postcss-value-parser: 4.2.0 + is-absolute-url: 2.1.0 + normalize-url: 3.3.0 + postcss: 7.0.39 + postcss-value-parser: 3.3.1 dev: true - /postcss-normalize-whitespace/5.1.1_postcss@8.4.12: - resolution: {integrity: sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + /postcss-normalize-whitespace/4.0.2: + resolution: {integrity: sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==} + engines: {node: '>=6.9.0'} dependencies: - postcss: 8.4.12 - postcss-value-parser: 4.2.0 + postcss: 7.0.39 + postcss-value-parser: 3.3.1 dev: true - /postcss-opacity-percentage/1.1.2: - resolution: {integrity: sha512-lyUfF7miG+yewZ8EAk9XUBIlrHyUE6fijnesuz+Mj5zrIHIEw6KcIZSOk/elVMqzLvREmXB83Zi/5QpNRYd47w==} - engines: {node: ^12 || ^14 || >=16} + /postcss-ordered-values/4.1.2: + resolution: {integrity: sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==} + engines: {node: '>=6.9.0'} + dependencies: + cssnano-util-get-arguments: 4.0.0 + postcss: 7.0.39 + postcss-value-parser: 3.3.1 dev: true - /postcss-ordered-values/5.1.1_postcss@8.4.12: - resolution: {integrity: sha512-7lxgXF0NaoMIgyihL/2boNAEZKiW0+HkMhdKMTD93CjW8TdCy2hSdj8lsAo+uwm7EDG16Da2Jdmtqpedl0cMfw==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + /postcss-overflow-shorthand/2.0.0: + resolution: {integrity: sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==} + engines: {node: '>=6.0.0'} dependencies: - cssnano-utils: 3.1.0_postcss@8.4.12 - postcss: 8.4.12 - postcss-value-parser: 4.2.0 + postcss: 7.0.39 dev: true - /postcss-overflow-shorthand/3.0.3_postcss@8.4.12: - resolution: {integrity: sha512-CxZwoWup9KXzQeeIxtgOciQ00tDtnylYIlJBBODqkgS/PU2jISuWOL/mYLHmZb9ZhZiCaNKsCRiLp22dZUtNsg==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.4 + /postcss-page-break/2.0.0: + resolution: {integrity: sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==} dependencies: - postcss: 8.4.12 + postcss: 7.0.39 dev: true - /postcss-page-break/3.0.4_postcss@8.4.12: - resolution: {integrity: sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==} - peerDependencies: - postcss: ^8 + /postcss-place/4.0.1: + resolution: {integrity: sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==} + engines: {node: '>=6.0.0'} dependencies: - postcss: 8.4.12 + postcss: 7.0.39 + postcss-values-parser: 2.0.1 dev: true - /postcss-place/7.0.4_postcss@8.4.12: - resolution: {integrity: sha512-MrgKeiiu5OC/TETQO45kV3npRjOFxEHthsqGtkh3I1rPbZSbXGD/lZVi9j13cYh+NA8PIAPyk6sGjT9QbRyvSg==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.4 + /postcss-preset-env/6.7.1: + resolution: {integrity: sha512-rlRkgX9t0v2On33n7TK8pnkcYOATGQSv48J2RS8GsXhqtg+xk6AummHP88Y5mJo0TLJelBjePvSjScTNkj3+qw==} + engines: {node: '>=6.0.0'} dependencies: - postcss: 8.4.12 - postcss-value-parser: 4.2.0 + autoprefixer: 9.8.8 + browserslist: 4.20.2 + caniuse-lite: 1.0.30001332 + css-blank-pseudo: 0.1.4 + css-has-pseudo: 0.10.0 + css-prefers-color-scheme: 3.1.1 + cssdb: 4.4.0 + postcss: 7.0.39 + postcss-attribute-case-insensitive: 4.0.2 + postcss-color-functional-notation: 2.0.1 + postcss-color-gray: 5.0.0 + postcss-color-hex-alpha: 5.0.3 + postcss-color-mod-function: 3.0.3 + postcss-color-rebeccapurple: 4.0.1 + postcss-custom-media: 7.0.8 + postcss-custom-properties: 8.0.11 + postcss-custom-selectors: 5.1.2 + postcss-dir-pseudo-class: 5.0.0 + postcss-double-position-gradients: 1.0.0 + postcss-env-function: 2.0.2 + postcss-focus-visible: 4.0.0 + postcss-focus-within: 3.0.0 + postcss-font-variant: 4.0.1 + postcss-gap-properties: 2.0.0 + postcss-image-set-function: 3.0.1 + postcss-initial: 3.0.4 + postcss-lab-function: 2.0.1 + postcss-logical: 3.0.0 + postcss-media-minmax: 4.0.0 + postcss-nesting: 7.0.1 + postcss-overflow-shorthand: 2.0.0 + postcss-page-break: 2.0.0 + postcss-place: 4.0.1 + postcss-pseudo-class-any-link: 6.0.0 + postcss-replace-overflow-wrap: 3.0.0 + postcss-selector-matches: 4.0.0 + postcss-selector-not: 4.0.1 + dev: true + + /postcss-pseudo-class-any-link/6.0.0: + resolution: {integrity: sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==} + engines: {node: '>=6.0.0'} + dependencies: + postcss: 7.0.39 + postcss-selector-parser: 5.0.0 dev: true - /postcss-preset-env/7.4.3_postcss@8.4.12: - resolution: {integrity: sha512-dlPA65g9KuGv7YsmGyCKtFkZKCPLkoVMUE3omOl6yM+qrynVHxFvf0tMuippIrXB/sB/MyhL1FgTIbrO+qMERg==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.4 + /postcss-reduce-initial/4.0.3: + resolution: {integrity: sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==} + engines: {node: '>=6.9.0'} dependencies: - '@csstools/postcss-color-function': 1.1.0_postcss@8.4.12 - '@csstools/postcss-font-format-keywords': 1.0.0_postcss@8.4.12 - '@csstools/postcss-hwb-function': 1.0.0_postcss@8.4.12 - '@csstools/postcss-ic-unit': 1.0.0_postcss@8.4.12 - '@csstools/postcss-is-pseudo-class': 2.0.2_postcss@8.4.12 - '@csstools/postcss-normalize-display-values': 1.0.0_postcss@8.4.12 - '@csstools/postcss-oklab-function': 1.1.0_postcss@8.4.12 - '@csstools/postcss-progressive-custom-properties': 1.3.0_postcss@8.4.12 - autoprefixer: 10.4.5_postcss@8.4.12 browserslist: 4.20.2 - css-blank-pseudo: 3.0.3_postcss@8.4.12 - css-has-pseudo: 3.0.4_postcss@8.4.12 - css-prefers-color-scheme: 6.0.3_postcss@8.4.12 - cssdb: 6.5.0 - postcss: 8.4.12 - postcss-attribute-case-insensitive: 5.0.0_postcss@8.4.12 - postcss-clamp: 4.1.0_postcss@8.4.12 - postcss-color-functional-notation: 4.2.2_postcss@8.4.12 - postcss-color-hex-alpha: 8.0.3_postcss@8.4.12 - postcss-color-rebeccapurple: 7.0.2_postcss@8.4.12 - postcss-custom-media: 8.0.0_postcss@8.4.12 - postcss-custom-properties: 12.1.7_postcss@8.4.12 - postcss-custom-selectors: 6.0.0_postcss@8.4.12 - postcss-dir-pseudo-class: 6.0.4_postcss@8.4.12 - postcss-double-position-gradients: 3.1.1_postcss@8.4.12 - postcss-env-function: 4.0.6_postcss@8.4.12 - postcss-focus-visible: 6.0.4_postcss@8.4.12 - postcss-focus-within: 5.0.4_postcss@8.4.12 - postcss-font-variant: 5.0.0_postcss@8.4.12 - postcss-gap-properties: 3.0.3_postcss@8.4.12 - postcss-image-set-function: 4.0.6_postcss@8.4.12 - postcss-initial: 4.0.1_postcss@8.4.12 - postcss-lab-function: 4.2.0_postcss@8.4.12 - postcss-logical: 5.0.4_postcss@8.4.12 - postcss-media-minmax: 5.0.0_postcss@8.4.12 - postcss-nesting: 10.1.4_postcss@8.4.12 - postcss-opacity-percentage: 1.1.2 - postcss-overflow-shorthand: 3.0.3_postcss@8.4.12 - postcss-page-break: 3.0.4_postcss@8.4.12 - postcss-place: 7.0.4_postcss@8.4.12 - postcss-pseudo-class-any-link: 7.1.2_postcss@8.4.12 - postcss-replace-overflow-wrap: 4.0.0_postcss@8.4.12 - postcss-selector-not: 5.0.0_postcss@8.4.12 - postcss-value-parser: 4.2.0 + caniuse-api: 3.0.0 + has: 1.0.3 + postcss: 7.0.39 dev: true - /postcss-pseudo-class-any-link/7.1.2_postcss@8.4.12: - resolution: {integrity: sha512-76XzEQv3g+Vgnz3tmqh3pqQyRojkcJ+pjaePsyhcyf164p9aZsu3t+NWxkZYbcHLK1ju5Qmalti2jPI5IWCe5w==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.4 + /postcss-reduce-transforms/4.0.2: + resolution: {integrity: sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==} + engines: {node: '>=6.9.0'} dependencies: - postcss: 8.4.12 - postcss-selector-parser: 6.0.10 + cssnano-util-get-match: 4.0.0 + has: 1.0.3 + postcss: 7.0.39 + postcss-value-parser: 3.3.1 dev: true - /postcss-reduce-initial/5.1.0_postcss@8.4.12: - resolution: {integrity: sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + /postcss-replace-overflow-wrap/3.0.0: + resolution: {integrity: sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==} dependencies: - browserslist: 4.20.2 - caniuse-api: 3.0.0 - postcss: 8.4.12 + postcss: 7.0.39 dev: true - /postcss-reduce-transforms/5.1.0_postcss@8.4.12: - resolution: {integrity: sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + /postcss-selector-matches/4.0.0: + resolution: {integrity: sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==} dependencies: - postcss: 8.4.12 - postcss-value-parser: 4.2.0 + balanced-match: 1.0.2 + postcss: 7.0.39 dev: true - /postcss-replace-overflow-wrap/4.0.0_postcss@8.4.12: - resolution: {integrity: sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==} - peerDependencies: - postcss: ^8.0.3 + /postcss-selector-not/4.0.1: + resolution: {integrity: sha512-YolvBgInEK5/79C+bdFMyzqTg6pkYqDbzZIST/PDMqa/o3qtXenD05apBG2jLgT0/BQ77d4U2UK12jWpilqMAQ==} dependencies: - postcss: 8.4.12 + balanced-match: 1.0.2 + postcss: 7.0.39 dev: true - /postcss-selector-not/5.0.0_postcss@8.4.12: - resolution: {integrity: sha512-/2K3A4TCP9orP4TNS7u3tGdRFVKqz/E6pX3aGnriPG0jU78of8wsUcqE4QAhWEU0d+WnMSF93Ah3F//vUtK+iQ==} - peerDependencies: - postcss: ^8.1.0 + /postcss-selector-parser/3.1.2: + resolution: {integrity: sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==} + engines: {node: '>=8'} dependencies: - balanced-match: 1.0.2 - postcss: 8.4.12 + dot-prop: 5.3.0 + indexes-of: 1.0.1 + uniq: 1.0.1 + dev: true + + /postcss-selector-parser/5.0.0: + resolution: {integrity: sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==} + engines: {node: '>=4'} + dependencies: + cssesc: 2.0.0 + indexes-of: 1.0.1 + uniq: 1.0.1 dev: true /postcss-selector-parser/6.0.10: @@ -11575,31 +11586,41 @@ packages: util-deprecate: 1.0.2 dev: true - /postcss-svgo/5.1.0_postcss@8.4.12: - resolution: {integrity: sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + /postcss-svgo/4.0.3: + resolution: {integrity: sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==} + engines: {node: '>=6.9.0'} dependencies: - postcss: 8.4.12 - postcss-value-parser: 4.2.0 - svgo: 2.8.0 + postcss: 7.0.39 + postcss-value-parser: 3.3.1 + svgo: 1.3.2 dev: true - /postcss-unique-selectors/5.1.1_postcss@8.4.12: - resolution: {integrity: sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + /postcss-unique-selectors/4.0.1: + resolution: {integrity: sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==} + engines: {node: '>=6.9.0'} dependencies: - postcss: 8.4.12 - postcss-selector-parser: 6.0.10 + alphanum-sort: 1.0.2 + postcss: 7.0.39 + uniqs: 2.0.0 + dev: true + + /postcss-value-parser/3.3.1: + resolution: {integrity: sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==} dev: true /postcss-value-parser/4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} dev: true + /postcss-values-parser/2.0.1: + resolution: {integrity: sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==} + engines: {node: '>=6.14.4'} + dependencies: + flatten: 1.0.3 + indexes-of: 1.0.1 + uniq: 1.0.1 + dev: true + /postcss/7.0.39: resolution: {integrity: sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==} engines: {node: '>=6.0.0'} @@ -11608,15 +11629,6 @@ packages: source-map: 0.6.1 dev: true - /postcss/8.4.12: - resolution: {integrity: sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg==} - engines: {node: ^10 || ^12 || >=14} - dependencies: - nanoid: 3.3.2 - picocolors: 1.0.0 - source-map-js: 1.0.2 - dev: true - /prelude-ls/1.1.2: resolution: {integrity: sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=} engines: {node: '>= 0.8.0'} @@ -12418,6 +12430,11 @@ packages: global-modules: 1.0.0 dev: true + /resolve-from/3.0.0: + resolution: {integrity: sha1-six699nWiBvItuZTM17rywoYh0g=} + engines: {node: '>=4'} + dev: true + /resolve-from/4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -12480,6 +12497,14 @@ packages: engines: {iojs: '>=1.0.0', node: '>=0.10.0'} dev: true + /rgb-regex/1.0.1: + resolution: {integrity: sha1-wODWiC3w4jviVKR16O3UGRX+rrE=} + dev: true + + /rgba-regex/1.0.0: + resolution: {integrity: sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=} + dev: true + /rimraf/2.7.1: resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} hasBin: true @@ -12628,6 +12653,10 @@ packages: source-map-js: 1.0.2 dev: true + /sax/1.2.4: + resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} + dev: true + /saxes/5.0.1: resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==} engines: {node: '>=10'} @@ -12844,6 +12873,12 @@ packages: requiresBuild: true dev: true + /simple-swizzle/0.2.2: + resolution: {integrity: sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=} + dependencies: + is-arrayish: 0.3.2 + dev: true + /sisteransi/1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} dev: true @@ -13225,15 +13260,13 @@ packages: inline-style-parser: 0.1.1 dev: true - /stylehacks/5.1.0_postcss@8.4.12: - resolution: {integrity: sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 + /stylehacks/4.0.3: + resolution: {integrity: sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==} + engines: {node: '>=6.9.0'} dependencies: browserslist: 4.20.2 - postcss: 8.4.12 - postcss-selector-parser: 6.0.10 + postcss: 7.0.39 + postcss-selector-parser: 3.1.2 dev: true /supports-color/2.0.0: @@ -13275,18 +13308,25 @@ packages: engines: {node: '>= 0.4'} dev: true - /svgo/2.8.0: - resolution: {integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==} - engines: {node: '>=10.13.0'} + /svgo/1.3.2: + resolution: {integrity: sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==} + engines: {node: '>=4.0.0'} + deprecated: This SVGO version is no longer supported. Upgrade to v2.x.x. hasBin: true dependencies: - '@trysound/sax': 0.2.0 - commander: 7.2.0 - css-select: 4.3.0 - css-tree: 1.1.3 + chalk: 2.4.2 + coa: 2.0.2 + css-select: 2.1.0 + css-select-base-adapter: 0.1.1 + css-tree: 1.0.0-alpha.37 csso: 4.2.0 - picocolors: 1.0.0 + js-yaml: 3.14.1 + mkdirp: 0.5.6 + object.values: 1.1.5 + sax: 1.2.4 stable: 0.1.8 + unquote: 1.1.1 + util.promisify: 1.0.0 dev: true /symbol-tree/3.2.4: @@ -13453,6 +13493,10 @@ packages: setimmediate: 1.0.5 dev: true + /timsort/0.3.0: + resolution: {integrity: sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=} + dev: true + /tmp/0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} @@ -13765,6 +13809,14 @@ packages: set-value: 2.0.1 dev: true + /uniq/1.0.1: + resolution: {integrity: sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=} + dev: true + + /uniqs/2.0.0: + resolution: {integrity: sha1-/+3ks2slKQaW5uFl1KWe25mOawI=} + dev: true + /unique-filename/1.1.1: resolution: {integrity: sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==} dependencies: @@ -13841,6 +13893,10 @@ packages: engines: {node: '>= 0.8'} dev: true + /unquote/1.1.1: + resolution: {integrity: sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=} + dev: true + /unset-value/1.0.0: resolution: {integrity: sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=} engines: {node: '>=0.10.0'} @@ -14027,6 +14083,10 @@ packages: engines: {node: '>= 0.8'} dev: true + /vendors/1.0.4: + resolution: {integrity: sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==} + dev: true + /vfile-location/3.2.0: resolution: {integrity: sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==} dev: true diff --git a/src/charts/bar.stories.js b/src/charts/bar.stories.js index 2916e1f6..5fb921aa 100644 --- a/src/charts/bar.stories.js +++ b/src/charts/bar.stories.js @@ -1,5 +1,5 @@ -import '../styles/chartist.scss'; -import { BarChart, AutoScaleAxis, Svg, getMultiValue } from '..'; +import 'chartist-dev/styles'; +import { BarChart, AutoScaleAxis, Svg, getMultiValue } from 'chartist-dev'; export default { title: 'BarChart', diff --git a/src/charts/line.stories.js b/src/charts/line.stories.js index 5fa1355a..4b4c06fa 100644 --- a/src/charts/line.stories.js +++ b/src/charts/line.stories.js @@ -1,6 +1,6 @@ +import 'chartist-dev/styles'; import faker from 'faker' -import '../styles/chartist.scss'; -import { LineChart, AutoScaleAxis, Interpolation, Svg, easings } from '..'; +import { LineChart, AutoScaleAxis, Interpolation, Svg, easings } from 'chartist-dev'; export default { title: 'LineChart', diff --git a/src/charts/pie.stories.js b/src/charts/pie.stories.js index 63c85d9a..f86fff5a 100644 --- a/src/charts/pie.stories.js +++ b/src/charts/pie.stories.js @@ -1,5 +1,5 @@ -import '../styles/chartist.scss'; -import { PieChart } from '..'; +import 'chartist-dev/styles'; +import { PieChart } from 'chartist-dev'; export default { title: 'PieChart', diff --git a/test/compat.js b/test/compat.js new file mode 100644 index 00000000..13a43b00 --- /dev/null +++ b/test/compat.js @@ -0,0 +1,15 @@ +import Chartist from 'chartist' + +export const { + Bar: BarChart, + Line: LineChart, + Pie: PieChart, + AutoScaleAxis, + Svg, + Interpolation, + getMultiValue +} = Chartist + +export const { + Easing: easings +} = Svg From feff8ad38528d184f891d00f6c71ad631cc60fd3 Mon Sep 17 00:00:00 2001 From: Dan Onoshko Date: Fri, 13 May 2022 16:24:44 +0700 Subject: [PATCH 17/44] test: storyshots (#10) --- .gitignore | 1 + .storybook/main.js | 2 +- jest.config.json | 4 + package.json | 6 + pnpm-lock.yaml | 643 +++++++++++++++++- src/charts/bar.spec.js | 2 +- src/charts/line.spec.js | 2 +- src/charts/line.stories.js | 2 +- src/charts/pie.spec.js | 2 +- src/core/creation.spec.js | 2 +- test/{ => mock}/compat.js | 0 test/mock/cssModule.js | 10 + test/{mock.js => mock/dom.js} | 0 test/storyshots.spec.js | 21 + test/utils/skipable.js | 9 + .../imageSnapshotWithStoryParameters.js | 115 ++++ test/utils/storyshots/index.js | 3 + test/utils/storyshots/initStoryshots.js | 89 +++ test/utils/storyshots/storybook.js | 82 +++ test/utils/storyshots/viewport.js | 7 + 20 files changed, 989 insertions(+), 13 deletions(-) rename test/{ => mock}/compat.js (100%) create mode 100644 test/mock/cssModule.js rename test/{mock.js => mock/dom.js} (100%) create mode 100644 test/storyshots.spec.js create mode 100644 test/utils/skipable.js create mode 100644 test/utils/storyshots/imageSnapshotWithStoryParameters.js create mode 100644 test/utils/storyshots/index.js create mode 100644 test/utils/storyshots/initStoryshots.js create mode 100644 test/utils/storyshots/storybook.js create mode 100644 test/utils/storyshots/viewport.js diff --git a/.gitignore b/.gitignore index 2617246b..9b242abb 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ node_modules # builds package dist +storybook-static # misc .DS_Store diff --git a/.storybook/main.js b/.storybook/main.js index 0fb5572b..b49e6104 100644 --- a/.storybook/main.js +++ b/.storybook/main.js @@ -25,7 +25,7 @@ module.exports = { ? 'chartist/dist/chartist.css' : path.resolve(__dirname, '..', 'src', 'styles', 'chartist.scss'); config.resolve.alias['chartist-dev$'] = isCompatMode - ? path.resolve(__dirname, '..', 'test', 'compat.js') + ? path.resolve(__dirname, '..', 'test', 'mock', 'compat.js') : path.resolve(__dirname, '..', 'src'); return config; diff --git a/jest.config.json b/jest.config.json index 400fa54f..56d079d4 100644 --- a/jest.config.json +++ b/jest.config.json @@ -11,6 +11,10 @@ } }] }, + "moduleNameMapper": { + "^chartist-dev$": "/src", + "^chartist-dev/styles$": "/test/mock/cssModule.js" + }, "collectCoverage": true, "collectCoverageFrom": [ "src/**/*.{js,jsx,ts,tsx}", diff --git a/package.json b/package.json index 33dcf888..f8ca6b2f 100644 --- a/package.json +++ b/package.json @@ -69,6 +69,8 @@ "@storybook/addon-actions": "^6.4.22", "@storybook/addon-controls": "^6.4.22", "@storybook/addon-docs": "^6.4.22", + "@storybook/addon-storyshots": "^6.4.22", + "@storybook/addon-storyshots-puppeteer": "^6.4.22", "@storybook/html": "^6.4.22", "@swc/core": "^1.2.165", "@swc/helpers": "^0.3.8", @@ -80,13 +82,17 @@ "chartist": "^0.11.4", "commitizen": "^4.2.4", "cssnano": "^4.1.11", + "del": "^6.0.0", "del-cli": "^4.0.1", "eslint": "^8.12.0", "faker": "^5.5.3", + "http-server": "^14.1.0", "inquirer": "^8.0.0", "jest": "^27.5.1", + "jest-image-snapshot": "^4.5.1", "postcss": "^7.0.39", "postcss-preset-env": "^6.7.1", + "puppeteer": "^14.0.0", "rollup": "^2.70.1", "rollup-plugin-swc": "^0.2.1", "sass": "^1.50.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 421b6223..575be145 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,6 +9,8 @@ specifiers: '@storybook/addon-actions': ^6.4.22 '@storybook/addon-controls': ^6.4.22 '@storybook/addon-docs': ^6.4.22 + '@storybook/addon-storyshots': ^6.4.22 + '@storybook/addon-storyshots-puppeteer': ^6.4.22 '@storybook/html': ^6.4.22 '@swc/core': ^1.2.165 '@swc/helpers': ^0.3.8 @@ -20,13 +22,17 @@ specifiers: chartist: ^0.11.4 commitizen: ^4.2.4 cssnano: ^4.1.11 + del: ^6.0.0 del-cli: ^4.0.1 eslint: ^8.12.0 faker: ^5.5.3 + http-server: ^14.1.0 inquirer: ^8.0.0 jest: ^27.5.1 + jest-image-snapshot: ^4.5.1 postcss: ^7.0.39 postcss-preset-env: ^6.7.1 + puppeteer: ^14.0.0 rollup: ^2.70.1 rollup-plugin-swc: ^0.2.1 sass: ^1.50.1 @@ -42,6 +48,8 @@ devDependencies: '@storybook/addon-actions': 6.4.22 '@storybook/addon-controls': 6.4.22_eslint@8.13.0 '@storybook/addon-docs': 6.4.22_7fd729fae3ed30395c91a6c3899e19ab + '@storybook/addon-storyshots': 6.4.22_eslint@8.13.0+jest@27.5.1 + '@storybook/addon-storyshots-puppeteer': 6.4.22_ee73af2950fdda0cdee7b156fb6cc3b7 '@storybook/html': 6.4.22_@babel+core@7.17.9+eslint@8.13.0 '@swc/core': 1.2.165 '@swc/helpers': 0.3.8 @@ -53,13 +61,17 @@ devDependencies: chartist: 0.11.4 commitizen: 4.2.4_@swc+core@1.2.165 cssnano: 4.1.11 + del: 6.0.0 del-cli: 4.0.1 eslint: 8.13.0 faker: 5.5.3 + http-server: 14.1.0 inquirer: 8.2.2 jest: 27.5.1 + jest-image-snapshot: 4.5.1_jest@27.5.1 postcss: 7.0.39 postcss-preset-env: 6.7.1 + puppeteer: 14.0.0 rollup: 2.70.1 rollup-plugin-swc: 0.2.1_@swc+core@1.2.165+rollup@2.70.1 sass: 1.50.1 @@ -75,6 +87,16 @@ packages: '@jridgewell/trace-mapping': 0.3.4 dev: true + /@axe-core/puppeteer/4.4.2_puppeteer@14.0.0: + resolution: {integrity: sha512-HsiXUALjQ5fcWZZgGUvYGr/b7qvWbQXeDuW2z+2YYOJsavlPV9z0IGdm4rmX0lmsdJ9usA5vq5LNLiz23ZyXmw==} + engines: {node: '>=6.4.0'} + peerDependencies: + puppeteer: '>=1.10.0 <= 13' + dependencies: + axe-core: 4.4.2 + puppeteer: 14.0.0 + dev: true + /@babel/code-frame/7.16.7: resolution: {integrity: sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==} engines: {node: '>=6.9.0'} @@ -2449,6 +2471,117 @@ packages: - webpack-command dev: true + /@storybook/addon-storyshots-puppeteer/6.4.22_ee73af2950fdda0cdee7b156fb6cc3b7: + resolution: {integrity: sha512-vmi0slsy8jo+NZL+KSDSvm71vKPv4EKH4xZvZgCAQ6Pm47KgmQxce1tVchmEtP4cBCmhTx7VHjDEe+QgtBvtDw==} + peerDependencies: + '@storybook/addon-storyshots': 6.4.22 + puppeteer: ^2.0.0 || ^3.0.0 + peerDependenciesMeta: + puppeteer: + optional: true + dependencies: + '@axe-core/puppeteer': 4.4.2_puppeteer@14.0.0 + '@storybook/addon-storyshots': 6.4.22_eslint@8.13.0+jest@27.5.1 + '@storybook/csf': 0.0.2--canary.87bc651.0 + '@storybook/node-logger': 6.4.22 + '@types/jest-image-snapshot': 4.3.1 + core-js: 3.21.1 + jest-image-snapshot: 4.5.1_jest@27.5.1 + puppeteer: 14.0.0 + regenerator-runtime: 0.13.9 + transitivePeerDependencies: + - jest + dev: true + + /@storybook/addon-storyshots/6.4.22_eslint@8.13.0+jest@27.5.1: + resolution: {integrity: sha512-9u+uigHH4khxHB18z1TOau+RKpLo/8tdhvKVqgjy6pr3FSsgp+JyoI+ubDtgWAWFHQ0Zhh5MBWNDmPOo5pwBdA==} + peerDependencies: + '@angular/core': '>=6.0.0' + '@angular/platform-browser-dynamic': '>=6.0.0' + '@storybook/angular': '*' + '@storybook/react': '*' + '@storybook/vue': '*' + '@storybook/vue3': '*' + jest: '*' + jest-preset-angular: '*' + jest-vue-preprocessor: '*' + preact: ^10.5.13 + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + rxjs: '*' + svelte: '*' + vue: '*' + vue-jest: '*' + peerDependenciesMeta: + '@angular/core': + optional: true + '@angular/platform-browser-dynamic': + optional: true + '@storybook/angular': + optional: true + '@storybook/react': + optional: true + '@storybook/vue': + optional: true + '@storybook/vue3': + optional: true + jest-preset-angular: + optional: true + jest-vue-preprocessor: + optional: true + preact: + optional: true + react: + optional: true + react-dom: + optional: true + rxjs: + optional: true + svelte: + optional: true + vue: + optional: true + vue-jest: + optional: true + dependencies: + '@jest/transform': 26.6.2 + '@storybook/addons': 6.4.22 + '@storybook/babel-plugin-require-context-hook': 1.0.1 + '@storybook/client-api': 6.4.22 + '@storybook/core': 6.4.22_eslint@8.13.0 + '@storybook/core-client': 6.4.22 + '@storybook/core-common': 6.4.22_eslint@8.13.0 + '@storybook/csf': 0.0.2--canary.87bc651.0 + '@types/glob': 7.2.0 + '@types/jest': 26.0.24 + '@types/jest-specific-snapshot': 0.5.5 + core-js: 3.21.1 + glob: 7.2.0 + global: 4.4.0 + jest: 27.5.1 + jest-specific-snapshot: 4.0.0_jest@27.5.1 + preact-render-to-string: 5.2.0 + pretty-format: 26.6.2 + react-test-renderer: 17.0.2 + read-pkg-up: 7.0.1 + regenerator-runtime: 0.13.9 + ts-dedent: 2.2.0 + transitivePeerDependencies: + - '@storybook/builder-webpack5' + - '@storybook/manager-webpack5' + - '@types/react' + - bufferutil + - encoding + - eslint + - supports-color + - typescript + - utf-8-validate + - vue-template-compiler + - webpack + - webpack-cli + - webpack-command + dev: true + /@storybook/addons/6.4.22: resolution: {integrity: sha512-P/R+Jsxh7pawKLYo8MtE3QU/ilRFKbtCewV/T1o5U/gm8v7hKQdFz3YdRMAra4QuCY8bQIp7MKd2HrB5aH5a1A==} peerDependencies: @@ -2541,6 +2674,10 @@ packages: util-deprecate: 1.0.2 dev: true + /@storybook/babel-plugin-require-context-hook/1.0.1: + resolution: {integrity: sha512-WM4vjgSVi8epvGiYfru7BtC3f0tGwNs7QK3Uc4xQn4t5hHQvISnCqbNrHdDYmNW56Do+bBztE8SwP6NGUvd7ww==} + dev: true + /@storybook/builder-webpack4/6.4.22_cfdbbe835af0ce3c97f004e72dcbccdb: resolution: {integrity: sha512-A+GgGtKGnBneRFSFkDarUIgUTI8pYFdLmUVKEAGdh2hL+vLXAz9A46sEY7C8LQ85XWa8TKy3OTDxqR4+4iWj3A==} peerDependencies: @@ -3231,7 +3368,7 @@ packages: util-deprecate: 1.0.2 watchpack: 2.3.1 webpack: 4.46.0 - ws: 8.2.3 + ws: 8.6.0 transitivePeerDependencies: - '@types/react' - bufferutil @@ -3301,7 +3438,7 @@ packages: util-deprecate: 1.0.2 watchpack: 2.3.1 webpack: 4.46.0 - ws: 8.2.3 + ws: 8.6.0 transitivePeerDependencies: - '@types/react' - bufferutil @@ -4136,6 +4273,27 @@ packages: '@types/istanbul-lib-report': 3.0.0 dev: true + /@types/jest-image-snapshot/4.3.1: + resolution: {integrity: sha512-WDdUruGF14C53axe/mNDgQP2YIhtcwXrwmmVP8eOGyfNTVD+FbxWjWR7RTU+lzEy4K6V6+z7nkVDm/auI/r3xQ==} + dependencies: + '@types/jest': 27.4.1 + '@types/pixelmatch': 5.2.4 + ssim.js: 3.5.0 + dev: true + + /@types/jest-specific-snapshot/0.5.5: + resolution: {integrity: sha512-AaPPw2tE8ewfjD6qGLkEd4DOfM6pPOK7ob/RSOe1Z8Oo70r9Jgo0SlWyfxslPAOvLfQukQtiVPm6DcnjSoZU5A==} + dependencies: + '@types/jest': 27.4.1 + dev: true + + /@types/jest/26.0.24: + resolution: {integrity: sha512-E/X5Vib8BWqZNRlDxj9vYXhsDwPYbPINqKF9BsnSoon4RQ0D9moEuLD8txgyypFLH7J4+Lho9Nr/c8H0Fi+17w==} + dependencies: + jest-diff: 26.6.2 + pretty-format: 26.6.2 + dev: true + /@types/jest/27.4.1: resolution: {integrity: sha512-23iPJADSmicDVrWk+HT58LMJtzLAnB2AgIzplQuq/bSrGaxCrlvRFjGbXmamnnk/mAmCdLStiGqggu28ocUyiw==} dependencies: @@ -4196,6 +4354,12 @@ packages: resolution: {integrity: sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==} dev: true + /@types/pixelmatch/5.2.4: + resolution: {integrity: sha512-HDaSHIAv9kwpMN7zlmwfTv6gax0PiporJOipcrGsVNF3Ba+kryOZc0Pio5pn6NhisgWr7TaajlPEKTbTAypIBQ==} + dependencies: + '@types/node': 17.0.23 + dev: true + /@types/prettier/2.6.0: resolution: {integrity: sha512-G/AdOadiZhnJp0jXCaBQU449W2h716OW/EoXeYkCytxKL06X1WCXB4DZpp8TpZ8eyIJVS1cw4lrlkkSYU21cDw==} dev: true @@ -4307,6 +4471,14 @@ packages: '@types/yargs-parser': 21.0.0 dev: true + /@types/yauzl/2.10.0: + resolution: {integrity: sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==} + requiresBuild: true + dependencies: + '@types/node': 17.0.23 + dev: true + optional: true + /@webassemblyjs/ast/1.9.0: resolution: {integrity: sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==} dependencies: @@ -4844,6 +5016,12 @@ packages: dev: true optional: true + /async/2.6.4: + resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} + dependencies: + lodash: 4.17.21 + dev: true + /asynckit/0.4.0: resolution: {integrity: sha1-x57Zf380y48robyXkLzDZkdLS3k=} dev: true @@ -4872,6 +5050,11 @@ packages: postcss-value-parser: 4.2.0 dev: true + /axe-core/4.4.2: + resolution: {integrity: sha512-LVAaGp/wkkgYJcjmHsoKx4juT1aQvJyPcW09MLCjVTh3V2cc6PnyempiLMNH5iMdfIX/zdbjUx2KDjMLCTdPeA==} + engines: {node: '>=12'} + dev: true + /babel-code-frame/6.26.0: resolution: {integrity: sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=} dependencies: @@ -5151,6 +5334,13 @@ packages: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} dev: true + /basic-auth/2.0.1: + resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} + engines: {node: '>= 0.8'} + dependencies: + safe-buffer: 5.1.2 + dev: true + /batch-processor/1.0.0: resolution: {integrity: sha1-dclcMrdI4IUNEMKxaPa9vpiRrOg=} dev: true @@ -5349,6 +5539,10 @@ packages: node-int64: 0.4.0 dev: true + /buffer-crc32/0.2.13: + resolution: {integrity: sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=} + dev: true + /buffer-from/1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} dev: true @@ -6084,6 +6278,11 @@ packages: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} dev: true + /corser/2.0.1: + resolution: {integrity: sha1-jtolLsqrWEDc2XXOuQ2TcMgZ/4c=} + engines: {node: '>= 0.4.0'} + dev: true + /cosmiconfig-typescript-loader/1.0.9_f533c3387680131348857b0baefd0f31: resolution: {integrity: sha512-tRuMRhxN4m1Y8hP9SNYfz7jRwt8lZdWxdjg/ohg5esKmsndJIn4yT96oJVcf5x0eA11taXl+sIp+ielu529k6g==} engines: {node: '>=12', npm: '>=6'} @@ -6189,6 +6388,14 @@ packages: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} dev: true + /cross-fetch/3.1.5: + resolution: {integrity: sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==} + dependencies: + node-fetch: 2.6.7 + transitivePeerDependencies: + - encoding + dev: true + /cross-spawn/6.0.5: resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} engines: {node: '>=4.8'} @@ -6675,6 +6882,15 @@ packages: debug: 2.6.9 dev: true + /devtools-protocol/0.0.982423: + resolution: {integrity: sha512-FnVW2nDbjGNw1uD/JRC+9U5768W7e1TfUwqbDTcSsAu1jXFjITSX8w3rkW5FEpHRMPPGpvNSmO1pOpqByiWscA==} + dev: true + + /diff-sequences/26.6.2: + resolution: {integrity: sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==} + engines: {node: '>= 10.14.2'} + dev: true + /diff-sequences/27.5.1: resolution: {integrity: sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -7192,6 +7408,10 @@ packages: engines: {node: '>= 0.6'} dev: true + /eventemitter3/4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + dev: true + /events/3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} @@ -7261,6 +7481,18 @@ packages: homedir-polyfill: 1.0.3 dev: true + /expect/26.6.2: + resolution: {integrity: sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==} + engines: {node: '>= 10.14.2'} + dependencies: + '@jest/types': 26.6.2 + ansi-styles: 4.3.0 + jest-get-type: 26.3.0 + jest-matcher-utils: 26.6.2 + jest-message-util: 26.6.2 + jest-regex-util: 26.0.0 + dev: true + /expect/27.5.1: resolution: {integrity: sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -7349,6 +7581,20 @@ packages: to-regex: 3.0.2 dev: true + /extract-zip/2.0.1: + resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} + engines: {node: '>= 10.17.0'} + hasBin: true + dependencies: + debug: 4.3.4 + get-stream: 5.2.0 + yauzl: 2.10.0 + optionalDependencies: + '@types/yauzl': 2.10.0 + transitivePeerDependencies: + - supports-color + dev: true + /faker/5.5.3: resolution: {integrity: sha512-wLTv2a28wjUyWkbnX7u/ABZBkUkIF2fCd73V6P2oFqEGEktDfzWx4UxrSqtPRw0xPRAcjeAOIiJWqZm3pP4u3g==} dev: true @@ -7406,6 +7652,12 @@ packages: bser: 2.1.1 dev: true + /fd-slicer/1.1.0: + resolution: {integrity: sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=} + dependencies: + pend: 1.2.0 + dev: true + /figgy-pudding/3.5.2: resolution: {integrity: sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==} dev: true @@ -7571,6 +7823,16 @@ packages: readable-stream: 2.3.7 dev: true + /follow-redirects/1.15.0: + resolution: {integrity: sha512-aExlJShTV4qOUOL7yF1U5tvLCB0xQuudbf6toyYA0E/acBNw71mvjFTnLaRp50aQaYocMR0a/RMMBIHeZnGyjQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dev: true + /for-in/1.0.2: resolution: {integrity: sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=} engines: {node: '>=0.10.0'} @@ -7658,6 +7920,10 @@ packages: readable-stream: 2.3.7 dev: true + /fs-constants/1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + dev: true + /fs-extra/0.30.0: resolution: {integrity: sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=} dependencies: @@ -7805,6 +8071,11 @@ packages: engines: {node: '>=8.0.0'} dev: true + /get-stdin/5.0.1: + resolution: {integrity: sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=} + engines: {node: '>=0.12.0'} + dev: true + /get-stream/4.1.0: resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} engines: {node: '>=6'} @@ -7812,6 +8083,13 @@ packages: pump: 3.0.0 dev: true + /get-stream/5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + dependencies: + pump: 3.0.0 + dev: true + /get-stream/6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} @@ -7991,6 +8269,10 @@ packages: slash: 2.0.0 dev: true + /glur/1.1.2: + resolution: {integrity: sha1-8g6jbbEDv8KSNDkh8fkeg8NGdok=} + dev: true + /graceful-fs/4.2.10: resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} dev: true @@ -8245,6 +8527,13 @@ packages: whatwg-encoding: 1.0.5 dev: true + /html-encoding-sniffer/3.0.0: + resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} + engines: {node: '>=12'} + dependencies: + whatwg-encoding: 2.0.0 + dev: true + /html-entities/2.3.3: resolution: {integrity: sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==} dev: true @@ -8346,12 +8635,45 @@ packages: - supports-color dev: true + /http-proxy/1.18.1: + resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} + engines: {node: '>=8.0.0'} + dependencies: + eventemitter3: 4.0.7 + follow-redirects: 1.15.0 + requires-port: 1.0.0 + transitivePeerDependencies: + - debug + dev: true + + /http-server/14.1.0: + resolution: {integrity: sha512-5lYsIcZtf6pdR8tCtzAHTWrAveo4liUlJdWc7YafwK/maPgYHs+VNP6KpCClmUnSorJrARVMXqtT055zBv11Yg==} + engines: {node: '>=12'} + hasBin: true + dependencies: + basic-auth: 2.0.1 + chalk: 4.1.2 + corser: 2.0.1 + he: 1.2.0 + html-encoding-sniffer: 3.0.0 + http-proxy: 1.18.1 + mime: 1.6.0 + minimist: 1.2.6 + opener: 1.5.2 + portfinder: 1.0.28 + secure-compare: 3.0.1 + union: 0.5.0 + url-join: 4.0.1 + transitivePeerDependencies: + - debug + dev: true + /https-browserify/1.0.0: resolution: {integrity: sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=} dev: true - /https-proxy-agent/5.0.0: - resolution: {integrity: sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==} + /https-proxy-agent/5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} dependencies: agent-base: 6.0.2 @@ -8372,6 +8694,13 @@ packages: safer-buffer: 2.1.2 dev: true + /iconv-lite/0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: true + /icss-utils/4.1.1: resolution: {integrity: sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==} engines: {node: '>= 6'} @@ -9152,6 +9481,16 @@ packages: - utf-8-validate dev: true + /jest-diff/26.6.2: + resolution: {integrity: sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==} + engines: {node: '>= 10.14.2'} + dependencies: + chalk: 4.1.2 + diff-sequences: 26.6.2 + jest-get-type: 26.3.0 + pretty-format: 26.6.2 + dev: true + /jest-diff/27.5.1: resolution: {integrity: sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -9210,6 +9549,11 @@ packages: jest-util: 27.5.1 dev: true + /jest-get-type/26.3.0: + resolution: {integrity: sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==} + engines: {node: '>= 10.14.2'} + dev: true + /jest-get-type/27.5.1: resolution: {integrity: sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -9256,6 +9600,24 @@ packages: fsevents: 2.3.2 dev: true + /jest-image-snapshot/4.5.1_jest@27.5.1: + resolution: {integrity: sha512-0YkgupgkkCx0wIZkxvqs/oNiUT0X0d2WTpUhaAp+Dy6CpqBUZMRTIZo4KR1f+dqmx6WXrLCvecjnHLIsLkI+gQ==} + engines: {node: '>= 10.14.2'} + peerDependencies: + jest: '>=20 <=27' + dependencies: + chalk: 1.1.3 + get-stdin: 5.0.1 + glur: 1.1.2 + jest: 27.5.1 + lodash: 4.17.21 + mkdirp: 0.5.6 + pixelmatch: 5.3.0 + pngjs: 3.4.0 + rimraf: 2.7.1 + ssim.js: 3.5.0 + dev: true + /jest-jasmine2/27.5.1: resolution: {integrity: sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -9289,6 +9651,16 @@ packages: pretty-format: 27.5.1 dev: true + /jest-matcher-utils/26.6.2: + resolution: {integrity: sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==} + engines: {node: '>= 10.14.2'} + dependencies: + chalk: 4.1.2 + jest-diff: 26.6.2 + jest-get-type: 26.3.0 + pretty-format: 26.6.2 + dev: true + /jest-matcher-utils/27.5.1: resolution: {integrity: sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -9299,6 +9671,21 @@ packages: pretty-format: 27.5.1 dev: true + /jest-message-util/26.6.2: + resolution: {integrity: sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==} + engines: {node: '>= 10.14.2'} + dependencies: + '@babel/code-frame': 7.16.7 + '@jest/types': 26.6.2 + '@types/stack-utils': 2.0.1 + chalk: 4.1.2 + graceful-fs: 4.2.10 + micromatch: 4.0.5 + pretty-format: 26.6.2 + slash: 3.0.0 + stack-utils: 2.0.5 + dev: true + /jest-message-util/27.5.1: resolution: {integrity: sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -9322,6 +9709,18 @@ packages: '@types/node': 17.0.23 dev: true + /jest-pnp-resolver/1.2.2_jest-resolve@26.6.2: + resolution: {integrity: sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + dependencies: + jest-resolve: 26.6.2 + dev: true + /jest-pnp-resolver/1.2.2_jest-resolve@27.5.1: resolution: {integrity: sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==} engines: {node: '>=6'} @@ -9355,6 +9754,20 @@ packages: - supports-color dev: true + /jest-resolve/26.6.2: + resolution: {integrity: sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==} + engines: {node: '>= 10.14.2'} + dependencies: + '@jest/types': 26.6.2 + chalk: 4.1.2 + graceful-fs: 4.2.10 + jest-pnp-resolver: 1.2.2_jest-resolve@26.6.2 + jest-util: 26.6.2 + read-pkg-up: 7.0.1 + resolve: 1.22.0 + slash: 3.0.0 + dev: true + /jest-resolve/27.5.1: resolution: {integrity: sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -9449,6 +9862,28 @@ packages: graceful-fs: 4.2.10 dev: true + /jest-snapshot/26.6.2: + resolution: {integrity: sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==} + engines: {node: '>= 10.14.2'} + dependencies: + '@babel/types': 7.17.0 + '@jest/types': 26.6.2 + '@types/babel__traverse': 7.17.0 + '@types/prettier': 2.6.0 + chalk: 4.1.2 + expect: 26.6.2 + graceful-fs: 4.2.10 + jest-diff: 26.6.2 + jest-get-type: 26.3.0 + jest-haste-map: 26.6.2 + jest-matcher-utils: 26.6.2 + jest-message-util: 26.6.2 + jest-resolve: 26.6.2 + natural-compare: 1.4.0 + pretty-format: 26.6.2 + semver: 7.3.7 + dev: true + /jest-snapshot/27.5.1: resolution: {integrity: sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -9479,6 +9914,15 @@ packages: - supports-color dev: true + /jest-specific-snapshot/4.0.0_jest@27.5.1: + resolution: {integrity: sha512-YdW5P/MVwOizWR0MJwURxdrjdXvdG2MMpXKVGr7dZ2YrBmE6E6Ab74UL3DOYmGmzaCnNAW1CL02pY5MTHE3ulQ==} + peerDependencies: + jest: '>= 26.0.0' + dependencies: + jest: 27.5.1 + jest-snapshot: 26.6.2 + dev: true + /jest-util/26.6.2: resolution: {integrity: sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==} engines: {node: '>= 10.14.2'} @@ -9616,7 +10060,7 @@ packages: form-data: 3.0.1 html-encoding-sniffer: 2.0.1 http-proxy-agent: 4.0.1 - https-proxy-agent: 5.0.0 + https-proxy-agent: 5.0.1 is-potential-custom-element-name: 1.0.1 nwsapi: 2.2.0 parse5: 6.0.1 @@ -10292,6 +10736,10 @@ packages: is-extendable: 1.0.1 dev: true + /mkdirp-classic/0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + dev: true + /mkdirp/0.5.6: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} hasBin: true @@ -10651,6 +11099,11 @@ packages: is-wsl: 2.2.0 dev: true + /opener/1.5.2: + resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} + hasBin: true + dev: true + /optionator/0.8.3: resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} engines: {node: '>= 0.8.0'} @@ -10950,6 +11403,10 @@ packages: sha.js: 2.4.11 dev: true + /pend/1.2.0: + resolution: {integrity: sha1-elfrVQpng/kRUzH89GY9XI4AelA=} + dev: true + /picocolors/0.2.1: resolution: {integrity: sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==} dev: true @@ -10978,6 +11435,13 @@ packages: engines: {node: '>= 6'} dev: true + /pixelmatch/5.3.0: + resolution: {integrity: sha512-o8mkY4E/+LNUf6LzX96ht6k6CEDi65k9G2rjMtBe9Oo+VPKSvl+0GKHuH/AlG+GA5LPG/i5hrekkxUc3s2HU+Q==} + hasBin: true + dependencies: + pngjs: 6.0.0 + dev: true + /pkg-dir/3.0.0: resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==} engines: {node: '>=6'} @@ -10999,6 +11463,16 @@ packages: find-up: 5.0.0 dev: true + /pngjs/3.4.0: + resolution: {integrity: sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==} + engines: {node: '>=4.0.0'} + dev: true + + /pngjs/6.0.0: + resolution: {integrity: sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg==} + engines: {node: '>=12.13.0'} + dev: true + /pnp-webpack-plugin/1.6.4: resolution: {integrity: sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg==} engines: {node: '>=6'} @@ -11015,6 +11489,15 @@ packages: '@babel/runtime': 7.17.9 dev: true + /portfinder/1.0.28: + resolution: {integrity: sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==} + engines: {node: '>= 0.12.0'} + dependencies: + async: 2.6.4 + debug: 3.2.7 + mkdirp: 0.5.6 + dev: true + /posix-character-classes/0.1.1: resolution: {integrity: sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=} engines: {node: '>=0.10.0'} @@ -11629,6 +12112,14 @@ packages: source-map: 0.6.1 dev: true + /preact-render-to-string/5.2.0: + resolution: {integrity: sha512-+RGwSW78Cl+NsZRUbFW1MGB++didsfqRk+IyRVTaqy+3OjtpKK/6HgBtfszUX0YXMfo41k2iaQSseAHGKEwrbg==} + peerDependencies: + preact: '>=10' + dependencies: + pretty-format: 3.8.0 + dev: true + /prelude-ls/1.1.2: resolution: {integrity: sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=} engines: {node: '>= 0.8.0'} @@ -11652,6 +12143,16 @@ packages: renderkid: 2.0.7 dev: true + /pretty-format/26.6.2: + resolution: {integrity: sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==} + engines: {node: '>= 10'} + dependencies: + '@jest/types': 26.6.2 + ansi-regex: 5.0.1 + ansi-styles: 4.3.0 + react-is: 17.0.2 + dev: true + /pretty-format/27.5.1: resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -11661,6 +12162,10 @@ packages: react-is: 17.0.2 dev: true + /pretty-format/3.8.0: + resolution: {integrity: sha1-v77VbV6ad2ZF9LH/eqGjrE+jw4U=} + dev: true + /pretty-hrtime/1.0.3: resolution: {integrity: sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=} engines: {node: '>= 0.8'} @@ -11680,6 +12185,11 @@ packages: engines: {node: '>= 0.6.0'} dev: true + /progress/2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + dev: true + /promise-inflight/1.0.1: resolution: {integrity: sha1-mEcocL8igTL8vdhoEputEsPAKeM=} dev: true @@ -11735,6 +12245,10 @@ packages: ipaddr.js: 1.9.1 dev: true + /proxy-from-env/1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + dev: true + /prr/1.0.1: resolution: {integrity: sha1-0/wRS6BplaRexok/SEzrHXj19HY=} dev: true @@ -11789,6 +12303,30 @@ packages: engines: {node: '>=6'} dev: true + /puppeteer/14.0.0: + resolution: {integrity: sha512-Aj/cySGBMWpUYEWV0YOcwyhq5lOxuuiGScgdj/OvslAm/ydoywiI8OzAIXT4HzKmNTmzm/fKKHHtcsQa/fFgdw==} + engines: {node: '>=14.1.0'} + requiresBuild: true + dependencies: + cross-fetch: 3.1.5 + debug: 4.3.4 + devtools-protocol: 0.0.982423 + extract-zip: 2.0.1 + https-proxy-agent: 5.0.1 + pkg-dir: 4.2.0 + progress: 2.0.3 + proxy-from-env: 1.1.0 + rimraf: 3.0.2 + tar-fs: 2.1.1 + unbzip2-stream: 1.4.3 + ws: 8.6.0 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: true + /q/1.5.1: resolution: {integrity: sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=} engines: {node: '>=0.6.0', teleport: '>=0.2.0'} @@ -12078,6 +12616,15 @@ packages: react: 16.14.0 dev: true + /react-shallow-renderer/16.15.0: + resolution: {integrity: sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA==} + peerDependencies: + react: ^16.0.0 || ^17.0.0 || ^18.0.0 + dependencies: + object-assign: 4.1.1 + react-is: 17.0.2 + dev: true + /react-sizeme/3.0.2: resolution: {integrity: sha512-xOIAOqqSSmKlKFJLO3inBQBdymzDuXx4iuwkNcJmC96jeiOg5ojByvL+g3MW9LPEsojLbC6pf68zOfobK8IPlw==} dependencies: @@ -12112,6 +12659,17 @@ packages: refractor: 3.6.0 dev: true + /react-test-renderer/17.0.2: + resolution: {integrity: sha512-yaQ9cB89c17PUb0x6UfWRs7kQCorVdHlutU1boVPEsB8IDZH6n9tHxMacc3y0JoXOJUsZb/t/Mb8FUWMKaM7iQ==} + peerDependencies: + react: 17.0.2 + dependencies: + object-assign: 4.1.1 + react-is: 17.0.2 + react-shallow-renderer: 16.15.0 + scheduler: 0.20.2 + dev: true + /react-textarea-autosize/8.3.3: resolution: {integrity: sha512-2XlHXK2TDxS6vbQaoPbMOfQ8GK7+irc2fVK6QFIcC8GOnH3zI/v481n+j1L0WaPVvKxwesnY93fEfH++sus2rQ==} engines: {node: '>=10'} @@ -12415,6 +12973,10 @@ packages: engines: {node: '>=0.10.0'} dev: true + /requires-port/1.0.0: + resolution: {integrity: sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=} + dev: true + /resolve-cwd/3.0.0: resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} engines: {node: '>=8'} @@ -12671,6 +13233,13 @@ packages: object-assign: 4.1.1 dev: true + /scheduler/0.20.2: + resolution: {integrity: sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==} + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + dev: true + /schema-utils/1.0.0: resolution: {integrity: sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==} engines: {node: '>= 4'} @@ -12707,6 +13276,10 @@ packages: ajv-keywords: 3.5.2_ajv@6.12.6 dev: true + /secure-compare/3.0.1: + resolution: {integrity: sha1-8aAymzCLIh+uN7mXTz1XjQypmeM=} + dev: true + /semver/5.7.1: resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} hasBin: true @@ -13021,6 +13594,10 @@ packages: resolution: {integrity: sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=} dev: true + /ssim.js/3.5.0: + resolution: {integrity: sha512-Aj6Jl2z6oDmgYFFbQqK7fght19bXdOxY7Tj03nF+03M9gCBAjeIiO8/PlEGMfKDwYpw4q6iBqVq2YuREorGg/g==} + dev: true + /ssri/6.0.2: resolution: {integrity: sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==} dependencies: @@ -13352,6 +13929,26 @@ packages: engines: {node: '>=6'} dev: true + /tar-fs/2.1.1: + resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 2.2.0 + dev: true + + /tar-stream/2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.0 + dev: true + /tar/6.1.11: resolution: {integrity: sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==} engines: {node: '>= 10'} @@ -13754,6 +14351,13 @@ packages: which-boxed-primitive: 1.0.2 dev: true + /unbzip2-stream/1.4.3: + resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} + dependencies: + buffer: 5.7.1 + through: 2.3.8 + dev: true + /unfetch/4.2.0: resolution: {integrity: sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==} dev: true @@ -13809,6 +14413,13 @@ packages: set-value: 2.0.1 dev: true + /union/0.5.0: + resolution: {integrity: sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==} + engines: {node: '>= 0.8.0'} + dependencies: + qs: 6.10.3 + dev: true + /uniq/1.0.1: resolution: {integrity: sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=} dev: true @@ -13922,6 +14533,10 @@ packages: deprecated: Please see https://github.com/lydell/urix#deprecated dev: true + /url-join/4.0.1: + resolution: {integrity: sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==} + dev: true + /url-loader/4.1.1_file-loader@6.2.0+webpack@4.46.0: resolution: {integrity: sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==} engines: {node: '>= 10.13.0'} @@ -14283,6 +14898,13 @@ packages: iconv-lite: 0.4.24 dev: true + /whatwg-encoding/2.0.0: + resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} + engines: {node: '>=12'} + dependencies: + iconv-lite: 0.6.3 + dev: true + /whatwg-mimetype/2.3.0: resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} dev: true @@ -14397,8 +15019,8 @@ packages: optional: true dev: true - /ws/8.2.3: - resolution: {integrity: sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==} + /ws/8.6.0: + resolution: {integrity: sha512-AzmM3aH3gk0aX7/rZLYvjdvZooofDu3fFOzGqcSnQ1tOcTWwhM/o+q++E8mAyVVIyUdajrkzWUGftaVSDLn1bw==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -14481,6 +15103,13 @@ packages: yargs-parser: 21.0.1 dev: true + /yauzl/2.10.0: + resolution: {integrity: sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=} + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + dev: true + /yn/3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} diff --git a/src/charts/bar.spec.js b/src/charts/bar.spec.js index 505dcf92..9b98f3cd 100644 --- a/src/charts/bar.spec.js +++ b/src/charts/bar.spec.js @@ -8,7 +8,7 @@ import { mockDom, mockDomRects, destroyMockDomRects -} from '../../test/mock'; +} from '../../test/mock/dom'; describe('Charts', () => { describe('BarChart', () => { diff --git a/src/charts/line.spec.js b/src/charts/line.spec.js index 8e85296d..c242a768 100644 --- a/src/charts/line.spec.js +++ b/src/charts/line.spec.js @@ -9,7 +9,7 @@ import { mockDom, mockDomRects, destroyMockDomRects -} from '../../test/mock'; +} from '../../test/mock/dom'; describe('Charts', () => { describe('LineChart', () => { diff --git a/src/charts/line.stories.js b/src/charts/line.stories.js index 4b4c06fa..ff84aae5 100644 --- a/src/charts/line.stories.js +++ b/src/charts/line.stories.js @@ -453,7 +453,7 @@ export function PathAnimation() { showPoint: false, fullWidth: true }).on('draw', (data) => { - if(data.type === 'line' || data.type === 'area') { + if (!process.env.STORYBOOK_STORYSHOTS && (data.type === 'line' || data.type === 'area')) { data.element.animate({ d: { begin: 2000 * data.index, diff --git a/src/charts/pie.spec.js b/src/charts/pie.spec.js index ad5fb576..3b47684f 100644 --- a/src/charts/pie.spec.js +++ b/src/charts/pie.spec.js @@ -5,7 +5,7 @@ import { addMockWrapper, destroyMockDom, mockDom, -} from '../../test/mock'; +} from '../../test/mock/dom'; describe('Charts', () => { describe('PieChart', () => { diff --git a/src/core/creation.spec.js b/src/core/creation.spec.js index 4e9b4a39..afc8645b 100644 --- a/src/core/creation.spec.js +++ b/src/core/creation.spec.js @@ -1,4 +1,4 @@ -import {addMockWrapper, mockDom, destroyMockDom} from '../../test/mock'; +import {addMockWrapper, mockDom, destroyMockDom} from '../../test/mock/dom'; import {createSvg, createGrid, createGridBackground, normalizePadding} from './creation'; import {EventEmitter} from '../event/event-emitter'; import {Svg} from '../svg/svg'; diff --git a/test/compat.js b/test/mock/compat.js similarity index 100% rename from test/compat.js rename to test/mock/compat.js diff --git a/test/mock/cssModule.js b/test/mock/cssModule.js new file mode 100644 index 00000000..7c38dd6d --- /dev/null +++ b/test/mock/cssModule.js @@ -0,0 +1,10 @@ +const mock = new Proxy( + {}, + { + get() { + return '' + }, + } +) + +module.exports = mock diff --git a/test/mock.js b/test/mock/dom.js similarity index 100% rename from test/mock.js rename to test/mock/dom.js diff --git a/test/storyshots.spec.js b/test/storyshots.spec.js new file mode 100644 index 00000000..3c9a956e --- /dev/null +++ b/test/storyshots.spec.js @@ -0,0 +1,21 @@ +import { skipable } from './utils/skipable' +import { initStoryshots } from './utils/storyshots' + +const testTimeout = 60 * 1000 * 10 +const config = { + url: 'http://localhost:6006', + setupTimeout: testTimeout, + testTimeout, + getGotoOptions() { + return { + waitUntil: 'networkidle0', + timeout: 0, + } + }, +} + +const describeWhenLinux = skipable(describe, process.platform !== 'linux' || Boolean(process.env.STORYSHOTS_SKIP)) + +describeWhenLinux('Storyshots', () => { + initStoryshots(config) +}) diff --git a/test/utils/skipable.js b/test/utils/skipable.js new file mode 100644 index 00000000..855f9c34 --- /dev/null +++ b/test/utils/skipable.js @@ -0,0 +1,9 @@ +/** + * Make block definition method skipable. + * @param fn - Jest's block definition method. + * @param skip - Skip test block. + * @returns Skipable block definition methid. + */ +export function skipable(fn, skip) { + return skip ? fn.skip : fn +} diff --git a/test/utils/storyshots/imageSnapshotWithStoryParameters.js b/test/utils/storyshots/imageSnapshotWithStoryParameters.js new file mode 100644 index 00000000..2f626ae2 --- /dev/null +++ b/test/utils/storyshots/imageSnapshotWithStoryParameters.js @@ -0,0 +1,115 @@ +import { devices } from 'puppeteer' +import { imageSnapshot } from '@storybook/addon-storyshots-puppeteer' + +import { Viewport } from './viewport' + +const captureRoot = true; +const offset = '40' + +/** + * Handle story parameters. + * @param page - Page instance. + * @param options - Story options. + * @returns Promise. + */ +async function beforeScreenshotHook(page, options) { + const { + storyshots: { currentViewport } = {}, + parameters: { storyshots: { beforeScreenshot } = {} }, + } = options.context + + if (currentViewport && currentViewport !== Viewport.Default) { + await page.emulate(devices[currentViewport]) + } + + if (beforeScreenshot) { + await beforeScreenshot(page, options) + } + + if (captureRoot) { + await page.$eval( + '#root', + (root, offset) => { + root.style.padding = `${offset}px` + }, + offset + ) + + return page.$('#root') + } + + return null +} + +function getCaptureRootScreenshotOptions() { + return { + encoding: 'base64', // encoding: 'base64' is a property required by puppeteer + fullPage: !captureRoot, + } +} + +/** + * Create snapshot tests function with story parameters. + * @param config - Snapshots config. + * @returns Snapshot tests function. + */ +export function imageSnapshotWithStoryParameters(config) { + const { beforeScreenshot, getScreenshotOptions } = config + const configWithBeforeScreenshot = { + ...config, + getScreenshotOptions: getScreenshotOptions + ? (options) => ({ + ...getCaptureRootScreenshotOptions(options), + ...getScreenshotOptions(options), + }) + : getCaptureRootScreenshotOptions, + beforeScreenshot: beforeScreenshot + ? async (page, options) => { + const captureTarget = await beforeScreenshotHook(page, options) + + await beforeScreenshot(page, options) + + return captureTarget + } + : beforeScreenshotHook, + } + const test = imageSnapshot(configWithBeforeScreenshot) + const testFn = async (options) => { + const { context } = options + const { + storyshots: { + viewports = [], + } = {}, + } = context.parameters + + if (!viewports.length) { + await test(options) + return + } + + for (const viewport of viewports) { + const currentViewport = viewport === Viewport.Default ? undefined : viewport + const originalId = context.id + + context.storyshots = { + currentViewport, + } + + if (currentViewport) { + context.id += `&${currentViewport}` + } + + await test(options) + + context.id = originalId + } + + expect.assertions(viewports.length) + } + + testFn.timeout = test.timeout + testFn.beforeAll = test.beforeAll + testFn.afterAll = test.afterAll + + return testFn +} diff --git a/test/utils/storyshots/index.js b/test/utils/storyshots/index.js new file mode 100644 index 00000000..1b80c689 --- /dev/null +++ b/test/utils/storyshots/index.js @@ -0,0 +1,3 @@ +export * from './initStoryshots' +export * from './imageSnapshotWithStoryParameters' +export * from './storybook' diff --git a/test/utils/storyshots/initStoryshots.js b/test/utils/storyshots/initStoryshots.js new file mode 100644 index 00000000..6420cd23 --- /dev/null +++ b/test/utils/storyshots/initStoryshots.js @@ -0,0 +1,89 @@ +import baseInitStoryshots from '@storybook/addon-storyshots' + +import { + imageSnapshotWithStoryParameters, +} from './imageSnapshotWithStoryParameters' +import { startStorybook } from './storybook' + +/** + * Default page customizer. + * @param page - Puppeteer's page instance. + * @returns Task promise. + */ +export function defaultCustomizePage(page) { + return page.setViewport({ + width: 1920, + height: 1080, + }) +} + +/** + * Prepare identifier for use in filename. + * @param indentifierPart - Identifier string part. + * @returns Sanitized identifier ready for use in filename. + */ +export function sanitizeSnapshotIdentifierPart(indentifierPart) { + return indentifierPart.replace(/[\s/]|%20/g, '-').replace(/"|%22/g, '') +} + +/** + * Default match options creator. + * @param storyOptions - Story info. + * @param storyOptions.context - Story context. + * @param storyOptions.context.kind - Story kind. + * @param storyOptions.context.story - Story name. + * @param storyOptions.context.storyshots - Storyshots metadata. + * @returns Match options. + */ +export function defaultGetMatchOptions({ context: { kind, story, storyshots } }) { + const currentViewport = storyshots?.currentViewport + const sanitizedKind = sanitizeSnapshotIdentifierPart(kind) + const sanitizedStory = sanitizeSnapshotIdentifierPart(story) + const sanitizedParams = currentViewport ? `__${sanitizeSnapshotIdentifierPart(currentViewport)}` : '' + + process.stdout.write(`📷 ${kind} ${story} ${currentViewport || ''}\n`) + + return { + customSnapshotIdentifier: `${sanitizedKind}__${sanitizedStory}${sanitizedParams}`, + } +} + +/** + * Initialize and run storyshots. + * @param config - Storyshots config. + */ +export function initStoryshots(config) { + process.env.STORYBOOK_STORYSHOTS = JSON.stringify(true) + + const finalOptions = { + getMatchOptions: defaultGetMatchOptions, + customizePage: defaultCustomizePage, + ...config, + } + const storybook = startStorybook(config) + const test = imageSnapshotWithStoryParameters({ + storybookUrl: config.url, + ...finalOptions, + }) + const { beforeAll, afterAll } = test + const { warn } = console + + test.beforeAll = (async () => { + await storybook.start() + await beforeAll() + }) + test.beforeAll.timeout = beforeAll.timeout + + test.afterAll = async () => { + await storybook.stop() + await afterAll() + } + + console.warn = () => undefined + baseInitStoryshots({ + framework: 'html', + suite: 'Storyshots', + test, + }) + console.warn = warn +} diff --git a/test/utils/storyshots/storybook.js b/test/utils/storyshots/storybook.js new file mode 100644 index 00000000..a085f643 --- /dev/null +++ b/test/utils/storyshots/storybook.js @@ -0,0 +1,82 @@ +import { spawn } from 'child_process' + +import { createServer } from 'http-server' +import del from 'del' + +const STORYBOOK_STATIC = 'storybook-static' +const errorMatcher = /ERR!|Error:|ERROR in|UnhandledPromiseRejectionWarning/ + +/** + * Run storybook static build. + * @param options - Build options. + * @param [options.env] - Environment variables. + * @param [options.verbose] - Print verbose messages. + * @returns Build process promise. + */ +export async function buildStorybook({ env = {}, verbose = false }) { + return new Promise((resolve, reject) => { + const buildProcess = spawn('build-storybook', [], { + cwd: process.cwd(), + env: { + ...process.env, + NODE_ENV: 'production', + ...env, + }, + detached: true, + }) + const onData = (data) => { + const message = data.toString('utf8') + + if (verbose) { + process.stdout.write(message) + } + + if (errorMatcher.test(message)) { + reject(new Error(message)) + } + } + + buildProcess.on('exit', (code, signal) => { + if (code === 0) { + resolve() + return + } + + reject(new Error(`Exit code: ${code || signal || 'unknown'}`)) + }) + buildProcess.stdout.on('data', onData) + buildProcess.stderr.on('data', onData) + }) +} + +/** + * Build static and start storybook server. + * @param options - Storybook build and start options. + * @returns Server controls. + */ +export function startStorybook(options) { + const { url, skipBuild } = options + const parsedUrl = new URL(url) + const server = createServer({ + root: STORYBOOK_STATIC, + }) + + return { + async start() { + if (!skipBuild) { + await buildStorybook(options) + } + + await new Promise((resolve) => { + server.listen(parseInt(parsedUrl.port, 10), parsedUrl.hostname, resolve) + }) + }, + async stop() { + server.close() + + if (!skipBuild) { + await del(STORYBOOK_STATIC) + } + }, + } +} diff --git a/test/utils/storyshots/viewport.js b/test/utils/storyshots/viewport.js new file mode 100644 index 00000000..6c201fbf --- /dev/null +++ b/test/utils/storyshots/viewport.js @@ -0,0 +1,7 @@ +export const Viewport = { + Default: 'default', + Mobile: 'iPhone X', + SmallMobile :'iPhone SE', + Tablet: 'iPad', + SmallTablet: 'Nexus 7', +} From 92c5098380e444c00e4f02371096152bf71618b7 Mon Sep 17 00:00:00 2001 From: Dan Onoshko Date: Mon, 16 May 2022 15:44:42 +0700 Subject: [PATCH 18/44] ci: add github actions workflows (#11) --- .gitattributes | 2 +- .github/workflows/checks.yml | 34 ++++++++++++++++ .github/workflows/ci.yml | 45 +++++++++++++++++++++ .github/workflows/commit.yml | 14 +++++++ .github/workflows/release.yml | 27 +++++++++++++ .github/workflows/update-storyshots.yml | 53 +++++++++++++++++++++++++ .simple-git-hooks.json | 3 +- CONTRIBUTING.md | 4 +- LICENSE-WTFPL | 10 ++--- package.json | 3 +- 10 files changed, 185 insertions(+), 10 deletions(-) create mode 100644 .github/workflows/checks.yml create mode 100644 .github/workflows/ci.yml create mode 100644 .github/workflows/commit.yml create mode 100644 .github/workflows/release.yml create mode 100644 .github/workflows/update-storyshots.yml diff --git a/.gitattributes b/.gitattributes index 21256661..176a458f 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +1 @@ -* text=auto \ No newline at end of file +* text=auto diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml new file mode 100644 index 00000000..b1264b41 --- /dev/null +++ b/.github/workflows/checks.yml @@ -0,0 +1,34 @@ +name: Checks +on: + pull_request: + branches: + - master + - develop +jobs: + storybook: + runs-on: ubuntu-latest + name: storybook + steps: + - name: Checkout the repository + uses: actions/checkout@v2 + - name: Install pnpm + uses: pnpm/action-setup@v2.0.1 + with: + version: 6 + - name: Install Node.js + uses: actions/setup-node@v2 + with: + node-version: 16 + cache: 'pnpm' + - name: Install dependencies + run: pnpm install + - name: Check storybook + run: pnpm build:storybook + editorconfig: + runs-on: ubuntu-latest + name: editorconfig + steps: + - name: Checkout the repository + uses: actions/checkout@v2 + - name: Check editorconfig + uses: editorconfig-checker/action-editorconfig-checker@v1 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000..0bd57db0 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,45 @@ +name: CI +on: + pull_request: + push: + branches: + - master + - develop +jobs: + test: + runs-on: ubuntu-latest + strategy: + matrix: + stage: + - unit + - storyshots + fail-fast: false + name: ${{ matrix.stage }} tests + steps: + - name: Checkout the repository + uses: actions/checkout@v3 + - name: Install pnpm + uses: pnpm/action-setup@v2.2.1 + with: + version: 6 + - name: Install Node.js + uses: actions/setup-node@v3 + with: + node-version: 16 + cache: 'pnpm' + - name: Install dependencies + run: pnpm install + - name: Run tests + run: pnpm test:${{ matrix.stage }} + - name: Collect coverage + uses: codecov/codecov-action@v3 + if: "success() && matrix.stage == 'unit'" + with: + files: ./coverage/lcov.info + fail_ci_if_error: true + - name: Collect artifacts + uses: actions/upload-artifact@v3 + if: "failure() && matrix.stage != 'unit'" + with: + name: Image snapshots (${{ matrix.stage }}) + path: test/__image_snapshots__/ diff --git a/.github/workflows/commit.yml b/.github/workflows/commit.yml new file mode 100644 index 00000000..11171693 --- /dev/null +++ b/.github/workflows/commit.yml @@ -0,0 +1,14 @@ +name: Commit +on: + push: +jobs: + commitlint: + runs-on: ubuntu-latest + name: commitlint + steps: + - name: Checkout the repository + uses: actions/checkout@v2 + with: + fetch-depth: 0 + - name: Run commitlint + uses: wagoid/commitlint-github-action@v4 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000..74c90ead --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,27 @@ +name: Release +on: + release: + types: [created] +jobs: + build: + runs-on: ubuntu-latest + name: Publish package + steps: + - name: Checkout the repository + uses: actions/checkout@v2 + - name: Install pnpm + uses: pnpm/action-setup@v2.0.1 + with: + version: 6 + - name: Install Node.js + uses: actions/setup-node@v2 + with: + node-version: 16 + cache: 'pnpm' + registry-url: 'https://registry.npmjs.org' + - name: Install dependencies + run: pnpm install + - name: Publish + run: pnpm publish --no-git-checks + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/.github/workflows/update-storyshots.yml b/.github/workflows/update-storyshots.yml new file mode 100644 index 00000000..caf2759c --- /dev/null +++ b/.github/workflows/update-storyshots.yml @@ -0,0 +1,53 @@ +name: Update storyshots +on: workflow_dispatch +jobs: + update-storyshots: + name: storyshots + steps: + - name: Checkout the repository + uses: actions/checkout@v3 + - name: Install pnpm + uses: pnpm/action-setup@v2.2.1 + with: + version: 6 + - name: Install Node.js + uses: actions/setup-node@v3 + with: + node-version: 16 + cache: 'pnpm' + - name: Install dependencies + run: pnpm install + - name: Update snapshots + run: pnpm test:storyshots -- -- -u + - name: Collect artifacts + uses: actions/upload-artifact@v3 + if: always() + with: + name: Updated image snapshots + path: test/__image_snapshots__/ + update-legacy-storyshots: + name: legacy storyshots + steps: + - name: Checkout the repository + uses: actions/checkout@v3 + - name: Install pnpm + uses: pnpm/action-setup@v2.2.1 + with: + version: 6 + - name: Install Node.js + uses: actions/setup-node@v3 + with: + node-version: 16 + cache: 'pnpm' + - name: Install dependencies + run: pnpm install + - name: Update snapshots + run: pnpm test:storyshots -- -- -u + env: + CHARTIST_COMPAT: true + - name: Collect artifacts + uses: actions/upload-artifact@v3 + if: always() + with: + name: Updated image snapshots + path: test/__image_snapshots__/ diff --git a/.simple-git-hooks.json b/.simple-git-hooks.json index 85a3769d..e2e2bacc 100644 --- a/.simple-git-hooks.json +++ b/.simple-git-hooks.json @@ -1,3 +1,4 @@ { - "commit-msg": "pnpm commitlint --edit \"$1\"" + "commit-msg": "pnpm commitlint --edit \"$1\"", + "pre-push": "pnpm test" } diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7a85d9a0..69d2dabe 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,7 +1,7 @@ # Contributing to chartist-js - - [Issues and Bugs](#issue) - - [Submission Guidelines](#submit) +- [Issues and Bugs](#issue) +- [Submission Guidelines](#submit) ## Found an Issue? diff --git a/LICENSE-WTFPL b/LICENSE-WTFPL index 5c93f456..58a9d91c 100644 --- a/LICENSE-WTFPL +++ b/LICENSE-WTFPL @@ -1,13 +1,13 @@ DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE Version 2, December 2004 - Copyright (C) 2004 Sam Hocevar +Copyright (C) 2004 Sam Hocevar - Everyone is permitted to copy and distribute verbatim or modified - copies of this license document, and changing it is allowed as long - as the name is changed. +Everyone is permitted to copy and distribute verbatim or modified +copies of this license document, and changing it is allowed as long +as the name is changed. DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. You just DO WHAT THE FUCK YOU WANT TO. diff --git a/package.json b/package.json index f8ca6b2f..81f22834 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,8 @@ "build": "rollup -c & pnpm build:styles", "start:storybook": "start-storybook -p 6006 --ci", "build:storybook": "del ./storybook-static; NODE_ENV=production build-storybook", - "test:unit": "jest -c jest.config.json", + "test:unit": "jest -c jest.config.json ./src", + "test:storyshots": "jest -c jest.config.json ./test/storyshots.spec.js", "test": "pnpm test:unit", "lint": "eslint src", "commit": "cz", From fae2fa2a86b09739f5d000bbe562b5bc6b211402 Mon Sep 17 00:00:00 2001 From: Dan Onoshko Date: Mon, 16 May 2022 16:33:14 +0700 Subject: [PATCH 19/44] test: adaptive storyshots (#12) --- .storybook/main.js | 1 + .storybook/preview.js | 16 ++++++++++ package.json | 1 + pnpm-lock.yaml | 30 ++++++++++++++++++- src/charts/bar.stories.js | 13 ++++++++ .../imageSnapshotWithStoryParameters.js | 4 --- test/utils/storyshots/viewport.js | 6 +++- 7 files changed, 65 insertions(+), 6 deletions(-) diff --git a/.storybook/main.js b/.storybook/main.js index b49e6104..ab6daeca 100644 --- a/.storybook/main.js +++ b/.storybook/main.js @@ -8,6 +8,7 @@ module.exports = { '@storybook/addon-docs', '@storybook/addon-controls', '@storybook/addon-actions', + '@storybook/addon-viewport' ], webpackFinal: async (config) => { config.module.rules.push({ diff --git a/.storybook/preview.js b/.storybook/preview.js index 0578373f..cf865ba4 100644 --- a/.storybook/preview.js +++ b/.storybook/preview.js @@ -1,5 +1,21 @@ +import { INITIAL_VIEWPORTS } from '@storybook/addon-viewport'; import { configureActions } from '@storybook/addon-actions'; +import faker from 'faker'; + +const SEED_VALUE = 584 + +if (process.env.STORYBOOK_STORYSHOTS) { + // Make faker values reproducible. + faker.seed(SEED_VALUE) +} configureActions({ depth: 5, }); + +export const parameters = { + viewport: { + viewports: INITIAL_VIEWPORTS, + }, +} + diff --git a/package.json b/package.json index 81f22834..9e6416f6 100644 --- a/package.json +++ b/package.json @@ -72,6 +72,7 @@ "@storybook/addon-docs": "^6.4.22", "@storybook/addon-storyshots": "^6.4.22", "@storybook/addon-storyshots-puppeteer": "^6.4.22", + "@storybook/addon-viewport": "^6.4.22", "@storybook/html": "^6.4.22", "@swc/core": "^1.2.165", "@swc/helpers": "^0.3.8", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 575be145..4ed7fdeb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,6 +11,7 @@ specifiers: '@storybook/addon-docs': ^6.4.22 '@storybook/addon-storyshots': ^6.4.22 '@storybook/addon-storyshots-puppeteer': ^6.4.22 + '@storybook/addon-viewport': ^6.4.22 '@storybook/html': ^6.4.22 '@swc/core': ^1.2.165 '@swc/helpers': ^0.3.8 @@ -50,6 +51,7 @@ devDependencies: '@storybook/addon-docs': 6.4.22_7fd729fae3ed30395c91a6c3899e19ab '@storybook/addon-storyshots': 6.4.22_eslint@8.13.0+jest@27.5.1 '@storybook/addon-storyshots-puppeteer': 6.4.22_ee73af2950fdda0cdee7b156fb6cc3b7 + '@storybook/addon-viewport': 6.4.22 '@storybook/html': 6.4.22_@babel+core@7.17.9+eslint@8.13.0 '@swc/core': 1.2.165 '@swc/helpers': 0.3.8 @@ -2582,6 +2584,32 @@ packages: - webpack-command dev: true + /@storybook/addon-viewport/6.4.22: + resolution: {integrity: sha512-6jk0z49LemeTblez5u2bYXYr6U+xIdLbywe3G283+PZCBbEDE6eNYy2d2HDL+LbCLbezJBLYPHPalElphjJIcw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + dependencies: + '@storybook/addons': 6.4.22 + '@storybook/api': 6.4.22 + '@storybook/client-logger': 6.4.22 + '@storybook/components': 6.4.22 + '@storybook/core-events': 6.4.22 + '@storybook/theming': 6.4.22 + core-js: 3.21.1 + global: 4.4.0 + memoizerific: 1.11.3 + prop-types: 15.8.1 + regenerator-runtime: 0.13.9 + transitivePeerDependencies: + - '@types/react' + dev: true + /@storybook/addons/6.4.22: resolution: {integrity: sha512-P/R+Jsxh7pawKLYo8MtE3QU/ilRFKbtCewV/T1o5U/gm8v7hKQdFz3YdRMAra4QuCY8bQIp7MKd2HrB5aH5a1A==} peerDependencies: @@ -5240,7 +5268,7 @@ packages: dev: true /babel-plugin-syntax-jsx/6.18.0: - resolution: {integrity: sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=} + resolution: {integrity: sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw==} dev: true /babel-preset-current-node-syntax/1.0.1_@babel+core@7.17.9: diff --git a/src/charts/bar.stories.js b/src/charts/bar.stories.js index 5fb921aa..8e2fa910 100644 --- a/src/charts/bar.stories.js +++ b/src/charts/bar.stories.js @@ -1,5 +1,6 @@ import 'chartist-dev/styles'; import { BarChart, AutoScaleAxis, Svg, getMultiValue } from 'chartist-dev'; +import { Viewport } from '../../test/utils/storyshots/viewport'; export default { title: 'BarChart', @@ -254,6 +255,12 @@ export function Adaptive() { return root } +Adaptive.parameters = { + storyshots: { + viewports: [Viewport.Default, Viewport.Tablet, Viewport.MobileLandscape, Viewport.Mobile], + } +} + export function OverlappingBarsOnMobile() { const root = document.createElement('div'); @@ -279,6 +286,12 @@ export function OverlappingBarsOnMobile() { return root } +OverlappingBarsOnMobile.parameters = { + storyshots: { + viewports: [Viewport.Default, Viewport.Mobile], + } +} + export function PeakCircles() { const root = document.createElement('div'); diff --git a/test/utils/storyshots/imageSnapshotWithStoryParameters.js b/test/utils/storyshots/imageSnapshotWithStoryParameters.js index 2f626ae2..b98ada18 100644 --- a/test/utils/storyshots/imageSnapshotWithStoryParameters.js +++ b/test/utils/storyshots/imageSnapshotWithStoryParameters.js @@ -95,10 +95,6 @@ export function imageSnapshotWithStoryParameters(config) { currentViewport, } - if (currentViewport) { - context.id += `&${currentViewport}` - } - await test(options) context.id = originalId diff --git a/test/utils/storyshots/viewport.js b/test/utils/storyshots/viewport.js index 6c201fbf..5244dcb6 100644 --- a/test/utils/storyshots/viewport.js +++ b/test/utils/storyshots/viewport.js @@ -1,7 +1,11 @@ export const Viewport = { Default: 'default', Mobile: 'iPhone X', - SmallMobile :'iPhone SE', + MobileLandscape: 'iPhone X landscape', + SmallMobile: 'iPhone SE', + SmallMobileLandscape: 'iPhone SE landscape', Tablet: 'iPad', + TabletLandscape: 'iPad landscape', SmallTablet: 'Nexus 7', + SmallTabletLandscape: 'Nexus 7 landscape', } From 81584ccb94c7889a2658dd3efa050bc7a7875886 Mon Sep 17 00:00:00 2001 From: dangreen Date: Mon, 16 May 2022 16:35:58 +0700 Subject: [PATCH 20/44] ci: fix storyshots action --- .github/workflows/update-storyshots.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/update-storyshots.yml b/.github/workflows/update-storyshots.yml index caf2759c..2a4c538e 100644 --- a/.github/workflows/update-storyshots.yml +++ b/.github/workflows/update-storyshots.yml @@ -2,6 +2,7 @@ name: Update storyshots on: workflow_dispatch jobs: update-storyshots: + runs-on: ubuntu-latest name: storyshots steps: - name: Checkout the repository @@ -23,9 +24,10 @@ jobs: uses: actions/upload-artifact@v3 if: always() with: - name: Updated image snapshots + name: Updated storyshots path: test/__image_snapshots__/ update-legacy-storyshots: + runs-on: ubuntu-latest name: legacy storyshots steps: - name: Checkout the repository @@ -49,5 +51,5 @@ jobs: uses: actions/upload-artifact@v3 if: always() with: - name: Updated image snapshots + name: Updated legacy storyshots path: test/__image_snapshots__/ From a0a706401ccef45d8c8b16cc80eeaa2b7ed4b0c9 Mon Sep 17 00:00:00 2001 From: dangreen Date: Mon, 16 May 2022 16:44:36 +0700 Subject: [PATCH 21/44] test: image snapshots sources --- .../BarChart__Adaptive-snap.png | Bin 0 -> 5933 bytes .../BarChart__Adaptive__iPad-snap.png | Bin 0 -> 13181 bytes ...Chart__Adaptive__iPhone-X-landscape-snap.png | Bin 0 -> 22267 bytes .../BarChart__Adaptive__iPhone-X-snap.png | Bin 0 -> 15611 bytes .../BarChart__Bi-Polar-snap.png | Bin 0 -> 7233 bytes .../BarChart__Default-snap.png | Bin 0 -> 4304 bytes .../BarChart__Distributed-Series-snap.png | Bin 0 -> 7505 bytes .../BarChart__Horizontal-snap.png | Bin 0 -> 20971 bytes .../BarChart__Labels-Placement-snap.png | Bin 0 -> 7701 bytes .../BarChart__Labels-snap.png | Bin 0 -> 7269 bytes .../BarChart__Multi-Series-snap.png | Bin 0 -> 5498 bytes .../BarChart__Multiline-Labels-snap.png | Bin 0 -> 13277 bytes ...arChart__Overlapping-Bars-On-Mobile-snap.png | Bin 0 -> 11410 bytes ...verlapping-Bars-On-Mobile__iPhone-X-snap.png | Bin 0 -> 18763 bytes .../BarChart__Peak-Circles-snap.png | Bin 0 -> 12349 bytes .../BarChart__Reverse-Data-snap.png | Bin 0 -> 5512 bytes .../BarChart__Stack-snap.png | Bin 0 -> 7392 bytes .../LineChart__Area-snap.png | Bin 0 -> 18140 bytes .../LineChart__Auto-Scale-snap.png | Bin 0 -> 9985 bytes .../LineChart__Bi-Polar-Area-snap.png | Bin 0 -> 14177 bytes ...__Cardinal-Interpolation-With-Holes-snap.png | Bin 0 -> 11950 bytes .../LineChart__Custom-Points-snap.png | Bin 0 -> 15335 bytes .../LineChart__Default-snap.png | Bin 0 -> 22804 bytes .../LineChart__Filled-Holes-snap.png | Bin 0 -> 36849 bytes .../LineChart__Full-Width-snap.png | Bin 0 -> 9385 bytes .../LineChart__Holes-snap.png | Bin 0 -> 28770 bytes .../LineChart__Labels-snap.png | Bin 0 -> 16838 bytes ...tone-Cubic-Interpolation-With-Holes-snap.png | Bin 0 -> 11950 bytes .../LineChart__Multi-Series-snap.png | Bin 0 -> 18798 bytes ...eChart__No-Interpolation-With-Holes-snap.png | Bin 0 -> 11880 bytes .../LineChart__Only-Whole-Numbers-snap.png | Bin 0 -> 39564 bytes .../LineChart__Path-Animation-snap.png | Bin 0 -> 30394 bytes .../LineChart__Reverse-Data-snap.png | Bin 0 -> 8293 bytes .../LineChart__Scatter-snap.png | Bin 0 -> 43797 bytes .../LineChart__Series-Overrides-snap.png | Bin 0 -> 21843 bytes ...rt__Simple-Interpolation-With-Holes-snap.png | Bin 0 -> 12192 bytes ...hart__Step-Interpolation-With-Holes-snap.png | Bin 0 -> 8664 bytes ...o-Postpone-Interpolation-With-Holes-snap.png | Bin 0 -> 8631 bytes .../PieChart__Default-snap.png | Bin 0 -> 4959 bytes .../PieChart__Donut-snap.png | Bin 0 -> 7626 bytes .../PieChart__Gauge-Donut-snap.png | Bin 0 -> 15087 bytes .../PieChart__Ignore-Empty-Values-snap.png | Bin 0 -> 7253 bytes .../PieChart__Label-Interpolation-snap.png | Bin 0 -> 5913 bytes .../PieChart__Labels-snap.png | Bin 0 -> 7518 bytes .../PieChart__Relative-Donut-Width-snap.png | Bin 0 -> 23033 bytes .../PieChart__Small-Slices-snap.png | Bin 0 -> 4662 bytes .../PieChart__Solid-snap.png | Bin 0 -> 8725 bytes .../PieChart__Start-Angle-snap.png | Bin 0 -> 7332 bytes 48 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 test/__image_snapshots__/BarChart__Adaptive-snap.png create mode 100644 test/__image_snapshots__/BarChart__Adaptive__iPad-snap.png create mode 100644 test/__image_snapshots__/BarChart__Adaptive__iPhone-X-landscape-snap.png create mode 100644 test/__image_snapshots__/BarChart__Adaptive__iPhone-X-snap.png create mode 100644 test/__image_snapshots__/BarChart__Bi-Polar-snap.png create mode 100644 test/__image_snapshots__/BarChart__Default-snap.png create mode 100644 test/__image_snapshots__/BarChart__Distributed-Series-snap.png create mode 100644 test/__image_snapshots__/BarChart__Horizontal-snap.png create mode 100644 test/__image_snapshots__/BarChart__Labels-Placement-snap.png create mode 100644 test/__image_snapshots__/BarChart__Labels-snap.png create mode 100644 test/__image_snapshots__/BarChart__Multi-Series-snap.png create mode 100644 test/__image_snapshots__/BarChart__Multiline-Labels-snap.png create mode 100644 test/__image_snapshots__/BarChart__Overlapping-Bars-On-Mobile-snap.png create mode 100644 test/__image_snapshots__/BarChart__Overlapping-Bars-On-Mobile__iPhone-X-snap.png create mode 100644 test/__image_snapshots__/BarChart__Peak-Circles-snap.png create mode 100644 test/__image_snapshots__/BarChart__Reverse-Data-snap.png create mode 100644 test/__image_snapshots__/BarChart__Stack-snap.png create mode 100644 test/__image_snapshots__/LineChart__Area-snap.png create mode 100644 test/__image_snapshots__/LineChart__Auto-Scale-snap.png create mode 100644 test/__image_snapshots__/LineChart__Bi-Polar-Area-snap.png create mode 100644 test/__image_snapshots__/LineChart__Cardinal-Interpolation-With-Holes-snap.png create mode 100644 test/__image_snapshots__/LineChart__Custom-Points-snap.png create mode 100644 test/__image_snapshots__/LineChart__Default-snap.png create mode 100644 test/__image_snapshots__/LineChart__Filled-Holes-snap.png create mode 100644 test/__image_snapshots__/LineChart__Full-Width-snap.png create mode 100644 test/__image_snapshots__/LineChart__Holes-snap.png create mode 100644 test/__image_snapshots__/LineChart__Labels-snap.png create mode 100644 test/__image_snapshots__/LineChart__Monotone-Cubic-Interpolation-With-Holes-snap.png create mode 100644 test/__image_snapshots__/LineChart__Multi-Series-snap.png create mode 100644 test/__image_snapshots__/LineChart__No-Interpolation-With-Holes-snap.png create mode 100644 test/__image_snapshots__/LineChart__Only-Whole-Numbers-snap.png create mode 100644 test/__image_snapshots__/LineChart__Path-Animation-snap.png create mode 100644 test/__image_snapshots__/LineChart__Reverse-Data-snap.png create mode 100644 test/__image_snapshots__/LineChart__Scatter-snap.png create mode 100644 test/__image_snapshots__/LineChart__Series-Overrides-snap.png create mode 100644 test/__image_snapshots__/LineChart__Simple-Interpolation-With-Holes-snap.png create mode 100644 test/__image_snapshots__/LineChart__Step-Interpolation-With-Holes-snap.png create mode 100644 test/__image_snapshots__/LineChart__Step-No-Postpone-Interpolation-With-Holes-snap.png create mode 100644 test/__image_snapshots__/PieChart__Default-snap.png create mode 100644 test/__image_snapshots__/PieChart__Donut-snap.png create mode 100644 test/__image_snapshots__/PieChart__Gauge-Donut-snap.png create mode 100644 test/__image_snapshots__/PieChart__Ignore-Empty-Values-snap.png create mode 100644 test/__image_snapshots__/PieChart__Label-Interpolation-snap.png create mode 100644 test/__image_snapshots__/PieChart__Labels-snap.png create mode 100644 test/__image_snapshots__/PieChart__Relative-Donut-Width-snap.png create mode 100644 test/__image_snapshots__/PieChart__Small-Slices-snap.png create mode 100644 test/__image_snapshots__/PieChart__Solid-snap.png create mode 100644 test/__image_snapshots__/PieChart__Start-Angle-snap.png diff --git a/test/__image_snapshots__/BarChart__Adaptive-snap.png b/test/__image_snapshots__/BarChart__Adaptive-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..5f02510f60cf251a9e27c37671e9ce0c9887b32a GIT binary patch literal 5933 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 literal 0 HcmV?d00001 diff --git a/test/__image_snapshots__/BarChart__Adaptive__iPad-snap.png b/test/__image_snapshots__/BarChart__Adaptive__iPad-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..754832d34dfba0a38a45bc2fe0b97a8442a0ae84 GIT binary patch literal 13181 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 literal 0 HcmV?d00001 diff --git a/test/__image_snapshots__/BarChart__Adaptive__iPhone-X-landscape-snap.png b/test/__image_snapshots__/BarChart__Adaptive__iPhone-X-landscape-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..6cdddbe9706d1f90c612dfc63ea58ca7adab611b GIT binary patch literal 22267 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%0AX;0T;T; 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 o3h%ZICc*z*4#6z^$W0(DMiSO5S3 literal 0 HcmV?d00001 diff --git a/test/__image_snapshots__/BarChart__Adaptive__iPhone-X-snap.png b/test/__image_snapshots__/BarChart__Adaptive__iPhone-X-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..363e526728e512d6188a2a7253c01f3d016650f4 GIT binary patch literal 15611 zcmeHucUY5W+kVt4Zo~m9NG#ON5S1lMkzo}C*+YSX3Nl4NRv>Osgj6k1KtQB`j4)(G zR)UqGARw|=P$DwIFo6IGB>7!8+P-gl*thR@9N+i*tNvj^NS@r!eP83e&hzB9;R)SU z%Qr8_U@)t`KdNPf!F;nAgIV}|=@NKltKr5Gcv#?Nq^pU^suvrAmoVRJ9X9cMIMQ?c z!oxQI9doG*)@)t6v{dtqqV}DA$sr=ke%V=LuUxpZ*nXR*m~up|)b_43avU)_p)bf$xEmg>lV})1CX+XA+!*ry{rjJP{y9W% z`?|Wix?E3MRXaH-P<5)^p|QKW^pRKi-MbZz2|>alGN(ck6B9#1oIE@Tr%NtXl7nU+ z7Zmtx!*7FZmX|f&9dWEc{F{v4hTy3@C9jWqT3QDV9H@wtwtk$HBzY{^sJqx_4`+5( zQsQw@k#cs%uagApxh9 zWFe)arKPJ|{czyClhe+&^`Vu|g1MZ11gPD1qwAI%%D;H=LT>NgH9|u4R${2Gxc`|> znlCmqWRu9A(zYJfG6@NHYH5*P(l=1tZy8=r-x+a?k(a>D#MPF2HK>U|s5Lo{xtnhk znpRVIQ1k8)vk2}(>aP4^3n2#w2RU_h@uZ|A&xwz9Ganup^fCKubKQH2XE<#Xbz1$x zb?esk)8IJ#vriT^9q#vn4YSyoh^ckIaA7ZRD1mprlR~tms23L(_eDF#N3&Wl*9cCn zS~X!{pOzW@@ZqTsPVkAh+u*d(+v4#&He|rghV_Hv;{-vCxxM6>zR($BFNX+`R6H(x zrKV@;Zr@!$>z}P_Zf<6BQCGXYW_ivCoT13A)mvhwJRq(ZL#YW>DER%Rdwi2pQ+M#* z3G(bZWfnz{7D;_L!t04!K4!BHVne_o@o@U%#Kdn`iz%(4aJwj5gnZrQW`+##2Z<@n zYg|puD>X4ShhT}9ZwM_nG&N9XpYh-G9Mbif_mB}gca^BZPlW2~>H)R3!NI}14bVsJ zez?BS#B}?E+iqQj5qL6=eUbf)X?8U?H`l+xbklOz?q{CSI!iH_A6F-0OwIjc5B1;T zOIsKIM7VYH=0~-Lckk@jez4cI2M)rQdM{mU@f1?A8Uj1_9p~P?drZ&%)!(?ex#ga3 zN?|JRA?++}Lmy%2$0}%BTX$VsEef679}?5m&TeZkrzzpYY>q}$jmHe6@WIhswZJK@ zin!5bdpx9{wN-|Sj0d8i71Y^Te!u558=ob}@MW=B5gw~7D8WIh%$Jf);u?OR>>xpP zv?_|c2F|G&z(1%bkg?CN35dwM!z!DX!757<4<#D@oagTCeSqpm3u87kXz=IqS&Jpc zx;5Xlv}_O(Dl02%Y-{uF^$!RPtX+UIy9e$OlXFzT*YVZZ&4rE)@nMj7?PY(fzu_3hlwh>SD4!dZP;NDf7hWp zyb==9;o`-8C~yYH#==8F$^xgW?n&yVPX$7>WXeYyrJ1C&wp#Q+-u0zwaL=DAx#ZTV zaAn%r-8~%kry}vlE#Z9Yase!Ejbr`8+pzrxv(w?>;Shm$7747D@<$+V*Sh67nL4_< z4t{=0Rn^rFuC7vdD(w#_D(VIX2D*0U@7fprdQn`q$!={t9=~$cD(xdjj^vX_23^H# zV8<%gAq08ovD5*G1kCNVpMM%r$JE*tj&98B$P8c&w`7=S+mr>cCR&dWmoB#3^kIU% zi62y$GXLV|->Nk)O2kMVh6aLD$0p#I-+N!WR0WmNS?#;Etvx-b)q|%x99@*w8nv~x zi9p>B4S6G)R#Zb>TF$+`FlXgK6&2X9EsReu1ZAJ7N7bsmVYg)19_70B9?gtoWZ0^( z^z|w1341ctfm1i~UU7}y0*kAz3NEH@!#7O}(nS92-P~CsSiW}s z@*6J)CWM6U)%Ir=>g)UX`bH6mh5FJ%Va@BxgzVh^{yrhZkN;SAj+n0BlasE%()9Qx zelQH@+M~GjRBcfrIC5)j-F6DBm<@L03x)nyqVBp)>%DjR+fYIV{v< zaFdO?jZ~_5FQ=7+u$Nc-_^&rsFgWz=>cK%L*Iu%kIDU=+Ajp$9$DZkz#cx7IYu%0$ zuLH#~m|$8qf0$BvYn)=sqVrHRcyCcZ#iB2qK=mtpi;6G;JU;YR{n_b>frjd#rc?(2 z8Ntj42^GHNi8w#_c1P9fh&|?gE#|gi_PHBT$(7U%{|Ot&V-L_KhnhUcx{Lh!Bh35y zqin+3gg;~?l;cLNAWLGUt|GxYMzzG=0o!6ZUeu0wTSonr6Zw6ruoI+4_OPgndl zpojB5Q0Y%3sBZz_2309_@j@XX07#6!P+0_zQ3p&jPVLj+rt%Na-( zN=k69@Z|e1;gt7gYi&wio>#r#fPpGQ>wtXEt3=dCL}YDBvr_;M0DyspBp@jMkf9nD z7M6?W^Fl%p0;f``$*Z?O3;iBpTWVP#?UU;CZFy*ay1KgT0eV|@uX$5bld(D#nqlTZ zC-j!P4G=4K@4MB@pIQuF#YecTx=SD!1iJnguy4$|8ny~0^dVDyJ-wd@)>c+2YOTG! zSl9;%`_8*pqX7f|fQ|srcvi_Tf?8A9&>jwHUSF8`47R#jHkc6_5~6fzq&>4s#EiN+=SM-dukY@VrCmah zKvGu?FK>`nRTV>>|JAEkeq%)geSrMp3kv@P-5B5B*{~npsKIF@*h9l6Gr~M7j1AP} z9l1AGiPlv60-~&)2XMrczpOEzD}(;d@;lFb=w@?W6t4A3K|wSU^)afk3De43wruIA zA)H6wbL0xZ5*hbLaAeCM(MABq)2cOio`BtF#(XIy?>s_aA~8}I-@G}76nx=A4zARH z;-df--F;u?uJWhFkoj|T3eV+$ynN*}h0hg;+1J_HDjcie2IT}nlCH;}Y_46q)?cmY z*0~-4;c-zV`0!PzDX}o(RK9w!!+};6#^8?QDRT?>hetZ{c1Vo58u+o9{g!kYn^M1C zFIb)5UKHmYd5*N^G-D|1eSy8RHV{lQ!>W)ScOf-Ho~_&W8s&_H#AZ=Z+Pml1LW_mr zn}%VT_k-B|QH-fB4_!D>qqOzeWmBD36J|>&vnBUlovG0v6%=Tjo12$TQv(~jx6+&aAw0?b>w8moS)$y(rPM<%o)QL~m5o53%Q1QsrT#~vp*1ZYFI7X$2?N21(&Jte_G3ASAUbUh4k1)Jk{NUA@zT_yI zJA&#nTk9VxuS-1<7c=DtY3%LeQ+Z{Pfb#)O$i0HY0DZTp`d!c-qic8%8p1FC3b7fs zLAi(ZkCJ^5UuJQzL=YYhJ$}9Z^0uA-!VQ*gu`$IZOC7I6XOjL?KZyp^1s&vZ+7OSg zTsJjp0g#!|3!v*5*VU|crX@R$1E^2O*49=_t4J{`g^_(GNIr}}h^i)8*7Shaf}AY{3nZXlS{$a6d@86Ks%9)YwSFXQ zg(+n>CL_!c6M5Lt(GezkN%7#B_lsKwE*1$Kqy(^5q$P}s-fr0!%yLO3GcTpH102-C z@!RMbY01gkE~ zw5m;d4HK<#^xcB41KOM_|U_5&S?3R5cK>s_WW4Lp@L_!0!cA2QW zP6hcE1j!3K6$*a&PeAT782$nepUwilSBNc0SMd33eDYP;gckm9c+#vZC8fBeq_!HK zL{91q-=;3ztGNGfdEZOe%iCU_%Y)o>w=j(jNc`i%_aWG}Hg`f);PFheUrTmLu(fVW z_A;rvUjye)Q+^*+goKJt)jM}Jn;>l64o~j?*SNZ7Y*EfP9j>kEog38s#>-~#JUTv` z<5RL48&2WQQZhI`^f1$c)LA-(TLq@0rZW0v@^`-jn z;IR|<%2~D)abR}>-g*6WELkat;|+~;aAf46@Y2uJW~eNAqo{&w2;fsF^LLEW@=s9! zAsjM7?NE{GC%Jvc4q8bs*L`k)KbJrQyp4b7H90w1L9`}GNc2Hd+uw>P4IURrQH1ZI zL5XNML4UXo+=hZ|*`!hFr(ahoAKa&ig*XagNWPEHO{bQ!INwO=hMhKhfn`w9R7_s763wPoAdG8lj|GvzfG3|Ezx zA7VdCPCiTJw6?Y~8L-{vXY?QuU814u$sIUgqVDeQ9#10gQ+k4vf!9|^u7BjNhv22C zsOSLE!9kE1nPA7E%Ypnl|9ug&riB@VOS8SRWy;Y{^y4A<+xrJG&ML zGr#4Jomeb%^11Zi>JI8LEq8u?eJLZ*T9a0XWwjKrO>My44=; z2jG@s;a1nTKl7yBxw{OIxHM3riiNK1y2pyZxlFVQu3jBUPy}o&;Q$}CsO=8X?{RW* z2?fTi5``+@3^*7$`ogOSPD!u)f~Q) z)5?FK%ZT)$q1z!LfTNWB-fVvjrxE(?`bSw190(X`X-!T|LAUP>k_U3E-}0MVg4nDM zA|Mz{MjY_3W;7bj6TmnVzncYbw6?Z(ZO{1@5o18w?vJ16(gEbn3}wrv!L&o`6Jqdz zP5p(z^dqK}?U-_V_VJjr6S91!?Ec_9d>c%Jsoc`DwUIMT8r-JYVZcD8lW&hRo(o_r zqW3%Y0d8y(A0HeH$;!%7y6~=?xe^ru&=Mo-uuw{5>Fm{84z53a`g9|VHEEcjDND#>$_0A9iEH#z|h+3GWqS~*W@0X(@ZU#)o!w&yp_=#MN4&}oQWkc_QE zQ)9?ZzHdKme-X)@*zEgyCVP(u4u`9fYw4ory=CPQ)61-?DBUbK8m&>uLEEQ=j$ST0 z<=#nY2~cGj+3KUsr}MGB&i+AWkI7FJTVMD&pQZ%kO3(E!&-yn2=1Za$x4G)$iLJiP zPNbJG0c@%^@yI4{hFizuH-@g-Z)Rd%MphqoF}Br@DDx~RMR+K9pxq+B-lB|Y_JVF) z8}MWU>31-B)=*hrVTjWhFL1Eo;`#IEZ|e(wQpt>IGv?kOww57j-Bo{MY_9d&6+u*( z2+yX@qr={}Z<&V%EKX#+XQiE0Yd(f_UuU(Yc5VnpDNW;p=joA=8||}E8bppynn#i& zfA<{{6&h$8b`GDEON&mojpE3&U+K!tQFzeHyYl&IPP4ImOBUUz_a?uMAM(mTJ)Psz z#rufYY2u}(2cNbJcE`erT-GWI!bCnY-1(Epy;uDgg~Jm+f*K!v%G_dQG@beRL5~4xqprh)6#!tIYw#nL>|Vao}(K06{6?dAK=d6y@%I$NGvd z(r$tHZVaY8ecSp+W2cHPZnFtuwIFU0q)%ufN7=c6oYWCfH&7oJYHs7d%_f-L4@fNY zJ<{>aWL=gUnggfvP(A1%$RQv{oIv6&Fjjpqrr!m*Oe@#ou5s!KV3E=r=RcwdZ9n-B zlw58~Zm!(acrR8+2>2}^4y+62!Ou462gg8tV*A0D=e3RkJ6AOTl_%#y>t}#d(O(+{ znl=ocot>TMh`^A!APKp-*#wAd1kM1BnYuhV`}akmIgH2S!F>w}H8wWNIl4jLDoU}C zssat%9EXGNbO}RPYwun|b@%hT5&Up`ItDTkO8YGRMbE)(FXWgoF5DSAg))ZjE-?@76!bOk0UKaiq}t zIJ~&Is-MPSF#PF2ia7oYDgw#^QM0NFaNo+sz(zm&0-UY`Zu?!SBx1$Hq_BXh{I#n< zSk8$o5{fMbb$gznidFQef_cHg-rl}-@izhj0=3o~-9ZzBV@X$Te)^}j|1TQ<_o-^Q zCSEO2qOX4HdX%hfe8E^>W$3gTIF~L90G7=XQ}x>mT$H3lUw4sLUMp*IQfr<)hu3p< zI{BQ5zeD0P1+YE5EWi3~j#Kn&pP1zXm{GAz>k|B43@c2bwGw6l5zwBq`VB{-N7l z1XAFdX5wBNrQwpns1>nSiAKpPg_HapcMu4Kh8e#Cz%)r@1y+kmhp2fiJt?@K?gG!g z01i+Nui?}+;3BP)ZO%bN%`1RhHvasB9&3v8B-@?K$<1|onESYRn8iA28_RJ{9|_Co zXPu-lSq1RyGs3uIh_O%*wNVwHz2h*=4fOS$z6;1|Y1t{(FK&}~{)_wsa}M|14X<-~ z?`Kx@Q=edsT$1>+Sm!puGL1x;Wk}V$sQfRfb6DiGV8QRi5C-!^{R_qRHKgz#y4e51 zub!k>31Tb)!HEG3&b|8w*lYhgYlJb(Ut zBTUQ?#7@r6cc4SGL-j+h74XIs{Yu%A@#@%Q)qD~BZ5)Onm;m#SY**2h%32t!jfesZ zGFL&xWl#ghwLLsM^z`+SYK#%pxKN;utq3bM2lMQLtms z(Bx68K`JanYWV!htE&1s3tajI1By<`gkv?tVF_>U@X5{D5x{XG8`0qWpcZ8ttPFBP z?gy`h#~lF&N&yi-LxL3)WVEr_crKj*HkkSux3>0n3mo&+4#rr?c$F?TXg!Q@j8PA~ zin#xWd;Zy=|IQONP~Ct&IepvqhAHw!*aVIiAXyJ;3UH}NfCHDyr@JgIC?@h z_>C5{_06#-7{9KN)iQ4C=8O2F$&P}@XM(2FNlDQ7+=Jn87!MNWz5|_ZydsI9UaU$H z%Qzt)Kugh&?Ykjj^K5*P8MIql9y5yZ{uWjTWOY2Z4Iie#exPB=Tq$jq>ddO@c&Or= zCAJj9N@fUX%sdxF^MVhWTANZ0s-blveG>@~?Rkz3nRq3nN5HC493tTl#T=AZC}?!B}JyFqG`%>IxPtG{kdQ zbQkke%Av7b>#upm0^a+@|^F03kxAp12X0&5JswvlwJ`q2E~8| zkO>5eCFM~0YnnEUo9O+vn8VlU8Bi`4jy zx>#uge^95wK!@?DDu%4_D7FQ*37(!}4-nKj zPE~^TfzxAQFK!7o_-7%hws(Zeb$IA)lBB2rj2Q^JAIoF|;S&8cs6hgo1u|?40%)#K zL&~0k`Dt#-gMSHFiyxjhEK1kiiIM6AyAqDoV&0$N7(*^z6VWg`H_-rE`k7Y_l4>Ab z@4{+KzBv+F9CrpnsNdr$;GLAX3E(m>A!pBknt8v~BHvWE2R9*h;U6*>`i5N=h#Ri! zG$K-!9-v~23K3fLj(ESmE7>bdZb6&MN0ABf%pRzurdqKVWB{DIu|gzLRpG6%vUI?% zX+3i?mNLhz)lP7ETnQ!3sh=whjHwQdA|1@HE z0_ou_&X_+;RQx!>W-=TIYK2d{at^jURU~t#y5y9UHtsm_@aHM@CBp=?b|{cchS4-R zYi?>7%GmLPB1367SskfSuHU#~TByGUwb&;ES9{3ID=$uNt+7E_ZgzGyPQ(AR+9iEn zHB+WwILsEu(8hsk?>X}cHJwoMcEc^9T~6z_j*X-RwLuz1d1uuOn8%9<_fe-`8&L_< z>b`R0)ip!KFm=Rw(luMNtXNe*NPe*eg746C=xs7mbzz!-E0S~d4W$EUpFUkEWwlx( zUr{x%(j|lR1uc^6F~UTq;ML^d!L)9Y_0IBZ#nWneKTXrh0$*wj&gPozuB^u5!6Zo} z5*e@eH%J9YWuAaFdz7(S^G!cWj*Z|hz_L-HzhCuy*kqJy0R9C4p&Lxu)#o$lR1;8Ujn_8_ zNpr+elp(e-+ug6K7(NMU0~I6HAR!!ZgWvlbBEmtd9x0&6HqEjxZFlQB7r=v-66r1T z)@%Gu=Wz(P+3p*q*ju-5(R4L9Cy@-UNM@{}Fa0iy8i0(ws;p+?{sd@jFSdodG=w3;g?%XY(5hhZ%m!%m)`fESZ-SQu zio8^>R}hfq+6fuVA|S*k#^~tB84`Y$v{76<9E>g%AWM)3UGfx~9Xv)xMx?N|;L`y- z0|;F^fzXn;xr_mJIphh|@$&L|sO+^JOU;xHVm-H536@^YFl;tvmR3TJ>R3ta*AA%+g?j0>Hu!>Ye6%xjgK{$va zNMBx705X!WbZlJ}*tPp0YJ`N4jYymO-kPn8j7AQSi?s?mZ_$jw#F7zi0NgIXd$S+F zDg3mHU+U3Iwses_UA#V<%yG^HTP=CIY`kdn##1Pn&`he12&&~jGNpoOR8t+T_mRAK z(4xewSW!Vyu^QQEz2m`!$t+$1#!4yK_>Rs_&LP@@$S4T&`$ulAt^`6DCNJoaw;kjC zKVIRrivb3JFw38tfMj<$wkMPcky?o`2rL&_z5$xt0sG$6m3jn2A}P^5PtP95jk?&z z<^qK9n)foHyPXampPoBh8F@qh~t%y@A zbevtYWa8DCee;kFO_P1~!5x6SR|NB*#?(yzssKm_8vePtcivMY9ZEjKCLb;q%}}Sw zJJ#6g0AkSB*KbO(Ye>FWy?}1>OR`m&kVP42c#$Je7!Ym;mI1(HQd-(BWH)(TlsZ*W zp;Zdi9XS@jgd2F4fYq=eew(KQs8yaV9v~U| zy8{rv5O#t$`hoeU4`%6!U^`gX9q=YU3!1&uO%75~pB>3#l57!rK#n)0SD>B=#YLMq zRoD3j%&17E1C{{P%iG9u+eV%$Km!XqmJ8k%U9il;c8K&(H@*ys8+Vs~@jG&HGV6YdnlOP*P2CoS{_D{+bA;$w-Ho(gizeVBU>| zQmrt4HK@-@p=*N}^|0{x^D^{j0LXq9G&{BIxaB?SGegY*lE(}!= zG(ci$fl}_TJr<%eT^Kyu)tmKx=l6$UvP47+kQL~C0BsOwfhWV1r!n_luy%H{ZnvfB>|t}w zoBf~aRmLk|v@zio!RGP?3A~q+&gm!SHS`}NtFUwL1T>zowqEvzAwdi5A;6tPdMpM8 z6z%=&)VrGzQ!gb66_8K!e`De4c#nk4+qsSn;-kF;UrrAkOuS_e``uLd zve=Jdj||g}j;R_-Phv_|xb*{Ghf*J+VqAg%8v3gj!2Om2m!VJ~3+peHql*sJ;gA;z z*&-_{D)RBR;9mzHQx!V77N;}6oP#?@v)2qr+-jq}AR8vZK#S%t#0~1w z^AH5`$W(^K&v{O=Sd{=~&W}Ro@F%MgelBRuEci$s_m6j+3QC|UeJsxEC>$O2zy2(2ZY@cO7Yjx&4CZ8f z3(!f2e){~wWAu{NZFmKTWc;T-f*@g%Hars)B9z;=I$qu4WGK>F0AFvKg8vW3Pdp~_^ z*C(n`ufi5Hh609soAJXo&Ep3ZdCX27YP)yjNM+u}^R){3`yFzvr`?MrOquRQmd(TI zzK3kGv-azl9*I$LusCL%vBf6rc)rixEd|FS+_ne)Z<~*+p09?5yNvd`fVsX!xoDSN zJ2%mGU!fmxcO4j|F|$?U>iZ!mUHe%t!X4AY&edfxdhl}H^}S6 z*=LF(JZkJSVtmR zw#hVFK39LG$yA|sWW-Z#*Dg~W4mZ+SvWxmVdrypueAdkfZQHgjt*mTcY+RgbbR&&M z{rK^$?7jFYb)@ak2aPSt$lM;0r(rKLsJf5_VLk>5^RTU*ywic^6HEx987^W)fjQ_!m9JwIw` ziCI}$xfiy3Y9}`S`@gcQJ2889!&f9U9G~m)R%hulnV< zF;=?xF~{GJW>mPL-c|JX_d^a}=<%Yos>N!gN}Ky;XJ!VH*58>C6c(nwer>T=TYEr` z=T2tK(Tw=pw<8ax-oT5J671B(({plE_wV075w*_ZZES3;tEZ>h467>zFN)IED_#X~< z^}fQ>hw~)n_(oMst-5T@#YKe(0J|?xKImOx4WHOlH*j>Nt3M zc3u~hg}R+pVvcI+>B)p1+``&{(#o?}GqJO?^YioTLvpUJu3p>LWk$dZo4Y?yU*m^;l9w zLQi&OEFOtoYr-~fccn(j6_l1r8W0k&UL z^gav#gP>u%d2+>h;gPu6rwIU=eT_>kCvmj^!{$EC#K!hl{TKGN+>@U0>LUaP>(hf+ zmG@p0HZhCh6BBb1D&YH_^OdvooDov)Reb=QW6mU8dWO$a3%Porad)cWCyyHLSL9G`5PnV8*k1mT-tIkT_( znnr4@b}yqzuYrULOo?RF88YWu5RczLI-Y8;hCHG-OHEzf22QG5Q@=L9KQvjW!~?*f zbP<$x27( z2UI^D2?jD>v!u#vk~6$2oKUHm#xI z;c%-gv%@tKSuP&#?u@~#6z8|t@2qg5nsOp2C}`wExlWXvp17*2>Uhm&bM(oRC+P+3 zC`l@5B&Tas`JfSsGakE|^IJY@mj3CJ_Xa`1!*1zD4AfW#aCTu~q1hR((|6XmDlU-^ zHCB+3ks&D~PmeUD zy?SM9lN@Q7H&7QTV-wTrsS#ISVB35HuS|RU_O0fgJyu!-?S%?)UteFF-&#GjJ@kUA zv;c9Q12n_M`}Zc|8{H?}TIGaP+CJ7PzwpmRl2+g2#j)_kvGQFk zNv)nIE=&4DE4^LHPZ!l?sBcz-4C+<}tGZ_F2anNq96Wc@`O3ImXJQ3x_l!q(MTQzxINhom8ZKF0T}e5+grl8~%@Nnq*51FI z@H}#Lx~jKhbuNWCyR5C0*5k6W?_zMCaZIVEp}fb;GBc>!?$UCL@P?X8xT=_+HMBDy zO6N>kW0(icPEyUOK~dy>W1K)+ z-ka4HT>9v|veedJo1GR0X^f}Q#0Nu@0VCeqYz*Ku0BP@6k@gOaS5XFt?#6Xa z`-cdtp;>=rqOVv~6x;rdT+rr*uDkyS0dLkNB};A~;d) zjyZSk-UB{yQV=#UP#5&;WE7XhB=kwq@Y=OT_V-=0o1dZO@bk}Mt-{WD&0~IE>Z{LoA`e7e<#(Ga)uTj!+r&Yd- zp%@m#^T1wTJRXk_({Xu_)0AeysZ(1zIy&xciw1GsI`O`x#kRfNNs!RsURY+!Y;SLW zDb#lEdErfFecUeU#lG9XNlcwTcmE4zNqDjYKIcW1|0dXT57_goSFffOG^sD5W-XzK z!(DcW@)JzC?h;_>(%Ky%_-G%FcZ+G?O3T043a&mHJu3V>U&U2&M&z?JXVL^{<`^=K{r4a9uZW?VXzxpvf+BG0R8<3P0&BkFw4vJl$3^shSIXKw!`a|DO%w-&VoZWAbZM91OxQ;Zj^&e4Z2ykl9D2H=z+>Y^7@j|1~c{#i;GRl9HWlKX&mk+IwX6YUrKFUWm$&Qj)XBLy6xH6gI1`T3j z0oDkd?~hB*%~hv%@fc5^1pVhmjXDgJ;gL+(7BJc&CQ?F-4jO0F&UIfAPAe+XN)A~V z44nOdN0^x6QYEj4ABzCtrbg>pXKZO!ZP~oAuz;+XkdT0UT}jDsdFrih$WkC0{jRzB zFmPXRuS^%2LZR3La6wb4A+_(Q!IYB2JR?lJ*q)x9oo%@ujZWI{uTn>)Dl4TybYL7A z-A}GGwX}#Y&Wwg5!6jdsX}5=X3q5E9Vse;6?Pb0mh{S{vQelT~6NPd%-;R*QP@#pQ^cqt?4-8+%ttbdSy^d9t!*V z&6`c;`s3&Z82nrjHnb-!eZY4`3P@<6(P-HCy3~qMB97VixWMt&{ z>qEk|gKx8xm0Z2NGy+E2Zu%Z2by(~WWdOXPd24Elz{(L|N=m(Z4ytKrn81XkpTB`j z7B-wy3|Ss_F(nd-&`|rtWH8Tu!D7P~Sye_zUdZIRkwO~db?TuQ;jCB51}FC|ceJ%h zW|^l%87&W*kH6AmAt~`HJ^KLZ1yJ_m`?Y$dH zuXm!qz5oP#h4Q+05q$E2iZA;w{A6xU1?+7Kni&Z@n7XmIx7TOvec4ed?|KAxU5oTt zMn@5L{0W~z-|x~Gw@1@G?`p#(5MGcc^xf1Yt^_0X1e>O6cLsQ`&S>eGQO#R(BROPb zgV2n)goLk|aK6v`Mkc=kami<-y>R=rhbWnosTO3Iqt!;r=&Y^q>6x%8IH)9pAnlcf z)~Y%XCa@V0ICOW$Y}M)|M7azM45X!|ZedQL26tfEH+nfq`1L#u{Wv%n_Mse4efsnu z2(yX{$2X!}x^l5(Q|MLovFc5)UvG>yTsR9_F+L&TIy`uHR9dw3Xq~I?Ppn^)<8@yFBOI z;El}?8IpKVLZ)!M8bqC|&)xiU$&8af9&ZX3^WnpX*2z{XF)FR@CZ$61-CpoU4S-h? zCP^`GDOavsDRDBA74aE*m;KTu55`ywMjGofSIaL3DXJ0C(Tk^Wq`Xv%9W{VdoGKe=qCi<_5NNGcqH?wo+#!M`auD}PH8P+tX7d0 znUp#)CSsUE5F~=2OjS&PfJhj{M3hGu13fo40o1qF`_+G*m6e>FbM86&?EQV;-ZvI| z$R72z+Sd>Sq4w{yI}Aa~JwX4>3R&=do_tIO{73~Iw*MX~Xi^`Bpw)5v?RFm}rt!KC zo=fiUknPFUe6SDqFuLuc)N|d`-}ZUZ^DvW&X*)dnUTB^f)f{^AhxE-GiJM(wmDPK2 ziq3xVx3_9;J%52$z3Qz>cVeD^k$J(I7o@Ip=r7$fD~gPpBgP+e@`Ayka2uU}d7X}Q zp{gHFkziv$+sB0DklrP-lrqxOQk33;^lY?ck0U*joje8UL9wbHQb>0Vrs^xC_pRrb z4S^^ANgrOGJ!)4I8jZ$a zFqf%{;@R!~Rl&Xi0oy8P_;giG&0l#u-tTE?39OT0TM1i{HCc9?MFc4^-Tw01p55-( zaDU6wPe0*5heVgkr8fHH6%^F=^_}K#0y`wX^fl>yaqo!e+D98`mDPG5YKL{ zH~TUjc9ebEB2Uc3Odvffl@ima>PJ-%dKC)Lh7=ee4H!kbxqg8!cxeF?Im0U{4IMx0 zT0z7R)*-joH#PH^vM2C4v6+$6-w{yAXx7glo|KXj73;Z4uQUsSzx%^MS-?!29ir20 zTH)yj57rJgrN?)locBYXs+w=hq*tAy-oL*_NlEE_Z@gjcz`#IdWC?)I3lJ}o@Gfhl z42DbqQzQ`lH8IuB?h)&v=7j`1y9X}$?DqCpFkosmH_3h0D7K}dU>p_v-yq}s^yus7 zW26L-e^>dsS5fm3;2zZM%&7D8Z7HxqgqW(K+^d13&Yx(LJznP^k&5>+VokyRo)aO} znMt=fW+{}XejeW~&fhpE>XGSL?S8dy-kjyDflZTHz9xarpwmMhgJa1MNCUFjXSb3= z85wjC9-CW7c`H37vIUMnQ8Kh(*#!+qT&GN2BPp~sf&P_<-4ea91^c(V8F+zEPPOsST@oCcT`%~NndE1bQ(Ph$pG1pR3yu!j}@ZD@SnM$Q5MY28u?+(w7 z8?Rr#o*cM-&hzx?Z~3ntYF@c=1!HQOOc$pMtoDN2F5c@v9e1w^uFuvZ<7lb>E4aGO ziD-&ji{Eyy3l~gbq>~zg5SqZW&Nw*(V)P`t)z^-3ve^wpIqPtaU>Q|HIeiBJD#z7e z9Bv@%@S=T+PPFUPfPdb-Fgc(-#tZaC2EZ6rRl-!re6_TniikhhRU*5wCKA}#fQtnC zdU@$6D=T}3hg)tpGvfkH!3*BDb7)`}(6V0S1WOlN6Mn3@+2voy;kc$*h8S(I3RlgH znhS9_c<}LiZe5VG*t`Rel$aW7XmtD)J;%LvOsZGi%{zDWf(ZnRX*ZEQ4b>7X?jm)T zoU3Cp?c@~{1`EV`e3gu*%sc@6caIWYs1OP|0nAbtf|`n^SRTo3i+lWd4_BN3M%{rA zZDDD@c<~}}B)>$ktFjyxriH75*!YHo>?m-fE3*pSqh<*z2Cn3L_wFU+Blja2;o)Gw zO+NumS=-yH#H6_#yyku4)6eEBxwR;^f$#R~)bjFF5eNIr;InL6Eq8Nd91DeDkG|HW zN_#9Unk}g|*4{oVou@~Zr~{@dcz02I-rLKk03Z+>KGw}8Mv1J0Aa$}-v7CsT`pZS$ z)K8V5L`%`kW8xHnV0P`=HBTIFvw>^rr3Jrb0KYwNXgDA*FVE!j{YB{mY-zJ{J$NQG zbmuQIF%!Zt5j3v;goY(;ZKK5MOZ%euUme5dwu!_@OZ&}uC?8IN>iA01VnNj@^U2e6 z1v7sRIXO9*4LCN!Dy$REOay(Jb;Z|8x{ZtYNkhnSz}@N5?P?Y2WN37$Q*QmIiEzu) zK<~gdRS&sQ$IWxK^V4HP@8*w$uLt{Vz?rDw-@LfTF$I6jA6f2pCFMly1zZa_Zlab5 z%RdfG96iuhT-42h?aumFLLvBBa#2w+NNVskQ4^<%#Uv&w`mpOiBacWRH`PcWE%C>n zFkAWtGozBm$H&=SU5PIF%4eE08r@ccP)CSU8dL zjiBES4f?oPG|zv7Oqersiqk`)&9i-qrkI(Zv&?(y?m!MGU!>+bcg_!4JLfxvX(Q@V z^@G6IA}rLuTyEXE#qQ{clT$J1D*$I;_shx2 zwVtKjEG#sHm5?#f9j~N!sINcYPjRpCFIG9cdWKG$F==YR4IXMBxYXON1 zat1EEn-?1!OB9Z?bhJJ3cueHv>lpK>x$pres6_*$LyWbxCYQ@C%e71ahLZ+UGcuAu zsu7`f6R&krO%Y>muBxDE^^7eGmE(xSNo+!)B9ezmwu8;q^9jSl!(e$jZ*ezM97Hze_rKoQHdZz=tFxGSmR2ib p(EO7x6JOr&V9I=XsYQfi&6J9ui)+`$phv<3`}Z8OEBM|c`fuL&Ns|Bo literal 0 HcmV?d00001 diff --git a/test/__image_snapshots__/BarChart__Distributed-Series-snap.png b/test/__image_snapshots__/BarChart__Distributed-Series-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..353144ac1778cdca354e1d16b51ac0bdacb9089e GIT binary patch literal 7505 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 K7DeW6Km7+NW!HuP literal 0 HcmV?d00001 diff --git a/test/__image_snapshots__/BarChart__Horizontal-snap.png b/test/__image_snapshots__/BarChart__Horizontal-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..77961f1497c45d7cfb5c2e27571333b5879406c5 GIT binary patch literal 20971 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 b{1TT@=(E0amEm`g+@I1j(#<_#|MPzX>fQA% literal 0 HcmV?d00001 diff --git a/test/__image_snapshots__/BarChart__Labels-snap.png b/test/__image_snapshots__/BarChart__Labels-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..125cc0d45801cf72fd47c114d51d84572393ca91 GIT binary patch literal 7269 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�FC{thr*0>Tf!{?PNOZJTK+g&9*0RI3pnc{pbai$4cR%~dmg-{SP);~}J7TsE)ok-Kbwn~W zU|J(;VwKCq23UE@-FS>gpq`!{ZuY@835`lFacPcC3&UsQD)jZI+asIh=vT?)YT{xq z(KIY9?1Z^_HH`dX2Qt0YzQ{N3tElZ&;9?aWAF1hslDq*H^MQL^HCPeXbLTz_4GrzA zj*}Q&oZ~Xa-oJ1KFidjWqiX8!p{c)^a#B=Z86+%ZkYdA_jB2XO~IT&Hg!KJ60}DkD+}?! zGv>UED=+f$x%Ad1Q~lb?*;H4oq}F*EJA3=(9$EMVGx&YHjmy;VJOBQ-nX(ZZNl{L4 zBCrF~N_WjH)P2pl^9f2_g&0+9mXF5WxP7}k+zf-@vU75j8gd;a+-q;eL`M@B25?k7 zw{?2Di?Uy~6QD=^_QiGR=}>*&Jz^L6;U*>~Do48*uAZLq+og2Hl*>kr3^o^W$zeN? zmJ|SVHNSG%4z$H*mOd7r5`Iw^tS&$M@-~Ui4=fx-)xFlZ!~qomRf5Fnr;l=dyu8r* zz*n}9KL4t@SpsbtzR9q_!j)}bG)$Jug1U>w82s;kS+Mg}&>ej1S)j8h#ib#F)c}{y zx0&BC-@e_Yq@?6O-ctj;LXTiH`Y;UxN(DN`m7*sSB`8hyV&$TMcvx5nMcCG%G)U9|oAMtx|wWpm8Bs!GT#D6EwkL>hxT{e%-^zC$6Wb2Q{`v z_L!Fz7P_OxS1A<6mE8(}rx|jJy1Kdv9*-x?_GJhOfk_ncYRL9?-6}&>p1V~Fl!a0h zMgpT-2I@)#byhEHYfZhpyjDo3h$2m%9$dKK;lUvfSm!#3qZAE3X;6n(@w4I4Bh;J3 z$p`{{c2(|#3bcA|A08bh{4zK#OhwpBrd zQj3Z-O-)TZUnZ(DA;yqlCQI_jwmt})3UoK&f0S0y-JxeDD~m$k!{ZC|jB0MGqitN! zRnW8Tnx7dT&G8FY5K*$*C1-vsy05Pe;84QC;#hN{}%#-rMy${W!P-&~6t`A^2~y z>RmuCFzf4g3kfM$XGcSkVi)?@8xut6x8VrPleKq4?lT)2M3R$}i`pmv*e+lZmBWX{ zDf+V>igw*+ghAwJ8ZGKY# literal 0 HcmV?d00001 diff --git a/test/__image_snapshots__/BarChart__Multi-Series-snap.png b/test/__image_snapshots__/BarChart__Multi-Series-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..4e467463beabdd6564382611b05a2972f64e7707 GIT binary patch literal 5498 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 HdPV;Wp(eyr literal 0 HcmV?d00001 diff --git a/test/__image_snapshots__/BarChart__Multiline-Labels-snap.png b/test/__image_snapshots__/BarChart__Multiline-Labels-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..520a1dbea7abb98888b4d76eb56760cdfd630f36 GIT binary patch literal 13277 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�@H(gOklU@L>#rVVMjSzJYlPFt+uiPc(+sJzgz zxBUw33u)JABAV|EO)AnUo>aO_}_<1*js2*p&6I)s$Ac z62r^9eEBkE@|nu;!~`;%;&ec%qWKCM=O`w%9fPHvh(ut>H)-%C3KTzR_$)GcW){(<)byWH#Dc25y6-K zNJsD4g>MxorrT`!Rq*y!L4xJeDd9Mi+k&VPGz_lD3XvF~Bh2>#H6v$tSiY`JI`U^h zBO?P!mrmKWIIuv{+k^jSD=RB;1zS=fZKEyN3M7&=nBu^kNhLwP0eMyct038L%KK89 z3N#EorFM+f?}9H4ytuvInzBcmI{$4ZO)eHrjdn1Q|0QlW+xEhCgvtQnkDYeludsXxM=KguW^Z^6Xgs&DHw$TUQCI1d)cIS&SDv z%m{sG7bl~PPR;#C@~E|RvgUzn@fO3X zX?rw!@y#Uh?y(d#+orduhgPPquW@?dvU6zu$~t2u-p}BZ@Q0G{E#O`vE)P$M%o6Ux z8|GucII_IwRrWCv%#wT$38swdvRCTb^boI(IDhM@JUI!{-3MZzw`$oCXD(FGm*Go~ zEZxXvuY+gz*D`@PgG;Cr)|937`innXQcSQ5t+CYI-8c-915-5Ocvp!~`y4bB8z?Za z#)OcyG|s}zD4O}PrH$++*mRLxBFF{bQBWze0oG0gcjxbQ`HpMOEapA!oou2H-d|f=04p7 zcE+Z|F@q!R1uzjgUS3`v0!suN#TR%lV*c>TEAW!9s;;>8bg$gbmq82b|Lt`p%MmTVlT}DQCuBfQ{fb9+r;#y73 zMmIuL0vbku>j_4<4Pd)?4w?6a%Be$64^JmRb*{GzH-apH#A)8p@d(T%KS3=-;xSdW zaD5WLtojOZqNfa4x{qvOCdG{4DURNUn^*{34^VJSSphykFN)W=J*L_92=Cv?sM2Y}CD3lL8Bnr2DfuSguUVa9i zaL%nHn2(VJRdcT(s`0wEKF~VNFTAU^qKj(1rwThrBd_z2Y6ZAK$){ccFesX+5G2+$ zfjKk;1}-iREj!ni-eSzLjNgCnLI>H(@4N4|D#Ta?Uzpt9(UC-#jrqEk_&Y*OC!Ssd zuNeXf-AZekb{eyq34s+>zK3TX76>>XN8)upnN|Q6bczr+JKml2(2beHWX{EuHDn)4 zY9QvoCwu|MTw&IDcTS!!$_H6F*lfma0s%n;$pli35A(sb8#ZiTbBsW51Swt;? z!5A_DMil%t?D>Ph_u9Z}%goHQc#&AoR)eX9sF*G@xV~b;Q79DjCzB>&x<0+o@4>iN zS{m9#4u*Y^X#A#>-#atffl37VV>r27R5duk8G*@BMT~Z~y74YQ1_tTSEw*@sZ@ ziA*ll0{Ms_wa~oGvA}7Fp;%xb`fxB>V+e*tWf%JQzhU6%unD}^c@E}46Jh@B-gjw& zD*DAC*9Iv^^dbcDF@#KF-62_62$_8M3^I@h@3}rcivz(DGX0^|9cDbxryIV&0@a=4 z(%6=VOifLxd8F469uZyMMmq|Cc>46|5ZK*H*gjV_HPVJ|Z8fycsnFd#i~OyYGCqCv zqv{7K(hKk2J-afrdKbv_m)|R^#_7OlxbfGks>R>dT$5g*O{yc1M`(VunSS51dOt$bbL|=1^z(Eg78^VFa|)K|o&=cE~{y zYCs@~=NdVqvDOP)Z7rw1VNKm8^qdUOm~K6+4c%JLkSz@X1W1Gl4TvV629@_rjl*kp zxF-`LN8M2L0D__8J`U(DM#>!i`xz_{WZWoh18A`1)4j|@^^D3eRF7e zDER2!kn6OLvZk73=Z7#_gs$8S8`{`y#yuaHate|Ng)cmO4+@6H_R}B32X~!Ik3A7) zxJ95_o%P_~w8qDcgY@f* z7<~u^(co|{y#;9J$E3R21|wYCwVUD%&0?dtd<# z5?wvU7pWJad%)-%PU2KaZ&!8`S?%BwqOqoDb_IkRn%cz|;@%*r!68dsBA{S1@CDP& zNrR&C=Ri?X(yb%+qG2M;AHYx%kkpLJ)?i}G;X(K_9e564YzRP`bOiT^QSBG?Y8z5 zwZE6~cB!B7yfnH8k|X$4+~#Ab=Ali3HCiP7T2fWmAKj-Kb@=2xyQc%9DnrQwRyR=* z%Cu(cf^Xqo6)~eKtHJ`j0Tnw7ecPdQFRQ~cpUq~w|K|y7#V)v-i@BhiJ_=17`t;Be zAuw-XCk}lP^NsTxMZZ9U%M!G}n0OIH^Dqk&_zJ0jMX0qf95vp(#4a&zvn+U%Q1%fI~uJ5ITZ+r|Bw$SD1c7V(2dPp zGXpHr(Q_&SXc(9>iR^xg8ET!-fdy$DkSKzPmfjbPvp$^h?z%?Ar2s4Eng^Wl(|dKB z&q`D4UCM!MthWdaY%r@3gsQzTib`>V9*>SJ?Db8Z{)y+vj5%hU(%6&Pb|u~UgqgLq zsL9xzCZ_<*i%+9(=y>g@;1(};v`gpUUa;2W7hlZ7kx&4rAH zw?of_76!1=v^BThd~ncm1e&00k$3HrgYU_aZ%73xOHRdh?lLeuP@M)1~>0Y$wURB zd=SUS&}RWVkOzja4-RIKzJ~*TX`t5-Jwb*IOjnV517rXl3qGLlg$qV9nG8|+4%Tc5 z#L0k8UGPI#2^EHXJH#CUUW&bIZwlY&A%KU&QpJ{FO`(Ai+CliBkU4IXzUO2MDWo7_ zP=uWa2q6N4ng*E+H$dGZsORaA19h?Jez5(SuOwfIrLnIORR(r};2GTm#2+eBFd6H? zvMYu*hZu$VrIAyhwg8wfbhJMMad|xN)HX%`%=4ADJ;7@6R?#^X2zEco5JV4wohKT& z#sP5j&2+wn9YI792GLC^#=Z@lE+AIOS{T}{$_(s`gH+-_zp-+Ne+iC8p@F(kv;b#h z(3(&sfJlHtJN^yDG)QgpkijFL4tk(xgZc(m`>plDhpda2E}c7jRtJ(AOapW_(0cye z6_}x)1r85*42IrTyaSXjOe}J5C4p9I0X=7@?j0^)bbki3a~FIEhJfnNXIwx9N|(N@EhWQ zjv^t6P!%A01LfX?)qtIsku!pMC=9K&y|kuBkLB30RUK$oyhB^4n>1&M5;X zao~D`WNU}Rh1JV}d4K`Jr)6?wz1)oPQ$D@uP*{>@gdYqGlG~aJtmnWC@PVXqQdK&Y z2UQM(1Y`DW0Nb=XuPGliD+u90cpK)C=JguStJ94-*a66g*BMH1!dR~3EzHjVA`d|p z42_p#l0Ar#?qCEXD+)%ambK29{5OOAC|%pkCg^Uy=9a6pSxzKvyG){|% zgTeu=!6W&#za9ZKi{;*dlI zMr*o7=~NL|DWDdz;m{Zu>#k3}YYohu{w>3bYzlXBt%@iy^)`xzezRy5+I>~}<)`De zzrdLL5B}leum64##o?o&`tN}JI~o38NCvS&iF9R~iT%{`V6+_EL7Q(1_j`T+KLED` BeYyYu literal 0 HcmV?d00001 diff --git a/test/__image_snapshots__/BarChart__Overlapping-Bars-On-Mobile-snap.png b/test/__image_snapshots__/BarChart__Overlapping-Bars-On-Mobile-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..b92100318a931ba6b17144f9c26410d628ef8a1f GIT binary patch literal 11410 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 R&ZC(7Sy4?P>x}WO{{hd3*hl~X literal 0 HcmV?d00001 diff --git a/test/__image_snapshots__/BarChart__Overlapping-Bars-On-Mobile__iPhone-X-snap.png b/test/__image_snapshots__/BarChart__Overlapping-Bars-On-Mobile__iPhone-X-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..b7679c54e50ce10a4c5bc7003054171ee2d5bf19 GIT binary patch literal 18763 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 literal 0 HcmV?d00001 diff --git a/test/__image_snapshots__/BarChart__Peak-Circles-snap.png b/test/__image_snapshots__/BarChart__Peak-Circles-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..b3592b9fda6dbedddb6757491941db681f9fac10 GIT binary patch literal 12349 zcmeHtXH-<%(ru#xW^F}4NeW7k3=$*=DnTWQ2&jZcKoCiink2zvAcKkuNKz1x*djSL zNX`-)nj|2x36gX7tBu|}?s(rzKi`k9$2f;Rhs|DV)vB5`YgYN)R98N<|I~gI3U%oE zHHBL!6s-|_pV~_U|914%riLF>4!4xApfZ}7CsC-=sOt)sZ@Waz^t(I0U5(&cOM3qN zIqEtM6+M+5x?21&1IF0=4dd72($Nu>5ixaU;*rle^Je>do=fIM_h(_BJc)>&smu3h zn2n04v{vm)DoPUV_j7kk>a~`pc{5vCE_^Jr-00->?pp7%^FrUA3*>ki(MjiC4$GV3 zPrelEaN4b2dv5M2xBcjL*W9Y9eSy9JY!LY{=6%a%`tubP&bR05->>`7WxM`-J*$8^ z@aNmBqf~rV;%x~T6Si}{v7dz+*XU?H$FHCFMmJKZgUdu(fc}gXv3(zg@mRR4Gm3PLBU1!C`mMlfMfIA z>M@TE%E-uIWMuSx`SNA{+Hio@^f8n-!IK;?LDryLRKJwTPa`Fzv`pl27_VNk>{6T= zmt$y`TPl}v+6(WNPqy1L-#ale;hU_LR9#k9_S=L@BPOuF$hn4?V>$A{GQ-cH2&<@} zq2X_^3-vaGoSW-1sTCW%vWg3ue($5iQmUkIko6LC4P{GkxXg!Q;iyk}J+Zkg>N-J( zZ2cC8w+E9-m_X1;QM2O7%;4bQa8Yx01qD-)h;V6V8^^#QB{mewM8f6QHD+>kUfgn= zbB!Nmp`tRQcd>gU)2nH;b^V24RayBnKLZBjg>5D@(|ebfmMS}vwR}h^DJhb!3#R@o zRH(P_%dNx@+pOtFJ^3}am?ba3(9@(BXG_4Dln=@E0 z7Jh7Y;NrGR*nG8$R_Uyo$P9+QD@W1-V$yr}=W-&8gg!%IpVJHIGa48epzYjNNv}DS z<1#aaM>9|;&b&_q!+>VN?aSvK?)n6?g@jSYy;z?0Sd|kHNHQ9({}q+6NiSIZ`wFw< z zLwinp^S^3tZua$k`0(M))Xqma_tJG@<5{Oj0Uiwk{`&iskKm)fMTnYgXvF${>&Xfj zo>NZO`THF5!%d_k^xes?)IWN9PWl{SQ!hH?{pPFt>MXeDwW32tQNi1Tl+uUa3BJCc zj&sG$NjoR@D`{S|8&=59%S-B~k-z@X);1(9;up$QLP+Rn5q9QA(IFHkm9)`;kGI>N zcpLv{YdglPljggyu#l}sRs97Y&taJV`%P`M)H^J%t&R@8$_K9#?|22&i$ddGHJQby zrt*IH@S)9y+NjOa+B#@sW8+JDx?0f*@9XJ!yxhuk&v9Pe4Ar6&C{9TPF%?H^Df3>{ ztzHziHk%Ra&TTTo$QEUd^0^G~Q8qaqU7Zlo`ZojTGZL@iC z{j;sPgQM;G<)s;`U|(Nw26pziv|RC&uC(B9g@xgzHr9=6Yc+Ak^TQYP5C>C|N9m!0 zPt$NSD<7?>6#vn4vPF=4*4v`BCATVj)$kpbDcNDq{Mtb$=bB7+JQL#0UUXTGyt+95 zyO@5u9QbnK; zQP=~j@*dKWBkKtb#}C1ph6UrL6ZtEJj8n7fONFprS@%A;)~qZCm&1Ih^-j3i-Me># zBL=oA?3LiUa!r44kCpg6J-v1tlPeRwJ$STO@HHzOW?`ek9!$j@1u3wxdNO!qjy&52t7P^i_@DQC2B;qzvkeb@b3B+Ik_47W()S` zl`o8FrVE@r$tu(s2kyuqlhr=m-%d}rM0V4E6l(OQKFzc14hrR84VK`g7gR5z=JcK( z<8K`th^Z&m%oel=z;994UZZkRr%s)U`}FC|j5zAX_Z02axW3kpLig2*rc$!?B$Mg` z1XPP&#NE`>V^UL7v&hrTR^M71>gZyvHyf!8Y13o7W~im5)zQ_J*iTdTSyxjNy%P=) za!*wS!Wt6#D;0z!B^i%gS~Gh4F1k65_x$}u>Vz;usVPEq1mzI} zpFBAyJG;{V1n=}eFZQJvlefO;=ZI|F^LLnSd%M^Yl9CF+8T2=j8w9%ZS{Ez3ZX*_k z=(=UVc1_39(z1g<=%qgJ%6xl!JJY;{waAEyQNlTi$~$j)D#VkSE6+NlG`gv^D9cq+ z^^1PV`SbLG!IPw}>c9}MMj6#(5+lx+^s}j^8<{Shicsa85$CqAI_i1&L6$JM`vWH@ zi#&uroU1`sa$EpYgvhSk>FDgNf@Ent+gFhJWPKsKcb9kN0|{F{xOF6>qh;|ctCyIT z2TQLXRWVjC`F&;DYxP6z@^V6dy&j(hS^IYB=9}!^kF`$yZtjl#SY@KM!iY(T!tw?z zhQRQ-B)%CMPJbS)#L8s?hE3Pd^+EBR$6SDUtcSRilvJC|0n{;3*xja}yN09ZkP63P z2(NEP$fxf`3Iu|ixK0P(5^V*f*Y*_cYwp$gNoF+67;w zGBQS&1^+02Mmy4-X;R@N9vO5u%PgTAjXE2TPvL2=9Qyt zg*%NTX7@7ctX8#1n?<4{jc3op3Eo~1HBz3KXpNum(9)=K9gk)xDJju3FklJ8c)Aj; zsmk&JHI+AW2tk(Pq+W}Bio0f!-PJh4=cR)sEB73qOjNXPE@D0tYdTbPD&u0U19(Ku z6N$9PYch-Gf+_~rbcoiK3-La2s*DF=HEJ$zYVTuRu&Y);Qa?-{p!)lguY@44YU_`w zya&a;?l^x)%6Kg-0lUHu)XdQ3BTzvBg0gsz0%$N01 z(b3VZeSKSr7r)|V8FY{=TGtUGM|Odn|MB4l&zRenBI)1(58GcAH^rGC=5b%h#Z!KF z*(T>gUQlL+!bRM%bbU*cn#<3cDuyhDw>;>yN}T5g*4A6R3@>ccX&IDw8dL_Je4WTc z@cQzQe5vEn@){|YvNc{IY83E^4KjO7+Va!gv@gxe=&#B_rZ?EXYdb+%(Ce_`vg+1Hyx64ZZ~Jq zaMSSf^9u_Jy}~jn;_&I|r%4B~&J3n3HyRo>JlWsR4xAYGSjQ-viumbgVMkuxDI6!* z4d{{yz9P1-mDwYklmK{$)^s`RN1ot+TE6e>s7%9oCj2DrTJIzhrDS%~dv8t7&9TKm zdKnp-J%)Pwk(|5oPg;9kR>5h~O}F|-kBkRoovVgpDST$03&&q4XRt1diD+vJkGu@2 zic1esuGk)IXvnyCLl0m z1%=`b%J!Dc=(hI!(Ep#CYHsquhv zmU;WBwKH8bFLx#DXBD0%$tzR_dTqSsPEGOuLLuBC-WcMACF%AlA7$`9`Sm8zaJw}GVGScc2>6pdv|dMnaG=qx zkn~O2wk|VoY)F_;9_T8y9M{vDb+i}SjWvZ03DinyJ^6~_0KIqxK$Ug-UgfYW;dqclaF!y1LQSdFcPcH zbCqdK5~H6uT(V4@2bp~E^XbI~c-YB%y!}~Qf=^yn9u|ABWMk@LY@Uq!g?h6_Zh7V3 zItFTBIMot>9*0_U1GQjbuauJo7nG;K`j9*b3GL<`SlNH=lpVf^%MafG$4Y4;;U7*T8^pEtRdBtTGtdtyu|4 zx^9+_n<^(KM^jHPawm5sC-cnEqi$SLR8&mUkJ$2gOT{gVEfe{K(E9DL60XBuBYN{w zA#B0mGmQ0S@#du5iNfU-7thHBmt|!+^&+(!`Ym17e)?R=rx}_PfbRcwMzcPGlx=%h zlLtcnQ8zxIuyipVD?Q!0)_OAJwUJDylhF9)gWaY}c{z%ZyA&}F4bqp)fgUnYM!811 z`&a3|iq?kkIAKo&y*T;RM61BeiLV!Lt6zhb=%bW`I}@V!VX5gv|ME@m??M1WpZ7wd z{8bl_}8Ni5S6qY5r7KZ0M*CzIy|2kyjN)VkH*;ciR4FP%8Q^+8L(YSnJ&cL` zu3^-3@wtSIq0^{)+|bia4|y_y=t+SWTC)(Ng5a!2*2dv2AV`w8o1vV%8Htan>B=tbn}Uw#W=a) zaen=LA*k)yhnHpv9Lm88CMF}khL#XtK@aH7*7s62pFT;(kB(`woqIBnC|HAlN^*Rg z5iENjSyu8t&`kOYC=($80)^bUwu7vCc{V`}0!4f&sj2NYsiwEnSv^pCVlRKtzsdcH z^JEm2TWR%mVAhLi7>%1f;wd-Q?_~Z|YWL2@7A~Wt_lN1*U)T3o?#%Su-nf%%)#HmX zhh25r^d0TA#IepVHkdUET@8)Xv@4&CWhl^}bv)|M8R)T1(idQe@C`3)6o@PYHBtZp~k_MxPX$ZF(ncdqINS*^YyZ;RR9UZ87dwqdk{xG@ay+bh3)?PUea&1 zV~b)Id?>mKoX0sdGwrTAYU|KzQ>NO|F|adVRZfwJ#>u%M(ZL#=SG4PhiQJQNSt3Z65k0Pux!FociA7 zIl!sQ=3?Y9t!IB30rDlQetIY~m-6zIA&QZN5IC-jVWlOLF!XBpM>&OGmm37}`nR{g zbUt$80lDLhE42~XQly?!wEBJ75J{w54oZ8HL}<`pcywS7suO ziFvlC$af!)VFd67Eel!fXa>v^J0id8{!XY#6rXv_t!;1giqQpp7>~I)zDoM-o^_mS z|KQKFA`WAX;TIjuh}Nq67ukr%BIdU4E3COTRJKy$eN0-yBuXYT2M1y!f_y({Y^M&* z*;d=M#wnVWasFJ3-FA)I8fJ@HzIauzl#xqrJ$b@?s_x4LqAxpg5s+DXA8%vjY&qBy zDOItG>vFEPl+%Hywz%xDO=kvGr7_O^P9_oJQ%$2m>W+1wPcR7ZSmuITThze z_Ep=Swgh2^-Vth2fFDmNQ@3>M|KLxd@x_$_kwRqSNAga(s`&y_Fg^4+6T z@m&7wevt0P;9;Y|>mwsxY+yP1j~tSDCSH!t%;YZo#qmY6eMUU&6;xINtC6euwo4oC zeaQ@lj4IC38BtkTyK_+k-+KSCi-ghwDK8x4(A*b+4rUrx`Ev`d;v~JF)I%-P*?B@u z%`E&X&y=mD+_oa;;uw<_UQB$fBW8SmSG#E!k$7r(c^O+CT=81Zmd$SM6dLMt*8a%6 z{8iMs#6R+q2?O8TFJuOc%=XjogPtLqN)f6DS!M6l=7xU+4hJ!(lt$|69jR55z@M}7 z2vFs8iyb)0f(RY9;r9<(K+cz$A_SV&oIwd)G=&l~j9kUlvdt>NP7}f!1j)!;bxx3* zWmoqu(CfZ#p7B4SDp%LdgAu}a}%9x+meMgMJBg#lRbs}!F_J-F;eFbff#_r z2Wz$D&cu7FVH{LgrKtSxDk{F{$KCt~a=y?Q`Cn0t%lAeZPxs0+#t-tqn}{6~O!(Ix^; zyPJh&q*NV;!m1)k;bLAN^8+ysxm)@6o%LUO^Us8^lou>RsvaN5GnQzOMc6~vn{c9r zI8hvByj;VB6Di3{UUE^18hu(iJ5SEe>v7i~xUtitiPFARZsFzb&Q5sRdOkHZ0Lloj z%9dD4*|sK-uA1PV)88WV6fE0c#P7dNdzi()xy4I(1+x+Z;#o5=x6rG%*hC!b57;V$ zZIMI(IQ#FE6d8DuvNh7W*3DtwzfW(Vn=vRvRwR)l;0zC<>^XYgpLWRF{GewHBzpgz zYB=={J%g)lPC5TcD8;xnP9bBri8hpvKrRHQ@E%%l5mHdG#1&@>rw|NT9Okyv`8+nl zG~p4V^{wxRJ!Y6*_b>d&$F)NMfJ|r3#aDJ0p^2_0Bl)sl3fS%lkf_J%?F1YPfz-gnG;Ok<^2Op#hS~7^CdMwzF%0! zH%&RYsH_l<@$Xc7(+zUv_+4}Jmt01u}E)!F0wl+3w2kA}( zFmQFFLtjAqfQFWKB!sdSVzM~alLO%hYu^MsHo_>O(y&izLF<_+D;VC1f%7=st>Utjykw?+1vTY zUunbDApT#)XCY0(WaE6#b($p6OP*I7DI;^PbMluFVeBeqQ|Ta!+@-j2q_#Ogp7O!s z7lNn%0wDQ)q)DBYhSF%tJ97`iyJ~8UAhl)!RhghUUv?ML@q3C`u64`iskbqoW@jJb zR|+eg(@Qr-eB!r>q&U#r;|MRZlKb<|yqDQ-K(i?8Qy|UOwM#$8MZIJB`oB}{&?PI4 zTLfsCJ;~iG9~DDYv;+Qv8c1(|ACO5`SNDRLSVI5)S8<5)+S|vBR1@aCD~LjgNc#R& z0Z0W*O1ymqMC$m`(o2slE!%CVYo9f@c%1pB$6CKB)eyqE@HE_EVs0)()_tY2{+&7H z6&k+}1L3!jt8~}en$P_{ZccB%0H_{2gyXngytBCj5;~n9IyH05a#r&L!;9MIjB0{e z=1CZe6g#_4+8s0^3F>=oPsYo`0fvWs*n*)C_Rz{oHA@ZR_?j9p=`+XnFvgN|Tbmk~ zQy~YB*@cEPP^u`e2*1UKm$rsifQ%`IP)d%z|0ktCe`twetVrZAwk)_+ZmUAB68cPy z&v&Yn>a>v$M^60m{aIbZiY|NOi(F+f!2W^U0oTY z)1#g!tCy!Z*lao)0PV{oBxDv~>`QhiQ~2p=Z+>qux390n%s<;R2AN26Og%9Mx|z%u z?LR-<&`j-|s=K$kw4~tV^&-%Q_AUl!b+b-w9qF1=j+t6{-cE|Mcpz&xAkx zrJ~5_X`MMpK`|Kn%Mhe7YdIu<{Ek6;hhai=;Kt^rNlT0@JhdJK(bp~QZV1xoo1_@W zgTg{*y8oIo4(V?}`3ce}YZ98|Oe;TTN8qX$Sj8#4{Q?B(S(P0ZniZc6x`zk?HspF#hFYS-p=(S1lO z@k8Xfsy9i_-Rn1oQ~b~V5KM)BBDFUfhy!xAkJo?^RQa*VGJ_u>AXOd*T4HMg?Sv1Jkt3CU$B~M1s3sOPj|p&l zxE)}vz5#-zl2rmbj`8ug;a0y!B_a2pv zuNRIZK|Ao@>Hgmam$nD*MBHtR|9Lv>ihlc7D|c#YL&GxFf*MNtima@xu+vn>P+>~S zdG#2X2xH|PTfYhxJ!1v#de*HUl!s}@e9Kv0p{MVX`sIn(>25Thyo}>uhpcnLZuFgQ z@Pt$R$>`o6KZFtoP>dzosX7V$yX3D!w>k*m1H71f-%bY)b@SNy^XH96>$g}_rF)P> z0ivz)a-oymudZGbqvuIVrO^x3)!_~eO-RS%AC_I8%dEOYaoOk^HrSougzs+^}JJG+~+cnzq+nxOn^S8jMH;K%;NbA&=WaIN1A@gu?CjurCn1pvTNATE-19>wctG?p z-riWAho0?)M<8H5ek=qEmGKNQN7HaNow}?5@--i;`*h|P;N75V$e1;KIDtmP(26Do z!-h^8q@^r`;RD4iyA(hTmD!kxhiGAEHy--_V!r%{r%(==it|nDfUe6_a?*|&m!Ca* zHlM8FaUR4ctt~AS9UjE6?otnT)2tqsIrl-P1N3~5K=C!QZc7iR`wB!8)gtM24V<*M zrp@I7fW%CYNCD6mtOCQl8Dpb5t%)tW)q%L(0S19Ue}DgQaqD}~<5+4_K}@2gpuidG zchO<2av0bcP%ubWBcoxMU{%iJFgVxLMa3C~91B9`lJdga+^IZ)!?Mi zf?|9MXGEM7(J6(!$Xi1-UMpF#RYMg%fCVs*BK)BKtxJph!0{H@RsDm94pqI=H9X0- zRz@3_kZ>-TO)f@f6Xkcj?A8*DwZ!G*IOW?wLVE^{co@)9P?#RX%fT;T?j$ab9eDzN zyfdWY{08=b87vlZL?ozw>FL&z-a)>SjuStAQ(oW8e?0Vi(aqgGJ~1)zx7u#in*cQP zZ7PC_7z_qp*_$T_LuW7L8tnl!0I;uRDSBTwxv+Xd2WKd|RgAdV!f3;RUcRzD;t<%# z1tDWg?CgfFqwib*+FpVo*1z5d2Xb_FJ~F5*xp+T3%+QS|x|(W19;MQ%m;F!^+@lsG z7nrdc9UYy|a4z8m8pwb~_e1?Q;5wercdqQ$kB$yHWGG5O!O_vNatazyNl9FX*)B07 ztzT_zu_t@X6e^perAKVZW46e!)mU?Mq)spDxH|B$#z+almAOGSG+Ge9WslT16%t8+ ztS_DM@591sN=+6Hxh6?0Vl~!Is!I0|eYL}rG z490_{9(Lu_43%IolevKsyREf(h&+`du;|DZ%sT)K_&~M4y}4TR?Lk8vbRv+&W@ct8 z?w6eeO6?coxfDN7w8T}xIkl!v85v7CI7~qs90^wj{l}M?Wn6?19Pse)s8D_&e&Ir8 zr!IyC2{7cy^R*ly3bwYk_5Hh5nN13Czxy0os$ij86ZA&LmX99!udJ*{I!)a!ULjg$ zn%2Gf0^~Ip=KbcY7)(G+M5B>$hc7r>2v>{?JCeiTdJu!f<1NJDZW;yP)y{lsI|#u4sg+zFpM`goQvV=wJ-#6LGe!C@XR4 zCst<9M}AUO$3fyBYl&rp`K5{?gD^o1IdKHyImUG?VhBe|OBpiVGE-Alznl)`sl~6(`c~@_ro-`#~P2X3!Vf z>P9@LI`E{e+W=_X5Xt;7zj5j>0YSw2$gvZ<9%CKGn}ZTm!m6ixvV7R|N}sGpV)5$H zQew!!n{qI--=|NXTxN0z!ya?)m{T*mR3AdfYu>$kQD5+0_5^>3T7<~CT$}z=0FrjY zm3}Ui%|SWl?p;D693{9{03a~kacSXo2wfrgZ9F(B0v>78OJtlydty~vg32J>*Olev zs&)-I7Nju&^%}vz+2Ho=+n+l{QMa2mEZ>!;^J@sDtWc}0|c!<@QvO66A@V> z-5wXSxsi(F4v&xzUZ?q+GRbc`o15_0-kvAFew6$+Na?CVaGTow4F>41S2IUnGVJlh z8*iR?)i7wDHAeB*Z4WDJty;B8_1uBO!8hIt^5=WkpL*zWy?UpF+)n`M+i5+g( zS7|XZEN<;QHsGN{RBD7{@E2#W0!)2$F{)@in3%YrU1NKcrA_Ex@eo|v+@cQqO4_p3 zl{+nM;p|qF$~q=0dBUX4b?Oar($*KcIPqdZIcx{XEMCX|Z4fx*f9ylVIFltb&xsYz z)zT#!070t{LCk_Eigx`%zwwm2y!5HT78rU%$+;T%;HzvxzC-E&MI5%EINQoGj24D{ zY{X9w#ny|^(&r7LZQl&HzIk(^D~3N}VrqJWYbbqTyMKo4T8!#BGX3KQ53I>PUT+*8 zf6<)Sc5zo1LSiQFmeoM*726fs`I5*YPh#wZcJR}?4RWszc_R=GtC6i^O7 zU9}WvSvcDB=H{c#&CMA!@A6KxIq?ra1M8SMTsgNV;!dw#HPuD)fys(ml$TzZyOox@ zy7C56ec)hnYH=>fpM@})M-T7|9gR9cQH&x8g~E;6+K!c9K<6L27B?{%r+fUMhHD+1 znT(vAl(e+8+EXxSU%Z=|kEhuS9VC(#sgc)_k@zg!se)1x=ozbm#OTE(2P7Bx`Z?Jy~CHh5rH6lTX5rhYv{Q>*)=&a zF%fJoZjIX-Pb!r<1surJbZqdp9bav$#p~C`nX1*vwQ>y8lUOZKUT^3pprkdRzSLC6 z>+&VLzTwP>jePe2RTN2rAfgM2o{uW(rzk*|G?q~w3d|~g1zpJVQo@ide#g)a1gtc^8np}NAaaaM(tk|)S-`Nt@#rXxy zL*iwLE9f6^D{*}q4Ph69gH3PUy7hKoZf=f2!GxzEWC_=v4S$OK<%HqHJcmSmm2JuX z*ilp#$g0~NI^^t-+9C1jMmfpeEcw(jw722P?n}M4AZn#$r5=vfu#BF!j=z?KHQu2O z3=cYjiIXd*dcwC(r9@eWh4Ri4N=bWIbpGVzx;H5qi41a3l9v)+>aLn~m{W z7Sd#1(9At@VVou0GaxF5tE(Th=&^`px6Fj}x3#O+h_;A9+NDwGC7j@p*mF);w7`lN z&PwD_W1pjq!K!$>#I%;qT?d`{!OZ*niSC>JBo2b1bC8qBSZy@{@Ne-a{M z{JhG(=}QWTw1j8nq-Sp^TrwqKXp|i^-f?>;L+S8^{@2QFRhNDqxyS0L6i zGBeNA6q-TPzql5|XQHgf%plL>zjXNaY=;_t2C%%};TuVUL0wmu_%dxI(ztZ}Pbnz_ z6gdd}JC7G3>HFQ$qwmEJzAbQ>;A=seSsI^k@=h_-J`bivg1#qjE)RfeAdfrKDTSu@g31}|_({SUX-{rykC63zyIPP3c*p8U__S`0G zZddz+*JA$qbR_}%yW+jewE`(KsIJTOb0E2t)Y4_x6SL~w{{H@m!R+w9BOdcE*nyq7 zA3m1-nNwlt1U-FyHoabWIm;$CW+YnQF$;e%LAAe1ro5cLkYlKJM-FBO0c!z6Wkmv# zW20Q_Z@?cvB`4b#xV*ruhZv>4*%2;qE@lo1%z>{P?IC?h4dv`7KB zFf2)m>-6oXR+p1LAz4e}Z!cFdRCdn+YWXQOH88P$Gt4z5t-`>tvE9`wC4HsiE|y5feUjYT1^Zu|0wrfcyU<6e53;Otb-1g z7HJH-o(^~#&a&>DeOz}%U=li{d>+;ieYr?%Bsz6rGxS53cnoRgXMv#dkg0 zjqzY|u8r=~R`iJ86PJuTfij|~B`f>~V#R!v;>ms0}XnXSq1hfKW8n&7?P3eA{{P~t1ECVx*-cV#Kd$>r5=vuW z%oH)>&YdJchPz{h*t3)&GhPgta;;zb3351hPg_oSlJC@+8ZL3BF`F zQoLV~iWzIz%QtHrBUL ziGOD*n&MF%T#(;lVPcZTpE4oRx}&3GdG8XW#sH+Mc~icM=wq|sm3MjM&X6;EfOry@ zQW#+@W@ngr4-lZs*qO0exQ*XPi?ZILFQcyum3Q8ga;~nNZ1-(`+E=5`bf;UC+FVPq zzWL-(Wz*|&Cwq2vA=BMry!XXM?9e+EbKSKB9}mI<%$OghyS1Cj?kzH|q?DkFo&lM9 z!Z2Nv10$9Oe~7<$c6a;i;}OhQ>Xogj=S$m)%f{b7IGwp*&*T`U=A`(CV@=|cpZ_YR z*wKkGAW>Vu!ZF&G9kY)Cy#x4viIO*eAcoG_sJkPV0WBs1V=ZE86}qv8h8~}@S!mnQ zbM+CBWG2?uNH&`dBIxN1RB?GLj*@xTtHqAhAXG7zOKRAGUpzeqDfdYe4UgUdIH{ck zO+W4cL77+eU%`4MGc%K{eHt1%3Dn2OnJBUP{`o{vN9`%Gnx%7&6?II4Q%=>Y?=z|0TA&BW;Sxgfv(bCfE>_akBZ9};3JXBG~1o_YSOCNm4%4&1+AuoS- zSJ$L>@7`^;kmZ9UF%8Nqsy^-NI%{{$aHHZp>Hvyz)R^)}?=SEFfjbv<;EKz}Tn<{k1oX$&L~ z$ykIvgD%#pl>>vF!^7x*&YBSkyKbjzls4RYZSnOc9Rbjs6a4lMMXX_)J*n?YJq&eN zT-)I}LZHLbLYsPW`ELO04Rv~QF#t~xT+Q^*kEs$@>a!#Qr5 zg-bYQMdtC~I1Y~U?w{ks{;pwA9ZJM8aw@BP`Iy-$d)w${$= zJlhcj*?IPih8}{jSU`Vb+g51ZFjtu2AA_r&)=4D0iEkW1_~OoL{Qa_5!gQaxeH1xX zWNwsuO++=qVcTwd%Og!s)no02c~dlO^^eF;pT1I%u32yYDm|``|MojBY>X=b+j6b( zjQI4-N4a)K4@0c&F9yk3tq$$l`ddtRdXXPG6L#}VG2D~h`hlo6HI&b_O=sJq&bcN3 zX72?`ufI88|7dw#$bt%3L|3dBBM`?Y14Mo63{5b?;z0G~8WaN9-9`ms3`x=cmlc$(fRoA?`8NnKw8YFX!;^{#Jik`U-cPN^W!T^6*%aXZnbX zpLA*xReT4Ri9^z|vitP)^`#XQxSLhTrc-@b`Tl^_>1TuX;u#CGvW|9S zUfs*i?&|8=(%H$~*w`qotjsq_$ce;YPA2c>m9xiu`SN9-Iqii@3EwJtHZqh;>gDp! zo930(&?t@(77~j($EWCaMA96`m$ceDYDt=CmsU~Xzj*QDd9_cit$RQec6M=GK*Mjp z=}z?&Njb$S7Z&+AZWo4y?A{!HZ ztG4i7j@*0q?nx^tVV{bKh@|G{%lP>CSi&6(IVRpLcN^EU?=SPNA~=mtPlxwmJ!^iw z$D;42NT2;e;Ooe~N(ToA=ef_n+Bi8y#>U2W=3YN#-&ZOtBvj}$Ai%PV4|6VUkH5cv zOLuqa;3Su%DWJ?}W=CkLm8HE}2b{3et4T3G@2&9T0;<@;QRp z?y0G%(u#^=4R0m>{O1xOYN7w5q9Tu#mDSZq288XG%VJe+ZI?T&kP4>#+}yQ3TM#e7 zVV4u<()8dRa^P2SjQ*XBy4i_|dapf5abTLBXekz(3TmIcgnY*B+_6I=Ffb6E?k^tG z;Jm&@=`3_GK@F7rA_xUVc+Ox9cW;Ud7!&`KPW{R2$b8mivC}1{O+GtdLyrnZ-Px%i z=AiCZ-zV{ZgD7W4PWnoM2e)@}bTY823w&$J^O-mi+obO!U@iLKLzO=m(R)EZAF

L(Mvi_R#=3}QTD`Mvq8!!@|g^p-4lH3x7GP?|hbbdOl8?4mEFd(YsOin`um5s{&} zFCX%5HpUfuOdGp-de%hnD+vh=eyw{Vt*R=(%F5c(-tKNrkay_j*tv7p4)l&G@_}Ep zE|n}9OpqPAmq|7@fnuapMnwG|F8UP)8SP_}lcDaD9aU>f!oo}~hM-lsAAj6U zrBcC?WS#PqIiecy+BBS9V)%XCiuYQgf3k;1@xssH$#d*0#b9jg?ZW^b;0*sJT>Q|< zR_aG_$uz^tb$54L`uHfu#l=OhXQrk7?d8jtLP7?9)ac~o5%14E z?V!X@IY=9}uuu-4^y{%J+3R>rz3BwmtY9P-b3eLmmbERScVBL3Xs9!wMJLvC){ItW zoTd63DOD@7`s2rsZyO9Z)FbHcdTU+ojVqTP-pOu&E#8IyWh>;}A>V+Zy17ds2@I-ts@qe5!aqwuh|eEPI^XlRJt zdExkE+W8pEg^@-Sx15}uruxg3b_pmy8~n6s$Rt6KPJoXu3~oljeWIka7xTtR+u>(rz!23Bh!6rpYa zLJ`+jXKSXWrdkWSx~^W0zHv1>!&EE^u(a&v$m1JVqlZ`Pn3$MkWg{gBKH5ECuoqSE z5(G>$>u94SkH2IZuHGMLttc3Y9#NlkRPe zt{y$C=BVA%*=d9>)9^MSGNBOSQk+k~)$HK}!)t%vflBXC_7iuI^4xYyL2>PGFk%fc z)^AT(M1-b>hM}Qh^%JCmDjs#NrLT`4!2D_?BSLntun=5XUCkF@vb}bF>G2Vc_2c(e zRiCb?B=sl@*1+c{+9=}wVC)wtJwjXen;;+c3-HxgDVIVJ^~N}wd5o2_p9E=D zbnG$?IfEZ4>Ej&= zcrKlxW~(2qyTYIZEDZQlUT$u#n}e;b*j5&nA`DfG7K`<+^AzMsnRks`6=`5 z8&-y@V4S=zs!1bHrVkXQ-ZoQSj7cBhoQME)+Qg*ciG7ux`VyR0j*gC^%}q_3c}Av0 zl1X<@kCnCcp~Hs{w|dj}L0&k1#RW|R&=HA5OtE(ysWt6E2)+}0upZO(^N$Z2zF{>Ss*c59q~e0Bn{2vQ zX7%yl5AZxvD-p8*C8QP=ks~IRJZH)#n{&RdREP5prNvw`u9w0s5564*SBp+R#>*N5 zmf6D@Cog7keLv7DK{jY!^aK1N1yW?XrNf$M&Sz^^biB#V&Q@?9)VOfrg2eM|73gXF zEYWbFHmR#rm1nRHcyj~>^FW}KVmznjA!+V_QA<#GOj&4f$r=R>x3?+3HO-*p)mFD> z7+Sp_jg<(rpP8LSQMbfkp}V%a#C3Eq$uF^PzUC%AscwGW<-9cnwbK_a-dJCIYsz*a zXM4MCK^$p!(w6-Ee0Fvq?m`XoDlV=RW7Abn+Tm6MFKhqf)CaU@uqB{6rPh@;$|Ake zijR0#;J?sp)i*#J{g`A92;ZcIn>VD%9j2|)Fz>QfrD&qv>x1SuVH=4C7uETa=C#mg zYQA!)wZHJ>sz( zx%^V=r``N%z7WeM!ufM^l~V^OhVb4@ibfb)UMfPz?}hP{{>i@Rvka@tzOPb<`bp=g zIQ413D^!IDB6!dPkfhEKK%^*xp_b{DIm2sDh#>)LOhG*Vj8WYD{AS%utO)7NA80bf z!>f@9kakG&(l6Hob^a{u#VoBW!#O%)RoMD;#ow?|Q#oP9Y$NOkDbsPwD6uLyxOn~^ z0SL=b^wB&?680oD&uSYTNH;O`yHQ~NC**Y#L;tkMzek+yx6@6NoAHnK+5GR3_IO4h z*>*+lIwT}D1fym(C z;IWB`hx|$&l`k*GrzC$_U$On`?Uqgf`Lw)q=f_0fnGzt6PG!`k9!O!IlQt6!b$;E7 zfZDmaJDKKqRUx76!6)rIa}VBs@W5#`_IqM1IXV08uOeKI;QFI~hE4aL=I@yKQf0HS zqx*p)_du#~R)2J)fC`U{jEuOL`SgbW|LKw;{r$yAqPn-YS1&U=VK(RMjGQ|*315giUYU*GO_Ap6Xgue^Iu(3 zxbs=Pj9AUP$uFJ%nOla0gebUtJ<~C?nY77P?&`#L0%-6P{oOAkEb0cOsZ8?irS!{|Zf?gHMq_~TEj%_6=7n2OZ3YTB zT++>iZ)j-*ABQ_5N^^!pf!kUXdBKTBJ56!YNQ(5l20mbPH)K z$es<9D#g)MHa^re_x8q2E$ldBl5C8I`Az8s+5T5GHc0m%_(CpF{rR&6n%RJPn3ns< z3IwhZy{7VNq60=2$3Ho*Efbel2>8S=zaV#baw%ou7Lqts~kgmU+Se-#yjEm2cJ9`7ayMrpTc?NQ}B2-NTCMH z$^D^V0Z{#rmX>DMQ6_5mP3R}p``9DJ7a_jO5BSNT^`+$GgJ9|@sj0%M3$e`_$+|`> zB~YVSCPoJG>8MfN+}z!7C`jwFapbC-mADL_TN~uUV@8t#RUcMaYG{0HZmx+8SWNX= z>bjK*rlqN+l?s^~kjm;$j1_&)72U?a!9Ubj85_>B;d*`lQ)ss1R0dwkvAvy&0OB)*- z3{;=0a{{S$z!_!J-~x04=AWQ599P3u+H(TXq8C~RlQL8Cm@ztLogVKpGHNFW(LBH6*WGi&pj<6r#e4ur%@RvYiHS4 z>V64QyZn6D@%+rZJZaFZgoK2(tR&KV-O*7}J4uxv4d&A;dv%oA4YN%{Am{3QcU%AX z@!mCaoll=W0U3W>^%}XOBP=YOS6u8>!}YVrOz(aX?F6(mgu!qN2t*Xv5j5@W>^Q9$ z-On(vwnb$a=2U-RQ}e4KEiEk-gA%sxWvHmXsI9H(>$}QNm|gPrpv(^&VLcq)6%?e& z3Lt)&b#-+Zj8cG_9o&&+Uh$&092kL98Bvo@EkHTZf2pf&bW2d=u@fh}n`s0EHMIj! zBLc0N;`~k&+IRiq*PqqP^(q)kbh8X%a94LCq!$1}q!kvODoIJn>XuY3tJ(hY+u_Uz z+tfXLQWlsvZZ24=vcKGS=#?7vb}yv1L*vM25AsT%gb>t1Dv3iiL-|Qm`-giO(4vj5 zAzEc5w`SQ&&hm{S&#x#oTbCo@)Ue{rv(!j!{GBm3O@0Yl;+SG&MB=4XWfPSo^abs|G+lm%e21#S)j0jmA} ze85Z<_I<+cwT&D*7ZV+lasLzT52{;R7)AOrD)v>m8 z{k-cR?t6WGtTmWb)NfphgPZ|HFaq*g6y=o<1bmM42hylL*+~k{LWzF!b*O_o1uVo9 z-?K_pvPzZhMr*HtyQ1cIBd@#;XruT9@wkDyy}&e4w;dTB9fD&Jr}CStA*w+=>3uLO ziptB>*}wzM$_p3ldy8AfjS$d;GI%rh^z^hd)RMWmxuL?F zySU)HG!>F%Qgl;68tHX(c9sUb;gomm#Q;t`OGpTV8%7nK3fAB6Gnw@)F7DyT$Ou}} zLMxv>zP|Yayoe(laxd_kOF-CR2^1HwSf!Pfm6_!(G_{!N!=^$J>fYJAJ}E)W6UKl@ zsC0R*qfKM8v&}wyNU_w14>&%;1<)Qj!qwEF-pHOK%Mc#$CGv=5KgeOINn#< z&mYR#b!eEFm~>b%xYvH?I0|ZP^l1B^-(3FlOVjU#>;KCi;vUi1%uo9_P^w=*c^^T} Np4QgLK56mOe*x<#1r-1Q literal 0 HcmV?d00001 diff --git a/test/__image_snapshots__/LineChart__Area-snap.png b/test/__image_snapshots__/LineChart__Area-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..d0e1d83cae7bd3288553af0c73d47a2c74737cc7 GIT binary patch literal 18140 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 literal 0 HcmV?d00001 diff --git a/test/__image_snapshots__/LineChart__Bi-Polar-Area-snap.png b/test/__image_snapshots__/LineChart__Bi-Polar-Area-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..b124e3f6eb710bcdcb486ec584840d3e3255fbe1 GIT binary patch literal 14177 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 literal 0 HcmV?d00001 diff --git a/test/__image_snapshots__/LineChart__Cardinal-Interpolation-With-Holes-snap.png b/test/__image_snapshots__/LineChart__Cardinal-Interpolation-With-Holes-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..0d532f927b1ba1d600949996443c17233927bea2 GIT binary patch literal 11950 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 Ms9n##X7cp^0G9D$9RL6T literal 0 HcmV?d00001 diff --git a/test/__image_snapshots__/LineChart__Default-snap.png b/test/__image_snapshots__/LineChart__Default-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..425af6b17c9a58a61946c62b6469b9e992d61bcc GIT binary patch literal 22804 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

q-;EFzQ7+c*TVH<-^e)<@cy(D> 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 F{{wn+%yIw# literal 0 HcmV?d00001 diff --git a/test/__image_snapshots__/LineChart__Holes-snap.png b/test/__image_snapshots__/LineChart__Holes-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..28cca50a4c0826f91ca168c4af1f3745b4f69f25 GIT binary patch literal 28770 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 literal 0 HcmV?d00001 diff --git a/test/__image_snapshots__/LineChart__Monotone-Cubic-Interpolation-With-Holes-snap.png b/test/__image_snapshots__/LineChart__Monotone-Cubic-Interpolation-With-Holes-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..0d532f927b1ba1d600949996443c17233927bea2 GIT binary patch literal 11950 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 X48N4)lr`}XGD>}&E82yB*gX6%$>p}D literal 0 HcmV?d00001 diff --git a/test/__image_snapshots__/LineChart__Only-Whole-Numbers-snap.png b/test/__image_snapshots__/LineChart__Only-Whole-Numbers-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..69c7703d8aca6476224ad5be3b217da0a9492641 GIT binary patch literal 39564 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%0DfDpTs= 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 I(*O7W0c)Y5W&i*H literal 0 HcmV?d00001 diff --git a/test/__image_snapshots__/LineChart__Path-Animation-snap.png b/test/__image_snapshots__/LineChart__Path-Animation-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..07c17232c7da1988331c5d7d42ec859cd67e4187 GIT binary patch literal 30394 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 literal 0 HcmV?d00001 diff --git a/test/__image_snapshots__/LineChart__Reverse-Data-snap.png b/test/__image_snapshots__/LineChart__Reverse-Data-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..6b515086067c7afc68c8b4b3133706eaaa2d87f9 GIT binary patch literal 8293 zcmeHNi#ycm-yYQ_Z3iOSC6vOZQi)MwR*B7VsU#!k7-5`8I}W3@ayFF|#$hwbGR9$z zbAu8hhlZSH4CPP`Gh@*hV~ly9F?N6N@4enX;Jx1K_gvSQFW2)uJfF|!xj*-Pf5rc7 zX|j9g_d6jF$nGmY8QDM};?CfBcE@(`GdS-0H{eSw$j0O%q@-J61_DurTro1db~lSj zr}<@Zeo_0&(=zX}*}%PhUCo_w$Ul*fb*gS39lDIF4#+$^eOWWGA`!xsOK{Yb)mOF< zBwW6CnC#%ANlpA6m*Xl9KZ2CWolqtEdU@!Q)NRfl&5+S9Ag4dQ)bZ@N4Vv5iU@bff zvJ?lqg5A}2YJt6Uq1Lf<@LTXe!l4L{9NH~9geb^vu@fCeJ>KCgCOWh^93^~sFn)@M z$cm1XkN#)k|Ecg?2^iX~Ad_vW*1#dpUp5%)DK^Wu3Fpzq6a#OFQr4s{)x>(0Z}xP& zH{YxoxmEPn1J<^Zn}^TeY-1>n)C8zFMzH&9LgyXLEiGFsdJOa!PegO0q#n(&(PS5B z!295O`UIcB1DF{N9_5(m%u`3U3`P9Rn;mpxrYS|t;%q9vmliBxj0)}JZSwc! z*M9p@Ua9AgOPdRW?QrJ2((K8?vWW29^*;s^-%hav<*90JKCFw6kEIQz>&nMuWa#qb z8>L!I&)K%7T#iKPym&Vi7iVW@7Z(>dGvifhPqZcU-}xV3t4;l}*FpBmx|p=`g@KKa zloTZ)?(=f#m%xREufdOt(h%9WxHX1PaX2f;y2v&!XzlK#r|024+_5t7c-V=KG>y|* zT3QSp@SE-%^Cng_y;ylPV2jQ-wdLjNPu{iPnFxGb)bCq)y$u3sqM)Wa(uDCTqk;J! zC8fdqN~H#c%F>95t7BPf^MVtBwQ;sYMIu^-+T~$Xjk|*3UM<*u&!-%O=A6VGjj2ck zywFHyw~459nj9sZIqkin4f1A~RZqQ0=7^HOC5x8|s}qRpWg~ieObDaXf>PT=6#n5h z5*slnPr2#X{rghf+o`;juYG*~Dw}wl%0PjPZ{@z2_V$R3k0QW{iZ+MTV+TMEk4Jo| zFJGt5Nl68)^?n<`vRYSfbz1FE;iJjP$%tEIYHm8QAK#Do+C1!@P<6f3#LxFc7wmO( znkoNOl?}_P+m_IN#P?`Id(p&Ny!7zbEf7eV*+%7;jcqIY?(Y=MLv=Q~wk zR(;NI6>MWc5K)m%tFD;Iw_{j!BXOB0t{;PYV>PDU<{D&MXoCBI@t5S5pzQ*lu_L4hqHYDPJ{D# zL|w*q-SkB@%QxjcPDyULjVn#i?3R{SnG>jey~vVtNRS~%ySSeY3Faf#0!G3(^coJU zesB0yU5tTgnlBWgK^suK(P5pHlk)b9QauQQaHQx+m+i7Ds9>)9;9(Xt#1W1cFSU}M zmga;0K_*XEPcJ=_S$eMINQibqTA)mKPS=ag6Zae!JFY^kZZO#4Myo`VzHhIa=z3q} zh#jTctCH-!qNthZ(WuG~0t5Kg#kYYIm}H;n&{U0KCAP&!`kX z>)kI54cHzo9$RD&=K&Z|PNMJhNR^zZU-W z2QnwRW`-vXeCuto%j`L+@Ayt7{w#+xmvP0qC;b{N;3?ys=0?vRTmhwW>ez^|b2~TI ziq(tLkhUdcv(WsP<{e>yT`_vdKMOKpq# z?|N+s)^$H8gUy*C+?-(eOQwUqU{93w?8!+^RkLa(!mIDo_r%(NtY`2I73JMhsl3DN?%0;8!k}t4~yxZ94Pld^Q4#gA-Cx!${GUZIx)jeIHrj zbY+zdy0nagEK4!8qhg|qKzV^w+6!cT^(4HY1zz>lexALFVWf?vHyJ8NeWPf`>CQ&n zA~1RSRJuP_M7$2@i1}=nm6df32so{(rY7zk2djNzM>OaRSz=b>^~RF==H@6xP}eCZ zfp*=}lC{0PVuwC8JttwL(>!Z!Z*Hw3d%MRs@tPy>D2u z49@J*MFkzDve7;cWLYu}dUYnhf+SN;k`Z>cMGVG&Y;axw@ZntSNS~ESq{sQsuqAKM z(Iy=Cy&sKW)v90DDEulaCDzCF?_f*bc>7BE(xm32>zh?d)p4{V`|c*H1|xDhicx>Zvjk4;m1Lj4B#$Kxm1H2G#vs! z;s0EwI~V(!yCn70X@qN7AkFlsQ0g9#=X+7z`xic+_4V}nA#x$ujSg?al@~z-C5#;~DRUt2&D*}8{CL5{v4KE?-sx;WX|dS*t{_x9+4EQ7s^I%C5@sHv{H_yl6B zFi)%g+~51;9gDIB68o#Xu<d-``52_qbc)KsP%ZoZnug~~8zKL0}*$|zr$fhm$k_r+@+YtBL zpYU9HN=`0zI{3^?3%HdttX8yPg0{*=sb}fQ#RPphe3D$Y6pe&Zzx`IYC@`8XrAK|E zd~ox(D2Qwnqeir2n_ScY8o;ZOEm+Ljgl@!Y@JMZtnq~I+%DH+&aAQUeD2=Abz^!1P zMDagwXPlf`;;!^QZIJQo&WcA?%a8F!IpaaOJckS1$<$`#?vFnQi1t)ebmumPik*`a zwsDovnBW&N2e&@nQ6^@bvRQ1q;vuNL=d&%>mSBRQan-)g>;3>_0B+T@U`h+)`PoXl zCKQ=^FpPg=YHIYUs`TGTw7KyQk2fEg2bOe_%wyFrbZYgyk+!-ZB_%Z`Sm#WPw8e)td=OA>ec`Ed-vJ_Rote$F z>QPN4<=??%R_SV`{$d3wgM+LA7WOy&YH4Xn&&pExtt@xf?F}r7e2$JZKqn>!cuY8w z=8|i;-Fg%+9XG~jQ_?JZs0MukZD#f`-|?Ab+oS$g=F*qLFfD1%la5KQ`3i)IiHErv zDKkz2wh2!JZTxh0n#K)RRW3Hh_?gnbD7Zlf+vU0fYOBdB7XfZZ)S-?qDp2kHZ3P7? z>wTCcJ;BsFsQ^La`$;M@9Z{KgozRwCJ(}WJ@tsw1i7~+z%jS$>kwJ&Xmzf{zJ3`Kb zJ)&)YqjXOsquJ_ZZCdepmSqlhjbVOVpXUSk_wEe^p+@#reuWTck7S8b|6`FkNaV0r<#rc_b7mDK&eqpEv#P!>)5~m==z8q~6I5{kjG2neOE(TW)kp%N(zz=3@zp<+3i}W&`pU0q6pM04IA& zt?Ny2upkeOEc%S1Z>>-NY5(W{0yD_R(@EfttPWG3;^H^0I6vlEQ<0nS3PU$QJAm9L z_9p;V6^PN1@Q_bN49-Tg+W@cXq?XSf5YAG}7CsJSgCtQad90r0!GqB41Zx@KcL~UwvgCgnM5tFt zh<4;+YVMm1Ezfbl%YagpmeX`pK*1r9tuYmz!tzMc7mRf8MUxSjl}`gFsAv@lFJ4If zXq=E@daZGOAv*&01GtS8Y`s0jD$vc1Q>xS8*B@}yG)V3+)L?yuEL_Wv_W=j&HBpL? zVWRZ9v-RYNwi@e;nu0S8e5PL;fT7cj0SKhG4{1W69LNYG{Vgi5yg;N@wzXs78|BfY zep;;FtiUQ)G5lnj>BDzZdD;CtVUVa|nMCVMTw?FY$ktrpg7B>KA$NwD5QqX2 zTwUjB;&`7G2k6hrg@~&ppb}KoR03;#Hj2*KT>{X}QF7QqU+((Zleg+*+OSGWC_M36z|HtP`kfdm5`j+KdVdvicu=xMwQ%TJtfjY7NB}S|7b#ZLvii;RQF#| zE{6b0?Pm3%N}PI%p8^5|Kg491V?Zl%#+mnR!CFE#$*sp^>Y?II+hP^c&qQ?!7@m}D zzt+M^HllxSfub2HMdo_QAV=P=D>Ai=gT^nDHS5pD7+^6Z7@Op9* z!DnCnH~(YwnL%+vGZF;X*s=To*YxOOn(2kK@M!<})UhAK|1u1gPu7hHRiUztN7lGK zc$!aZ`4kS&+i^#tY6-K<|s6&%7taw zxb!hnO$~oG^pI&qh2DKqOGbuBDCwFD(Xz>~cgBdG#NNnwjOAWNZ^n)sLndC!C^$B1;0T1L=!bBI11iDMXi^GdtbF>R) zvvC6M3V|HRaX1Og9P9L~B(;-`HA^^4Pa1#NYCDO)|Lvw=K4}arAJ+QUj_$oXW7NC5 zRi#N&>emT0TP4mVDljFEZJ?!is<5g)Hq8n3F|~5tegcheT&&3nFJZ$tB7MBFGQb}` zl71o$3VVt_3zY*+(tJZm{HZ34UdnIXy*B&a4s1^)Mbk(?`EDvyz%Jn$DTFj&g`H0? zKGEH6EVEN2tDpZ91ITo69^GfpmSJ0>EYo~6v_X=Bl^;ka9Ht*EA z3=7TJq<`88fX~CLoLd@c>bA!M*2JuU;S_znjmZRt0lk1pBQB|ErlOLABSnPi~EP=KHrN7p>hEy}u1t?WHlLZfS9Oaw&r?LN7HoxO_qWe!U)8@1Z+U|+!bY-&{?`lBBJ%Fz(6Z?!oHn`zh2AG zf&&p8__%}LlW+P<*{bf&n2qv@;=6AFmHhEk2gtVe{+7bRyW?g+0bA758};C0sOT!k zMokh>fiHS3LvJ6|v9)!b=&Dv6ng1Fr6u)`&$fs5I@j~5PJ2Hxy#~LKa1K+oNxfzJf zWT+d1`^9xFzw`|kw%!bEOMW`$40!IET!|t54Sl9-Dw2~->8m6ft54^93T^1^iwv6| zGP3Bhoyhy7{yUF9pEO#36VHn@1 z-h87HkStH0JQ;^#mZ0E$MC-z>k<&uf35mT4G<-%L2qQXTP6wbZ(?ctd2E3=W_S7ps z(i&m)%b^%0PRaV6l{&9AjmG``n6-LyG^l}(2;evXfzr5P>O}ttJX*Gz7ZkQ(URw${ zOg5_W&zjY}u(*Y%4Ug960c&h}IJw=&*x=kZgn#+`CNCTvlGJ70R$-WPDSkZkFFalt z$JNzMXj&X^i^#-oUeb4m`$$cpdE8x+GRiE(s?q+8)rCa0I@dQ!TbH2<4o zIm~uBy5Z}sq#R6ilRNpQ+%q>B-nhVxTj}?Euh!NIYN%}-=Vu(+@ZCf;@-o2@ixu$6 z(>ii_oKLY*+1>BgcYu6Ix@>sCv6rjmnK3bl{#i;1bbJD{TCg&W;d3uxGWWj$vz}ks zpaRdXZ@wqd|7&idk?n+EwZi1On1BfiD6R_>d_#D*S2fo!B=pawIBD1tPV?pV<~{%z z6-C|%qdy|;^XKtFN8VH2CGkcjx1NYYhYz>r@GfR?qsOpLVN9pIvry>d9smluKE=wy zm!@F+6fcBG;rP${$p5^B1&}2i|DWDHPdB_>0ZWn={x874Eo==_Z$(m(xFW_DF8Ru3 LOQVvD&cFT_M6Mid literal 0 HcmV?d00001 diff --git a/test/__image_snapshots__/LineChart__Scatter-snap.png b/test/__image_snapshots__/LineChart__Scatter-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..db914ef0c35201ccf85b423f729f801565716b95 GIT binary patch literal 43797 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 literal 0 HcmV?d00001 diff --git a/test/__image_snapshots__/LineChart__Step-No-Postpone-Interpolation-With-Holes-snap.png b/test/__image_snapshots__/LineChart__Step-No-Postpone-Interpolation-With-Holes-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..ba61bed6b31b28733c1dc3a3618be8fb8b17b0e1 GIT binary patch literal 8631 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 literal 0 HcmV?d00001 diff --git a/test/__image_snapshots__/PieChart__Default-snap.png b/test/__image_snapshots__/PieChart__Default-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..f1ff7655bfb9912f5d8dcc1fc8cc79fa30745c77 GIT binary patch literal 4959 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 F|2I12&tU)n literal 0 HcmV?d00001 diff --git a/test/__image_snapshots__/PieChart__Donut-snap.png b/test/__image_snapshots__/PieChart__Donut-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..e8f57fe4fc0beb793190c0c28a9d39525c701a8e GIT binary patch literal 7626 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 literal 0 HcmV?d00001 diff --git a/test/__image_snapshots__/PieChart__Gauge-Donut-snap.png b/test/__image_snapshots__/PieChart__Gauge-Donut-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..cb27df6fb5b1289ed0780e85a5897073dc194f83 GIT binary patch literal 15087 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 D@Dke< literal 0 HcmV?d00001 diff --git a/test/__image_snapshots__/PieChart__Ignore-Empty-Values-snap.png b/test/__image_snapshots__/PieChart__Ignore-Empty-Values-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..c125d1d71e9c5526567ac9216d27e0aaa997d2ea GIT binary patch literal 7253 zcmeHM_g7Qdw`az$eH;XoE;uj>3W$*|2AGi|f`neB2ntA5X%b3MMg?gWqzHr&gb-Q` zRg^lEhypPXiUf#&v;c+{I>|ft#<$*@Kj8iH)?+QmUAg=0{n?*g&OV1&Qxk(j2Sg9> z@bDZmyrgT+!?V`~JTvy~0e=HytagKsp90Jc{^Tj`5})DW5$843{loHZ=KOHj6M9et zb8(GX-G4o#JY)8u&OV{v{yJ`Y;q;$AmiA|?DzNr{%ifRvmGs9f)hiu)GpPzUPgTNN zJ2=c!a!tsK-S(9w)~3b#WL->akEi}+bo{TYs?~KK{tfiCZL@EehK4?bV6vGZYl~^^ z#wUMkAj>IjFK2kv(@`frmB|BC(2u%%FLf99k;nbuPlDXX<1#=05YRFCk1hARsLXwD zeh6ytx%|X^yd%~4GxzD6ZWQDx`1ugabCCP=MBx7w0w(@fIaJ0;027TvR<s7iwqUKp z;}N_hUCwhev0<@F;=O`-X42q5eZjnB%%CmC_|Tf(?B3Iq3LiUV){1T=PV=SUnfQF{ z_kz_G-JX9QP|CclDoQk@2fOUWdLJCL;Pe93X}NF)h`O#5Y1r5j-qwNAM{dQ;R|N@k zT7~2S7E7;$z<k4T>?ylJ37&lE=@_72QDV0|N6tu9#MCc?MEM$HStkF<JP9asSxukA zoZBN=udzpMn7=t`Sn$g?w%cZHAFpNN4B2LqoRk>nbTli~iT_xtBfmnC^|78QprJ7k z#&G9p?@71o%f}FJXHtX*?;6E32h(P!B)y|{9*{N1<ELxqo`K))w6&!mvzxx1EXa6T z2D~(}{ad32ajUc;wr(x*oR`~<Qn1O$PpeZ_Vd$JG-+oe#7+s=M&ZcWX1EB1Pgwvn= z>BD$6sr0=Te>88z38^CTdZ?0!OSV;sem|k%j9}et7Q%n{ff5D^KzSmR^o@L<^4nbL zyxIcqnQWRc?Kb8j+3!-+j)w14=CQaD7LE9|P%fvtukUj?fF`R5l}A+bCkAnCEBo;= z`gU%b=-|`qf9CF*BP$bZ`HVQ<l5)3Rs_9!68L9#!rV=o&N6Hn8lLNuaOwwI?v|-5W z18>OKhSiSgoj6{765(oc;9elxdJ?M4vn9l1ye&PPO&VgUB@2(!)!pRTQd(9-TdlBL z_vX$QSK@JyVjZr-2$i=ARhS)K-~z{=af)n~%p=Cf_u_J(bJ!L69VX^Tr=0a`C(ti+ z?!nFAf;ahL5@{6^=1-L|ut06>egLo(1O~P&B}M-Jj(#_YaSCWZqN~CJA3WU|qQe47 z7>3H?iZ<Q$!@9lYmk*bGFv||EG?jimUwS<?07%L5K&-eViVd!?2G&zONDI>ROUS&6 zJ=$9}1L5B>k15P>HP#Uz$u9u4p~(UtFL^9`O3ZB;r<gSOp_CeM+23onZ(!-8bL=pa zGah5Fz!HbVZ|?<7tx;TA<Bf_0hwANG%WR@rB--*ZqmXHdMvAfH4GS9uUD?@axR+1v z2aPXE!`){pdhr9jw%Bs9(nsHK1ML&qs)wiv@`hbgPJ_aJ_R%l?_0keM)9=zmN7B(B zi`7=6x5nBJMryQ49)1U5<mdV{-N4BnTjWICq{=+BK&30?V<XRFuU2d6`!`6#E{Vcj zG;LS#@J1?eBEZIgiZe&02QZ?e7pZxK#3sdX1XoT6>b7YU!4Xpzi93@S=H#@Vve?*x z;ND*1S~DgKc0tJ)7HZuiv3c2tGsw)tHYsh6>|h7BUNu}sf+$9b{0=2ahq*K=T&*g6 zwUDZ$u0s!tRNSMr{DrCnI7|BtN{mK%<tlGCANI-wC_oF;sE(Z=jlR?;ywT^2PX$tE zcR@84W#@k9mcs>hY+SAuA`^XJuSHR74*_#=j(*FZaRP{a<Koft8o#)>E^{Uk|7sqO zyCuvT9lguwB_za>B#e;2t0?jP&_+}KK>)+q6sFgmV*Qdx{p=DSxjBxv0WY3N!(^sR zZ>?sNK1^zwlfUk(EWOHC*UxdcRMi%D%jRssnZ(_Q&K{hjujURcc4}WnMoUwJM&sNT z^%P@;r;}o0773B3^1la2LO%K&hqy?-8sYjocD>^$AIqL`O8njln|jsrsH^-4Eq11} z<j%k&DO$A}<urh?1aE!GLsbN}pYiuFDb_E)<_`9W)~VGZ><gdwup?E^^XF!7+D6-e z1bCtbVg9>ik0jfEZig*nLH>Hy-ljBWq<UN5axd@BU$fK*G1sN<nqn0o`J&RfSg7AV zC*Ea95{!`1&FTyF{moxEGY!k9U4aBQ_b+?VY%pqGZU%y^OKvkN4I1+igh$U3ej!cE zXq}5L0w~iAp#bXap9dTWzvUdndnEt!+)l9Co%IlFchf&<Ld{92)1sL?OGfRi*Qaf> zks1U*!{2;xMETL1&LdCJf1aBASmqfQL-`;Y>`pV3bK9Vm#(x~iBCTk+Id6vR))7aA z0VX#Yn8A*((HzlSl<y^E?vWJh)5JITrh-Zu&I&rObjJ)wkhbku3aFNr5Wi2?jsk!Q za0(`0vL>`v5r&h|dwOi|bRMOIhNG_MO4me8uBUPku6LxW$sk`{CgIFDQMNV$G>niy z<fkkLX>J?uOOsOYuVONpFH4w%BIBG$qtfjCAf_GsP=~mjqopCL=@)@vh-_ziFvI3) zs%{?fm<c034J|9EYyS{)rAKgNymG^UT9MF^HMHy(9gOi%#8f;MDA9?88F@Ak(NE9E znx21OCNGgBpD#5=k&k1`f0_vJ7_0BUxF`w*XUWq930#Y67W)$J5zj=+vf{h#?C~w# z1uZW#wFuoK5+F-%>pN>)$l6Si$yuFl^F%i>9%3OZl;!`x0h_Cz%EilcgeJUYvP|3j zH!eR504UVYW1*UsecS#j3$f6cY60s0U7xeCqoVqmGLd>9dQxrZ=$8dk%k%G_`2q}I z7cTq+)SBK3WA5D5txG|-W%f>QIq?=cCB@R}p9Vv--=h;y+>Y2<6G+%FEl9)?$_(Z^ zE&Ke3Qe|j{1|J`S-I*cn<$3`S@e~fiZq>4l)ihC)wLx0VX;uVb@ALUD$1E}=xQ*rF zVTkwxKAz*9zzGe<S;hEPp*m%$QIMbKSmRsfC<xnOn9`rchE`Zqfyv~5hSt#go@>9A zVf_cZ{q+yn(}MOUU&P2%P<euB3&5RUAK^d^Il4S^6^Ovg{}BzJmIFri>(v4G^CQPp zTEHtku20m@Z4TzBG}hxt`fQW&yS-2mzIkcE3t1QH#hrAWCi>@L5k(3$laD>|2}d^T z`=is*(>T88&-oM-;Jxt{4+^H|Gg~3VK($7j6>o<(UaOO!vMFik1vXU<=t_Gi1N-aA zS(U_L&&pM1Rh$!aWEaNp53ixmvYyqcih%4b<&xs*GqnrgJr9vmDkLuSMSg#3rHmR5 z3ludfb14y}ZS+tD++UodgY|F)BWiX*;G<TV3;*$vaBl^So6)LNV5;&*;l1iUG+ULm zQ>aRp39ObE#Py)^@%sLo^O6b07-vhgV7?Owb0ZlZ-VeBU^bknJ0Xw^iF07As0e~JV zc1XMvw)N`nZUhK)Q#=cqhW-<;5V>qcsl0Rh`o(BGuH)@sFyS|FwviQuTbj$s&Fa@! z)5|Zas%+Wc#d3n~9M4gGfi}5Ftwv^{fkB?V3kRU0xQ|chWXq^6_o2r=+AfI+8B|61 zwa)qk{?3gy-0_YWNBA6P{be4yTHk++W{$e~*2h)qU+=F(AzkC>;Z_xW29qrjgr1j~ z#&y6()ULNMJubEP*B2(oz>7uL=-47$O-*-yUj01D0AIK3KeB*xj|cX&>Fuu7uaisg z3vQt(bHAsy?H-uv*w}KyJw3FE0VVgh=MYp#I;Sj6K2ENH1zxMnLXhK+_2D#4%MXn+ zN6Egvhb38{WHUc*CsG9fF7+sAJ}^Cd#rGie_Gy-wtCy7xL*#+^44e%Az1r(NPuSV$ zI#eFkRQAP27G4Idy#)_Kf4jUqAm~zk==$xgTozSHO3Kxf<Y?y5+p`d`_vFcO2in$H zJ#uSo_1JsY@kY~THDi)o3<S%73rni*{@p;SI8v|&-s1x4>r#nf7t-TeNM`ljYgga+ z-1Zr$RBQ99{9O~9n|Fc*MeElefv7zGQx*0G5w956lVWX-3QcU9578~DCZZyPtE*bZ zR;yxSJn`1K=CNsoINqKYeSQD(S1)w;Vp|p;PN76M&vr*eN@@>k<oVoO-M9epO{L0t zhnLTN*F^}&p)``<rjb3`Iv;zOwzq5=D@37KH*SjZMbrG_2LEZ(-mxQ>y~WUVif0|W z7s_!Kj_>5TIq`&@Jqs`|h|kw~TcBb{Asz^I!Nu_sJ8D@>yM0TDWD)5BPVgIj(cSKs zEY%}Ou|d(`>m}G$-qpFd03nuch&ST9lkfS(Z~wwRU+0mJUC8|WE<iT!QHXnMEP*UM zy%ij&5bmfvFP5=be$tDzK03ly54#r9;qCWwaXHa4sCECpVrDOd74Pj!EI`G-#+v)E z?0+Fh#C{KR*NX8I7k_N9=g}CYY19Mb>&P6l?M+|!wXd(Q;LNGEq9-77>l|(i@N%d+ zx$3_Y$q?b=qtL8kM@n5sc5A*_cA)g$wzD+IcVEdAIy09Dez6p#MC+c9&!tYcqECZH z6Sa>{1(7^ZP`6f06}bFc(UrE(>En2h-zgOzcL?B(9=zus`CL0viI+)kYsAu|XFUy( zxub=0i6|t%5OotC?{`xphrR#_eN`2~W)I_hEalb}Qq~i=s(XGkGj`#@oNnq%wEoSN zHH;>sq_q|otlyC#+3Br^28yKM9r!@O;E-SzuKpa@2n$e&Z66L=5Ii#{RXp^RLEi%g zfAqckjPpC)0CFB?p{qcx*MjUBlM>Kn1Vf7E8Z7j#<Ox$|j7JkO^F!+|Y2j6Hg;@rS zXMnSY&i+aTEfxFJ%oMafeopMYCZkuL6)$3i^wYCUJ!1q9y+0KB+{3vfUH0{Hp2J)- zVu&aePUuZ>d+={u=c`;;H-Pgdob}<St#fq;tG>YGJ%A5ZM{G&$gqX>$5zuUJcm>+T zW4~mg+u{r4?fE-#1Vh-+k4><+n<^gXywnFIJ&tcR6^9?F3fj@*yK)8Z0af`vZo^SP z&m00LErv+mIgK)8n>D!%=Tg+`8P-b3cY+AI#s$^iU3uXhIouJ*l@m4$p6UTd{p_9Y z{9!4m$hF!G^K{u|af5S$^;dVg_@JnpVj7Y#>svPsxCJKFe}+x&55#U3dO8Mr0bM=X z%zJi=M|@c8FDT({gYfMCL(EXV=4%^>iHEC8Kz#O9Hlf~Es9_M<2o#+#WBb1Xp8+j7 z%cZei-X4%9dd(@;UvB0z)A4;l1Y?*8Y3_`tTUn=xR@{t+hzS4sR9Kr>>x`ih?po+N zI50ro@`%4$irfWyZCZ57)rBt48M_x~{h2w3g<FjMWTT+=GS7&KRxW8r;2Pn_D_6GM zPGuVcyGmN?p7DxgbF#YEyp5B98LRggXxhf%abUucO~;lK;#ZGO<zvmxM}NvTL5>zE zX9eq5)Xq(C^(Axloo6rc;=pj18;0Q*`1EO6<?YU6wLExZUN*)0Lk|~<+<HIdgv}Fh zK-a}j)p^)ky7pbpLY>}S+|g%>JGbDEref3!eI3ET{c&Mr%hlD4$h=<?7}!=j>vsue zWy%n4(fE|zq}KhM4W>C+HtUsDm^n)Qb!h+a;TI;?AP<VU$Yw)F#d4;GiY&;oFGi7K zu4P4FPOE?nD=3DAa@pGjchYZ(n0aSCqqY5z<*%o9@G{#uRjLFD&}-9n!^)m{dpRGL zVfRe|i!VmOxudY$Hl(QwL({B7gE`(s5Y8a?dx-+hqM!O2)L8NS?XJ@muc*@4UUa*6 z&ct>Q%-R#!pi7EvWP5g7?a`?`teI$ZSiL~yDxRv8Gqa+CU@~US$$&KOePW~ho$g8w zzrwH_@FJn9$KW~E89CZA9nQqWd3u?=gHEK|aGIB2GP3c{T<Y`J?Wxtn<C6dR{B_N> zumt;Uj!`y23GLaEp6oQbqXjf8U4%$XyD=!3EsDE}F|vFK#)eb1#abfLMPi&IK6&MG z=l#$aOThyZK)O5uKCU0^bhz!8xss20T(CYEqQ2`QJ<dL07xTXF&Dg{>_BG3}RJHHM zKwPv<?KZ$<S2(+3<T@dym5$aQy-~R+tmRgVcw|*XS?pTV@4@5LCc#+DBWeO8X%%F5 z_Y${l=-EK{Q2dYpD}S&<!n~wyyP9L7oW1re9SN>yqF%$1u=D#O$MF^qnaKv+dD{72 zcxZ#_82ZWAm$InYAPFM7(UAp;U+1^~xj>sdbYWp)V2Rg1(Wmea0!<;^Yk6Bea`|0> zduL6g-;GFvz@Zf_!Z9e?((puc)*z4&5s`^*o~I~dZZl3ju*?=sc-m`G6X|~AkB~t2 zXm%{LCj`WBZ!$Wx*|qBP$LMi=t++g_`K29;HT}A0WXCtXBNLR3dhH~}N2{7}39w=U zo)kI|B}kdJ8MTq4$8g0cWZo@?z(oX_L8R|?aI86fp1yXkU{xZu89Fh4Y&ixU>;tT< zlj=3u9&>M55qzw0=Q;=XE569v+tO186QS&ki7F$-q*XaWtmn<nP^c^1;M%#p6|$|2 z-R?MwAWl)J76;sJvyM_WTDEgHm0s)~MsV6f43-B2+&!T~C3nf;FH~Eft?IQFEOUnd zR=lc-Fe@Hdc_tlsplT!4Nqm{Unphw|jUBxKmK@1~{BJCOs2YK++HS5iqk+Uv{+7}v z=gLlLzOb9t&A%KuJLp-ru96@EQch<SJ_cPd@D22bJRy2Clcb@uQoAzQK~PS$UiP$E z`s$j46Z%?(bC56CeY_XW0XvW3OAr@(H%-a-66eUUc)uD=R`T@}6ZV}B`p8D6v$s>2 zNriLh73Hj@`?^J7h3q+~uA?rBuFnX$(fa)!x3j^?MEUBc?eVd<kH`s^EpyQS#3Gni z`VE%tre0$qaQ9$v;?`i}jtB`qyIH@ZEtMf^gv7l<)11T(_R|lS%ql)Eu(Tk9^!ocN zl#D!y1K%3^!130ZG!mwLw35iC2Dn=qt$nn;)1>K2iKFvhnMdNMfS@Tqw14mzC}fBx z-OG+d1k;y^!ozn^42>GFe?POm!=~kWvu;4UnFf$cj)$2=h=A+Rxtb|ABGVu{VYB5D zLxXJ8Q~Q88t=Hf7?4VzK3f79N-W66~^8s9?-UXMv6*FRpl@BF|ku_6>;Unt1>15km zZG_hQN|6fZO`IfO<fl-d12f#_#^c^X{hTN~v|cGZ80h_r_9k<N8DFBRM>3psZDMd@ zN_~xNaKoU}G#0~~(&xkArXq$ouN_Nt<RuMs?RBeVzDg4hN9%VLRt4$Nx_c@0a~+<} zRVN2iOJWnB_v=;qHpORx66VpCZUn>U6XOWi^>pDamw4u|cqOIIj7FENBzi>7fs1!` z1VUv<h>!2evXFsA7)rTwHZec+VD`oaX4}*5R(OS?ru1M+Ni5g^WY`%X5NB=RumRmX z8u)yu#-N|G4scI|9{>LzFAxhn-~JE%uZb<`jkq*pFlaOed1k0*qFef>%l-cX;3l_e literal 0 HcmV?d00001 diff --git a/test/__image_snapshots__/PieChart__Label-Interpolation-snap.png b/test/__image_snapshots__/PieChart__Label-Interpolation-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..f2b004ac487973bc2d9028fc089d5d3ff784bba9 GIT binary patch literal 5913 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 literal 0 HcmV?d00001 diff --git a/test/__image_snapshots__/PieChart__Labels-snap.png b/test/__image_snapshots__/PieChart__Labels-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..1c89b6a659398b660f20c65984b53e7fdb96ae59 GIT binary patch literal 7518 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 literal 0 HcmV?d00001 diff --git a/test/__image_snapshots__/PieChart__Relative-Donut-Width-snap.png b/test/__image_snapshots__/PieChart__Relative-Donut-Width-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..6d1a893a03d27f483156279ac8f21d623aeae50a GIT binary patch literal 23033 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 literal 0 HcmV?d00001 diff --git a/test/__image_snapshots__/PieChart__Small-Slices-snap.png b/test/__image_snapshots__/PieChart__Small-Slices-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..dab5e76150bf14c6f6caa69edd36b02af367dd81 GIT binary patch literal 4662 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 literal 0 HcmV?d00001 diff --git a/test/__image_snapshots__/PieChart__Solid-snap.png b/test/__image_snapshots__/PieChart__Solid-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..649dc34bd966cf173022004bfcc17167e12874d7 GIT binary patch literal 8725 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 Upv9*>6eoIy`eyJ7J(v6c3D3TeE&u=k literal 0 HcmV?d00001 diff --git a/test/__image_snapshots__/PieChart__Start-Angle-snap.png b/test/__image_snapshots__/PieChart__Start-Angle-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..0df60581e67e347779f4bebfcde096ab3e71e3ff GIT binary patch literal 7332 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 G9{v|f{is9$ literal 0 HcmV?d00001 From eb4649d1dc899472e46ae0f62e19d5fe8c5741cf Mon Sep 17 00:00:00 2001 From: Dan Onoshko <danon0404@gmail.com> Date: Wed, 18 May 2022 00:31:14 +0700 Subject: [PATCH 22/44] style: updated code style config (#13) --- .eslintrc | 224 ----- .eslintrc.json | 62 ++ .nano-staged.json | 3 + .prettierrc | 9 + .simple-git-hooks.json | 1 + .storybook/main.js | 15 +- .storybook/manager.js | 2 +- .storybook/preview.js | 13 +- .storybook/theme.js | 2 +- .travis.yml | 6 - package.json | 16 +- pnpm-lock.yaml | 583 +++++++++---- postcss.config.js | 13 +- rollup.config.js | 28 +- scripts/styles.js | 21 +- src/axes/auto-scale-axis.js | 17 +- src/axes/axes.js | 8 +- src/axes/axis.js | 93 +- src/axes/axis.spec.js | 60 +- src/axes/fixed-scale-axis.js | 19 +- src/axes/fixed-scale-axis.spec.js | 10 +- src/axes/step-axis.js | 2 +- src/axes/step-axis.spec.js | 2 +- src/charts/bar.js | 378 ++++++--- src/charts/bar.spec.js | 199 +++-- src/charts/bar.stories.js | 508 ++++++----- src/charts/base.js | 46 +- src/charts/charts.js | 8 +- src/charts/line.js | 230 +++-- src/charts/line.spec.js | 802 ++++++++++++++---- src/charts/line.stories.js | 752 +++++++++------- src/charts/pie.js | 177 ++-- src/charts/pie.spec.js | 229 +++-- src/charts/pie.stories.js | 203 +++-- src/core/core.js | 4 +- src/core/creation.js | 223 +++-- src/core/creation.spec.js | 84 +- src/core/data.js | 202 +++-- src/core/data.spec.js | 254 +++--- src/core/extend.js | 10 +- src/core/functional.js | 9 +- src/core/globals.js | 3 +- src/core/lang.js | 14 +- src/core/lang.spec.js | 22 +- src/core/math.js | 20 +- src/core/options-provider.js | 24 +- src/event/event-emitter.js | 14 +- src/index.js | 6 +- src/interpolation/cardinal.js | 86 +- src/interpolation/interpolation.js | 10 +- src/interpolation/monotone-cubic.js | 53 +- src/interpolation/none.js | 13 +- src/interpolation/simple.js | 29 +- src/interpolation/step.js | 30 +- src/svg/svg-list.js | 37 +- src/svg/svg-path.js | 191 +++-- src/svg/svg-path.spec.js | 97 ++- src/svg/svg.js | 178 ++-- src/svg/svg.spec.js | 92 +- test/mock/compat.js | 8 +- test/mock/cssModule.js | 8 +- test/mock/dom.js | 8 +- test/setup.js | 2 +- test/storyshots.spec.js | 23 +- test/utils/skipable.js | 2 +- .../imageSnapshotWithStoryParameters.js | 91 +- test/utils/storyshots/index.js | 6 +- test/utils/storyshots/initStoryshots.js | 74 +- test/utils/storyshots/storybook.js | 68 +- test/utils/storyshots/viewport.js | 4 +- 70 files changed, 4268 insertions(+), 2472 deletions(-) delete mode 100644 .eslintrc create mode 100644 .eslintrc.json create mode 100644 .nano-staged.json create mode 100644 .prettierrc delete mode 100644 .travis.yml diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index a667cd4d..00000000 --- a/.eslintrc +++ /dev/null @@ -1,224 +0,0 @@ -{ - "parser": "babel-eslint", - - "parser-options": { - "ecmaFeatures": { - "binaryLiterals": false, - "blockBindings": false, - "defaultParams": true, - "forOf": false, - "generators": false, - "objectLiteralComputedProperties": true, - "objectLiteralDuplicateProperties": false, - "objectLiteralShorthandMethods": true, - "objectLiteralShorthandProperties": true, - "octalLiterals": false, - "regexUFlag": false, - "regexYFlag": false, - "templateStrings": true, - "unicodeCodePointEscapes": false, - "jsx": false, - "spread": true, - "arrowFunctions": true, - "classes": true, - "modules": true, - "restParams": true, - "destructuring": true - } - }, - "env": { - "browser": true, - "node": false, - "amd": false, - "mocha": false, - "jasmine": true , - "phantomjs": false, - "jquery": false, - "prototypejs": false, - "shelljs": false - }, - - "globals": { - - }, - - "plugins": [ - - ], - - "rules": { - - - "no-comma-dangle": 0, - "no-cond-assign": 0, - "no-console": 2, - "no-constant-condition": 0, - "no-control-regex": 0, - "no-debugger": 2, - "no-dupe-keys": 0, - "no-empty": 0, - "no-empty-class": 0, - "no-ex-assign": 0, - "no-extra-boolean-cast": 0, - "no-extra-parens": 0, - "no-extra-semi": 0, - "no-func-assign": 0, - "no-inner-declarations": 0, - "no-invalid-regexp": 0, - "no-irregular-whitespace": 0, - "no-negated-in-lhs": 0, - "no-obj-calls": 0, - "no-regex-spaces": 0, - "no-reserved-keys": 0, - "no-sparse-arrays": 0, - "no-unreachable": 2, - "use-isnan": 0, - "valid-jsdoc": 0, - "valid-typeof": 0, - - - - - "block-scoped-var": 0, - "complexity": 0, - "consistent-return": 0, - "curly": 2, - "default-case": 0, - "dot-notation": 1, - "eqeqeq": 2, - "guard-for-in": 0, - "no-alert": 2, - "no-caller": 2, - "no-div-regex": 0, - "no-else-return": 0, - "no-empty-label": 0, - "no-eq-null": 0, - "no-eval": 2, - "no-extend-native": 0, - "no-extra-bind": 2, - "no-fallthrough": 0, - "no-floating-decimal": 0, - "no-implied-eval": 2, - "no-iterator": 0, - "no-labels": 0, - "no-lone-blocks": 0, - "no-loop-func": 2, - "no-multi-spaces": 2, - "no-multi-str": 0, - "no-native-reassign": 0, - "no-new": 0, - "no-new-func": 0, - "no-new-wrappers": 0, - "no-octal": 0, - "no-octal-escape": 0, - "no-process-env": 0, - "no-proto": 0, - "no-redeclare": 0, - "no-return-assign": 0, - "no-script-url": 0, - "no-self-compare": 0, - "no-sequences": 0, - "no-unused-expressions": 0, - "no-void": 0, - "no-warning-comments": 0, - "no-with": 2, - "radix": 2, - "vars-on-top": 0, - "wrap-iife": 0, - "yoda": 0, - - - - - "global-strict": 0, - "no-extra-strict": 0, - "strict": 0, - - - - - "no-catch-shadow": 0, - "no-delete-var": 0, - "no-label-var": 0, - "no-shadow": 2, - "no-shadow-restricted-names": 2, - "no-undef": 0, - "no-undef-init": 0, - "no-undefined": 0, - "no-unused-vars": 0, - "no-use-before-define": 0, - - - - - "handle-callback-err": 0, - "no-mixed-requires": 0, - "no-new-require": 0, - "no-path-concat": 0, - "no-process-exit": 0, - "no-restricted-modules": 0, - "no-sync": 0, - - - - - "brace-style": ["error", "1tbs"], - "camelcase": 2, - "comma-spacing": 0, - "comma-style": ["error", "last"], - "consistent-this": 0, - "eol-last": 2, - "func-names": 0, - "func-style": 0, - "key-spacing": 2, - "max-nested-callbacks": 0, - "new-cap": 1, - "new-parens": 0, - "no-array-constructor": 2, - "no-inline-comments": 0, - "no-lonely-if": 0, - "no-mixed-spaces-and-tabs": 2, - "no-multiple-empty-lines": 2, - "no-nested-ternary": 2, - "no-new-object": 0, - "semi-spacing": 2, - "no-spaced-func": 2, - "no-ternary": 0, - "no-trailing-spaces": 2, - "no-underscore-dangle": 0, - "no-wrap-func": 0, - "one-var": 0, - "operator-assignment": 0, - "padded-blocks": 0, - "quote-props": 0, - "quotes": ["error", "single"], - "semi": 0, - "sort-vars": 0, - "space-before-function-paren": ["error", "never"], - "keyword-spacing": 0, - "space-before-blocks": 2, - "space-in-brackets": 0, - "space-in-parens": 0, - "space-infix-ops": 0, - "space-return-throw-case": 0, - "space-unary-ops": 0, - "spaced-comment": 1, - "wrap-regex": 0, - - - - - "no-var": 2, - "generator-star": 0, - - - - - "max-depth": 0, - "max-len": 0, - "max-params": 0, - "max-statements": 0, - "no-bitwise": 0, - "no-plusplus": 0 - } -} diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 00000000..d7db095c --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,62 @@ +{ + "extends": ["eslint:recommended", "plugin:prettier/recommended"], + "parser": "@babel/eslint-parser", + "parserOptions": { + "ecmaVersion": "latest", + "requireConfigFile": false + }, + "env": { + "es6": true, + "browser": true, + "node": true + }, + "rules": { + "no-console": 2, + "curly": 2, + "dot-notation": 1, + "eqeqeq": 2, + "no-alert": 2, + "no-caller": 2, + "no-eval": 2, + "no-extra-bind": 2, + "no-implied-eval": 2, + "no-multi-spaces": 2, + "no-with": 2, + "no-shadow": 2, + "no-shadow-restricted-names": 2, + "brace-style": ["error", "1tbs"], + "camelcase": 2, + "comma-style": ["error", "last"], + "eol-last": 2, + "key-spacing": 2, + "new-cap": 1, + "no-array-constructor": 2, + "no-mixed-spaces-and-tabs": 2, + "no-multiple-empty-lines": 2, + "no-nested-ternary": 2, + "semi-spacing": 2, + "no-spaced-func": 2, + "no-trailing-spaces": 2, + "space-before-blocks": 2, + "spaced-comment": 1, + "no-var": 2 + }, + "overrides": [ + { + "files": ["test/**/*.js", "*.spec.js", "*.stories.js"], + "plugins": [ + "jest", + "testing-library", + "jest-dom" + ], + "extends": ["plugin:jest-dom/recommended"], + "env": { + "jest/globals": true + }, + "rules": { + "no-console": 0, + "no-shadow": 0 + } + } + ] +} diff --git a/.nano-staged.json b/.nano-staged.json new file mode 100644 index 00000000..1730308c --- /dev/null +++ b/.nano-staged.json @@ -0,0 +1,3 @@ +{ + "**/*.js": ["prettier --write", "eslint"] +} diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 00000000..c79ed740 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,9 @@ +{ + "singleQuote": true, + "jsxSingleQuote": true, + "semi": true, + "tabWidth": 2, + "bracketSpacing": true, + "arrowParens": "avoid", + "trailingComma": "none" +} diff --git a/.simple-git-hooks.json b/.simple-git-hooks.json index e2e2bacc..06e40b96 100644 --- a/.simple-git-hooks.json +++ b/.simple-git-hooks.json @@ -1,4 +1,5 @@ { "commit-msg": "pnpm commitlint --edit \"$1\"", + "pre-commit": "pnpm nano-staged", "pre-push": "pnpm test" } diff --git a/.storybook/main.js b/.storybook/main.js index ab6daeca..d3461913 100644 --- a/.storybook/main.js +++ b/.storybook/main.js @@ -1,6 +1,6 @@ const path = require('path'); -const isCompatMode = process.env.CHARTIST_COMPAT === 'true' +const isCompatMode = process.env.CHARTIST_COMPAT === 'true'; module.exports = { stories: ['../src/**/*.stories.@(js|jsx|ts|tsx)'], @@ -10,16 +10,13 @@ module.exports = { '@storybook/addon-actions', '@storybook/addon-viewport' ], - webpackFinal: async (config) => { + webpackFinal: async config => { config.module.rules.push({ test: /\.scss$/, sideEffects: true, - use: [ - 'style-loader', - 'css-loader', - 'postcss-loader', - 'sass-loader' - ].map(require.resolve) + use: ['style-loader', 'css-loader', 'postcss-loader', 'sass-loader'].map( + require.resolve + ) }); config.resolve.alias['chartist-dev/styles$'] = isCompatMode @@ -30,5 +27,5 @@ module.exports = { : path.resolve(__dirname, '..', 'src'); return config; - }, + } }; diff --git a/.storybook/manager.js b/.storybook/manager.js index d64c248b..79890c47 100644 --- a/.storybook/manager.js +++ b/.storybook/manager.js @@ -4,5 +4,5 @@ import { theme } from './theme'; addons.setConfig({ theme, - panelPosition: 'right', + panelPosition: 'right' }); diff --git a/.storybook/preview.js b/.storybook/preview.js index cf865ba4..320ceb46 100644 --- a/.storybook/preview.js +++ b/.storybook/preview.js @@ -2,20 +2,19 @@ import { INITIAL_VIEWPORTS } from '@storybook/addon-viewport'; import { configureActions } from '@storybook/addon-actions'; import faker from 'faker'; -const SEED_VALUE = 584 +const SEED_VALUE = 584; if (process.env.STORYBOOK_STORYSHOTS) { // Make faker values reproducible. - faker.seed(SEED_VALUE) + faker.seed(SEED_VALUE); } configureActions({ - depth: 5, + depth: 5 }); export const parameters = { viewport: { - viewports: INITIAL_VIEWPORTS, - }, -} - + viewports: INITIAL_VIEWPORTS + } +}; diff --git a/.storybook/theme.js b/.storybook/theme.js index d9b1155e..f5c68789 100644 --- a/.storybook/theme.js +++ b/.storybook/theme.js @@ -3,5 +3,5 @@ import { create } from '@storybook/theming'; export const theme = create({ base: 'light', brandTitle: 'chartist', - brandUrl: 'https://github.com/chartist-js/chartist', + brandUrl: 'https://github.com/chartist-js/chartist' }); diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 78129c84..00000000 --- a/.travis.yml +++ /dev/null @@ -1,6 +0,0 @@ -language: node_js -node_js: - - '6.9.0' -before_script: - - 'npm install -g jspm' - - 'jspm install' diff --git a/package.json b/package.json index 9e6416f6..e1a6f80a 100644 --- a/package.json +++ b/package.json @@ -56,13 +56,15 @@ "build:storybook": "del ./storybook-static; NODE_ENV=production build-storybook", "test:unit": "jest -c jest.config.json ./src", "test:storyshots": "jest -c jest.config.json ./test/storyshots.spec.js", - "test": "pnpm test:unit", - "lint": "eslint src", + "test": "pnpm lint && pnpm test:unit", + "lint": "eslint './*.js' 'test/**/*.js' 'src/**/*.js' '.storybook/**/*.js' 'scripts/**/*.js'", + "format": "prettier --write './*.js' 'test/**/*.js' 'src/**/*.js' '.storybook/**/*.js' 'scripts/**/*.js'", "commit": "cz", "updateGitHooks": "simple-git-hooks" }, "devDependencies": { "@babel/core": "^7.17.9", + "@babel/eslint-parser": "^7.17.0", "@commitlint/cli": "^16.2.3", "@commitlint/config-conventional": "^16.2.1", "@commitlint/cz-commitlint": "^16.2.3", @@ -79,21 +81,27 @@ "@swc/jest": "^0.2.20", "@testing-library/jest-dom": "^5.16.4", "@types/faker": "^5.5.8", - "babel-eslint": "^7.1.0", "browserslist": "^4.20.2", "chartist": "^0.11.4", "commitizen": "^4.2.4", "cssnano": "^4.1.11", "del": "^6.0.0", "del-cli": "^4.0.1", - "eslint": "^8.12.0", + "eslint": "^8.15.0", + "eslint-config-prettier": "^8.5.0", + "eslint-plugin-jest": "^26.2.2", + "eslint-plugin-jest-dom": "^4.0.1", + "eslint-plugin-prettier": "^4.0.0", + "eslint-plugin-testing-library": "^5.5.0", "faker": "^5.5.3", "http-server": "^14.1.0", "inquirer": "^8.0.0", "jest": "^27.5.1", "jest-image-snapshot": "^4.5.1", + "nano-staged": "^0.8.0", "postcss": "^7.0.39", "postcss-preset-env": "^6.7.1", + "prettier": "^2.6.2", "puppeteer": "^14.0.0", "rollup": "^2.70.1", "rollup-plugin-swc": "^0.2.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4ed7fdeb..60a87b0d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -2,6 +2,7 @@ lockfileVersion: 5.3 specifiers: '@babel/core': ^7.17.9 + '@babel/eslint-parser': ^7.17.0 '@commitlint/cli': ^16.2.3 '@commitlint/config-conventional': ^16.2.1 '@commitlint/cz-commitlint': ^16.2.3 @@ -18,21 +19,27 @@ specifiers: '@swc/jest': ^0.2.20 '@testing-library/jest-dom': ^5.16.4 '@types/faker': ^5.5.8 - babel-eslint: ^7.1.0 browserslist: ^4.20.2 chartist: ^0.11.4 commitizen: ^4.2.4 cssnano: ^4.1.11 del: ^6.0.0 del-cli: ^4.0.1 - eslint: ^8.12.0 + eslint: ^8.15.0 + eslint-config-prettier: ^8.5.0 + eslint-plugin-jest: ^26.2.2 + eslint-plugin-jest-dom: ^4.0.1 + eslint-plugin-prettier: ^4.0.0 + eslint-plugin-testing-library: ^5.5.0 faker: ^5.5.3 http-server: ^14.1.0 inquirer: ^8.0.0 jest: ^27.5.1 jest-image-snapshot: ^4.5.1 + nano-staged: ^0.8.0 postcss: ^7.0.39 postcss-preset-env: ^6.7.1 + prettier: ^2.6.2 puppeteer: ^14.0.0 rollup: ^2.70.1 rollup-plugin-swc: ^0.2.1 @@ -42,37 +49,44 @@ specifiers: devDependencies: '@babel/core': 7.17.9 + '@babel/eslint-parser': 7.17.0_@babel+core@7.17.9+eslint@8.15.0 '@commitlint/cli': 16.2.3_@swc+core@1.2.165 '@commitlint/config-conventional': 16.2.1 '@commitlint/cz-commitlint': 16.2.3_d728995458426a93696f083845656c00 '@rollup/plugin-node-resolve': 13.2.0_rollup@2.70.1 '@storybook/addon-actions': 6.4.22 - '@storybook/addon-controls': 6.4.22_eslint@8.13.0 - '@storybook/addon-docs': 6.4.22_7fd729fae3ed30395c91a6c3899e19ab - '@storybook/addon-storyshots': 6.4.22_eslint@8.13.0+jest@27.5.1 + '@storybook/addon-controls': 6.4.22_eslint@8.15.0 + '@storybook/addon-docs': 6.4.22_bb08b3ace3da23babfac149a03b58596 + '@storybook/addon-storyshots': 6.4.22_eslint@8.15.0+jest@27.5.1 '@storybook/addon-storyshots-puppeteer': 6.4.22_ee73af2950fdda0cdee7b156fb6cc3b7 '@storybook/addon-viewport': 6.4.22 - '@storybook/html': 6.4.22_@babel+core@7.17.9+eslint@8.13.0 + '@storybook/html': 6.4.22_@babel+core@7.17.9+eslint@8.15.0 '@swc/core': 1.2.165 '@swc/helpers': 0.3.8 '@swc/jest': 0.2.20_@swc+core@1.2.165 '@testing-library/jest-dom': 5.16.4 '@types/faker': 5.5.9 - babel-eslint: 7.2.3 browserslist: 4.20.2 chartist: 0.11.4 commitizen: 4.2.4_@swc+core@1.2.165 cssnano: 4.1.11 del: 6.0.0 del-cli: 4.0.1 - eslint: 8.13.0 + eslint: 8.15.0 + eslint-config-prettier: 8.5.0_eslint@8.15.0 + eslint-plugin-jest: 26.2.2_eslint@8.15.0+jest@27.5.1 + eslint-plugin-jest-dom: 4.0.1_eslint@8.15.0 + eslint-plugin-prettier: 4.0.0_440b30a60bbe5bb6e3ad0057150b2782 + eslint-plugin-testing-library: 5.5.0_eslint@8.15.0 faker: 5.5.3 http-server: 14.1.0 inquirer: 8.2.2 jest: 27.5.1 jest-image-snapshot: 4.5.1_jest@27.5.1 + nano-staged: 0.8.0 postcss: 7.0.39 postcss-preset-env: 6.7.1 + prettier: 2.6.2 puppeteer: 14.0.0 rollup: 2.70.1 rollup-plugin-swc: 0.2.1_@swc+core@1.2.165+rollup@2.70.1 @@ -158,6 +172,20 @@ packages: - supports-color dev: true + /@babel/eslint-parser/7.17.0_@babel+core@7.17.9+eslint@8.15.0: + resolution: {integrity: sha512-PUEJ7ZBXbRkbq3qqM/jZ2nIuakUBqCYc7Qf52Lj7dlZ6zERnqisdHioL0l4wwQZnmskMeasqUNzLBFKs3nylXA==} + engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} + peerDependencies: + '@babel/core': '>=7.11.0' + eslint: ^7.5.0 || ^8.0.0 + dependencies: + '@babel/core': 7.17.9 + eslint: 8.15.0 + eslint-scope: 5.1.1 + eslint-visitor-keys: 2.1.0 + semver: 6.3.0 + dev: true + /@babel/generator/7.17.9: resolution: {integrity: sha512-rAdDousTwxbIxbz5I7GEQ3lUip+xVCXooZNbsydCWs3xA7ZsYOv+CFRdzGxRX78BmQHu9B1Eso59AOZQOJDEdQ==} engines: {node: '>=6.9.0'} @@ -1546,6 +1574,15 @@ packages: ajv: 6.12.6 dev: true + /@commitlint/config-validator/17.0.0: + resolution: {integrity: sha512-78IQjoZWR4kDHp/U5y17euEWzswJpPkA9TDL5F6oZZZaLIEreWzrDZD5PWtM8MsSRl/K2LDU/UrzYju2bKLMpA==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/types': 17.0.0 + ajv: 6.12.6 + dev: true + optional: true + /@commitlint/cz-commitlint/16.2.3_d728995458426a93696f083845656c00: resolution: {integrity: sha512-G9rRnBJ/5te7RiOzp7EdqII9rQYvtsfsqwMxcoK4B7l0Rc57nFCOlf0e4Bn70E4aOsLeMzNe+PvVVrEsPStEHg==} engines: {node: '>=v12'} @@ -1579,6 +1616,12 @@ packages: engines: {node: '>=v12'} dev: true + /@commitlint/execute-rule/17.0.0: + resolution: {integrity: sha512-nVjL/w/zuqjCqSJm8UfpNaw66V9WzuJtQvEnCrK4jDw6qKTmZB+1JQ8m6BQVZbNBcwfYdDNKnhIhqI0Rk7lgpQ==} + engines: {node: '>=v14'} + dev: true + optional: true + /@commitlint/format/16.2.1: resolution: {integrity: sha512-Yyio9bdHWmNDRlEJrxHKglamIk3d6hC0NkEUW6Ti6ipEh2g0BAhy8Od6t4vLhdZRa1I2n+gY13foy+tUgk0i1Q==} engines: {node: '>=v12'} @@ -1625,6 +1668,27 @@ packages: - '@swc/wasm' dev: true + /@commitlint/load/17.0.0_@swc+core@1.2.165: + resolution: {integrity: sha512-XaiHF4yWQOPAI0O6wXvk+NYLtJn/Xb7jgZEeKd4C1ZWd7vR7u8z5h0PkWxSr0uLZGQsElGxv3fiZ32C5+q6M8w==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/config-validator': 17.0.0 + '@commitlint/execute-rule': 17.0.0 + '@commitlint/resolve-extends': 17.0.0 + '@commitlint/types': 17.0.0 + '@types/node': 17.0.23 + chalk: 4.1.2 + cosmiconfig: 7.0.1 + cosmiconfig-typescript-loader: 2.0.0_5afcf6943f43533df426196350caf695 + lodash: 4.17.21 + resolve-from: 5.0.0 + typescript: 4.6.4 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + dev: true + optional: true + /@commitlint/message/16.2.1: resolution: {integrity: sha512-2eWX/47rftViYg7a3axYDdrgwKv32mxbycBJT6OQY/MJM7SUfYNYYvbMFOQFaA4xIVZt7t2Alyqslbl6blVwWw==} engines: {node: '>=v12'} @@ -1661,6 +1725,19 @@ packages: resolve-global: 1.0.0 dev: true + /@commitlint/resolve-extends/17.0.0: + resolution: {integrity: sha512-wi60WiJmwaQ7lzMXK8Vbc18Hq9tE2j/6iv2AFfPUGV7fvfY6Sf1iNKuUHirSqR0fquUyufIXe4y/K9A6LVIIvw==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/config-validator': 17.0.0 + '@commitlint/types': 17.0.0 + import-fresh: 3.3.0 + lodash: 4.17.21 + resolve-from: 5.0.0 + resolve-global: 1.0.0 + dev: true + optional: true + /@commitlint/rules/16.2.1: resolution: {integrity: sha512-ZFezJXQaBBso+BOTre/+1dGCuCzlWVaeLiVRGypI53qVgPMzQqZhkCcrxBFeqB87qeyzr4A4EoG++IvITwwpIw==} engines: {node: '>=v12'} @@ -1691,6 +1768,14 @@ packages: chalk: 4.1.2 dev: true + /@commitlint/types/17.0.0: + resolution: {integrity: sha512-hBAw6U+SkAT5h47zDMeOu3HSiD0SODw4Aq7rRNh1ceUmL7GyLKYhPbUvlRWqZ65XjBLPHZhFyQlRaPNz8qvUyQ==} + engines: {node: '>=v14'} + dependencies: + chalk: 4.1.2 + dev: true + optional: true + /@cspotcode/source-map-consumer/0.8.0: resolution: {integrity: sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==} engines: {node: '>= 12'} @@ -1851,14 +1936,14 @@ packages: resolution: {integrity: sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==} dev: true - /@eslint/eslintrc/1.2.1: - resolution: {integrity: sha512-bxvbYnBPN1Gibwyp6NrpnFzA3YtRL3BBAyEAFVIpNTm2Rn4Vy87GA5M4aSn3InRrlsbX5N0GW7XIx+U4SAEKdQ==} + /@eslint/eslintrc/1.2.3: + resolution: {integrity: sha512-uGo44hIwoLGNyduRpjdEpovcbMdd+Nv7amtmJxnKmI8xj6yd5LncmSwDa5NgX/41lIFJtkjD6YdVfgEzPfJ5UA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 debug: 4.3.4 - espree: 9.3.1 - globals: 13.13.0 + espree: 9.3.2 + globals: 13.15.0 ignore: 5.2.0 import-fresh: 3.3.0 js-yaml: 4.1.0 @@ -2331,7 +2416,7 @@ packages: - '@types/react' dev: true - /@storybook/addon-controls/6.4.22_eslint@8.13.0: + /@storybook/addon-controls/6.4.22_eslint@8.15.0: resolution: {integrity: sha512-f/M/W+7UTEUnr/L6scBMvksq+ZA8GTfh3bomE5FtWyOyaFppq9k8daKAvdYNlzXAOrUUsoZVJDgpb20Z2VBiSQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 @@ -2346,7 +2431,7 @@ packages: '@storybook/api': 6.4.22 '@storybook/client-logger': 6.4.22 '@storybook/components': 6.4.22 - '@storybook/core-common': 6.4.22_eslint@8.13.0 + '@storybook/core-common': 6.4.22_eslint@8.15.0 '@storybook/csf': 0.0.2--canary.87bc651.0 '@storybook/node-logger': 6.4.22 '@storybook/store': 6.4.22 @@ -2364,7 +2449,7 @@ packages: - webpack-command dev: true - /@storybook/addon-docs/6.4.22_7fd729fae3ed30395c91a6c3899e19ab: + /@storybook/addon-docs/6.4.22_bb08b3ace3da23babfac149a03b58596: resolution: {integrity: sha512-9j+i+W+BGHJuRe4jUrqk6ubCzP4fc1xgFS2o8pakRiZgPn5kUQPdkticmsyh1XeEJifwhqjKJvkEDrcsleytDA==} peerDependencies: '@storybook/angular': 6.4.22 @@ -2422,14 +2507,14 @@ packages: '@mdx-js/react': 1.6.22 '@storybook/addons': 6.4.22 '@storybook/api': 6.4.22 - '@storybook/builder-webpack4': 6.4.22_eslint@8.13.0 + '@storybook/builder-webpack4': 6.4.22_eslint@8.15.0 '@storybook/client-logger': 6.4.22 '@storybook/components': 6.4.22 - '@storybook/core': 6.4.22_eslint@8.13.0 + '@storybook/core': 6.4.22_eslint@8.15.0 '@storybook/core-events': 6.4.22 '@storybook/csf': 0.0.2--canary.87bc651.0 '@storybook/csf-tools': 6.4.22 - '@storybook/html': 6.4.22_@babel+core@7.17.9+eslint@8.13.0 + '@storybook/html': 6.4.22_@babel+core@7.17.9+eslint@8.15.0 '@storybook/node-logger': 6.4.22 '@storybook/postinstall': 6.4.22 '@storybook/preview-web': 6.4.22 @@ -2483,7 +2568,7 @@ packages: optional: true dependencies: '@axe-core/puppeteer': 4.4.2_puppeteer@14.0.0 - '@storybook/addon-storyshots': 6.4.22_eslint@8.13.0+jest@27.5.1 + '@storybook/addon-storyshots': 6.4.22_eslint@8.15.0+jest@27.5.1 '@storybook/csf': 0.0.2--canary.87bc651.0 '@storybook/node-logger': 6.4.22 '@types/jest-image-snapshot': 4.3.1 @@ -2495,7 +2580,7 @@ packages: - jest dev: true - /@storybook/addon-storyshots/6.4.22_eslint@8.13.0+jest@27.5.1: + /@storybook/addon-storyshots/6.4.22_eslint@8.15.0+jest@27.5.1: resolution: {integrity: sha512-9u+uigHH4khxHB18z1TOau+RKpLo/8tdhvKVqgjy6pr3FSsgp+JyoI+ubDtgWAWFHQ0Zhh5MBWNDmPOo5pwBdA==} peerDependencies: '@angular/core': '>=6.0.0' @@ -2550,9 +2635,9 @@ packages: '@storybook/addons': 6.4.22 '@storybook/babel-plugin-require-context-hook': 1.0.1 '@storybook/client-api': 6.4.22 - '@storybook/core': 6.4.22_eslint@8.13.0 + '@storybook/core': 6.4.22_eslint@8.15.0 '@storybook/core-client': 6.4.22 - '@storybook/core-common': 6.4.22_eslint@8.13.0 + '@storybook/core-common': 6.4.22_eslint@8.15.0 '@storybook/csf': 0.0.2--canary.87bc651.0 '@types/glob': 7.2.0 '@types/jest': 26.0.24 @@ -2706,7 +2791,7 @@ packages: resolution: {integrity: sha512-WM4vjgSVi8epvGiYfru7BtC3f0tGwNs7QK3Uc4xQn4t5hHQvISnCqbNrHdDYmNW56Do+bBztE8SwP6NGUvd7ww==} dev: true - /@storybook/builder-webpack4/6.4.22_cfdbbe835af0ce3c97f004e72dcbccdb: + /@storybook/builder-webpack4/6.4.22_92b9a5635cc8dc22d6ee778fa547da7f: resolution: {integrity: sha512-A+GgGtKGnBneRFSFkDarUIgUTI8pYFdLmUVKEAGdh2hL+vLXAz9A46sEY7C8LQ85XWa8TKy3OTDxqR4+4iWj3A==} peerDependencies: react: ^16.8.0 || ^17.0.0 @@ -2744,7 +2829,7 @@ packages: '@storybook/client-api': 6.4.22_react-dom@16.14.0+react@16.14.0 '@storybook/client-logger': 6.4.22 '@storybook/components': 6.4.22_react-dom@16.14.0+react@16.14.0 - '@storybook/core-common': 6.4.22_cfdbbe835af0ce3c97f004e72dcbccdb + '@storybook/core-common': 6.4.22_92b9a5635cc8dc22d6ee778fa547da7f '@storybook/core-events': 6.4.22 '@storybook/node-logger': 6.4.22 '@storybook/preview-web': 6.4.22_react-dom@16.14.0+react@16.14.0 @@ -2796,7 +2881,7 @@ packages: - webpack-command dev: true - /@storybook/builder-webpack4/6.4.22_eslint@8.13.0: + /@storybook/builder-webpack4/6.4.22_eslint@8.15.0: resolution: {integrity: sha512-A+GgGtKGnBneRFSFkDarUIgUTI8pYFdLmUVKEAGdh2hL+vLXAz9A46sEY7C8LQ85XWa8TKy3OTDxqR4+4iWj3A==} peerDependencies: react: ^16.8.0 || ^17.0.0 @@ -2834,7 +2919,7 @@ packages: '@storybook/client-api': 6.4.22 '@storybook/client-logger': 6.4.22 '@storybook/components': 6.4.22 - '@storybook/core-common': 6.4.22_eslint@8.13.0 + '@storybook/core-common': 6.4.22_eslint@8.15.0 '@storybook/core-events': 6.4.22 '@storybook/node-logger': 6.4.22 '@storybook/preview-web': 6.4.22 @@ -3195,7 +3280,7 @@ packages: - '@types/react' dev: true - /@storybook/core-common/6.4.22_cfdbbe835af0ce3c97f004e72dcbccdb: + /@storybook/core-common/6.4.22_92b9a5635cc8dc22d6ee778fa547da7f: resolution: {integrity: sha512-PD3N/FJXPNRHeQS2zdgzYFtqPLdi3MLwAicbnw+U3SokcsspfsAuyYHZOYZgwO8IAEKy6iCc7TpBdiSJZ/vAKQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 @@ -3238,7 +3323,7 @@ packages: express: 4.17.3 file-system-cache: 1.0.5 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.1_eslint@8.13.0+webpack@4.46.0 + fork-ts-checker-webpack-plugin: 6.5.1_eslint@8.15.0+webpack@4.46.0 fs-extra: 9.1.0 glob: 7.2.0 handlebars: 4.7.7 @@ -3264,7 +3349,7 @@ packages: - webpack-command dev: true - /@storybook/core-common/6.4.22_eslint@8.13.0: + /@storybook/core-common/6.4.22_eslint@8.15.0: resolution: {integrity: sha512-PD3N/FJXPNRHeQS2zdgzYFtqPLdi3MLwAicbnw+U3SokcsspfsAuyYHZOYZgwO8IAEKy6iCc7TpBdiSJZ/vAKQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 @@ -3307,7 +3392,7 @@ packages: express: 4.17.3 file-system-cache: 1.0.5 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.1_eslint@8.13.0+webpack@4.46.0 + fork-ts-checker-webpack-plugin: 6.5.1_eslint@8.15.0+webpack@4.46.0 fs-extra: 9.1.0 glob: 7.2.0 handlebars: 4.7.7 @@ -3337,7 +3422,7 @@ packages: core-js: 3.21.1 dev: true - /@storybook/core-server/6.4.22_cfdbbe835af0ce3c97f004e72dcbccdb: + /@storybook/core-server/6.4.22_92b9a5635cc8dc22d6ee778fa547da7f: resolution: {integrity: sha512-wFh3e2fa0un1d4+BJP+nd3FVWUO7uHTqv3OGBfOmzQMKp4NU1zaBNdSQG7Hz6mw0fYPBPZgBjPfsJRwIYLLZyw==} peerDependencies: '@storybook/builder-webpack5': 6.4.22 @@ -3354,13 +3439,13 @@ packages: optional: true dependencies: '@discoveryjs/json-ext': 0.5.7 - '@storybook/builder-webpack4': 6.4.22_cfdbbe835af0ce3c97f004e72dcbccdb + '@storybook/builder-webpack4': 6.4.22_92b9a5635cc8dc22d6ee778fa547da7f '@storybook/core-client': 6.4.22_e97e5e3809294a3414549b4ba42cd203 - '@storybook/core-common': 6.4.22_cfdbbe835af0ce3c97f004e72dcbccdb + '@storybook/core-common': 6.4.22_92b9a5635cc8dc22d6ee778fa547da7f '@storybook/core-events': 6.4.22 '@storybook/csf': 0.0.2--canary.87bc651.0 '@storybook/csf-tools': 6.4.22 - '@storybook/manager-webpack4': 6.4.22_cfdbbe835af0ce3c97f004e72dcbccdb + '@storybook/manager-webpack4': 6.4.22_92b9a5635cc8dc22d6ee778fa547da7f '@storybook/node-logger': 6.4.22 '@storybook/semver': 7.3.2 '@storybook/store': 6.4.22_react-dom@16.14.0+react@16.14.0 @@ -3409,7 +3494,7 @@ packages: - webpack-command dev: true - /@storybook/core-server/6.4.22_eslint@8.13.0: + /@storybook/core-server/6.4.22_eslint@8.15.0: resolution: {integrity: sha512-wFh3e2fa0un1d4+BJP+nd3FVWUO7uHTqv3OGBfOmzQMKp4NU1zaBNdSQG7Hz6mw0fYPBPZgBjPfsJRwIYLLZyw==} peerDependencies: '@storybook/builder-webpack5': 6.4.22 @@ -3426,13 +3511,13 @@ packages: optional: true dependencies: '@discoveryjs/json-ext': 0.5.7 - '@storybook/builder-webpack4': 6.4.22_eslint@8.13.0 + '@storybook/builder-webpack4': 6.4.22_eslint@8.15.0 '@storybook/core-client': 6.4.22_webpack@4.46.0 - '@storybook/core-common': 6.4.22_eslint@8.13.0 + '@storybook/core-common': 6.4.22_eslint@8.15.0 '@storybook/core-events': 6.4.22 '@storybook/csf': 0.0.2--canary.87bc651.0 '@storybook/csf-tools': 6.4.22 - '@storybook/manager-webpack4': 6.4.22_eslint@8.13.0 + '@storybook/manager-webpack4': 6.4.22_eslint@8.15.0 '@storybook/node-logger': 6.4.22 '@storybook/semver': 7.3.2 '@storybook/store': 6.4.22 @@ -3479,7 +3564,7 @@ packages: - webpack-command dev: true - /@storybook/core/6.4.22_cfdbbe835af0ce3c97f004e72dcbccdb: + /@storybook/core/6.4.22_92b9a5635cc8dc22d6ee778fa547da7f: resolution: {integrity: sha512-KZYJt7GM5NgKFXbPRZZZPEONZ5u/tE/cRbMdkn/zWN3He8+VP+65/tz8hbriI/6m91AWVWkBKrODSkeq59NgRA==} peerDependencies: '@storybook/builder-webpack5': 6.4.22 @@ -3494,7 +3579,7 @@ packages: optional: true dependencies: '@storybook/core-client': 6.4.22_react-dom@16.14.0+react@16.14.0 - '@storybook/core-server': 6.4.22_cfdbbe835af0ce3c97f004e72dcbccdb + '@storybook/core-server': 6.4.22_92b9a5635cc8dc22d6ee778fa547da7f react: 16.14.0 react-dom: 16.14.0_react@16.14.0 transitivePeerDependencies: @@ -3510,7 +3595,7 @@ packages: - webpack-command dev: true - /@storybook/core/6.4.22_eslint@8.13.0: + /@storybook/core/6.4.22_eslint@8.15.0: resolution: {integrity: sha512-KZYJt7GM5NgKFXbPRZZZPEONZ5u/tE/cRbMdkn/zWN3He8+VP+65/tz8hbriI/6m91AWVWkBKrODSkeq59NgRA==} peerDependencies: '@storybook/builder-webpack5': 6.4.22 @@ -3525,7 +3610,7 @@ packages: optional: true dependencies: '@storybook/core-client': 6.4.22 - '@storybook/core-server': 6.4.22_eslint@8.13.0 + '@storybook/core-server': 6.4.22_eslint@8.15.0 transitivePeerDependencies: - '@storybook/manager-webpack5' - '@types/react' @@ -3569,7 +3654,7 @@ packages: lodash: 4.17.21 dev: true - /@storybook/html/6.4.22_@babel+core@7.17.9+eslint@8.13.0: + /@storybook/html/6.4.22_@babel+core@7.17.9+eslint@8.15.0: resolution: {integrity: sha512-qOULn4db1bJlN6IuGCfH2g88utO+0h9aFityfRpmM0KntYx+tezLDD2/2yzdRy69Mh3KsIoqmDtX0hdsaFxH6w==} engines: {node: '>=10.13.0'} hasBin: true @@ -3579,8 +3664,8 @@ packages: '@babel/core': 7.17.9 '@storybook/addons': 6.4.22_react-dom@16.14.0+react@16.14.0 '@storybook/client-api': 6.4.22_react-dom@16.14.0+react@16.14.0 - '@storybook/core': 6.4.22_cfdbbe835af0ce3c97f004e72dcbccdb - '@storybook/core-common': 6.4.22_cfdbbe835af0ce3c97f004e72dcbccdb + '@storybook/core': 6.4.22_92b9a5635cc8dc22d6ee778fa547da7f + '@storybook/core-common': 6.4.22_92b9a5635cc8dc22d6ee778fa547da7f '@storybook/csf': 0.0.2--canary.87bc651.0 '@storybook/preview-web': 6.4.22_react-dom@16.14.0+react@16.14.0 '@storybook/store': 6.4.22_react-dom@16.14.0+react@16.14.0 @@ -3609,7 +3694,7 @@ packages: - webpack-command dev: true - /@storybook/manager-webpack4/6.4.22_cfdbbe835af0ce3c97f004e72dcbccdb: + /@storybook/manager-webpack4/6.4.22_92b9a5635cc8dc22d6ee778fa547da7f: resolution: {integrity: sha512-nzhDMJYg0vXdcG0ctwE6YFZBX71+5NYaTGkxg3xT7gbgnP1YFXn9gVODvgq3tPb3gcRapjyOIxUa20rV+r8edA==} peerDependencies: react: ^16.8.0 || ^17.0.0 @@ -3624,7 +3709,7 @@ packages: '@babel/preset-react': 7.16.7_@babel+core@7.17.9 '@storybook/addons': 6.4.22_react-dom@16.14.0+react@16.14.0 '@storybook/core-client': 6.4.22_e97e5e3809294a3414549b4ba42cd203 - '@storybook/core-common': 6.4.22_cfdbbe835af0ce3c97f004e72dcbccdb + '@storybook/core-common': 6.4.22_92b9a5635cc8dc22d6ee778fa547da7f '@storybook/node-logger': 6.4.22 '@storybook/theming': 6.4.22_react-dom@16.14.0+react@16.14.0 '@storybook/ui': 6.4.22_react-dom@16.14.0+react@16.14.0 @@ -3667,7 +3752,7 @@ packages: - webpack-command dev: true - /@storybook/manager-webpack4/6.4.22_eslint@8.13.0: + /@storybook/manager-webpack4/6.4.22_eslint@8.15.0: resolution: {integrity: sha512-nzhDMJYg0vXdcG0ctwE6YFZBX71+5NYaTGkxg3xT7gbgnP1YFXn9gVODvgq3tPb3gcRapjyOIxUa20rV+r8edA==} peerDependencies: react: ^16.8.0 || ^17.0.0 @@ -3682,7 +3767,7 @@ packages: '@babel/preset-react': 7.16.7_@babel+core@7.17.9 '@storybook/addons': 6.4.22 '@storybook/core-client': 6.4.22_webpack@4.46.0 - '@storybook/core-common': 6.4.22_eslint@8.13.0 + '@storybook/core-common': 6.4.22_eslint@8.15.0 '@storybook/node-logger': 6.4.22 '@storybook/theming': 6.4.22 '@storybook/ui': 6.4.22 @@ -4175,6 +4260,20 @@ packages: '@swc/core': 1.2.165 dev: true + /@testing-library/dom/8.13.0: + resolution: {integrity: sha512-9VHgfIatKNXQNaZTtLnalIy0jNZzY35a4S3oi08YAt9Hv1VsfZ/DfA45lM8D/UhtHBGJ4/lGwp0PZkVndRkoOQ==} + engines: {node: '>=12'} + dependencies: + '@babel/code-frame': 7.16.7 + '@babel/runtime': 7.17.9 + '@types/aria-query': 4.2.2 + aria-query: 5.0.0 + chalk: 4.1.2 + dom-accessibility-api: 0.5.13 + lz-string: 1.4.4 + pretty-format: 27.5.1 + dev: true + /@testing-library/jest-dom/5.16.4: resolution: {integrity: sha512-Gy+IoFutbMQcky0k+bqqumXZ1cTGswLsFqmNLzNdSKkU9KGV2u9oXhukCbbJ9/LRPKiqwxEE8VpV/+YZlfkPUA==} engines: {node: '>=8', npm: '>=6', yarn: '>=1'} @@ -4211,6 +4310,10 @@ packages: resolution: {integrity: sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==} dev: true + /@types/aria-query/4.2.2: + resolution: {integrity: sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig==} + dev: true + /@types/babel__core/7.1.19: resolution: {integrity: sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==} dependencies: @@ -4507,6 +4610,65 @@ packages: dev: true optional: true + /@typescript-eslint/scope-manager/5.24.0: + resolution: {integrity: sha512-WpMWipcDzGmMzdT7NtTjRXFabx10WleLUGrJpuJLGaxSqpcyq5ACpKSD5VE40h2nz3melQ91aP4Du7lh9FliCA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.24.0 + '@typescript-eslint/visitor-keys': 5.24.0 + dev: true + + /@typescript-eslint/types/5.24.0: + resolution: {integrity: sha512-Tpg1c3shTDgTmZd3qdUyd+16r/pGmVaVEbLs+ufuWP0EruVbUiEOmpBBQxBb9a8iPRxi8Rb2oiwOxuZJzSq11A==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@typescript-eslint/typescript-estree/5.24.0: + resolution: {integrity: sha512-zcor6vQkQmZAQfebSPVwUk/FD+CvnsnlfKXYeQDsWXRF+t7SBPmIfNia/wQxCSeu1h1JIjwV2i9f5/DdSp/uDw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 5.24.0 + '@typescript-eslint/visitor-keys': 5.24.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.3.7 + tsutils: 3.21.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/utils/5.24.0_eslint@8.15.0: + resolution: {integrity: sha512-K05sbWoeCBJH8KXu6hetBJ+ukG0k2u2KlgD3bN+v+oBKm8adJqVHpSSLHNzqyuv0Lh4GVSAUgZ5lB4icmPmWLw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@types/json-schema': 7.0.11 + '@typescript-eslint/scope-manager': 5.24.0 + '@typescript-eslint/types': 5.24.0 + '@typescript-eslint/typescript-estree': 5.24.0 + eslint: 8.15.0 + eslint-scope: 5.1.1 + eslint-utils: 3.0.0_eslint@8.15.0 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/visitor-keys/5.24.0: + resolution: {integrity: sha512-qzGwSXMyMnogcAo+/2fU+jhlPPVMXlIH2PeAonIKjJSoDKl1+lJVvG5Z5Oud36yU0TWK2cs1p/FaSN5J2OUFYA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.24.0 + eslint-visitor-keys: 3.3.0 + dev: true + /@webassemblyjs/ast/1.9.0: resolution: {integrity: sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==} dependencies: @@ -4677,12 +4839,12 @@ packages: acorn: 7.4.1 dev: true - /acorn-jsx/5.3.2_acorn@8.7.0: + /acorn-jsx/5.3.2_acorn@8.7.1: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - acorn: 8.7.0 + acorn: 8.7.1 dev: true /acorn-walk/7.2.0: @@ -4707,8 +4869,8 @@ packages: hasBin: true dev: true - /acorn/8.7.0: - resolution: {integrity: sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==} + /acorn/8.7.1: + resolution: {integrity: sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==} engines: {node: '>=0.4.0'} hasBin: true dev: true @@ -4816,7 +4978,7 @@ packages: dev: true /ansi-regex/2.1.1: - resolution: {integrity: sha1-w7M6te42DYbg5ijwRorn7yfWVN8=} + resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} engines: {node: '>=0.10.0'} dev: true @@ -5083,25 +5245,6 @@ packages: engines: {node: '>=12'} dev: true - /babel-code-frame/6.26.0: - resolution: {integrity: sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=} - dependencies: - chalk: 1.1.3 - esutils: 2.0.3 - js-tokens: 3.0.2 - dev: true - - /babel-eslint/7.2.3: - resolution: {integrity: sha1-sv4tgBJkcPXBlELcdXJTqJdxCCc=} - engines: {node: '>=4'} - deprecated: babel-eslint is now @babel/eslint-parser. This package will no longer receive updates. - dependencies: - babel-code-frame: 6.26.0 - babel-traverse: 6.26.0 - babel-types: 6.26.0 - babylon: 6.18.0 - dev: true - /babel-jest/27.5.1_@babel+core@7.17.9: resolution: {integrity: sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -5136,12 +5279,6 @@ packages: webpack: 4.46.0 dev: true - /babel-messages/6.23.0: - resolution: {integrity: sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=} - dependencies: - babel-runtime: 6.26.0 - dev: true - /babel-plugin-apply-mdx-type-prop/1.6.22_@babel+core@7.12.9: resolution: {integrity: sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ==} peerDependencies: @@ -5302,41 +5439,6 @@ packages: babel-preset-current-node-syntax: 1.0.1_@babel+core@7.17.9 dev: true - /babel-runtime/6.26.0: - resolution: {integrity: sha1-llxwWGaOgrVde/4E/yM3vItWR/4=} - dependencies: - core-js: 2.6.12 - regenerator-runtime: 0.11.1 - dev: true - - /babel-traverse/6.26.0: - resolution: {integrity: sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=} - dependencies: - babel-code-frame: 6.26.0 - babel-messages: 6.23.0 - babel-runtime: 6.26.0 - babel-types: 6.26.0 - babylon: 6.18.0 - debug: 2.6.9 - globals: 9.18.0 - invariant: 2.2.4 - lodash: 4.17.21 - dev: true - - /babel-types/6.26.0: - resolution: {integrity: sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=} - dependencies: - babel-runtime: 6.26.0 - esutils: 2.0.3 - lodash: 4.17.21 - to-fast-properties: 1.0.3 - dev: true - - /babylon/6.18.0: - resolution: {integrity: sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==} - hasBin: true - dev: true - /bail/1.0.5: resolution: {integrity: sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==} dev: true @@ -5703,7 +5805,7 @@ packages: dev: true /callsites/2.0.0: - resolution: {integrity: sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=} + resolution: {integrity: sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==} engines: {node: '>=4'} dev: true @@ -6291,12 +6393,6 @@ packages: requiresBuild: true dev: true - /core-js/2.6.12: - resolution: {integrity: sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==} - deprecated: core-js@<3.4 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Please, upgrade your dependencies to the actual version of core-js. - requiresBuild: true - dev: true - /core-js/3.21.1: resolution: {integrity: sha512-FRq5b/VMrWlrmCzwRrpDYNxyHP9BcAZC+xHJaqTgIE5091ZV1NTmyh0sGOg5XqpnHvR0svdy0sv1gWA1zmhxig==} requiresBuild: true @@ -6327,6 +6423,23 @@ packages: - '@swc/wasm' dev: true + /cosmiconfig-typescript-loader/2.0.0_5afcf6943f43533df426196350caf695: + resolution: {integrity: sha512-2NlGul/E3vTQEANqPziqkA01vfiuUU8vT0jZAuUIjEW8u3eCcnCQWLggapCjhbF76s7KQF0fM0kXSKmzaDaG1g==} + engines: {node: '>=12', npm: '>=6'} + peerDependencies: + '@types/node': '*' + typescript: '>=3' + dependencies: + '@types/node': 17.0.23 + cosmiconfig: 7.0.1 + ts-node: 10.7.0_5afcf6943f43533df426196350caf695 + typescript: 4.6.4 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + dev: true + optional: true + /cosmiconfig/5.2.1: resolution: {integrity: sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==} engines: {node: '>=4'} @@ -6709,7 +6822,7 @@ packages: longest: 2.0.1 word-wrap: 1.2.3 optionalDependencies: - '@commitlint/load': 16.2.3_@swc+core@1.2.165 + '@commitlint/load': 17.0.0_@swc+core@1.2.165 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' @@ -7299,6 +7412,78 @@ packages: source-map: 0.6.1 dev: true + /eslint-config-prettier/8.5.0_eslint@8.15.0: + resolution: {integrity: sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + dependencies: + eslint: 8.15.0 + dev: true + + /eslint-plugin-jest-dom/4.0.1_eslint@8.15.0: + resolution: {integrity: sha512-9aUaX4AtlFBziLqKSjc7DKHQ/y1T32qNapG3uSeLDMJYKswASoQLJWOfLIE+zEHKvCNzNIz8T7282tQkuu0TKQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6', yarn: '>=1'} + peerDependencies: + eslint: '>=6.8' + dependencies: + '@babel/runtime': 7.17.9 + '@testing-library/dom': 8.13.0 + eslint: 8.15.0 + requireindex: 1.2.0 + dev: true + + /eslint-plugin-jest/26.2.2_eslint@8.15.0+jest@27.5.1: + resolution: {integrity: sha512-etSFZ8VIFX470aA6kTqDPhIq7YWe0tjBcboFNV3WeiC18PJ/AVonGhuTwlmuz2fBkH8FJHA7JQ4k7GsQIj1Gew==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/eslint-plugin': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + jest: '*' + peerDependenciesMeta: + '@typescript-eslint/eslint-plugin': + optional: true + jest: + optional: true + dependencies: + '@typescript-eslint/utils': 5.24.0_eslint@8.15.0 + eslint: 8.15.0 + jest: 27.5.1 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /eslint-plugin-prettier/4.0.0_440b30a60bbe5bb6e3ad0057150b2782: + resolution: {integrity: sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==} + engines: {node: '>=6.0.0'} + peerDependencies: + eslint: '>=7.28.0' + eslint-config-prettier: '*' + prettier: '>=2.0.0' + peerDependenciesMeta: + eslint-config-prettier: + optional: true + dependencies: + eslint: 8.15.0 + eslint-config-prettier: 8.5.0_eslint@8.15.0 + prettier: 2.6.2 + prettier-linter-helpers: 1.0.0 + dev: true + + /eslint-plugin-testing-library/5.5.0_eslint@8.15.0: + resolution: {integrity: sha512-eWQ19l6uWL7LW8oeMyQVSGjVYFnBqk7DMHjadm0yOHBvX3Xi9OBrsNuxoAMdX4r7wlQ5WWpW46d+CB6FWFL/PQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6'} + peerDependencies: + eslint: ^7.5.0 || ^8.0.0 + dependencies: + '@typescript-eslint/utils': 5.24.0_eslint@8.15.0 + eslint: 8.15.0 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + /eslint-scope/4.0.3: resolution: {integrity: sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==} engines: {node: '>=4.0.0'} @@ -7307,6 +7492,14 @@ packages: estraverse: 4.3.0 dev: true + /eslint-scope/5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + dev: true + /eslint-scope/7.1.1: resolution: {integrity: sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -7315,13 +7508,13 @@ packages: estraverse: 5.3.0 dev: true - /eslint-utils/3.0.0_eslint@8.13.0: + /eslint-utils/3.0.0_eslint@8.15.0: resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} peerDependencies: eslint: '>=5' dependencies: - eslint: 8.13.0 + eslint: 8.15.0 eslint-visitor-keys: 2.1.0 dev: true @@ -7335,12 +7528,12 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /eslint/8.13.0: - resolution: {integrity: sha512-D+Xei61eInqauAyTJ6C0q6x9mx7kTUC1KZ0m0LSEexR0V+e94K12LmWX076ZIsldwfQ2RONdaJe0re0TRGQbRQ==} + /eslint/8.15.0: + resolution: {integrity: sha512-GG5USZ1jhCu8HJkzGgeK8/+RGnHaNYZGrGDzUtigK3BsGESW/rs2az23XqE0WVwDxy1VRvvjSSGu5nB0Bu+6SA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - '@eslint/eslintrc': 1.2.1 + '@eslint/eslintrc': 1.2.3 '@humanwhocodes/config-array': 0.9.5 ajv: 6.12.6 chalk: 4.1.2 @@ -7349,16 +7542,16 @@ packages: doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.1.1 - eslint-utils: 3.0.0_eslint@8.13.0 + eslint-utils: 3.0.0_eslint@8.15.0 eslint-visitor-keys: 3.3.0 - espree: 9.3.1 + espree: 9.3.2 esquery: 1.4.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 6.0.1 functional-red-black-tree: 1.0.1 glob-parent: 6.0.2 - globals: 13.13.0 + globals: 13.15.0 ignore: 5.2.0 import-fresh: 3.3.0 imurmurhash: 0.1.4 @@ -7379,12 +7572,12 @@ packages: - supports-color dev: true - /espree/9.3.1: - resolution: {integrity: sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==} + /espree/9.3.2: + resolution: {integrity: sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - acorn: 8.7.0 - acorn-jsx: 5.3.2_acorn@8.7.0 + acorn: 8.7.1 + acorn-jsx: 5.3.2_acorn@8.7.1 eslint-visitor-keys: 3.3.0 dev: true @@ -7631,6 +7824,10 @@ packages: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} dev: true + /fast-diff/1.2.0: + resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==} + dev: true + /fast-glob/2.2.7: resolution: {integrity: sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==} engines: {node: '>=4.0.0'} @@ -7879,7 +8076,7 @@ packages: worker-rpc: 0.1.1 dev: true - /fork-ts-checker-webpack-plugin/6.5.1_eslint@8.13.0+webpack@4.46.0: + /fork-ts-checker-webpack-plugin/6.5.1_eslint@8.15.0+webpack@4.46.0: resolution: {integrity: sha512-x1wumpHOEf4gDROmKTaB6i4/Q6H3LwmjVO7fIX47vBwlZbtPjU33hgoMuD/Q/y6SU8bnuYSoN6ZQOLshGp0T/g==} engines: {node: '>=10', yarn: '>=1.0.0'} peerDependencies: @@ -7899,7 +8096,7 @@ packages: chokidar: 3.5.3 cosmiconfig: 6.0.0 deepmerge: 4.2.2 - eslint: 8.13.0 + eslint: 8.15.0 fs-extra: 9.1.0 glob: 7.2.0 memfs: 3.4.1 @@ -8252,18 +8449,13 @@ packages: engines: {node: '>=4'} dev: true - /globals/13.13.0: - resolution: {integrity: sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==} + /globals/13.15.0: + resolution: {integrity: sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==} engines: {node: '>=8'} dependencies: type-fest: 0.20.2 dev: true - /globals/9.18.0: - resolution: {integrity: sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==} - engines: {node: '>=0.10.0'} - dev: true - /globalthis/1.0.2: resolution: {integrity: sha512-ZQnSFO1la8P7auIOQECnm0sSuoMeaSq0EEdXMBFF2QJO4uNcwbyhSgG3MruWNbFTqCLmxVwGOl7LZ9kASvHdeQ==} engines: {node: '>= 0.4'} @@ -8315,7 +8507,7 @@ packages: source-map: 0.6.1 wordwrap: 1.0.0 optionalDependencies: - uglify-js: 3.15.4 + uglify-js: 3.15.5 dev: true /hard-rejection/2.1.0: @@ -10044,10 +10236,6 @@ packages: engines: {node: '>= 0.8'} dev: true - /js-tokens/3.0.2: - resolution: {integrity: sha1-mGbfOVECEw449/mWvOtlRDIJwls=} - dev: true - /js-tokens/4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} dev: true @@ -10077,7 +10265,7 @@ packages: optional: true dependencies: abab: 2.0.6 - acorn: 8.7.0 + acorn: 8.7.1 acorn-globals: 6.0.0 cssom: 0.4.4 cssstyle: 2.3.0 @@ -10379,6 +10567,11 @@ packages: yallist: 4.0.0 dev: true + /lz-string/1.4.4: + resolution: {integrity: sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY=} + hasBin: true + dev: true + /make-dir/2.1.0: resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} engines: {node: '>=6'} @@ -10821,6 +11014,14 @@ packages: dev: true optional: true + /nano-staged/0.8.0: + resolution: {integrity: sha512-QSEqPGTCJbkHU2yLvfY6huqYPjdBrOaTMKatO1F8nCSrkQGXeKwtCiCnsdxnuMhbg3DTVywKaeWLGCE5oJpq0g==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + dependencies: + picocolors: 1.0.0 + dev: true + /nanoid/3.3.2: resolution: {integrity: sha512-CuHBogktKwpm5g2sRgv83jEy2ijFzBwMoYA60orPDR7ynsLijJDqgsi4RDGj3OJpy3Ieb+LYwiRmIOGyytgITA==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -12158,12 +12359,25 @@ packages: engines: {node: '>= 0.8.0'} dev: true + /prettier-linter-helpers/1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + dependencies: + fast-diff: 1.2.0 + dev: true + /prettier/2.3.0: resolution: {integrity: sha512-kXtO4s0Lz/DW/IJ9QdWhAf7/NmPWQXkFr/r/WkR3vyI+0v8amTDxiaQSLzs8NBlytfLWX/7uQUMIW677yLKl4w==} engines: {node: '>=10.13.0'} hasBin: true dev: true + /prettier/2.6.2: + resolution: {integrity: sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew==} + engines: {node: '>=10.13.0'} + hasBin: true + dev: true + /pretty-error/2.1.2: resolution: {integrity: sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==} dependencies: @@ -12845,10 +13059,6 @@ packages: resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} dev: true - /regenerator-runtime/0.11.1: - resolution: {integrity: sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==} - dev: true - /regenerator-runtime/0.13.9: resolution: {integrity: sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==} dev: true @@ -13001,6 +13211,11 @@ packages: engines: {node: '>=0.10.0'} dev: true + /requireindex/1.2.0: + resolution: {integrity: sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==} + engines: {node: '>=0.10.5'} + dev: true + /requires-port/1.0.0: resolution: {integrity: sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=} dev: true @@ -14061,7 +14276,7 @@ packages: engines: {node: '>=10'} hasBin: true dependencies: - acorn: 8.7.0 + acorn: 8.7.1 commander: 2.20.3 source-map: 0.7.3 source-map-support: 0.5.21 @@ -14137,11 +14352,6 @@ packages: resolution: {integrity: sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=} dev: true - /to-fast-properties/1.0.3: - resolution: {integrity: sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=} - engines: {node: '>=0.10.0'} - dev: true - /to-fast-properties/2.0.0: resolution: {integrity: sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=} engines: {node: '>=4'} @@ -14235,6 +14445,39 @@ packages: engines: {node: '>=6.10'} dev: true + /ts-node/10.7.0_5afcf6943f43533df426196350caf695: + resolution: {integrity: sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.7.0 + '@swc/core': 1.2.165 + '@tsconfig/node10': 1.0.8 + '@tsconfig/node12': 1.0.9 + '@tsconfig/node14': 1.0.1 + '@tsconfig/node16': 1.0.2 + '@types/node': 17.0.23 + acorn: 8.7.1 + acorn-walk: 8.2.0 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 4.6.4 + v8-compile-cache-lib: 3.0.0 + yn: 3.1.1 + dev: true + optional: true + /ts-node/10.7.0_f533c3387680131348857b0baefd0f31: resolution: {integrity: sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A==} hasBin: true @@ -14256,7 +14499,7 @@ packages: '@tsconfig/node14': 1.0.1 '@tsconfig/node16': 1.0.2 '@types/node': 17.0.23 - acorn: 8.7.0 + acorn: 8.7.1 acorn-walk: 8.2.0 arg: 4.1.3 create-require: 1.1.1 @@ -14285,6 +14528,15 @@ packages: resolution: {integrity: sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==} dev: true + /tsutils/3.21.0: + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + dependencies: + tslib: 1.14.1 + dev: true + /tty-browserify/0.0.0: resolution: {integrity: sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=} dev: true @@ -14362,8 +14614,15 @@ packages: hasBin: true dev: true - /uglify-js/3.15.4: - resolution: {integrity: sha512-vMOPGDuvXecPs34V74qDKk4iJ/SN4vL3Ow/23ixafENYvtrNvtbcgUeugTcUGRGsOF/5fU8/NYSL5Hyb3l1OJA==} + /typescript/4.6.4: + resolution: {integrity: sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg==} + engines: {node: '>=4.2.0'} + hasBin: true + dev: true + optional: true + + /uglify-js/3.15.5: + resolution: {integrity: sha512-hNM5q5GbBRB5xB+PMqVRcgYe4c8jbyZ1pzZhS6jbq54/4F2gFK869ZheiE5A8/t+W5jtTNpWef/5Q9zk639FNQ==} engines: {node: '>=0.8.0'} hasBin: true requiresBuild: true diff --git a/postcss.config.js b/postcss.config.js index 612cb3d4..4703deb9 100644 --- a/postcss.config.js +++ b/postcss.config.js @@ -1,10 +1,11 @@ -const isProd = process.env.NODE_ENV !== 'development' +const isProd = process.env.NODE_ENV !== 'development'; module.exports = { plugins: [ require('postcss-preset-env'), - isProd && require('cssnano')({ - preset: 'default', - }) - ].filter(Boolean), -} + isProd && + require('cssnano')({ + preset: 'default' + }) + ].filter(Boolean) +}; diff --git a/rollup.config.js b/rollup.config.js index 77703b74..3df4868d 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -6,29 +6,29 @@ const extensions = ['.js', '.ts', '.tsx']; const external = _ => /node_modules/.test(_) && !/@swc\/helpers/.test(_); const plugins = targets => [ nodeResolve({ - extensions, + extensions }), swc({ jsc: { parser: { syntax: 'typescript', - tsx: true, + tsx: true }, transform: { react: { - useBuiltins: true, - }, + useBuiltins: true + } }, - externalHelpers: true, + externalHelpers: true }, env: { - targets, + targets }, module: { - type: 'es6', + type: 'es6' }, - sourceMaps: true, - }), + sourceMaps: true + }) ]; export default [ @@ -40,8 +40,8 @@ export default [ file: pkg.publishConfig.main, format: 'cjs', exports: 'named', - sourcemap: true, - }, + sourcemap: true + } }, { input: pkg.main, @@ -50,7 +50,7 @@ export default [ output: { file: pkg.publishConfig.module, format: 'es', - sourcemap: true, - }, - }, + sourcemap: true + } + } ]; diff --git a/scripts/styles.js b/scripts/styles.js index 5f520cb9..d1c86a20 100755 --- a/scripts/styles.js +++ b/scripts/styles.js @@ -14,13 +14,15 @@ const output = pkg.publishConfig.style; const sourceMapOutput = pkg.publishConfig.style.replace('.css', '.css.map'); (async () => { - let styles + let styles; styles = sass.compile(pkg.style, { sourceMap: true - }) + }); - styles.sourceMap.sources = styles.sourceMap.sources.map(_ => _.replace(cwd, '')) + styles.sourceMap.sources = styles.sourceMap.sources.map(_ => + _.replace(cwd, '') + ); styles = await postcss(plugins).process(styles.css, { from: input, @@ -28,16 +30,17 @@ const sourceMapOutput = pkg.publishConfig.style.replace('.css', '.css.map'); map: { prev: styles.sourceMap } - }) + }); - const map = styles.map.toString() - const css = styles.css + `\n/*# sourceMappingURL=${path.basename(sourceMapOutput)} */` + const map = styles.map.toString(); + const css = + styles.css + `\n/*# sourceMappingURL=${path.basename(sourceMapOutput)} */`; await fs.mkdir(path.dirname(output), { recursive: true - }) + }); await Promise.all([ fs.writeFile(output, css), fs.writeFile(sourceMapOutput, map) - ]) -})() + ]); +})(); diff --git a/src/axes/auto-scale-axis.js b/src/axes/auto-scale-axis.js index 5d057dd5..db71b299 100644 --- a/src/axes/auto-scale-axis.js +++ b/src/axes/auto-scale-axis.js @@ -1,12 +1,17 @@ -import {getBounds, getHighLow, getMultiValue} from '../core/data'; -import {Axis} from './axis'; +import { getBounds, getHighLow, getMultiValue } from '../core/data'; +import { Axis } from './axis'; export class AutoScaleAxis extends Axis { constructor(axisUnit, data, chartRect, options) { super(); // Usually we calculate highLow based on the data but this can be overriden by a highLow object in the options const highLow = options.highLow || getHighLow(data, options, axisUnit.pos); - this.bounds = getBounds(chartRect[axisUnit.rectEnd] - chartRect[axisUnit.rectStart], highLow, options.scaleMinSpace || 20, options.onlyInteger); + this.bounds = getBounds( + chartRect[axisUnit.rectEnd] - chartRect[axisUnit.rectStart], + highLow, + options.scaleMinSpace || 20, + options.onlyInteger + ); this.range = { min: this.bounds.min, max: this.bounds.max @@ -16,6 +21,10 @@ export class AutoScaleAxis extends Axis { } projectValue(value) { - return this.axisLength * (+getMultiValue(value, this.units.pos) - this.bounds.min) / this.bounds.range; + return ( + (this.axisLength * + (+getMultiValue(value, this.units.pos) - this.bounds.min)) / + this.bounds.range + ); } } diff --git a/src/axes/axes.js b/src/axes/axes.js index 75d73cc3..7714b4b4 100644 --- a/src/axes/axes.js +++ b/src/axes/axes.js @@ -1,4 +1,4 @@ -export {Axis, axisUnits} from './axis'; -export {AutoScaleAxis} from './auto-scale-axis'; -export {FixedScaleAxis} from './fixed-scale-axis'; -export {StepAxis} from './step-axis'; +export { Axis, axisUnits } from './axis'; +export { AutoScaleAxis } from './auto-scale-axis'; +export { FixedScaleAxis } from './fixed-scale-axis'; +export { StepAxis } from './step-axis'; diff --git a/src/axes/axis.js b/src/axes/axis.js index c08cef1b..7c52f578 100644 --- a/src/axes/axis.js +++ b/src/axes/axis.js @@ -1,5 +1,5 @@ -import {isFalseyButZero} from '../core/lang'; -import {createGrid, createLabel} from '../core/creation'; +import { isFalseyButZero } from '../core/lang'; +import { createGrid, createLabel } from '../core/creation'; export const axisUnits = { x: { @@ -26,16 +26,23 @@ export class Axis { this.counterUnits = units === axisUnits.x ? axisUnits.y : axisUnits.x; this.options = options; this.chartRect = chartRect; - this.axisLength = chartRect[this.units.rectEnd] - chartRect[this.units.rectStart]; + this.axisLength = + chartRect[this.units.rectEnd] - chartRect[this.units.rectStart]; this.gridOffset = chartRect[this.units.rectOffset]; this.ticks = ticks; } - projectValue(value, index, data) { - throw new Error('Base axis can\'t be instantiated!'); + projectValue() { + throw new Error("Base axis can't be instantiated!"); } - createGridAndLabels(gridGroup, labelGroup, useForeignObject, chartOptions, eventEmitter) { + createGridAndLabels( + gridGroup, + labelGroup, + useForeignObject, + chartOptions, + eventEmitter + ) { const axisOptions = chartOptions['axis' + this.units.pos.toUpperCase()]; const projectedValues = this.ticks.map(this.projectValue.bind(this)); const labelValues = this.ticks.map(axisOptions.labelInterpolationFnc); @@ -49,7 +56,7 @@ export class Axis { // TODO: Find better solution for solving this problem // Calculate how much space we have available for the label let labelLength; - if(projectedValues[index + 1]) { + if (projectedValues[index + 1]) { // If we still have one label ahead, we can calculate the distance to the next tick / label labelLength = projectedValues[index + 1] - projectedValue; } else { @@ -60,55 +67,83 @@ export class Axis { } // Skip grid lines and labels where interpolated label values are falsey (except for 0) - if(isFalseyButZero(labelValues[index]) && labelValues[index] !== '') { + if (isFalseyButZero(labelValues[index]) && labelValues[index] !== '') { return; } // Transform to global coordinates using the chartRect // We also need to set the label offset for the createLabel function - if(this.units.pos === 'x') { + if (this.units.pos === 'x') { projectedValue = this.chartRect.x1 + projectedValue; labelOffset.x = chartOptions.axisX.labelOffset.x; // If the labels should be positioned in start position (top side for vertical axis) we need to set a // different offset as for positioned with end (bottom) - if(chartOptions.axisX.position === 'start') { - labelOffset.y = this.chartRect.padding.top + + if (chartOptions.axisX.position === 'start') { + labelOffset.y = + this.chartRect.padding.top + chartOptions.axisX.labelOffset.y + (useForeignObject ? 5 : 20); } else { - labelOffset.y = this.chartRect.y1 + + labelOffset.y = + this.chartRect.y1 + chartOptions.axisX.labelOffset.y + (useForeignObject ? 5 : 20); } } else { projectedValue = this.chartRect.y1 - projectedValue; - labelOffset.y = chartOptions.axisY.labelOffset.y - (useForeignObject ? labelLength : 0); + labelOffset.y = + chartOptions.axisY.labelOffset.y - + (useForeignObject ? labelLength : 0); // If the labels should be positioned in start position (left side for horizontal axis) we need to set a // different offset as for positioned with end (right side) - if(chartOptions.axisY.position === 'start') { - labelOffset.x = useForeignObject ? - this.chartRect.padding.left + chartOptions.axisY.labelOffset.x : - this.chartRect.x1 - 10; + if (chartOptions.axisY.position === 'start') { + labelOffset.x = useForeignObject + ? this.chartRect.padding.left + chartOptions.axisY.labelOffset.x + : this.chartRect.x1 - 10; } else { - labelOffset.x = this.chartRect.x2 + chartOptions.axisY.labelOffset.x + 10; + labelOffset.x = + this.chartRect.x2 + chartOptions.axisY.labelOffset.x + 10; } } - if(axisOptions.showGrid) { - createGrid(projectedValue, index, this, this.gridOffset, this.chartRect[this.counterUnits.len](), gridGroup, [ - chartOptions.classNames.grid, - chartOptions.classNames[this.units.dir] - ], eventEmitter); + if (axisOptions.showGrid) { + createGrid( + projectedValue, + index, + this, + this.gridOffset, + this.chartRect[this.counterUnits.len](), + gridGroup, + [ + chartOptions.classNames.grid, + chartOptions.classNames[this.units.dir] + ], + eventEmitter + ); } - if(axisOptions.showLabel) { - createLabel(projectedValue, labelLength, index, labelValues, this, axisOptions.offset, labelOffset, labelGroup, [ - chartOptions.classNames.label, - chartOptions.classNames[this.units.dir], - (axisOptions.position === 'start' ? chartOptions.classNames[axisOptions.position] : chartOptions.classNames.end) - ], useForeignObject, eventEmitter); + if (axisOptions.showLabel) { + createLabel( + projectedValue, + labelLength, + index, + labelValues, + this, + axisOptions.offset, + labelOffset, + labelGroup, + [ + chartOptions.classNames.label, + chartOptions.classNames[this.units.dir], + axisOptions.position === 'start' + ? chartOptions.classNames[axisOptions.position] + : chartOptions.classNames.end + ], + useForeignObject, + eventEmitter + ); } }); } diff --git a/src/axes/axis.spec.js b/src/axes/axis.spec.js index 70c8818a..ddec767b 100644 --- a/src/axes/axis.spec.js +++ b/src/axes/axis.spec.js @@ -1,6 +1,6 @@ -import {Svg} from '../svg/svg'; -import {EventEmitter} from '../event/event-emitter'; -import {Axis, axisUnits} from './axis'; +import { Svg } from '../svg/svg'; +import { EventEmitter } from '../event/event-emitter'; +import { Axis, axisUnits } from './axis'; describe('Axes', () => { describe('Axis', () => { @@ -55,42 +55,66 @@ describe('Axes', () => { }); it('should skip all grid lines and labels for interpolated value of null', () => { - chartOptions.axisX.labelInterpolationFnc = - (value, index) => index === 0 ? null : value; + chartOptions.axisX.labelInterpolationFnc = (value, index) => + index === 0 ? null : value; const axis = new Axis(); axis.initialize(axisUnits.x, chartRect, ticks, null); - axis.projectValue = (value) => value; + axis.projectValue = value => value; - axis.createGridAndLabels(gridGroup, labelGroup, true, chartOptions, eventEmitter); + axis.createGridAndLabels( + gridGroup, + labelGroup, + true, + chartOptions, + eventEmitter + ); expect(gridGroup.querySelectorAll('.ct-grid').svgElements.length).toBe(1); - expect(labelGroup.querySelectorAll('.ct-label').svgElements.length).toBe(1); + expect(labelGroup.querySelectorAll('.ct-label').svgElements.length).toBe( + 1 + ); }); it('should skip all grid lines and labels for interpolated value of undefined', () => { - chartOptions.axisX.labelInterpolationFnc = - (value, index) => index === 0 ? undefined : value; + chartOptions.axisX.labelInterpolationFnc = (value, index) => + index === 0 ? undefined : value; const axis = new Axis(); axis.initialize(axisUnits.x, chartRect, ticks, null); - axis.projectValue = (value) => value; + axis.projectValue = value => value; - axis.createGridAndLabels(gridGroup, labelGroup, true, chartOptions, eventEmitter); + axis.createGridAndLabels( + gridGroup, + labelGroup, + true, + chartOptions, + eventEmitter + ); expect(gridGroup.querySelectorAll('.ct-grid').svgElements.length).toBe(1); - expect(labelGroup.querySelectorAll('.ct-label').svgElements.length).toBe(1); + expect(labelGroup.querySelectorAll('.ct-label').svgElements.length).toBe( + 1 + ); }); it('should include all grid lines and labels for interpolated value of empty strings', () => { - chartOptions.axisX.labelInterpolationFnc = - (value, index) => index === 0 ? '' : value; + chartOptions.axisX.labelInterpolationFnc = (value, index) => + index === 0 ? '' : value; const axis = new Axis(); axis.initialize(axisUnits.x, chartRect, ticks, null); - axis.projectValue = (value) => value; + axis.projectValue = value => value; - axis.createGridAndLabels(gridGroup, labelGroup, true, chartOptions, eventEmitter); + axis.createGridAndLabels( + gridGroup, + labelGroup, + true, + chartOptions, + eventEmitter + ); expect(gridGroup.querySelectorAll('.ct-grid').svgElements.length).toBe(2); - expect(labelGroup.querySelectorAll('.ct-label').svgElements.length).toBe(2); + expect(labelGroup.querySelectorAll('.ct-label').svgElements.length).toBe( + 2 + ); }); }); }); diff --git a/src/axes/fixed-scale-axis.js b/src/axes/fixed-scale-axis.js index 9e0c59aa..cfb31d87 100644 --- a/src/axes/fixed-scale-axis.js +++ b/src/axes/fixed-scale-axis.js @@ -1,6 +1,6 @@ -import {getMultiValue, getHighLow} from '../core/data'; -import {times} from '../core/functional'; -import {Axis} from './axis'; +import { getMultiValue, getHighLow } from '../core/data'; +import { times } from '../core/functional'; +import { Axis } from './axis'; export class FixedScaleAxis extends Axis { constructor(axisUnit, data, chartRect, options) { @@ -8,9 +8,11 @@ export class FixedScaleAxis extends Axis { const highLow = options.highLow || getHighLow(data, options, axisUnit.pos); this.divisor = options.divisor || 1; - this.ticks = options.ticks || + this.ticks = + options.ticks || times(this.divisor).map( - (value, index) => highLow.low + (highLow.high - highLow.low) / this.divisor * index + (value, index) => + highLow.low + ((highLow.high - highLow.low) / this.divisor) * index ); this.ticks.sort((a, b) => a - b); this.range = { @@ -24,7 +26,10 @@ export class FixedScaleAxis extends Axis { } projectValue(value) { - return this.axisLength * (+getMultiValue(value, this.units.pos) - this.range.min) / - (this.range.max - this.range.min); + return ( + (this.axisLength * + (+getMultiValue(value, this.units.pos) - this.range.min)) / + (this.range.max - this.range.min) + ); } } diff --git a/src/axes/fixed-scale-axis.spec.js b/src/axes/fixed-scale-axis.spec.js index b7096847..74f3a0be 100644 --- a/src/axes/fixed-scale-axis.spec.js +++ b/src/axes/fixed-scale-axis.spec.js @@ -1,4 +1,4 @@ -import {FixedScaleAxis} from './fixed-scale-axis'; +import { FixedScaleAxis } from './fixed-scale-axis'; describe('Axes', () => { describe('FixedScaleAxis', () => { @@ -13,7 +13,11 @@ describe('Axes', () => { rectOffset: 'x1' }; const data = [ - [{x: 1, y: 10}, {x: 2, y: 5}, {x: 3, y: -5}] + [ + { x: 1, y: 10 }, + { x: 2, y: 5 }, + { x: 3, y: -5 } + ] ]; const chartRect = { padding: { @@ -30,7 +34,7 @@ describe('Axes', () => { const options = { offset: 40, position: 'start', - labelOffset: {'x': 0, 'y': 0}, + labelOffset: { x: 0, y: 0 }, showLabel: true, showGrid: true, scaleMinSpace: 20, diff --git a/src/axes/step-axis.js b/src/axes/step-axis.js index 8010e33c..d676df2f 100644 --- a/src/axes/step-axis.js +++ b/src/axes/step-axis.js @@ -1,4 +1,4 @@ -import {Axis} from './axis'; +import { Axis } from './axis'; export class StepAxis extends Axis { constructor(axisUnit, data, chartRect, options) { diff --git a/src/axes/step-axis.spec.js b/src/axes/step-axis.spec.js index 140406d7..e635e2ed 100644 --- a/src/axes/step-axis.spec.js +++ b/src/axes/step-axis.spec.js @@ -1,4 +1,4 @@ -import {StepAxis} from './step-axis'; +import { StepAxis } from './step-axis'; describe('Axes', () => { describe('StepAxis', () => { diff --git a/src/charts/bar.js b/src/charts/bar.js index 23940417..06c72a6a 100644 --- a/src/charts/bar.js +++ b/src/charts/bar.js @@ -1,10 +1,19 @@ -import {isNumeric, alphaNumerate} from '../core/lang'; -import {noop, serialMap} from '../core/functional'; -import {extend} from '../core/extend'; -import {normalizeData, serialize, getMetaData, getHighLow} from '../core/data'; -import {createSvg, createChartRect, createGridBackground} from '../core/creation'; -import {AutoScaleAxis, StepAxis, axisUnits} from '../axes/axes'; -import {BaseChart} from './base'; +import { isNumeric, alphaNumerate } from '../core/lang'; +import { noop, serialMap } from '../core/functional'; +import { extend } from '../core/extend'; +import { + normalizeData, + serialize, + getMetaData, + getHighLow +} from '../core/data'; +import { + createSvg, + createChartRect, + createGridBackground +} from '../core/creation'; +import { AutoScaleAxis, StepAxis, axisUnits } from '../axes/axes'; +import { BaseChart } from './base'; /** * Default options in bar charts. Expand the code view to see a detailed list of options with comments. @@ -145,7 +154,13 @@ export class BarChart extends BaseChart { * */ constructor(query, data, options, responsiveOptions) { - super(query, data, defaultOptions, extend({}, defaultOptions, options), responsiveOptions); + super( + query, + data, + defaultOptions, + extend({}, defaultOptions, options), + responsiveOptions + ); } /** @@ -156,11 +171,19 @@ export class BarChart extends BaseChart { let data; let highLow; - if(options.distributeSeries) { - data = normalizeData(this.data, options.reverseData, options.horizontalBars ? 'x' : 'y'); - data.normalized.series = data.normalized.series.map((value) => [value]); + if (options.distributeSeries) { + data = normalizeData( + this.data, + options.reverseData, + options.horizontalBars ? 'x' : 'y' + ); + data.normalized.series = data.normalized.series.map(value => [value]); } else { - data = normalizeData(this.data, options.reverseData, options.horizontalBars ? 'x' : 'y'); + data = normalizeData( + this.data, + options.reverseData, + options.horizontalBars ? 'x' : 'y' + ); } // Create new svg element @@ -168,38 +191,55 @@ export class BarChart extends BaseChart { this.container, options.width, options.height, - options.classNames.chart + (options.horizontalBars ? ' ' + options.classNames.horizontalBars : '') + options.classNames.chart + + (options.horizontalBars ? ' ' + options.classNames.horizontalBars : '') ); // Drawing groups in correct order const gridGroup = this.svg.elem('g').addClass(options.classNames.gridGroup); const seriesGroup = this.svg.elem('g'); - const labelGroup = this.svg.elem('g').addClass(options.classNames.labelGroup); + const labelGroup = this.svg + .elem('g') + .addClass(options.classNames.labelGroup); - if(options.stackBars && data.normalized.series.length !== 0) { + if (options.stackBars && data.normalized.series.length !== 0) { // If stacked bars we need to calculate the high low from stacked values from each series const serialSums = serialMap(data.normalized.series, () => Array.from(arguments) - .map((value) => value) - .reduce((prev, curr) => { - return { - x: prev.x + (curr && curr.x) || 0, - y: prev.y + (curr && curr.y) || 0 - }; - }, {x: 0, y: 0}) + .map(value => value) + .reduce( + (prev, curr) => { + return { + x: prev.x + (curr && curr.x) || 0, + y: prev.y + (curr && curr.y) || 0 + }; + }, + { x: 0, y: 0 } + ) ); - highLow = getHighLow([serialSums], options, options.horizontalBars ? 'x' : 'y'); - + highLow = getHighLow( + [serialSums], + options, + options.horizontalBars ? 'x' : 'y' + ); } else { - highLow = getHighLow(data.normalized.series, options, options.horizontalBars ? 'x' : 'y'); + highLow = getHighLow( + data.normalized.series, + options, + options.horizontalBars ? 'x' : 'y' + ); } // Overrides of high / low from settings highLow.high = +options.high || (options.high === 0 ? 0 : highLow.high); highLow.low = +options.low || (options.low === 0 ? 0 : highLow.low); - const chartRect = createChartRect(this.svg, options, defaultOptions.padding); + const chartRect = createChartRect( + this.svg, + options, + defaultOptions.padding + ); let valueAxis; let labelAxisTicks; let labelAxis; @@ -207,7 +247,7 @@ export class BarChart extends BaseChart { let axisY; // We need to set step count based on some options combinations - if(options.distributeSeries && options.stackBars) { + if (options.distributeSeries && options.stackBars) { // If distributed series are enabled and bars need to be stacked, we'll only have one bar and therefore should // use only the first label for the step axis labelAxisTicks = data.normalized.labels.slice(0, 1); @@ -219,60 +259,117 @@ export class BarChart extends BaseChart { } // Set labelAxis and valueAxis based on the horizontalBars setting. This setting will flip the axes if necessary. - if(options.horizontalBars) { - if(options.axisX.type === undefined) { - valueAxis = axisX = new AutoScaleAxis(axisUnits.x, data.normalized.series, chartRect, extend({}, options.axisX, { - highLow: highLow, - referenceValue: 0 - })); + if (options.horizontalBars) { + if (options.axisX.type === undefined) { + valueAxis = axisX = new AutoScaleAxis( + axisUnits.x, + data.normalized.series, + chartRect, + extend({}, options.axisX, { + highLow: highLow, + referenceValue: 0 + }) + ); } else { - valueAxis = axisX = new options.axisX.type(axisUnits.x, data.normalized.series, chartRect, extend({}, options.axisX, { - highLow: highLow, - referenceValue: 0 - })); + valueAxis = axisX = new options.axisX.type( + axisUnits.x, + data.normalized.series, + chartRect, + extend({}, options.axisX, { + highLow: highLow, + referenceValue: 0 + }) + ); } - if(options.axisY.type === undefined) { - labelAxis = axisY = new StepAxis(axisUnits.y, data.normalized.series, chartRect, { - ticks: labelAxisTicks - }); + if (options.axisY.type === undefined) { + labelAxis = axisY = new StepAxis( + axisUnits.y, + data.normalized.series, + chartRect, + { + ticks: labelAxisTicks + } + ); } else { - labelAxis = axisY = new options.axisY.type(axisUnits.y, data.normalized.series, chartRect, options.axisY); + labelAxis = axisY = new options.axisY.type( + axisUnits.y, + data.normalized.series, + chartRect, + options.axisY + ); } } else { - if(options.axisX.type === undefined) { - labelAxis = axisX = new StepAxis(axisUnits.x, data.normalized.series, chartRect, { - ticks: labelAxisTicks - }); + if (options.axisX.type === undefined) { + labelAxis = axisX = new StepAxis( + axisUnits.x, + data.normalized.series, + chartRect, + { + ticks: labelAxisTicks + } + ); } else { - labelAxis = axisX = new options.axisX.type(axisUnits.x, data.normalized.series, chartRect, options.axisX); + labelAxis = axisX = new options.axisX.type( + axisUnits.x, + data.normalized.series, + chartRect, + options.axisX + ); } - if(options.axisY.type === undefined) { - valueAxis = axisY = new AutoScaleAxis(axisUnits.y, data.normalized.series, chartRect, extend({}, options.axisY, { - highLow: highLow, - referenceValue: 0 - })); + if (options.axisY.type === undefined) { + valueAxis = axisY = new AutoScaleAxis( + axisUnits.y, + data.normalized.series, + chartRect, + extend({}, options.axisY, { + highLow: highLow, + referenceValue: 0 + }) + ); } else { - valueAxis = axisY = new options.axisY.type(axisUnits.y, data.normalized.series, chartRect, extend({}, options.axisY, { - highLow: highLow, - referenceValue: 0 - })); + valueAxis = axisY = new options.axisY.type( + axisUnits.y, + data.normalized.series, + chartRect, + extend({}, options.axisY, { + highLow: highLow, + referenceValue: 0 + }) + ); } } // Projected 0 point - const zeroPoint = options.horizontalBars ? - (chartRect.x1 + valueAxis.projectValue(0)) : - (chartRect.y1 - valueAxis.projectValue(0)); + const zeroPoint = options.horizontalBars + ? chartRect.x1 + valueAxis.projectValue(0) + : chartRect.y1 - valueAxis.projectValue(0); // Used to track the screen coordinates of stacked bars const stackedBarValues = []; - labelAxis.createGridAndLabels(gridGroup, labelGroup, this.supportsForeignObject, options, this.eventEmitter); - valueAxis.createGridAndLabels(gridGroup, labelGroup, this.supportsForeignObject, options, this.eventEmitter); + labelAxis.createGridAndLabels( + gridGroup, + labelGroup, + this.supportsForeignObject, + options, + this.eventEmitter + ); + valueAxis.createGridAndLabels( + gridGroup, + labelGroup, + this.supportsForeignObject, + options, + this.eventEmitter + ); - if(options.showGridBackground) { - createGridBackground(gridGroup, chartRect, options.classNames.gridBackground, this.eventEmitter); + if (options.showGridBackground) { + createGridBackground( + gridGroup, + chartRect, + options.classNames.gridBackground, + this.eventEmitter + ); } // Draw the series @@ -283,17 +380,19 @@ export class BarChart extends BaseChart { let periodHalfLength; // We need to set periodHalfLength based on some options combinations - if(options.distributeSeries && !options.stackBars) { + if (options.distributeSeries && !options.stackBars) { // If distributed series are enabled but stacked bars aren't, we need to use the length of the normaizedData array // which is the series count and divide by 2 - periodHalfLength = labelAxis.axisLength / data.normalized.series.length / 2; - } else if(options.distributeSeries && options.stackBars) { + periodHalfLength = + labelAxis.axisLength / data.normalized.series.length / 2; + } else if (options.distributeSeries && options.stackBars) { // If distributed series and stacked bars are enabled we'll only get one bar so we should just divide the axis // length by 2 periodHalfLength = labelAxis.axisLength / 2; } else { // On regular bar charts we should just use the series length - periodHalfLength = labelAxis.axisLength / data.normalized.series[seriesIndex].length / 2; + periodHalfLength = + labelAxis.axisLength / data.normalized.series[seriesIndex].length / 2; } // Adding the series group to the series element @@ -306,19 +405,22 @@ export class BarChart extends BaseChart { }); // Use series class from series data or if not set generate one - seriesElement.addClass([ - options.classNames.series, - series.className || `${options.classNames.series}-${alphaNumerate(seriesIndex)}` - ].join(' ')); + seriesElement.addClass( + [ + options.classNames.series, + series.className || + `${options.classNames.series}-${alphaNumerate(seriesIndex)}` + ].join(' ') + ); data.normalized.series[seriesIndex].forEach((value, valueIndex) => { let labelAxisValueIndex; // We need to set labelAxisValueIndex based on some options combinations - if(options.distributeSeries && !options.stackBars) { + if (options.distributeSeries && !options.stackBars) { // If distributed series are enabled but stacked bars aren't, we can use the seriesIndex for later projection // on the step axis for label positioning labelAxisValueIndex = seriesIndex; - } else if(options.distributeSeries && options.stackBars) { + } else if (options.distributeSeries && options.stackBars) { // If distributed series and stacked bars are enabled, we will only get one bar and therefore always use // 0 for projection on the label step axis labelAxisValueIndex = 0; @@ -329,37 +431,68 @@ export class BarChart extends BaseChart { let projected; // We need to transform coordinates differently based on the chart layout - if(options.horizontalBars) { + if (options.horizontalBars) { projected = { - x: chartRect.x1 + valueAxis.projectValue(value && value.x ? value.x : 0, valueIndex, data.normalized.series[seriesIndex]), - y: chartRect.y1 - labelAxis.projectValue(value && value.y ? value.y : 0, labelAxisValueIndex, data.normalized.series[seriesIndex]) + x: + chartRect.x1 + + valueAxis.projectValue( + value && value.x ? value.x : 0, + valueIndex, + data.normalized.series[seriesIndex] + ), + y: + chartRect.y1 - + labelAxis.projectValue( + value && value.y ? value.y : 0, + labelAxisValueIndex, + data.normalized.series[seriesIndex] + ) }; } else { projected = { - x: chartRect.x1 + labelAxis.projectValue(value && value.x ? value.x : 0, labelAxisValueIndex, data.normalized.series[seriesIndex]), - y: chartRect.y1 - valueAxis.projectValue(value && value.y ? value.y : 0, valueIndex, data.normalized.series[seriesIndex]) - } + x: + chartRect.x1 + + labelAxis.projectValue( + value && value.x ? value.x : 0, + labelAxisValueIndex, + data.normalized.series[seriesIndex] + ), + y: + chartRect.y1 - + valueAxis.projectValue( + value && value.y ? value.y : 0, + valueIndex, + data.normalized.series[seriesIndex] + ) + }; } // If the label axis is a step based axis we will offset the bar into the middle of between two steps using // the periodHalfLength value. Also we do arrange the different series so that they align up to each other using // the seriesBarDistance. If we don't have a step axis, the bar positions can be chosen freely so we should not // add any automated positioning. - if(labelAxis instanceof StepAxis) { + if (labelAxis instanceof StepAxis) { // Offset to center bar between grid lines, but only if the step axis is not stretched - if(!labelAxis.options.stretch) { - projected[labelAxis.units.pos] += periodHalfLength * (options.horizontalBars ? -1 : 1); + if (!labelAxis.options.stretch) { + projected[labelAxis.units.pos] += + periodHalfLength * (options.horizontalBars ? -1 : 1); } // Using bi-polar offset for multiple series if no stacked bars or series distribution is used - projected[labelAxis.units.pos] += (options.stackBars || options.distributeSeries) ? 0 : biPol * options.seriesBarDistance * (options.horizontalBars ? -1 : 1); + projected[labelAxis.units.pos] += + options.stackBars || options.distributeSeries + ? 0 + : biPol * + options.seriesBarDistance * + (options.horizontalBars ? -1 : 1); } // Enter value in stacked bar values used to remember previous screen value for stacking up bars const previousStack = stackedBarValues[valueIndex] || zeroPoint; - stackedBarValues[valueIndex] = previousStack - (zeroPoint - projected[labelAxis.counterUnits.pos]); + stackedBarValues[valueIndex] = + previousStack - (zeroPoint - projected[labelAxis.counterUnits.pos]); // Skip if value is undefined - if(value === undefined) { + if (value === undefined) { return; } @@ -367,47 +500,72 @@ export class BarChart extends BaseChart { positions[`${labelAxis.units.pos}1`] = projected[labelAxis.units.pos]; positions[`${labelAxis.units.pos}2`] = projected[labelAxis.units.pos]; - if(options.stackBars && (options.stackMode === 'accumulate' || !options.stackMode)) { + if ( + options.stackBars && + (options.stackMode === 'accumulate' || !options.stackMode) + ) { // Stack mode: accumulate (default) // If bars are stacked we use the stackedBarValues reference and otherwise base all bars off the zero line // We want backwards compatibility, so the expected fallback without the 'stackMode' option // to be the original behaviour (accumulate) positions[`${labelAxis.counterUnits.pos}1`] = previousStack; - positions[`${labelAxis.counterUnits.pos}2`] = stackedBarValues[valueIndex]; + positions[`${labelAxis.counterUnits.pos}2`] = + stackedBarValues[valueIndex]; } else { // Draw from the zero line normally // This is also the same code for Stack mode: overlap positions[`${labelAxis.counterUnits.pos}1`] = zeroPoint; - positions[`${labelAxis.counterUnits.pos}2`] = projected[labelAxis.counterUnits.pos]; + positions[`${labelAxis.counterUnits.pos}2`] = + projected[labelAxis.counterUnits.pos]; } // Limit x and y so that they are within the chart rect - positions.x1 = Math.min(Math.max(positions.x1, chartRect.x1), chartRect.x2); - positions.x2 = Math.min(Math.max(positions.x2, chartRect.x1), chartRect.x2); - positions.y1 = Math.min(Math.max(positions.y1, chartRect.y2), chartRect.y1); - positions.y2 = Math.min(Math.max(positions.y2, chartRect.y2), chartRect.y1); + positions.x1 = Math.min( + Math.max(positions.x1, chartRect.x1), + chartRect.x2 + ); + positions.x2 = Math.min( + Math.max(positions.x2, chartRect.x1), + chartRect.x2 + ); + positions.y1 = Math.min( + Math.max(positions.y1, chartRect.y2), + chartRect.y1 + ); + positions.y2 = Math.min( + Math.max(positions.y2, chartRect.y2), + chartRect.y1 + ); const metaData = getMetaData(series, valueIndex); // Create bar element - const bar = seriesElement.elem('line', positions, options.classNames.bar).attr({ - 'ct:value': [value.x, value.y].filter(isNumeric).join(','), - 'ct:meta': serialize(metaData) - }); - - this.eventEmitter.emit('draw', extend({ - type: 'bar', - value, - index: valueIndex, - meta: metaData, - series, - seriesIndex, - axisX, - axisY, - chartRect, - group: seriesElement, - element: bar - }, positions)); + const bar = seriesElement + .elem('line', positions, options.classNames.bar) + .attr({ + 'ct:value': [value.x, value.y].filter(isNumeric).join(','), + 'ct:meta': serialize(metaData) + }); + + this.eventEmitter.emit( + 'draw', + extend( + { + type: 'bar', + value, + index: valueIndex, + meta: metaData, + series, + seriesIndex, + axisX, + axisY, + chartRect, + group: seriesElement, + element: bar + }, + positions + ) + ); }); }); diff --git a/src/charts/bar.spec.js b/src/charts/bar.spec.js index 9b98f3cd..167741ff 100644 --- a/src/charts/bar.spec.js +++ b/src/charts/bar.spec.js @@ -1,7 +1,7 @@ -import {AutoScaleAxis} from '../axes/axes'; -import {BarChart} from './bar'; -import {namespaces} from '../core/globals'; -import {deserialize} from '../core/data'; +import { AutoScaleAxis } from '../axes/axes'; +import { BarChart } from './bar'; +import { namespaces } from '../core/globals'; +import { deserialize } from '../core/data'; import { addMockWrapper, destroyMockDom, @@ -18,15 +18,20 @@ describe('Charts', () => { let data; function createChart() { - return new Promise((resolve) => { - fixture = addMockWrapper('<div class="ct-chart ct-golden-section"></div>'); - const { wrapper } = fixture - chart = new BarChart(wrapper.querySelector('.ct-chart'), data, options) - .on('created', () => { - resolve(); - chart.off('created'); - }); - }) + return new Promise(resolve => { + fixture = addMockWrapper( + '<div class="ct-chart ct-golden-section"></div>' + ); + const { wrapper } = fixture; + chart = new BarChart( + wrapper.querySelector('.ct-chart'), + data, + options + ).on('created', () => { + resolve(); + chart.off('created'); + }); + }); } beforeEach(() => { @@ -43,10 +48,12 @@ describe('Charts', () => { describe('grids', () => { beforeEach(() => { data = { - series: [[ - {x: 1, y: 1}, - {x: 3, y: 5} - ]] + series: [ + [ + { x: 1, y: 1 }, + { x: 3, y: 5 } + ] + ] }; options = { axisX: { @@ -71,33 +78,48 @@ describe('Charts', () => { it('should draw grid lines', async () => { await createChart(); - expect(fixture.wrapper.querySelectorAll('g.ct-grids line.ct-grid.ct-horizontal').length).toBe(3); - expect(fixture.wrapper.querySelectorAll('g.ct-grids line.ct-grid.ct-vertical').length).toBe(6); + expect( + fixture.wrapper.querySelectorAll( + 'g.ct-grids line.ct-grid.ct-horizontal' + ).length + ).toBe(3); + expect( + fixture.wrapper.querySelectorAll( + 'g.ct-grids line.ct-grid.ct-vertical' + ).length + ).toBe(6); }); it('should draw grid background', async () => { options.showGridBackground = true; await createChart(); - expect(fixture.wrapper.querySelectorAll('g.ct-grids rect.ct-grid-background').length).toBe(1); + expect( + fixture.wrapper.querySelectorAll('g.ct-grids rect.ct-grid-background') + .length + ).toBe(1); }); it('should not draw grid background if option set to false', async () => { options.showGridBackground = false; await createChart(); - expect(fixture.wrapper.querySelectorAll('g.ct-grids rect.ct-grid-background').length).toBe(0); + expect( + fixture.wrapper.querySelectorAll('g.ct-grids rect.ct-grid-background') + .length + ).toBe(0); }); - }); describe('ct:value attribute', () => { it('should contain x and y value for each bar', async () => { data = { - series: [[ - {x: 1, y: 2}, - {x: 3, y: 4} - ]] + series: [ + [ + { x: 1, y: 2 }, + { x: 3, y: 4 } + ] + ] }; options = { axisX: { @@ -113,11 +135,13 @@ describe('Charts', () => { it('should render values that are zero', async () => { data = { - series: [[ - {x: 0, y: 1}, - {x: 2, y: 0}, - {x: 0, y: 0} - ]] + series: [ + [ + { x: 0, y: 1 }, + { x: 2, y: 0 }, + { x: 0, y: 0 } + ] + ] }; options = { axisX: { @@ -142,16 +166,24 @@ describe('Charts', () => { data = { labels: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu'], series: [ - [5, 2, 4, { - value: 2, - meta: meta - }, 0] + [ + 5, + 2, + 4, + { + value: 2, + meta: meta + }, + 0 + ] ] }; await createChart(); const bar = fixture.wrapper.querySelectorAll('.ct-bar')[3]; - expect(deserialize(bar.getAttributeNS(namespaces.ct, 'meta'))).toEqual(meta); + expect(deserialize(bar.getAttributeNS(namespaces.ct, 'meta'))).toEqual( + meta + ); }); it('should render meta data correctly with mixed value array and different normalized data length', async () => { @@ -162,16 +194,24 @@ describe('Charts', () => { data = { labels: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'], series: [ - [5, 2, 4, { - value: 2, - meta: meta - }, 0] + [ + 5, + 2, + 4, + { + value: 2, + meta: meta + }, + 0 + ] ] }; await createChart(); const bar = fixture.wrapper.querySelectorAll('.ct-bar')[3]; - expect(deserialize(bar.getAttributeNS(namespaces.ct, 'meta'))).toEqual(meta); + expect(deserialize(bar.getAttributeNS(namespaces.ct, 'meta'))).toEqual( + meta + ); }); it('should render meta data correctly with mixed value array and mixed series notation', async () => { @@ -183,16 +223,27 @@ describe('Charts', () => { data = { labels: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'], series: [ - [5, 2, 4, { - value: 2, - meta: valueMeta - }, 0], - { - meta: seriesMeta, - data: [5, 2, { + [ + 5, + 2, + 4, + { value: 2, meta: valueMeta - }, 0] + }, + 0 + ], + { + meta: seriesMeta, + data: [ + 5, + 2, + { + value: 2, + meta: valueMeta + }, + 0 + ] } ] }; @@ -200,21 +251,24 @@ describe('Charts', () => { expect( deserialize( - fixture.wrapper.querySelectorAll('.ct-series-a .ct-bar')[3] + fixture.wrapper + .querySelectorAll('.ct-series-a .ct-bar')[3] .getAttributeNS(namespaces.ct, 'meta') ) ).toEqual(valueMeta); expect( deserialize( - fixture.wrapper.querySelector('.ct-series-b') + fixture.wrapper + .querySelector('.ct-series-b') .getAttributeNS(namespaces.ct, 'meta') ) ).toEqual(seriesMeta); expect( deserialize( - fixture.wrapper.querySelectorAll('.ct-series-b .ct-bar')[2] + fixture.wrapper + .querySelectorAll('.ct-series-b .ct-bar')[2] .getAttributeNS(namespaces.ct, 'meta') ) ).toEqual(valueMeta); @@ -228,7 +282,9 @@ describe('Charts', () => { await createChart(); // Find at least one vertical grid line - expect(document.querySelector('.ct-grids .ct-grid.ct-vertical')).toBeDefined(); + expect( + document.querySelector('.ct-grids .ct-grid.ct-vertical') + ).toBeDefined(); }); it('should render empty grid with only labels', async () => { @@ -238,9 +294,13 @@ describe('Charts', () => { await createChart(); // Find at least one vertical grid line - expect(document.querySelector('.ct-grids .ct-grid.ct-vertical')).toBeDefined(); + expect( + document.querySelector('.ct-grids .ct-grid.ct-vertical') + ).toBeDefined(); // Find exactly as many horizontal grid lines as labels were specified (Step Axis) - expect(document.querySelectorAll('.ct-grids .ct-grid.ct-horizontal').length).toBe(data.labels.length); + expect( + document.querySelectorAll('.ct-grids .ct-grid.ct-horizontal').length + ).toBe(data.labels.length); }); it('should generate labels and render empty grid with only series in data', async () => { @@ -254,10 +314,13 @@ describe('Charts', () => { await createChart(); // Find at least one vertical grid line - expect(document.querySelector('.ct-grids .ct-grid.ct-vertical')).toBeDefined(); + expect( + document.querySelector('.ct-grids .ct-grid.ct-vertical') + ).toBeDefined(); // Should generate the labels using the largest series count - expect(document.querySelectorAll('.ct-grids .ct-grid.ct-horizontal').length) - .toBe(Math.max(...data.series.map((series) => series.length))); + expect( + document.querySelectorAll('.ct-grids .ct-grid.ct-horizontal').length + ).toBe(Math.max(...data.series.map(series => series.length))); }); it('should render empty grid with no data and specified high low', async () => { @@ -270,7 +333,9 @@ describe('Charts', () => { await createChart(); // Find first and last label - const labels = document.querySelectorAll('.ct-labels .ct-label.ct-vertical'); + const labels = document.querySelectorAll( + '.ct-labels .ct-label.ct-vertical' + ); const firstLabel = labels[0]; const lastLabel = labels[labels.length - 1]; @@ -285,7 +350,9 @@ describe('Charts', () => { await createChart(); // Find at least one vertical grid line - expect(document.querySelector('.ct-grids .ct-grid.ct-vertical')).toBeDefined(); + expect( + document.querySelector('.ct-grids .ct-grid.ct-vertical') + ).toBeDefined(); }); it('should render empty grid with no data and stackBars option', async () => { @@ -295,7 +362,9 @@ describe('Charts', () => { await createChart(); // Find at least one vertical grid line - expect(document.querySelector('.ct-grids .ct-grid.ct-vertical')).toBeDefined(); + expect( + document.querySelector('.ct-grids .ct-grid.ct-vertical') + ).toBeDefined(); }); it('should render empty grid with no data and horizontalBars option', async () => { @@ -306,7 +375,9 @@ describe('Charts', () => { // Find at least one vertical grid line // TODO: In theory the axis should be created with ct-horizontal class - expect(document.querySelector('.ct-grids .ct-grid.ct-vertical')).toBeDefined(); + expect( + document.querySelector('.ct-grids .ct-grid.ct-vertical') + ).toBeDefined(); }); it('should render empty grid with no data and distributeSeries option', async () => { @@ -316,7 +387,9 @@ describe('Charts', () => { await createChart(); // Find at least one vertical grid line - expect(document.querySelector('.ct-grids .ct-grid.ct-vertical')).toBeDefined(); + expect( + document.querySelector('.ct-grids .ct-grid.ct-vertical') + ).toBeDefined(); }); }); }); diff --git a/src/charts/bar.stories.js b/src/charts/bar.stories.js index 8e2fa910..fa54e35e 100644 --- a/src/charts/bar.stories.js +++ b/src/charts/bar.stories.js @@ -10,315 +10,417 @@ export default { export function Default() { const root = document.createElement('div'); - new BarChart(root, { - series: [[ - {x: 1, y: 1}, - {x: 3, y: 5} - ]] - }, { - axisX: { - type: AutoScaleAxis, - onlyInteger: true + new BarChart( + root, + { + series: [ + [ + { x: 1, y: 1 }, + { x: 3, y: 5 } + ] + ] }, - axisY: { - type: AutoScaleAxis, - onlyInteger: true + { + axisX: { + type: AutoScaleAxis, + onlyInteger: true + }, + axisY: { + type: AutoScaleAxis, + onlyInteger: true + } } - }); + ); - return root + return root; } export function BiPolar() { const root = document.createElement('div'); - new BarChart(root, { - labels: ['W1', 'W2', 'W3', 'W4', 'W5', 'W6', 'W7', 'W8', 'W9', 'W10'], - series: [ - [1, 2, 4, 8, 6, -2, -1, -4, -6, -2] - ] - }, { - high: 10, - low: -10, - axisX: { - labelInterpolationFnc(value, index) { - return index % 2 === 0 ? value : null; + new BarChart( + root, + { + labels: ['W1', 'W2', 'W3', 'W4', 'W5', 'W6', 'W7', 'W8', 'W9', 'W10'], + series: [[1, 2, 4, 8, 6, -2, -1, -4, -6, -2]] + }, + { + high: 10, + low: -10, + axisX: { + labelInterpolationFnc(value, index) { + return index % 2 === 0 ? value : null; + } } } - }); + ); - return root + return root; } export function Labels() { const root = document.createElement('div'); - new BarChart(root, { - labels: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu'], - series: [ - [5, 2, 4, 2, 0] - ] - }, { - }); + new BarChart( + root, + { + labels: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu'], + series: [[5, 2, 4, 2, 0]] + }, + {} + ); - return root + return root; } export function MultilineLabels() { const root = document.createElement('div'); - new BarChart(root, { - labels: ['First quarter of the year', 'Second quarter of the year', 'Third quarter of the year', 'Fourth quarter of the year'], - series: [ - [60000, 40000, 80000, 70000], - [40000, 30000, 70000, 65000], - [8000, 3000, 10000, 6000] - ] - }, { - seriesBarDistance: 10, - axisX: { - offset: 60 + new BarChart( + root, + { + labels: [ + 'First quarter of the year', + 'Second quarter of the year', + 'Third quarter of the year', + 'Fourth quarter of the year' + ], + series: [ + [60000, 40000, 80000, 70000], + [40000, 30000, 70000, 65000], + [8000, 3000, 10000, 6000] + ] }, - axisY: { - offset: 80, - labelInterpolationFnc(value) { - return value + ' CHF' + { + seriesBarDistance: 10, + axisX: { + offset: 60 }, - scaleMinSpace: 15 + axisY: { + offset: 80, + labelInterpolationFnc(value) { + return value + ' CHF'; + }, + scaleMinSpace: 15 + } } - }); + ); - return root + return root; } export function LabelsPlacement() { const root = document.createElement('div'); - new BarChart(root, { - labels: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'], - series: [ - [5, 4, 3, 7, 5, 10, 3], - [3, 2, 9, 5, 4, 6, 4] - ] - }, { - axisX: { - // On the x-axis start means top and end means bottom - position: 'start' + new BarChart( + root, + { + labels: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'], + series: [ + [5, 4, 3, 7, 5, 10, 3], + [3, 2, 9, 5, 4, 6, 4] + ] }, - axisY: { - // On the y-axis start means left and end means right - position: 'end' + { + axisX: { + // On the x-axis start means top and end means bottom + position: 'start' + }, + axisY: { + // On the y-axis start means left and end means right + position: 'end' + } } - }); + ); - return root + return root; } export function MultiSeries() { const root = document.createElement('div'); - new BarChart(root, { - series: [ - [1, 2, 3, 4], - [2, 3, 4], - [3, 4] - ] - }, {}); + new BarChart( + root, + { + series: [ + [1, 2, 3, 4], + [2, 3, 4], + [3, 4] + ] + }, + {} + ); - return root + return root; } export function DistributedSeries() { const root = document.createElement('div'); - new BarChart(root, { - labels: ['XS', 'S', 'M', 'L', 'XL', 'XXL', 'XXXL'], - series: [20, 60, 120, 200, 180, 20, 10] - }, { - distributeSeries: true - }); + new BarChart( + root, + { + labels: ['XS', 'S', 'M', 'L', 'XL', 'XXL', 'XXXL'], + series: [20, 60, 120, 200, 180, 20, 10] + }, + { + distributeSeries: true + } + ); - return root + return root; } export function ReverseData() { const root = document.createElement('div'); - new BarChart(root, { - series: [ - [1, 2, 3, 4], - [2, 3, 4], - [3, 4] - ] - }, { - reverseData: true - }); + new BarChart( + root, + { + series: [ + [1, 2, 3, 4], + [2, 3, 4], + [3, 4] + ] + }, + { + reverseData: true + } + ); - return root + return root; } export function Stack() { const root = document.createElement('div'); - new BarChart(root, { - labels: ['Q1', 'Q2', 'Q3', 'Q4'], - series: [ - [800000, 1200000, 1400000, 1300000], - [200000, 400000, 500000, 300000], - [100000, 200000, 400000, 600000] - ] - }, { - stackBars: true, - axisY: { - labelInterpolationFnc(value) { - return (value / 1000) + 'k'; + new BarChart( + root, + { + labels: ['Q1', 'Q2', 'Q3', 'Q4'], + series: [ + [800000, 1200000, 1400000, 1300000], + [200000, 400000, 500000, 300000], + [100000, 200000, 400000, 600000] + ] + }, + { + stackBars: true, + axisY: { + labelInterpolationFnc(value) { + return value / 1000 + 'k'; + } } } - }).on('draw', (data) => { - if(data.type === 'bar') { + ).on('draw', data => { + if (data.type === 'bar') { data.element.attr({ style: 'stroke-width: 30px' }); } - }) + }); - return root + return root; } export function Horizontal() { const root = document.createElement('div'); - new BarChart(root, { - labels: ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'], - series: [ - [5, 4, 3, 7, 5, 10, 3], - [3, 2, 9, 5, 4, 6, 4] - ] - }, { - seriesBarDistance: 10, - reverseData: true, - horizontalBars: true, - axisY: { - offset: 70 + new BarChart( + root, + { + labels: [ + 'Monday', + 'Tuesday', + 'Wednesday', + 'Thursday', + 'Friday', + 'Saturday', + 'Sunday' + ], + series: [ + [5, 4, 3, 7, 5, 10, 3], + [3, 2, 9, 5, 4, 6, 4] + ] + }, + { + seriesBarDistance: 10, + reverseData: true, + horizontalBars: true, + axisY: { + offset: 70 + } } - }); + ); - return root + return root; } export function Adaptive() { const root = document.createElement('div'); - new BarChart(root, { - labels: ['Quarter 1', 'Quarter 2', 'Quarter 3', 'Quarter 4'], - series: [ - [5, 4, 3, 7], - [3, 2, 9, 5], - [1, 5, 8, 4], - [2, 3, 4, 6], - [4, 1, 2, 1] - ] - }, { - // Default mobile configuration - stackBars: true, - axisX: { - labelInterpolationFnc: value => value.split(/\s+/).map(word => word[0]).join('') + new BarChart( + root, + { + labels: ['Quarter 1', 'Quarter 2', 'Quarter 3', 'Quarter 4'], + series: [ + [5, 4, 3, 7], + [3, 2, 9, 5], + [1, 5, 8, 4], + [2, 3, 4, 6], + [4, 1, 2, 1] + ] }, - axisY: { - offset: 20 - } - }, [ - // Options override for media > 400px - ['screen and (min-width: 400px)', { - reverseData: true, - horizontalBars: true, + { + // Default mobile configuration + stackBars: true, axisX: { - labelInterpolationFnc: () => undefined, + labelInterpolationFnc: value => + value + .split(/\s+/) + .map(word => word[0]) + .join('') }, axisY: { - offset: 60 + offset: 20 } - }], - // Options override for media > 800px - ['screen and (min-width: 800px)', { - stackBars: false, - seriesBarDistance: 10 - }], - // Options override for media > 1000px - ['screen and (min-width: 1000px)', { - reverseData: false, - horizontalBars: false, - seriesBarDistance: 15 - }] - ]); - - return root + }, + [ + // Options override for media > 400px + [ + 'screen and (min-width: 400px)', + { + reverseData: true, + horizontalBars: true, + axisX: { + labelInterpolationFnc: () => undefined + }, + axisY: { + offset: 60 + } + } + ], + // Options override for media > 800px + [ + 'screen and (min-width: 800px)', + { + stackBars: false, + seriesBarDistance: 10 + } + ], + // Options override for media > 1000px + [ + 'screen and (min-width: 1000px)', + { + reverseData: false, + horizontalBars: false, + seriesBarDistance: 15 + } + ] + ] + ); + + return root; } Adaptive.parameters = { storyshots: { - viewports: [Viewport.Default, Viewport.Tablet, Viewport.MobileLandscape, Viewport.Mobile], + viewports: [ + Viewport.Default, + Viewport.Tablet, + Viewport.MobileLandscape, + Viewport.Mobile + ] } -} +}; export function OverlappingBarsOnMobile() { const root = document.createElement('div'); - new BarChart(root, { - labels: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], - series: [ - [5, 4, 3, 7, 5, 10, 3, 4, 8, 10, 6, 8], - [3, 2, 9, 5, 4, 6, 4, 6, 7, 8, 7, 4] - ] - }, { - seriesBarDistance: 10 - }, [ - ['screen and (max-width: 640px)', { - seriesBarDistance: 5, - axisX: { - labelInterpolationFnc(value) { - return value[0]; + new BarChart( + root, + { + labels: [ + 'Jan', + 'Feb', + 'Mar', + 'Apr', + 'May', + 'Jun', + 'Jul', + 'Aug', + 'Sep', + 'Oct', + 'Nov', + 'Dec' + ], + series: [ + [5, 4, 3, 7, 5, 10, 3, 4, 8, 10, 6, 8], + [3, 2, 9, 5, 4, 6, 4, 6, 7, 8, 7, 4] + ] + }, + { + seriesBarDistance: 10 + }, + [ + [ + 'screen and (max-width: 640px)', + { + seriesBarDistance: 5, + axisX: { + labelInterpolationFnc(value) { + return value[0]; + } + } } - } - }] - ]); + ] + ] + ); - return root + return root; } OverlappingBarsOnMobile.parameters = { storyshots: { - viewports: [Viewport.Default, Viewport.Mobile], + viewports: [Viewport.Default, Viewport.Mobile] } -} +}; export function PeakCircles() { const root = document.createElement('div'); - new BarChart(root, { - labels: ['W1', 'W2', 'W3', 'W4', 'W5', 'W6', 'W7', 'W8', 'W9', 'W10'], - series: [ - [1, 2, 4, 8, 6, -2, -1, -4, -6, -2] - ] - }, { - high: 10, - low: -10, - axisX: { - labelInterpolationFnc(value, index) { - return index % 2 === 0 ? value : null; + new BarChart( + root, + { + labels: ['W1', 'W2', 'W3', 'W4', 'W5', 'W6', 'W7', 'W8', 'W9', 'W10'], + series: [[1, 2, 4, 8, 6, -2, -1, -4, -6, -2]] + }, + { + high: 10, + low: -10, + axisX: { + labelInterpolationFnc(value, index) { + return index % 2 === 0 ? value : null; + } } } - }).on('draw', (data) => { + ).on('draw', data => { // If this draw event is of type bar we can use the data to create additional content - if(data.type === 'bar') { + if (data.type === 'bar') { // We use the group element of the current series to append a simple circle with the bar peek coordinates and a circle radius that is depending on the value - data.group.append(new Svg('circle', { - cx: data.x2, - cy: data.y2, - r: Math.abs(getMultiValue(data.value)) * 2 + 5 - }, 'ct-slice-pie')); + data.group.append( + new Svg( + 'circle', + { + cx: data.x2, + cy: data.y2, + r: Math.abs(getMultiValue(data.value)) * 2 + 5 + }, + 'ct-slice-pie' + ) + ); } }); - return root + return root; } diff --git a/src/charts/base.js b/src/charts/base.js index b9170606..b11b9b7c 100644 --- a/src/charts/base.js +++ b/src/charts/base.js @@ -1,6 +1,6 @@ -import {querySelector, extend, optionsProvider} from '../core/core'; -import {EventEmitter} from '../event/event-emitter'; -import {isSupported} from '../svg/svg'; +import { querySelector, extend, optionsProvider } from '../core/core'; +import { EventEmitter } from '../event/event-emitter'; +import { isSupported } from '../svg/svg'; export class BaseChart { /** @@ -26,9 +26,9 @@ export class BaseChart { this.supportsAnimations = isSupported('AnimationEventsAttribute'); this.resizeListener = () => this.update(); - if(this.container) { + if (this.container) { // If chartist was already initialized in this container we are detaching all event listeners first - if(this.container.__chartist__) { + if (this.container.__chartist__) { this.container.__chartist__.detach(); } @@ -41,7 +41,7 @@ export class BaseChart { } createChart() { - throw new Error('Base chart type can\'t be instantiated!'); + throw new Error("Base chart type can't be instantiated!"); } // TODO: Currently we need to re-draw the chart on window resize. This is usually very bad and will affect performance. @@ -59,7 +59,7 @@ export class BaseChart { * @memberof Chartist.Base */ update(data, options, override) { - if(data) { + if (data) { this.data = data || {}; this.data.labels = this.data.labels || []; this.data.series = this.data.series || []; @@ -70,19 +70,27 @@ export class BaseChart { }); } - if(options) { - this.options = extend({}, override ? this.options : this.defaultOptions, options); + if (options) { + this.options = extend( + {}, + override ? this.options : this.defaultOptions, + options + ); // If chartist was not initialized yet, we just set the options and leave the rest to the initialization // Otherwise we re-create the optionsProvider at this point - if(!this.initializeTimeoutId) { + if (!this.initializeTimeoutId) { this.optionsProvider.removeMediaQueryListeners(); - this.optionsProvider = optionsProvider(this.options, this.responsiveOptions, this.eventEmitter); + this.optionsProvider = optionsProvider( + this.options, + this.responsiveOptions, + this.eventEmitter + ); } } // Only re-created the chart if it has been initialized yet - if(!this.initializeTimeoutId) { + if (!this.initializeTimeoutId) { this.createChart(this.optionsProvider.getCurrentOptions()); } @@ -98,7 +106,7 @@ export class BaseChart { detach() { // Only detach if initialization already occurred on this chart. If this chart still hasn't initialized (therefore // the initializationTimeoutId is still a valid timeout reference, we will clear the timeout - if(!this.initializeTimeoutId) { + if (!this.initializeTimeoutId) { window.removeEventListener('resize', this.resizeListener); this.optionsProvider.removeMediaQueryListeners(); } else { @@ -138,15 +146,19 @@ export class BaseChart { // Obtain current options based on matching media queries (if responsive options are given) // This will also register a listener that is re-creating the chart based on media changes - this.optionsProvider = optionsProvider(this.options, this.responsiveOptions, this.eventEmitter); + this.optionsProvider = optionsProvider( + this.options, + this.responsiveOptions, + this.eventEmitter + ); // Register options change listener that will trigger a chart update this.eventEmitter.addEventHandler('optionsChanged', () => this.update()); // Before the first chart creation we need to register us with all plugins that are configured // Initialize all relevant plugins with our chart object and the plugin options specified in the config - if(this.options.plugins) { - this.options.plugins.forEach((plugin) => { - if(plugin instanceof Array) { + if (this.options.plugins) { + this.options.plugins.forEach(plugin => { + if (plugin instanceof Array) { plugin[0](this, plugin[1]); } else { plugin(this); diff --git a/src/charts/charts.js b/src/charts/charts.js index a0a33a9d..bcd11824 100644 --- a/src/charts/charts.js +++ b/src/charts/charts.js @@ -1,4 +1,4 @@ -export {BaseChart} from './base'; -export {LineChart} from './line'; -export {BarChart} from './bar'; -export {PieChart} from './pie'; +export { BaseChart } from './base'; +export { LineChart } from './line'; +export { BarChart } from './bar'; +export { PieChart } from './pie'; diff --git a/src/charts/line.js b/src/charts/line.js index ee9f0fef..7926a29b 100644 --- a/src/charts/line.js +++ b/src/charts/line.js @@ -1,11 +1,20 @@ -import {isNumeric, alphaNumerate} from '../core/lang'; -import {noop} from '../core/functional'; -import {extend} from '../core/extend'; -import {normalizeData, serialize, getMetaData, getSeriesOption} from '../core/data'; -import {createSvg, createChartRect, createGridBackground} from '../core/creation'; -import {StepAxis, AutoScaleAxis, axisUnits} from '../axes/axes'; -import {BaseChart} from './base'; -import {monotoneCubic, none} from '../interpolation/interpolation'; +import { isNumeric, alphaNumerate } from '../core/lang'; +import { noop } from '../core/functional'; +import { extend } from '../core/extend'; +import { + normalizeData, + serialize, + getMetaData, + getSeriesOption +} from '../core/data'; +import { + createSvg, + createChartRect, + createGridBackground +} from '../core/creation'; +import { StepAxis, AutoScaleAxis, axisUnits } from '../axes/axes'; +import { BaseChart } from './base'; +import { monotoneCubic, none } from '../interpolation/interpolation'; /** * Default options in line charts. Expand the code view to see a detailed list of options with comments. @@ -190,7 +199,13 @@ export class LineChart extends BaseChart { * */ constructor(query, data, options, responsiveOptions) { - super(query, data, defaultOptions, extend({}, defaultOptions, options), responsiveOptions); + super( + query, + data, + defaultOptions, + extend({}, defaultOptions, options), + responsiveOptions + ); } /** @@ -201,39 +216,87 @@ export class LineChart extends BaseChart { const data = normalizeData(this.data, options.reverseData, true); // Create new svg object - this.svg = createSvg(this.container, options.width, options.height, options.classNames.chart); + this.svg = createSvg( + this.container, + options.width, + options.height, + options.classNames.chart + ); // Create groups for labels, grid and series const gridGroup = this.svg.elem('g').addClass(options.classNames.gridGroup); const seriesGroup = this.svg.elem('g'); - const labelGroup = this.svg.elem('g').addClass(options.classNames.labelGroup); + const labelGroup = this.svg + .elem('g') + .addClass(options.classNames.labelGroup); - const chartRect = createChartRect(this.svg, options, defaultOptions.padding); + const chartRect = createChartRect( + this.svg, + options, + defaultOptions.padding + ); let axisX; let axisY; - if(options.axisX.type === undefined) { - axisX = new StepAxis(axisUnits.x, data.normalized.series, chartRect, extend({}, options.axisX, { - ticks: data.normalized.labels, - stretch: options.fullWidth - })); + if (options.axisX.type === undefined) { + axisX = new StepAxis( + axisUnits.x, + data.normalized.series, + chartRect, + extend({}, options.axisX, { + ticks: data.normalized.labels, + stretch: options.fullWidth + }) + ); } else { - axisX = new options.axisX.type(axisUnits.x, data.normalized.series, chartRect, options.axisX); + axisX = new options.axisX.type( + axisUnits.x, + data.normalized.series, + chartRect, + options.axisX + ); } - if(options.axisY.type === undefined) { - axisY = new AutoScaleAxis(axisUnits.y, data.normalized.series, chartRect, extend({}, options.axisY, { - high: isNumeric(options.high) ? options.high : options.axisY.high, - low: isNumeric(options.low) ? options.low : options.axisY.low - })); + if (options.axisY.type === undefined) { + axisY = new AutoScaleAxis( + axisUnits.y, + data.normalized.series, + chartRect, + extend({}, options.axisY, { + high: isNumeric(options.high) ? options.high : options.axisY.high, + low: isNumeric(options.low) ? options.low : options.axisY.low + }) + ); } else { - axisY = new options.axisY.type(axisUnits.y, data.normalized.series, chartRect, options.axisY); + axisY = new options.axisY.type( + axisUnits.y, + data.normalized.series, + chartRect, + options.axisY + ); } - axisX.createGridAndLabels(gridGroup, labelGroup, this.supportsForeignObject, options, this.eventEmitter); - axisY.createGridAndLabels(gridGroup, labelGroup, this.supportsForeignObject, options, this.eventEmitter); + axisX.createGridAndLabels( + gridGroup, + labelGroup, + this.supportsForeignObject, + options, + this.eventEmitter + ); + axisY.createGridAndLabels( + gridGroup, + labelGroup, + this.supportsForeignObject, + options, + this.eventEmitter + ); - if(options.showGridBackground) { - createGridBackground(gridGroup, chartRect, options.classNames.gridBackground, this.eventEmitter); + if (options.showGridBackground) { + createGridBackground( + gridGroup, + chartRect, + options.classNames.gridBackground, + this.eventEmitter + ); } // Draw the series @@ -247,18 +310,33 @@ export class LineChart extends BaseChart { }); // Use series class from series data or if not set generate one - seriesElement.addClass([ - options.classNames.series, - series.className || `${options.classNames.series}-${alphaNumerate(seriesIndex)}` - ].join(' ')); + seriesElement.addClass( + [ + options.classNames.series, + series.className || + `${options.classNames.series}-${alphaNumerate(seriesIndex)}` + ].join(' ') + ); const pathCoordinates = []; const pathData = []; data.normalized.series[seriesIndex].forEach((value, valueIndex) => { const p = { - x: chartRect.x1 + axisX.projectValue(value, valueIndex, data.normalized.series[seriesIndex]), - y: chartRect.y1 - axisY.projectValue(value, valueIndex, data.normalized.series[seriesIndex]) + x: + chartRect.x1 + + axisX.projectValue( + value, + valueIndex, + data.normalized.series[seriesIndex] + ), + y: + chartRect.y1 - + axisY.projectValue( + value, + valueIndex, + data.normalized.series[seriesIndex] + ) }; pathCoordinates.push(p.x, p.y); pathData.push({ @@ -277,7 +355,7 @@ export class LineChart extends BaseChart { }; let smoothing; - if(typeof seriesOptions.lineSmooth === 'function') { + if (typeof seriesOptions.lineSmooth === 'function') { smoothing = seriesOptions.lineSmooth; } else { smoothing = seriesOptions.lineSmooth ? monotoneCubic() : none(); @@ -290,18 +368,25 @@ export class LineChart extends BaseChart { // If we should show points we need to create them now to avoid secondary loop // Points are drawn from the pathElements returned by the interpolation function // Small offset for Firefox to render squares correctly - if(seriesOptions.showPoint) { - - path.pathElements.forEach((pathElement) => { - const point = seriesElement.elem('line', { - x1: pathElement.x, - y1: pathElement.y, - x2: pathElement.x + 0.01, - y2: pathElement.y - }, options.classNames.point).attr({ - 'ct:value': [pathElement.data.value.x, pathElement.data.value.y].filter(isNumeric).join(','), - 'ct:meta': serialize(pathElement.data.meta) - }); + if (seriesOptions.showPoint) { + path.pathElements.forEach(pathElement => { + const point = seriesElement + .elem( + 'line', + { + x1: pathElement.x, + y1: pathElement.y, + x2: pathElement.x + 0.01, + y2: pathElement.y + }, + options.classNames.point + ) + .attr({ + 'ct:value': [pathElement.data.value.x, pathElement.data.value.y] + .filter(isNumeric) + .join(','), + 'ct:meta': serialize(pathElement.data.meta) + }); this.eventEmitter.emit('draw', { type: 'point', @@ -320,10 +405,15 @@ export class LineChart extends BaseChart { }); } - if(seriesOptions.showLine) { - const line = seriesElement.elem('path', { - d: path.stringify() - }, options.classNames.line, true); + if (seriesOptions.showLine) { + const line = seriesElement.elem( + 'path', + { + d: path.stringify() + }, + options.classNames.line, + true + ); this.eventEmitter.emit('draw', { type: 'line', @@ -343,42 +433,54 @@ export class LineChart extends BaseChart { } // Area currently only works with axes that support a range! - if(seriesOptions.showArea && axisY.range) { + if (seriesOptions.showArea && axisY.range) { // If areaBase is outside the chart area (< min or > max) we need to set it respectively so that // the area is not drawn outside the chart area. - const areaBase = Math.max(Math.min(seriesOptions.areaBase, axisY.range.max), axisY.range.min); + const areaBase = Math.max( + Math.min(seriesOptions.areaBase, axisY.range.max), + axisY.range.min + ); // We project the areaBase value into screen coordinates const areaBaseProjected = chartRect.y1 - axisY.projectValue(areaBase); // In order to form the area we'll first split the path by move commands so we can chunk it up into segments - path.splitByCommand('M') - // We filter only "solid" segments that contain more than one point. Otherwise there's no need for an area - .filter((pathSegment) => pathSegment.pathElements.length > 1) - .map((solidPathSegments) => { + path + .splitByCommand('M') + // We filter only "solid" segments that contain more than one point. Otherwise there's no need for an area + .filter(pathSegment => pathSegment.pathElements.length > 1) + .map(solidPathSegments => { // Receiving the filtered solid path segments we can now convert those segments into fill areas const firstElement = solidPathSegments.pathElements[0]; - const lastElement = solidPathSegments.pathElements[solidPathSegments.pathElements.length - 1]; + const lastElement = + solidPathSegments.pathElements[ + solidPathSegments.pathElements.length - 1 + ]; // Cloning the solid path segment with closing option and removing the first move command from the clone // We then insert a new move that should start at the area base and draw a straight line up or down // at the end of the path we add an additional straight line to the projected area base value // As the closing option is set our path will be automatically closed - return solidPathSegments.clone(true) + return solidPathSegments + .clone(true) .position(0) .remove(1) .move(firstElement.x, areaBaseProjected) .line(firstElement.x, firstElement.y) .position(solidPathSegments.pathElements.length + 1) .line(lastElement.x, areaBaseProjected); - }) - .forEach((areaPath) => { + .forEach(areaPath => { // For each of our newly created area paths, we'll now create path elements by stringifying our path objects // and adding the created DOM elements to the correct series group - const area = seriesElement.elem('path', { - d: areaPath.stringify() - }, options.classNames.area, true); + const area = seriesElement.elem( + 'path', + { + d: areaPath.stringify() + }, + options.classNames.area, + true + ); // Emit an event for each area that was drawn this.eventEmitter.emit('draw', { diff --git a/src/charts/line.spec.js b/src/charts/line.spec.js index c242a768..12927dd0 100644 --- a/src/charts/line.spec.js +++ b/src/charts/line.spec.js @@ -1,8 +1,8 @@ -import {AutoScaleAxis, FixedScaleAxis} from '../axes/axes'; -import {LineChart} from './line'; +import { AutoScaleAxis, FixedScaleAxis } from '../axes/axes'; +import { LineChart } from './line'; import * as Interpolation from '../interpolation/interpolation'; -import {namespaces} from '../core/globals'; -import {deserialize} from '../core/data'; +import { namespaces } from '../core/globals'; +import { deserialize } from '../core/data'; import { addMockWrapper, destroyMockDom, @@ -19,15 +19,20 @@ describe('Charts', () => { let data; function createChart() { - return new Promise((resolve) => { - fixture = addMockWrapper('<div class="ct-chart ct-golden-section"></div>'); - const { wrapper } = fixture - chart = new LineChart(wrapper.querySelector('.ct-chart'), data, options) - .on('created', () => { - resolve(); - chart.off('created'); - }); - }) + return new Promise(resolve => { + fixture = addMockWrapper( + '<div class="ct-chart ct-golden-section"></div>' + ); + const { wrapper } = fixture; + chart = new LineChart( + wrapper.querySelector('.ct-chart'), + data, + options + ).on('created', () => { + resolve(); + chart.off('created'); + }); + }); } beforeEach(() => { @@ -44,10 +49,12 @@ describe('Charts', () => { describe('grids', () => { beforeEach(() => { data = { - series: [[ - {x: 1, y: 1}, - {x: 3, y: 5} - ]] + series: [ + [ + { x: 1, y: 1 }, + { x: 3, y: 5 } + ] + ] }; options = { axisX: { @@ -70,32 +77,46 @@ describe('Charts', () => { it('should draw grid lines', async () => { await createChart(); - expect(fixture.wrapper.querySelectorAll('.ct-grids .ct-grid.ct-horizontal').length).toBe(3); - expect(fixture.wrapper.querySelectorAll('.ct-grids .ct-grid.ct-vertical').length).toBe(5); + expect( + fixture.wrapper.querySelectorAll('.ct-grids .ct-grid.ct-horizontal') + .length + ).toBe(3); + expect( + fixture.wrapper.querySelectorAll('.ct-grids .ct-grid.ct-vertical') + .length + ).toBe(5); }); it('should draw grid background', async () => { options.showGridBackground = true; await createChart(); - expect(fixture.wrapper.querySelectorAll('.ct-grids .ct-grid-background').length).toBe(1); + expect( + fixture.wrapper.querySelectorAll('.ct-grids .ct-grid-background') + .length + ).toBe(1); }); it('should not draw grid background if option set to false', async () => { options.showGridBackground = false; await createChart(); - expect(fixture.wrapper.querySelectorAll('.ct-grids .ct-grid-background').length).toBe(0); + expect( + fixture.wrapper.querySelectorAll('.ct-grids .ct-grid-background') + .length + ).toBe(0); }); }); describe('AxisY position tests', () => { beforeEach(() => { data = { - series: [[ - {x: 1, y: 1}, - {x: 3, y: 5} - ]] + series: [ + [ + { x: 1, y: 1 }, + { x: 3, y: 5 } + ] + ] }; options = {}; }); @@ -108,8 +129,14 @@ describe('Charts', () => { }; await createChart(); - Array.from(fixture.wrapper.querySelectorAll('.ct-label.ct-vertical')) - .forEach((element) => expect(element.getAttribute('class')).toBe('ct-label ct-vertical ct-start')); + Array.from( + fixture.wrapper.querySelectorAll('.ct-label.ct-vertical') + ).forEach(element => + expect(element).toHaveAttribute( + 'class', + 'ct-label ct-vertical ct-start' + ) + ); }); it('should have ct-end class if position is any other value than start', async () => { @@ -120,18 +147,26 @@ describe('Charts', () => { }; await createChart(); - Array.from(fixture.wrapper.querySelectorAll('.ct-label.ct-vertical')) - .forEach((element) => expect(element.getAttribute('class')).toBe('ct-label ct-vertical ct-end')); + Array.from( + fixture.wrapper.querySelectorAll('.ct-label.ct-vertical') + ).forEach(element => + expect(element).toHaveAttribute( + 'class', + 'ct-label ct-vertical ct-end' + ) + ); }); }); describe('ct:value attribute', () => { it('should contain x and y value for each datapoint', async () => { data = { - series: [[ - {x: 1, y: 2}, - {x: 3, y: 4} - ]] + series: [ + [ + { x: 1, y: 2 }, + { x: 3, y: 4 } + ] + ] }; options = { axisX: { @@ -147,11 +182,13 @@ describe('Charts', () => { it('should render values that are zero', async () => { data = { - series: [[ - {x: 0, y: 1}, - {x: 1, y: 0}, - {x: 0, y: 0} - ]] + series: [ + [ + { x: 0, y: 1 }, + { x: 1, y: 0 }, + { x: 0, y: 0 } + ] + ] }; options = { axisX: { @@ -176,16 +213,24 @@ describe('Charts', () => { data = { labels: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu'], series: [ - [5, 2, 4, { - value: 2, - meta: meta - }, 0] + [ + 5, + 2, + 4, + { + value: 2, + meta: meta + }, + 0 + ] ] }; await createChart(); const points = fixture.wrapper.querySelectorAll('.ct-point'); - expect(deserialize(points[3].getAttributeNS(namespaces.ct, 'meta'))).toEqual(meta); + expect( + deserialize(points[3].getAttributeNS(namespaces.ct, 'meta')) + ).toEqual(meta); }); it('should render meta data correctly with mixed value array and different normalized data length', async () => { @@ -196,16 +241,24 @@ describe('Charts', () => { data = { labels: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'], series: [ - [5, 2, 4, { - value: 2, - meta: meta - }, 0] + [ + 5, + 2, + 4, + { + value: 2, + meta: meta + }, + 0 + ] ] }; await createChart(); const points = fixture.wrapper.querySelectorAll('.ct-point'); - expect(deserialize(points[3].getAttributeNS(namespaces.ct, 'meta'))).toEqual(meta); + expect( + deserialize(points[3].getAttributeNS(namespaces.ct, 'meta')) + ).toEqual(meta); }); it('should render meta data correctly with mixed value array and mixed series notation', async () => { @@ -217,16 +270,27 @@ describe('Charts', () => { data = { labels: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'], series: [ - [5, 2, 4, { - value: 2, - meta: valueMeta - }, 0], - { - meta: seriesMeta, - data: [5, 2, { + [ + 5, + 2, + 4, + { value: 2, meta: valueMeta - }, 0] + }, + 0 + ], + { + meta: seriesMeta, + data: [ + 5, + 2, + { + value: 2, + meta: valueMeta + }, + 0 + ] } ] }; @@ -234,21 +298,24 @@ describe('Charts', () => { expect( deserialize( - fixture.wrapper.querySelectorAll('.ct-series-a .ct-point')[3] + fixture.wrapper + .querySelectorAll('.ct-series-a .ct-point')[3] .getAttributeNS(namespaces.ct, 'meta') ) ).toEqual(valueMeta); expect( deserialize( - fixture.wrapper.querySelector('.ct-series-b') + fixture.wrapper + .querySelector('.ct-series-b') .getAttributeNS(namespaces.ct, 'meta') ) ).toEqual(seriesMeta); expect( deserialize( - fixture.wrapper.querySelectorAll('.ct-series-b .ct-point')[2] + fixture.wrapper + .querySelectorAll('.ct-series-b .ct-point')[2] .getAttributeNS(namespaces.ct, 'meta') ) ).toEqual(valueMeta); @@ -260,7 +327,18 @@ describe('Charts', () => { data = { labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], series: [ - [NaN, 15, 0, null, 2, 3, 4, undefined, {value: 1, meta: 'meta data'}, null] + [ + NaN, + 15, + 0, + null, + 2, + 3, + 4, + undefined, + { value: 1, meta: 'meta data' }, + null + ] ] }; options = { @@ -269,20 +347,64 @@ describe('Charts', () => { await createChart(); - chart.on('draw', (context) => { - if(context.type === 'line') { - expect(context.path.pathElements.map((pathElement) => { - return { - command: pathElement.command, - data: pathElement.data - }; - })).toEqual([ - {command: 'M', data: {valueIndex: 1, value: {x: undefined, y: 15}, meta: undefined}}, - {command: 'L', data: {valueIndex: 2, value: {x: undefined, y: 0}, meta: undefined}}, - {command: 'M', data: {valueIndex: 4, value: {x: undefined, y: 2}, meta: undefined}}, - {command: 'L', data: {valueIndex: 5, value: {x: undefined, y: 3}, meta: undefined}}, - {command: 'L', data: {valueIndex: 6, value: {x: undefined, y: 4}, meta: undefined}}, - {command: 'M', data: {valueIndex: 8, value: {x: undefined, y: 1}, meta: 'meta data'}} + chart.on('draw', context => { + if (context.type === 'line') { + expect( + context.path.pathElements.map(pathElement => { + return { + command: pathElement.command, + data: pathElement.data + }; + }) + ).toEqual([ + { + command: 'M', + data: { + valueIndex: 1, + value: { x: undefined, y: 15 }, + meta: undefined + } + }, + { + command: 'L', + data: { + valueIndex: 2, + value: { x: undefined, y: 0 }, + meta: undefined + } + }, + { + command: 'M', + data: { + valueIndex: 4, + value: { x: undefined, y: 2 }, + meta: undefined + } + }, + { + command: 'L', + data: { + valueIndex: 5, + value: { x: undefined, y: 3 }, + meta: undefined + } + }, + { + command: 'L', + data: { + valueIndex: 6, + value: { x: undefined, y: 4 }, + meta: undefined + } + }, + { + command: 'M', + data: { + valueIndex: 8, + value: { x: undefined, y: 1 }, + meta: 'meta data' + } + } ]); } }); @@ -292,7 +414,18 @@ describe('Charts', () => { data = { labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], series: [ - [NaN, 15, 0, null, 2, 3, 4, undefined, {value: 1, meta: 'meta data'}, null] + [ + NaN, + 15, + 0, + null, + 2, + 3, + 4, + undefined, + { value: 1, meta: 'meta data' }, + null + ] ] }; options = { @@ -301,22 +434,66 @@ describe('Charts', () => { await createChart(); - chart.on('draw', (context) => { - if(context.type === 'line') { - expect(context.path.pathElements.map((pathElement) => { - return { - command: pathElement.command, - data: pathElement.data - }; - })).toEqual([ - {command: 'M', data: {valueIndex: 1, value: {x: undefined, y: 15}, meta: undefined}}, + chart.on('draw', context => { + if (context.type === 'line') { + expect( + context.path.pathElements.map(pathElement => { + return { + command: pathElement.command, + data: pathElement.data + }; + }) + ).toEqual([ + { + command: 'M', + data: { + valueIndex: 1, + value: { x: undefined, y: 15 }, + meta: undefined + } + }, // Cardinal should create Line path segment if only one connection - {command: 'L', data: {valueIndex: 2, value: {x: undefined, y: 0}, meta: undefined}}, - {command: 'M', data: {valueIndex: 4, value: {x: undefined, y: 2}, meta: undefined}}, + { + command: 'L', + data: { + valueIndex: 2, + value: { x: undefined, y: 0 }, + meta: undefined + } + }, + { + command: 'M', + data: { + valueIndex: 4, + value: { x: undefined, y: 2 }, + meta: undefined + } + }, // Cardinal should create Curve path segment for 2 or more connections - {command: 'C', data: {valueIndex: 5, value: {x: undefined, y: 3}, meta: undefined}}, - {command: 'C', data: {valueIndex: 6, value: {x: undefined, y: 4}, meta: undefined}}, - {command: 'M', data: {valueIndex: 8, value: {x: undefined, y: 1}, meta: 'meta data'}} + { + command: 'C', + data: { + valueIndex: 5, + value: { x: undefined, y: 3 }, + meta: undefined + } + }, + { + command: 'C', + data: { + valueIndex: 6, + value: { x: undefined, y: 4 }, + meta: undefined + } + }, + { + command: 'M', + data: { + valueIndex: 8, + value: { x: undefined, y: 1 }, + meta: 'meta data' + } + } ]); } }); @@ -326,7 +503,18 @@ describe('Charts', () => { data = { labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], series: [ - [NaN, 15, 0, null, 2, 3, 4, undefined, {value: 1, meta: 'meta data'}, null] + [ + NaN, + 15, + 0, + null, + 2, + 3, + 4, + undefined, + { value: 1, meta: 'meta data' }, + null + ] ] }; options = { @@ -335,22 +523,66 @@ describe('Charts', () => { await createChart(); - chart.on('draw', (context) => { - if(context.type === 'line') { - expect(context.path.pathElements.map((pathElement) => { - return { - command: pathElement.command, - data: pathElement.data - }; - })).toEqual([ - {command: 'M', data: {valueIndex: 1, value: {x: undefined, y: 15}, meta: undefined}}, + chart.on('draw', context => { + if (context.type === 'line') { + expect( + context.path.pathElements.map(pathElement => { + return { + command: pathElement.command, + data: pathElement.data + }; + }) + ).toEqual([ + { + command: 'M', + data: { + valueIndex: 1, + value: { x: undefined, y: 15 }, + meta: undefined + } + }, // Monotone cubic should create Line path segment if only one connection - {command: 'L', data: {valueIndex: 2, value: {x: undefined, y: 0}, meta: undefined}}, - {command: 'M', data: {valueIndex: 4, value: {x: undefined, y: 2}, meta: undefined}}, + { + command: 'L', + data: { + valueIndex: 2, + value: { x: undefined, y: 0 }, + meta: undefined + } + }, + { + command: 'M', + data: { + valueIndex: 4, + value: { x: undefined, y: 2 }, + meta: undefined + } + }, // Monotone cubic should create Curve path segment for 2 or more connections - {command: 'C', data: {valueIndex: 5, value: {x: undefined, y: 3}, meta: undefined}}, - {command: 'C', data: {valueIndex: 6, value: {x: undefined, y: 4}, meta: undefined}}, - {command: 'M', data: {valueIndex: 8, value: {x: undefined, y: 1}, meta: 'meta data'}} + { + command: 'C', + data: { + valueIndex: 5, + value: { x: undefined, y: 3 }, + meta: undefined + } + }, + { + command: 'C', + data: { + valueIndex: 6, + value: { x: undefined, y: 4 }, + meta: undefined + } + }, + { + command: 'M', + data: { + valueIndex: 8, + value: { x: undefined, y: 1 }, + meta: 'meta data' + } + } ]); } }); @@ -360,7 +592,18 @@ describe('Charts', () => { data = { labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], series: [ - [NaN, 15, 0, null, 2, 3, 4, undefined, {value: 1, meta: 'meta data'}, null] + [ + NaN, + 15, + 0, + null, + 2, + 3, + 4, + undefined, + { value: 1, meta: 'meta data' }, + null + ] ] }; options = { @@ -369,20 +612,64 @@ describe('Charts', () => { await createChart(); - chart.on('draw', (context) => { - if(context.type === 'line') { - expect(context.path.pathElements.map((pathElement) => { - return { - command: pathElement.command, - data: pathElement.data - }; - })).toEqual([ - {command: 'M', data: {valueIndex: 1, value: {x: undefined, y: 15}, meta: undefined}}, - {command: 'C', data: {valueIndex: 2, value: {x: undefined, y: 0}, meta: undefined}}, - {command: 'M', data: {valueIndex: 4, value: {x: undefined, y: 2}, meta: undefined}}, - {command: 'C', data: {valueIndex: 5, value: {x: undefined, y: 3}, meta: undefined}}, - {command: 'C', data: {valueIndex: 6, value: {x: undefined, y: 4}, meta: undefined}}, - {command: 'M', data: {valueIndex: 8, value: {x: undefined, y: 1}, meta: 'meta data'}} + chart.on('draw', context => { + if (context.type === 'line') { + expect( + context.path.pathElements.map(pathElement => { + return { + command: pathElement.command, + data: pathElement.data + }; + }) + ).toEqual([ + { + command: 'M', + data: { + valueIndex: 1, + value: { x: undefined, y: 15 }, + meta: undefined + } + }, + { + command: 'C', + data: { + valueIndex: 2, + value: { x: undefined, y: 0 }, + meta: undefined + } + }, + { + command: 'M', + data: { + valueIndex: 4, + value: { x: undefined, y: 2 }, + meta: undefined + } + }, + { + command: 'C', + data: { + valueIndex: 5, + value: { x: undefined, y: 3 }, + meta: undefined + } + }, + { + command: 'C', + data: { + valueIndex: 6, + value: { x: undefined, y: 4 }, + meta: undefined + } + }, + { + command: 'M', + data: { + valueIndex: 8, + value: { x: undefined, y: 1 }, + meta: 'meta data' + } + } ]); } }); @@ -392,7 +679,18 @@ describe('Charts', () => { data = { labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], series: [ - [NaN, 15, 0, null, 2, 3, 4, undefined, {value: 1, meta: 'meta data'}, null] + [ + NaN, + 15, + 0, + null, + 2, + 3, + 4, + undefined, + { value: 1, meta: 'meta data' }, + null + ] ] }; options = { @@ -401,23 +699,88 @@ describe('Charts', () => { await createChart(); - chart.on('draw', (context) => { - if(context.type === 'line') { - expect(context.path.pathElements.map((pathElement) => { - return { - command: pathElement.command, - data: pathElement.data - }; - })).toEqual([ - {command: 'M', data: {valueIndex: 1, value: {x: undefined, y: 15}, meta: undefined}}, - {command: 'L', data: {valueIndex: 1, value: {x: undefined, y: 15}, meta: undefined}}, - {command: 'L', data: {valueIndex: 2, value: {x: undefined, y: 0}, meta: undefined}}, - {command: 'M', data: {valueIndex: 4, value: {x: undefined, y: 2}, meta: undefined}}, - {command: 'L', data: {valueIndex: 4, value: {x: undefined, y: 2}, meta: undefined}}, - {command: 'L', data: {valueIndex: 5, value: {x: undefined, y: 3}, meta: undefined}}, - {command: 'L', data: {valueIndex: 5, value: {x: undefined, y: 3}, meta: undefined}}, - {command: 'L', data: {valueIndex: 6, value: {x: undefined, y: 4}, meta: undefined}}, - {command: 'M', data: {valueIndex: 8, value: {x: undefined, y: 1}, meta: 'meta data'}} + chart.on('draw', context => { + if (context.type === 'line') { + expect( + context.path.pathElements.map(pathElement => { + return { + command: pathElement.command, + data: pathElement.data + }; + }) + ).toEqual([ + { + command: 'M', + data: { + valueIndex: 1, + value: { x: undefined, y: 15 }, + meta: undefined + } + }, + { + command: 'L', + data: { + valueIndex: 1, + value: { x: undefined, y: 15 }, + meta: undefined + } + }, + { + command: 'L', + data: { + valueIndex: 2, + value: { x: undefined, y: 0 }, + meta: undefined + } + }, + { + command: 'M', + data: { + valueIndex: 4, + value: { x: undefined, y: 2 }, + meta: undefined + } + }, + { + command: 'L', + data: { + valueIndex: 4, + value: { x: undefined, y: 2 }, + meta: undefined + } + }, + { + command: 'L', + data: { + valueIndex: 5, + value: { x: undefined, y: 3 }, + meta: undefined + } + }, + { + command: 'L', + data: { + valueIndex: 5, + value: { x: undefined, y: 3 }, + meta: undefined + } + }, + { + command: 'L', + data: { + valueIndex: 6, + value: { x: undefined, y: 4 }, + meta: undefined + } + }, + { + command: 'M', + data: { + valueIndex: 8, + value: { x: undefined, y: 1 }, + meta: 'meta data' + } + } ]); } }); @@ -427,7 +790,18 @@ describe('Charts', () => { data = { labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], series: [ - [NaN, 15, 0, null, 2, 3, 4, undefined, {value: 1, meta: 'meta data'}, null] + [ + NaN, + 15, + 0, + null, + 2, + 3, + 4, + undefined, + { value: 1, meta: 'meta data' }, + null + ] ] }; options = { @@ -438,23 +812,88 @@ describe('Charts', () => { await createChart(); - chart.on('draw', (context) => { - if(context.type === 'line') { - expect(context.path.pathElements.map((pathElement) => { - return { - command: pathElement.command, - data: pathElement.data - }; - })).toEqual([ - {command: 'M', data: {valueIndex: 1, value: {x: undefined, y: 15}, meta: undefined}}, - {command: 'L', data: {valueIndex: 2, value: {x: undefined, y: 0}, meta: undefined}}, - {command: 'L', data: {valueIndex: 2, value: {x: undefined, y: 0}, meta: undefined}}, - {command: 'M', data: {valueIndex: 4, value: {x: undefined, y: 2}, meta: undefined}}, - {command: 'L', data: {valueIndex: 5, value: {x: undefined, y: 3}, meta: undefined}}, - {command: 'L', data: {valueIndex: 5, value: {x: undefined, y: 3}, meta: undefined}}, - {command: 'L', data: {valueIndex: 6, value: {x: undefined, y: 4}, meta: undefined}}, - {command: 'L', data: {valueIndex: 6, value: {x: undefined, y: 4}, meta: undefined}}, - {command: 'M', data: {valueIndex: 8, value: {x: undefined, y: 1}, meta: 'meta data'}} + chart.on('draw', context => { + if (context.type === 'line') { + expect( + context.path.pathElements.map(pathElement => { + return { + command: pathElement.command, + data: pathElement.data + }; + }) + ).toEqual([ + { + command: 'M', + data: { + valueIndex: 1, + value: { x: undefined, y: 15 }, + meta: undefined + } + }, + { + command: 'L', + data: { + valueIndex: 2, + value: { x: undefined, y: 0 }, + meta: undefined + } + }, + { + command: 'L', + data: { + valueIndex: 2, + value: { x: undefined, y: 0 }, + meta: undefined + } + }, + { + command: 'M', + data: { + valueIndex: 4, + value: { x: undefined, y: 2 }, + meta: undefined + } + }, + { + command: 'L', + data: { + valueIndex: 5, + value: { x: undefined, y: 3 }, + meta: undefined + } + }, + { + command: 'L', + data: { + valueIndex: 5, + value: { x: undefined, y: 3 }, + meta: undefined + } + }, + { + command: 'L', + data: { + valueIndex: 6, + value: { x: undefined, y: 4 }, + meta: undefined + } + }, + { + command: 'L', + data: { + valueIndex: 6, + value: { x: undefined, y: 4 }, + meta: undefined + } + }, + { + command: 'M', + data: { + valueIndex: 8, + value: { x: undefined, y: 1 }, + meta: 'meta data' + } + } ]); } }); @@ -472,9 +911,15 @@ describe('Charts', () => { it('should render without NaN values and points', async () => { await createChart(); - expect(document.querySelector('.ct-line').getAttribute('d')).toBe('M50,15'); - expect(document.querySelector('.ct-point').getAttribute('x1')).toBe('50'); - expect(document.querySelector('.ct-point').getAttribute('x2')).toBe('50.01'); + expect(document.querySelector('.ct-line')).toHaveAttribute( + 'd', + 'M50,15' + ); + expect(document.querySelector('.ct-point')).toHaveAttribute('x1', '50'); + expect(document.querySelector('.ct-point')).toHaveAttribute( + 'x2', + '50.01' + ); }); }); @@ -482,7 +927,9 @@ describe('Charts', () => { it('should render empty grid with no data', async () => { await createChart(); // Find at least one vertical grid line - expect(document.querySelector('.ct-grids .ct-grid.ct-vertical')).toBeDefined(); + expect( + document.querySelector('.ct-grids .ct-grid.ct-vertical') + ).toBeDefined(); }); it('should render empty grid with only labels', async () => { @@ -492,9 +939,13 @@ describe('Charts', () => { await createChart(); // Find at least one vertical grid line - expect(document.querySelector('.ct-grids .ct-grid.ct-vertical')).toBeDefined(); + expect( + document.querySelector('.ct-grids .ct-grid.ct-vertical') + ).toBeDefined(); // Find exactly as many horizontal grid lines as labels were specified (Step Axis) - expect(document.querySelectorAll('.ct-grids .ct-grid.ct-horizontal').length).toBe(data.labels.length); + expect( + document.querySelectorAll('.ct-grids .ct-grid.ct-horizontal').length + ).toBe(data.labels.length); }); it('should generate labels and render empty grid with only series in data', async () => { @@ -508,10 +959,13 @@ describe('Charts', () => { await createChart(); // Find at least one vertical grid line - expect(document.querySelector('.ct-grids .ct-grid.ct-vertical')).toBeDefined(); + expect( + document.querySelector('.ct-grids .ct-grid.ct-vertical') + ).toBeDefined(); // Should generate the labels using the largest series count - expect(document.querySelectorAll('.ct-grids .ct-grid.ct-horizontal').length) - .toBe(Math.max(...data.series.map((series) => series.length))); + expect( + document.querySelectorAll('.ct-grids .ct-grid.ct-horizontal').length + ).toBe(Math.max(...data.series.map(series => series.length))); }); it('should render empty grid with no data and specified high low', async () => { @@ -525,7 +979,9 @@ describe('Charts', () => { await createChart(); // Find first and last label - const labels = document.querySelectorAll('.ct-labels .ct-label.ct-vertical'); + const labels = document.querySelectorAll( + '.ct-labels .ct-label.ct-vertical' + ); const firstLabel = labels[0]; const lastLabel = labels[labels.length - 1]; @@ -541,24 +997,28 @@ describe('Charts', () => { await createChart(); // Find at least one vertical grid line - expect(document.querySelector('.ct-grids .ct-grid.ct-vertical')).toBeDefined(); + expect( + document.querySelector('.ct-grids .ct-grid.ct-vertical') + ).toBeDefined(); }); }); describe('x1 and x2 attribute', () => { it('should contain just a datapoint', async () => { data = { - series: [[ - {x: 1, y: 2} - ]] + series: [[{ x: 1, y: 2 }]] }; options = { fullWidth: true }; await createChart(); - expect(document.querySelector('.ct-point').getAttribute('x1')).not.toBe('NaN'); - expect(document.querySelector('.ct-point').getAttribute('x2')).not.toBe('NaN'); + expect(document.querySelector('.ct-point').getAttribute('x1')).not.toBe( + 'NaN' + ); + expect(document.querySelector('.ct-point').getAttribute('x2')).not.toBe( + 'NaN' + ); }); }); }); diff --git a/src/charts/line.stories.js b/src/charts/line.stories.js index ff84aae5..b7b781d0 100644 --- a/src/charts/line.stories.js +++ b/src/charts/line.stories.js @@ -1,6 +1,12 @@ import 'chartist-dev/styles'; -import faker from 'faker' -import { LineChart, AutoScaleAxis, Interpolation, Svg, easings } from 'chartist-dev'; +import faker from 'faker'; +import { + LineChart, + AutoScaleAxis, + Interpolation, + Svg, + easings +} from 'chartist-dev'; export default { title: 'LineChart', @@ -10,397 +16,528 @@ export default { export function Default() { const root = document.createElement('div'); - new LineChart(root, { - labels: ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'], - series: [ - [12, 9, 7, 8, 5], - [2, 1, 3.5, 7, 3], - [1, 3, 4, 5, 6] - ] - }, { - fullWidth: true, - chartPadding: { - right: 40 + new LineChart( + root, + { + labels: ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'], + series: [ + [12, 9, 7, 8, 5], + [2, 1, 3.5, 7, 3], + [1, 3, 4, 5, 6] + ] + }, + { + fullWidth: true, + chartPadding: { + right: 40 + } } - }); + ); - return root + return root; } export function AutoScale() { const root = document.createElement('div'); - new LineChart(root, { - series: [[ - {x: 1, y: 1}, - {x: 3, y: 5} - ]] - }, { - axisX: { - type: AutoScaleAxis, - onlyInteger: true + new LineChart( + root, + { + series: [ + [ + { x: 1, y: 1 }, + { x: 3, y: 5 } + ] + ] }, - axisY: { - type: AutoScaleAxis, - onlyInteger: true + { + axisX: { + type: AutoScaleAxis, + onlyInteger: true + }, + axisY: { + type: AutoScaleAxis, + onlyInteger: true + } } - }); + ); - return root + return root; } export function Labels() { const root = document.createElement('div'); - new LineChart(root, { - labels: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu'], - series: [ - [5, 2, 4, 2, 0] - ] - }, {}); + new LineChart( + root, + { + labels: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu'], + series: [[5, 2, 4, 2, 0]] + }, + {} + ); - return root + return root; } export function MultiSeries() { const root = document.createElement('div'); - new LineChart(root, { - labels: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'], - series: [ - [5, 2, 4, 2, 0], - [5, 2, 2, 0] - ] - }, {}); + new LineChart( + root, + { + labels: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'], + series: [ + [5, 2, 4, 2, 0], + [5, 2, 2, 0] + ] + }, + {} + ); - return root + return root; } export function Holes() { const root = document.createElement('div'); - new LineChart(root, { - labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], - series: [ - [5, 5, 10, 8, 7, 5, 4, null, null, null, 10, 10, 7, 8, 6, 9], - [10, 15, null, 12, null, 10, 12, 15, null, null, 12, null, 14, null, null, null], - [null, null, null, null, 3, 4, 1, 3, 4, 6, 7, 9, 5, null, null, null], - [{x:3, y: 3},{x: 4, y: 3}, {x: 5, y: undefined}, {x: 6, y: 4}, {x: 7, y: null}, {x: 8, y: 4}, {x: 9, y: 4}] - ] - }, { - fullWidth: true, - chartPadding: { - right: 10 + new LineChart( + root, + { + labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], + series: [ + [5, 5, 10, 8, 7, 5, 4, null, null, null, 10, 10, 7, 8, 6, 9], + [ + 10, + 15, + null, + 12, + null, + 10, + 12, + 15, + null, + null, + 12, + null, + 14, + null, + null, + null + ], + [null, null, null, null, 3, 4, 1, 3, 4, 6, 7, 9, 5, null, null, null], + [ + { x: 3, y: 3 }, + { x: 4, y: 3 }, + { x: 5, y: undefined }, + { x: 6, y: 4 }, + { x: 7, y: null }, + { x: 8, y: 4 }, + { x: 9, y: 4 } + ] + ] }, - low: 0 - }); + { + fullWidth: true, + chartPadding: { + right: 10 + }, + low: 0 + } + ); - return root + return root; } export function FilledHoles() { const root = document.createElement('div'); - new LineChart(root, { - labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], - series: [ - [5, 5, 10, 8, 7, 5, 4, null, null, null, 10, 10, 7, 8, 6, 9], - [10, 15, null, 12, null, 10, 12, 15, null, null, 12, null, 14, null, null, null], - [null, null, null, null, 3, 4, 1, 3, 4, 6, 7, 9, 5, null, null, null], - [{x:3, y: 3},{x: 4, y: 3}, {x: 5, y: undefined}, {x: 6, y: 4}, {x: 7, y: null}, {x: 8, y: 4}, {x: 9, y: 4}] - ] - }, { - fullWidth: true, - chartPadding: { - right: 10 + new LineChart( + root, + { + labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], + series: [ + [5, 5, 10, 8, 7, 5, 4, null, null, null, 10, 10, 7, 8, 6, 9], + [ + 10, + 15, + null, + 12, + null, + 10, + 12, + 15, + null, + null, + 12, + null, + 14, + null, + null, + null + ], + [null, null, null, null, 3, 4, 1, 3, 4, 6, 7, 9, 5, null, null, null], + [ + { x: 3, y: 3 }, + { x: 4, y: 3 }, + { x: 5, y: undefined }, + { x: 6, y: 4 }, + { x: 7, y: null }, + { x: 8, y: 4 }, + { x: 9, y: 4 } + ] + ] }, - lineSmooth: Interpolation.cardinal({ - fillHoles: true, - }), - low: 0 - }); + { + fullWidth: true, + chartPadding: { + right: 10 + }, + lineSmooth: Interpolation.cardinal({ + fillHoles: true + }), + low: 0 + } + ); - return root + return root; } export function OnlyWholeNumbers() { const root = document.createElement('div'); - new LineChart(root, { - labels: [1, 2, 3, 4, 5, 6, 7, 8], - series: [ - [1, 2, 3, 1, -2, 0, 1, 0], - [-2, -1, -2, -1, -3, -1, -2, -1], - [0, 0, 0, 1, 2, 3, 2, 1], - [3, 2, 1, 0.5, 1, 0, -1, -3] - ] - }, { - high: 3, - low: -3, - fullWidth: true, - // As this is axis specific we need to tell Chartist to use whole numbers only on the concerned axis - axisY: { - onlyInteger: true, - offset: 20 + new LineChart( + root, + { + labels: [1, 2, 3, 4, 5, 6, 7, 8], + series: [ + [1, 2, 3, 1, -2, 0, 1, 0], + [-2, -1, -2, -1, -3, -1, -2, -1], + [0, 0, 0, 1, 2, 3, 2, 1], + [3, 2, 1, 0.5, 1, 0, -1, -3] + ] + }, + { + high: 3, + low: -3, + fullWidth: true, + // As this is axis specific we need to tell Chartist to use whole numbers only on the concerned axis + axisY: { + onlyInteger: true, + offset: 20 + } } - }); + ); - return root + return root; } export function NoInterpolationWithHoles() { const root = document.createElement('div'); - new LineChart(root, { - labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], - series: [ - [NaN, 15, 0, null, 2, 3, 4, undefined, 1, null] - ] - }, { - lineSmooth: false - }); + new LineChart( + root, + { + labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + series: [[NaN, 15, 0, null, 2, 3, 4, undefined, 1, null]] + }, + { + lineSmooth: false + } + ); - return root + return root; } export function CardinalInterpolationWithHoles() { const root = document.createElement('div'); - new LineChart(root, { - labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], - series: [ - [NaN, 15, 0, null, 2, 3, 4, undefined, 1, null] - ] - }, { - lineSmooth: true - }); + new LineChart( + root, + { + labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + series: [[NaN, 15, 0, null, 2, 3, 4, undefined, 1, null]] + }, + { + lineSmooth: true + } + ); - return root + return root; } export function MonotoneCubicInterpolationWithHoles() { const root = document.createElement('div'); - new LineChart(root, { - labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], - series: [ - [NaN, 15, 0, null, 2, 3, 4, undefined, 1, null] - ] - }, { - lineSmooth: Interpolation.monotoneCubic() - }); + new LineChart( + root, + { + labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + series: [[NaN, 15, 0, null, 2, 3, 4, undefined, 1, null]] + }, + { + lineSmooth: Interpolation.monotoneCubic() + } + ); - return root + return root; } export function SimpleInterpolationWithHoles() { const root = document.createElement('div'); - new LineChart(root, { - labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], - series: [ - [NaN, 15, 0, null, 2, 3, 4, undefined, 1, null] - ] - }, { - lineSmooth: Interpolation.simple() - }); + new LineChart( + root, + { + labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + series: [[NaN, 15, 0, null, 2, 3, 4, undefined, 1, null]] + }, + { + lineSmooth: Interpolation.simple() + } + ); - return root + return root; } export function StepInterpolationWithHoles() { const root = document.createElement('div'); - new LineChart(root, { - labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], - series: [ - [NaN, 15, 0, null, 2, 3, 4, undefined, 1, null] - ] - }, { - lineSmooth: Interpolation.step() - }); + new LineChart( + root, + { + labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + series: [[NaN, 15, 0, null, 2, 3, 4, undefined, 1, null]] + }, + { + lineSmooth: Interpolation.step() + } + ); - return root + return root; } export function StepNoPostponeInterpolationWithHoles() { const root = document.createElement('div'); - new LineChart(root, { - labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], - series: [ - [NaN, 15, 0, null, 2, 3, 4, undefined, 1, null] - ] - }, { - lineSmooth: Interpolation.step({ - postpone: false - }) - }); + new LineChart( + root, + { + labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + series: [[NaN, 15, 0, null, 2, 3, 4, undefined, 1, null]] + }, + { + lineSmooth: Interpolation.step({ + postpone: false + }) + } + ); - return root + return root; } export function SeriesOverrides() { const root = document.createElement('div'); - new LineChart(root, { - labels: ['1', '2', '3', '4', '5', '6', '7', '8'], - // Naming the series with the series object array notation - series: [{ - name: 'series-1', - data: [5, 2, -4, 2, 0, -2, 5, -3] - }, { - name: 'series-2', - data: [4, 3, 5, 3, 1, 3, 6, 4] - }, { - name: 'series-3', - data: [2, 4, 3, 1, 4, 5, 3, 2] - }] - }, { - fullWidth: true, - // Within the series options you can use the series names - // to specify configuration that will only be used for the - // specific series. - series: { - 'series-1': { - lineSmooth: Interpolation.step() - }, - 'series-2': { - lineSmooth: Interpolation.simple(), - showArea: true - }, - 'series-3': { - showPoint: false - } - } - }, [ - // You can even use responsive configuration overrides to - // customize your series configuration even further! - ['screen and (max-width: 320px)', { + new LineChart( + root, + { + labels: ['1', '2', '3', '4', '5', '6', '7', '8'], + // Naming the series with the series object array notation + series: [ + { + name: 'series-1', + data: [5, 2, -4, 2, 0, -2, 5, -3] + }, + { + name: 'series-2', + data: [4, 3, 5, 3, 1, 3, 6, 4] + }, + { + name: 'series-3', + data: [2, 4, 3, 1, 4, 5, 3, 2] + } + ] + }, + { + fullWidth: true, + // Within the series options you can use the series names + // to specify configuration that will only be used for the + // specific series. series: { 'series-1': { - lineSmooth: Interpolation.none() + lineSmooth: Interpolation.step() }, 'series-2': { - lineSmooth: Interpolation.none(), - showArea: false + lineSmooth: Interpolation.simple(), + showArea: true }, 'series-3': { - lineSmooth: Interpolation.none(), - showPoint: true + showPoint: false } } - }] - ]); + }, + [ + // You can even use responsive configuration overrides to + // customize your series configuration even further! + [ + 'screen and (max-width: 320px)', + { + series: { + 'series-1': { + lineSmooth: Interpolation.none() + }, + 'series-2': { + lineSmooth: Interpolation.none(), + showArea: false + }, + 'series-3': { + lineSmooth: Interpolation.none(), + showPoint: true + } + } + } + ] + ] + ); - return root + return root; } export function ReverseData() { const root = document.createElement('div'); - new LineChart(root, { - series: [[ - {x: 1, y: 1}, - {x: 3, y: 5} - ]] - }, { - reverseData: true - }); + new LineChart( + root, + { + series: [ + [ + { x: 1, y: 1 }, + { x: 3, y: 5 } + ] + ] + }, + { + reverseData: true + } + ); - return root + return root; } export function FullWidth() { const root = document.createElement('div'); - new LineChart(root, { - series: [[ - {x: 1, y: 1}, - {x: 3, y: 5} - ]] - }, { - fullWidth: true - }); + new LineChart( + root, + { + series: [ + [ + { x: 1, y: 1 }, + { x: 3, y: 5 } + ] + ] + }, + { + fullWidth: true + } + ); - return root + return root; } export function Scatter() { const root = document.createElement('div'); - const data = Array.from({ length: 52 }).reduce((data, _, index) => { - data.labels.push(index + 1); - data.series.forEach((series) => { - series.push(faker.datatype.number({ min: 0, max: 100 })) - }); - - return data; - }, { - labels: [], - series: Array.from({ length: 4 }, () => []) - }) - - new LineChart(root, data, { - showLine: false, - axisX: { - labelInterpolationFnc(value, index) { - return index % 13 === 0 ? 'W' + value : null; - } + const data = Array.from({ length: 52 }).reduce( + (data, _, index) => { + data.labels.push(index + 1); + data.series.forEach(series => { + series.push(faker.datatype.number({ min: 0, max: 100 })); + }); + + return data; + }, + { + labels: [], + series: Array.from({ length: 4 }, () => []) } - }, [ - ['screen and (min-width: 640px)', { + ); + + new LineChart( + root, + data, + { + showLine: false, axisX: { labelInterpolationFnc(value, index) { - return index % 4 === 0 ? 'W' + value : null; + return index % 13 === 0 ? 'W' + value : null; } } - }] - ]); + }, + [ + [ + 'screen and (min-width: 640px)', + { + axisX: { + labelInterpolationFnc(value, index) { + return index % 4 === 0 ? 'W' + value : null; + } + } + } + ] + ] + ); - return root + return root; } export function Area() { const root = document.createElement('div'); - new LineChart(root, { - labels: [1, 2, 3, 4, 5, 6, 7, 8], - series: [ - [5, 9, 7, 8, 5, 3, 5, 4] - ] - }, { - low: 0, - showArea: true - }); + new LineChart( + root, + { + labels: [1, 2, 3, 4, 5, 6, 7, 8], + series: [[5, 9, 7, 8, 5, 3, 5, 4]] + }, + { + low: 0, + showArea: true + } + ); - return root + return root; } export function BiPolarArea() { const root = document.createElement('div'); - new LineChart(root, { - labels: [1, 2, 3, 4, 5, 6, 7, 8], - series: [ - [1, 2, 3, 1, -2, 0, 1, 0], - [-2, -1, -2, -1, -2.5, -1, -2, -1], - [0, 0, 0, 1, 2, 2.5, 2, 1], - [2.5, 2, 1, 0.5, 1, 0.5, -1, -2.5] - ] - }, { - high: 3, - low: -3, - showArea: true, - showLine: false, - showPoint: false, - fullWidth: true, - axisX: { - showLabel: false, - showGrid: false + new LineChart( + root, + { + labels: [1, 2, 3, 4, 5, 6, 7, 8], + series: [ + [1, 2, 3, 1, -2, 0, 1, 0], + [-2, -1, -2, -1, -2.5, -1, -2, -1], + [0, 0, 0, 1, 2, 2.5, 2, 1], + [2.5, 2, 1, 0.5, 1, 0.5, -1, -2.5] + ] + }, + { + high: 3, + low: -3, + showArea: true, + showLine: false, + showPoint: false, + fullWidth: true, + axisX: { + showLabel: false, + showGrid: false + } } - }); + ); - return root + return root; } export function CustomPoints() { @@ -408,57 +545,72 @@ export function CustomPoints() { new LineChart(root, { labels: [1, 2, 3, 4, 5], - series: [ - [12, 9, 7, 8, 5] - ] - }).on('draw', (data) => { + series: [[12, 9, 7, 8, 5]] + }).on('draw', data => { // If the draw event was triggered from drawing a point on the line chart - if(data.type === 'point') { + if (data.type === 'point') { // We are creating a new path SVG element that draws a triangle around the point coordinates - var triangle = new Svg('path', { - d: ['M', - data.x, - data.y - 15, - 'L', - data.x - 15, - data.y + 8, - 'L', - data.x + 15, - data.y + 8, - 'z'].join(' '), - style: 'fill-opacity: 1' - }, 'ct-area'); + let triangle = new Svg( + 'path', + { + d: [ + 'M', + data.x, + data.y - 15, + 'L', + data.x - 15, + data.y + 8, + 'L', + data.x + 15, + data.y + 8, + 'z' + ].join(' '), + style: 'fill-opacity: 1' + }, + 'ct-area' + ); // With data.element we get the Chartist SVG wrapper and we can replace the original point drawn by Chartist with our newly created triangle data.element.replace(triangle); } }); - return root + return root; } export function PathAnimation() { const root = document.createElement('div'); - new LineChart(root, { - labels: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], - series: [ - [1, 5, 2, 5, 4, 3], - [2, 3, 4, 8, 1, 2], - [5, 4, 3, 2, 1, 0.5] - ] - }, { - low: 0, - showArea: true, - showPoint: false, - fullWidth: true - }).on('draw', (data) => { - if (!process.env.STORYBOOK_STORYSHOTS && (data.type === 'line' || data.type === 'area')) { + new LineChart( + root, + { + labels: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], + series: [ + [1, 5, 2, 5, 4, 3], + [2, 3, 4, 8, 1, 2], + [5, 4, 3, 2, 1, 0.5] + ] + }, + { + low: 0, + showArea: true, + showPoint: false, + fullWidth: true + } + ).on('draw', data => { + if ( + !process.env.STORYBOOK_STORYSHOTS && + (data.type === 'line' || data.type === 'area') + ) { data.element.animate({ d: { begin: 2000 * data.index, dur: 2000, - from: data.path.clone().scale(1, 0).translate(0, data.chartRect.height()).stringify(), + from: data.path + .clone() + .scale(1, 0) + .translate(0, data.chartRect.height()) + .stringify(), to: data.path.clone().stringify(), easing: easings.easeOutQuint } @@ -466,5 +618,5 @@ export function PathAnimation() { } }); - return root + return root; } diff --git a/src/charts/pie.js b/src/charts/pie.js index 820dcec9..e21a863c 100644 --- a/src/charts/pie.js +++ b/src/charts/pie.js @@ -1,11 +1,16 @@ -import {alphaNumerate, quantity, isFalseyButZero} from '../core/lang'; -import {noop, sum} from '../core/functional'; -import {polarToCartesian} from '../core/math'; -import {extend} from '../core/extend'; -import {normalizeData, serialize} from '../core/data'; -import {createSvg, createChartRect} from '../core/creation'; -import {SvgPath} from '../svg/svg-path'; -import {BaseChart} from './base'; +import { + alphaNumerate, + quantity, + isFalseyButZero, + safeHasProperty +} from '../core/lang'; +import { noop, sum } from '../core/functional'; +import { polarToCartesian } from '../core/math'; +import { extend } from '../core/extend'; +import { normalizeData, serialize } from '../core/data'; +import { createSvg, createChartRect } from '../core/creation'; +import { SvgPath } from '../svg/svg-path'; +import { BaseChart } from './base'; /** * Default options in line charts. Expand the code view to see a detailed list of options with comments. @@ -64,11 +69,15 @@ const defaultOptions = { export function determineAnchorPosition(center, label, direction) { const toTheRight = label.x > center.x; - if(toTheRight && direction === 'explode' || - !toTheRight && direction === 'implode') { + if ( + (toTheRight && direction === 'explode') || + (!toTheRight && direction === 'implode') + ) { return 'start'; - } else if(toTheRight && direction === 'implode' || - !toTheRight && direction === 'explode') { + } else if ( + (toTheRight && direction === 'implode') || + (!toTheRight && direction === 'explode') + ) { return 'end'; } else { return 'middle'; @@ -145,7 +154,13 @@ export class PieChart extends BaseChart { * }); */ constructor(query, data, options, responsiveOptions) { - super(query, data, defaultOptions, extend({}, defaultOptions, options), responsiveOptions); + super( + query, + data, + defaultOptions, + extend({}, defaultOptions, options), + responsiveOptions + ); } /** @@ -161,17 +176,27 @@ export class PieChart extends BaseChart { let startAngle = options.startAngle; // Create SVG.js draw - this.svg = createSvg(this.container, options.width, options.height, options.donut ? options.classNames.chartDonut : options.classNames.chartPie); + this.svg = createSvg( + this.container, + options.width, + options.height, + options.donut + ? options.classNames.chartDonut + : options.classNames.chartPie + ); // Calculate charting rect - const chartRect = createChartRect(this.svg, options, defaultOptions.padding); + const chartRect = createChartRect( + this.svg, + options, + defaultOptions.padding + ); // Get biggest circle radius possible within chartRect let radius = Math.min(chartRect.width() / 2, chartRect.height() / 2); // Calculate total of all series to get reference value or use total reference from optional options - const totalDataSum = options.total || - data.normalized.series.reduce(sum, 0); + const totalDataSum = options.total || data.normalized.series.reduce(sum, 0); const donutWidth = quantity(options.donutWidth); - if(donutWidth.unit === '%') { + if (donutWidth.unit === '%') { donutWidth.value *= radius / 100; } @@ -182,9 +207,9 @@ export class PieChart extends BaseChart { // If labelPosition is set to `outside` or a donut chart is drawn then the label position is at the radius, // if regular pie chart it's half of the radius - if(options.labelPosition === 'outside' || options.donut) { + if (options.labelPosition === 'outside' || options.donut) { labelRadius = radius; - } else if(options.labelPosition === 'center') { + } else if (options.labelPosition === 'center') { // If labelPosition is center we start with 0 and will later wait for the labelOffset labelRadius = 0; } else { @@ -202,15 +227,17 @@ export class PieChart extends BaseChart { }; // Check if there is only one non-zero value in the series array. - const hasSingleValInSeries = data.raw.series - .filter((val) => val.hasOwnProperty('value') ? val.value !== 0 : val !== 0) - .length === 1; + const hasSingleValInSeries = + data.raw.series.filter(val => + safeHasProperty(val, 'value') ? val.value !== 0 : val !== 0 + ).length === 1; // Creating the series groups - data.raw.series - .forEach((series, index) => seriesGroups[index] = this.svg.elem('g', null, null)); + data.raw.series.forEach( + (series, index) => (seriesGroups[index] = this.svg.elem('g', null, null)) + ); // if we need to show labels we create the label group now - if(options.showLabel) { + if (options.showLabel) { labelsGroup = this.svg.elem('g', null, null); } @@ -218,7 +245,7 @@ export class PieChart extends BaseChart { // initialize series groups data.raw.series.forEach((series, index) => { // If current value is zero and we are ignoring empty values then skip to next value - if(data.normalized.series[index] === 0 && options.ignoreEmptyValues) { + if (data.normalized.series[index] === 0 && options.ignoreEmptyValues) { return; } @@ -228,41 +255,69 @@ export class PieChart extends BaseChart { }); // Use series class from series data or if not set generate one - seriesGroups[index].addClass([ - options.classNames.series, - series.className || `${options.classNames.series}-${alphaNumerate(index)}` - ].join(' ')); + seriesGroups[index].addClass( + [ + options.classNames.series, + series.className || + `${options.classNames.series}-${alphaNumerate(index)}` + ].join(' ') + ); // If the whole dataset is 0 endAngle should be zero. Can't divide by 0. - let endAngle = (totalDataSum > 0 ? startAngle + data.normalized.series[index] / totalDataSum * 360 : 0); + let endAngle = + totalDataSum > 0 + ? startAngle + (data.normalized.series[index] / totalDataSum) * 360 + : 0; // Use slight offset so there are no transparent hairline issues - const overlappigStartAngle = Math.max(0, startAngle - (index === 0 || hasSingleValInSeries ? 0 : 0.2)); + const overlappigStartAngle = Math.max( + 0, + startAngle - (index === 0 || hasSingleValInSeries ? 0 : 0.2) + ); // If we need to draw the arc for all 360 degrees we need to add a hack where we close the circle // with Z and use 359.99 degrees - if(endAngle - overlappigStartAngle >= 359.99) { + if (endAngle - overlappigStartAngle >= 359.99) { endAngle = overlappigStartAngle + 359.99; } - const start = polarToCartesian(center.x, center.y, radius, overlappigStartAngle); + const start = polarToCartesian( + center.x, + center.y, + radius, + overlappigStartAngle + ); const end = polarToCartesian(center.x, center.y, radius, endAngle); // Create a new path element for the pie chart. If this isn't a donut chart we should close the path for a correct stroke const path = new SvgPath(!options.donut) .move(end.x, end.y) - .arc(radius, radius, 0, endAngle - startAngle > 180, 0, start.x, start.y); + .arc( + radius, + radius, + 0, + endAngle - startAngle > 180, + 0, + start.x, + start.y + ); // If regular pie chart (no donut) we add a line to the center of the circle for completing the pie - if(!options.donut) { + if (!options.donut) { path.line(center.x, center.y); } // Create the SVG path // If this is a donut chart we add the donut class, otherwise just a regular slice - const pathElement = seriesGroups[index].elem('path', { - d: path.stringify() - }, options.donut ? options.classNames.sliceDonut : options.classNames.slicePie); + const pathElement = seriesGroups[index].elem( + 'path', + { + d: path.stringify() + }, + options.donut + ? options.classNames.sliceDonut + : options.classNames.slicePie + ); // Adding the pie series value to the path pathElement.attr({ @@ -271,9 +326,9 @@ export class PieChart extends BaseChart { }); // If this is a donut, we add the stroke-width as style attribute - if(options.donut) { + if (options.donut) { pathElement.attr({ - 'style': 'stroke-width: ' + donutWidth.value + 'px' + style: 'stroke-width: ' + donutWidth.value + 'px' }); } @@ -295,10 +350,10 @@ export class PieChart extends BaseChart { }); // If we need to show labels we need to add the label for this slice now - if(options.showLabel) { + if (options.showLabel) { let labelPosition; - if(data.raw.series.length === 1) { + if (data.raw.series.length === 1) { // If we have only 1 series, we can position the label in the center of the pie labelPosition = { x: center.x, @@ -315,20 +370,36 @@ export class PieChart extends BaseChart { } let rawValue; - if(data.normalized.labels && !isFalseyButZero(data.normalized.labels[index])) { + if ( + data.normalized.labels && + !isFalseyButZero(data.normalized.labels[index]) + ) { rawValue = data.normalized.labels[index]; } else { rawValue = data.normalized.series[index]; } - const interpolatedValue = options.labelInterpolationFnc(rawValue, index); - - if(interpolatedValue || interpolatedValue === 0) { - const labelElement = labelsGroup.elem('text', { - dx: labelPosition.x, - dy: labelPosition.y, - 'text-anchor': determineAnchorPosition(center, labelPosition, options.labelDirection) - }, options.classNames.label).text('' + interpolatedValue); + const interpolatedValue = options.labelInterpolationFnc( + rawValue, + index + ); + + if (interpolatedValue || interpolatedValue === 0) { + const labelElement = labelsGroup + .elem( + 'text', + { + dx: labelPosition.x, + dy: labelPosition.y, + 'text-anchor': determineAnchorPosition( + center, + labelPosition, + options.labelDirection + ) + }, + options.classNames.label + ) + .text('' + interpolatedValue); // Fire off draw event this.eventEmitter.emit('draw', { diff --git a/src/charts/pie.spec.js b/src/charts/pie.spec.js index 3b47684f..fde205df 100644 --- a/src/charts/pie.spec.js +++ b/src/charts/pie.spec.js @@ -1,11 +1,7 @@ -import {namespaces} from '../core/globals'; -import {deserialize} from '../core/data'; -import {PieChart} from './pie'; -import { - addMockWrapper, - destroyMockDom, - mockDom, -} from '../../test/mock/dom'; +import { namespaces } from '../core/globals'; +import { deserialize } from '../core/data'; +import { PieChart } from './pie'; +import { addMockWrapper, destroyMockDom, mockDom } from '../../test/mock/dom'; describe('Charts', () => { describe('PieChart', () => { @@ -15,15 +11,20 @@ describe('Charts', () => { let data; function createChart() { - return new Promise((resolve) => { - fixture = addMockWrapper('<div class="ct-chart ct-golden-section"></div>'); - const { wrapper } = fixture - chart = new PieChart(wrapper.querySelector('.ct-chart'), data, options) - .on('created', () => { - resolve(); - chart.off('created'); - }); - }) + return new Promise(resolve => { + fixture = addMockWrapper( + '<div class="ct-chart ct-golden-section"></div>' + ); + const { wrapper } = fixture; + chart = new PieChart( + wrapper.querySelector('.ct-chart'), + data, + options + ).on('created', () => { + resolve(); + chart.off('created'); + }); + }); } beforeEach(() => { @@ -36,19 +37,24 @@ describe('Charts', () => { }); describe('Meta data tests', () => { - it('should render meta data correctly on slice with mixed value array', async () => { - const fixture = addMockWrapper('<div class="ct-chart ct-golden-section"></div>'); + const fixture = addMockWrapper( + '<div class="ct-chart ct-golden-section"></div>' + ); const meta = { test: 'Serialized Test' }; const data = { labels: ['A', 'B', 'C'], - series: [5, { - value: 8, - meta: meta - }, 1] + series: [ + 5, + { + value: 8, + meta: meta + }, + 1 + ] }; const chartContainer = fixture.wrapper.querySelector('.ct-chart'); @@ -76,14 +82,17 @@ describe('Charts', () => { width: 100, height: 100, chartPadding: 10, - labelInterpolationFnc: (value) => `${Math.round(value / data.series.reduce(sum) * 100)}%` + labelInterpolationFnc: value => + `${Math.round((value / data.series.reduce(sum)) * 100)}%` }; }); it('should render three slices', async () => { await createChart(); - expect(fixture.wrapper.querySelectorAll('.ct-slice-pie').length).toBe(3); + expect(fixture.wrapper.querySelectorAll('.ct-slice-pie').length).toBe( + 3 + ); }); it('should set value attribute', async () => { @@ -98,20 +107,24 @@ describe('Charts', () => { it('should create slice path', async () => { await createChart(); - Array.from(fixture.wrapper.querySelectorAll('.ct-slice-pie')).forEach((element) => { - const pattern = new RegExp(`M${num},${num}A40,40,0,0,0,${num},${num}L50,50Z$`); - const path = element.getAttribute('d'); - expect(path).toMatch(pattern); - }); + Array.from(fixture.wrapper.querySelectorAll('.ct-slice-pie')).forEach( + element => { + const pattern = new RegExp( + `M${num},${num}A40,40,0,0,0,${num},${num}L50,50Z$` + ); + const path = element.getAttribute('d'); + expect(path).toMatch(pattern); + } + ); }); it('should add labels', async () => { await createChart(); const labels = fixture.wrapper.querySelectorAll('.ct-label'); - expect(labels[0].textContent).toBe('42%'); - expect(labels[1].textContent).toBe('25%'); - expect(labels[2].textContent).toBe('33%'); + expect(labels[0]).toHaveTextContent('42%'); + expect(labels[1]).toHaveTextContent('25%'); + expect(labels[2]).toHaveTextContent('33%'); }); it('should overlap slices', async () => { @@ -120,10 +133,18 @@ describe('Charts', () => { }; await createChart(); - const [slice1, slice2] = Array.from(fixture.wrapper.querySelectorAll('.ct-slice-pie')); - - expect(slice1.getAttribute('d')).toMatch(/^M50,90A40,40,0,0,0,50,10L50,50Z/); - expect(slice2.getAttribute('d')).toMatch(/^M50,10A40,40,0,0,0,50.\d+,90L50,50Z/); + const [slice1, slice2] = Array.from( + fixture.wrapper.querySelectorAll('.ct-slice-pie') + ); + + expect(slice1).toHaveAttribute( + 'd', + expect.stringMatching(/^M50,90A40,40,0,0,0,50,10L50,50Z/) + ); + expect(slice2).toHaveAttribute( + 'd', + expect.stringMatching(/^M50,10A40,40,0,0,0,50.\d+,90L50,50Z/) + ); }); it('should set large arc sweep flag', async () => { @@ -133,7 +154,10 @@ describe('Charts', () => { await createChart(); const slice = fixture.wrapper.querySelectorAll('.ct-slice-pie')[1]; - expect(slice.getAttribute('d')).toMatch(/^M50,10A40,40,0,1,0/); + expect(slice).toHaveAttribute( + 'd', + expect.stringMatching(/^M50,10A40,40,0,1,0/) + ); }); it('should draw complete circle with gap', async () => { @@ -143,7 +167,10 @@ describe('Charts', () => { await createChart(); const slice = fixture.wrapper.querySelectorAll('.ct-slice-pie')[0]; - expect(slice.getAttribute('d')).toMatch(/^M49.9\d+,10A40,40,0,1,0,50,10L50,50Z/); + expect(slice).toHaveAttribute( + 'd', + expect.stringMatching(/^M49.9\d+,10A40,40,0,1,0,50,10L50,50Z/) + ); }); it('should draw complete circle with startAngle', async () => { @@ -152,7 +179,10 @@ describe('Charts', () => { await createChart(); const slice = fixture.wrapper.querySelectorAll('.ct-slice-pie')[0]; - expect(slice.getAttribute('d')).toMatch(/^M90,49.9\d+A40,40,0,1,0,90,50L50,50Z/); + expect(slice).toHaveAttribute( + 'd', + expect.stringMatching(/^M90,49.9\d+A40,40,0,1,0,90,50L50,50Z/) + ); }); it('should draw complete circle if values are 0', async () => { @@ -162,9 +192,11 @@ describe('Charts', () => { await createChart(); const slice = fixture.wrapper.querySelectorAll('.ct-slice-pie')[1]; - expect(slice.getAttribute('d')).toMatch(/^M49.9\d+,10A40,40,0,1,0,50,10L50,50Z/); + expect(slice).toHaveAttribute( + 'd', + expect.stringMatching(/^M49.9\d+,10A40,40,0,1,0,50,10L50,50Z/) + ); }); - }); describe('Pie with small slices', () => { @@ -182,30 +214,54 @@ describe('Charts', () => { it('should render correctly with very small slices', async () => { await createChart(); - const [slice1, slice2] = Array.from(fixture.wrapper.querySelectorAll('.ct-slice-pie')); - - expect(slice1.getAttribute('d')).toMatch(/^M50.1\d+,0A50,50,0,0,0,50,0/); - expect(slice2.getAttribute('d')).toMatch(/^M49.9\d*,0A50,50,0,1,0,50,0/); + const [slice1, slice2] = Array.from( + fixture.wrapper.querySelectorAll('.ct-slice-pie') + ); + + expect(slice1).toHaveAttribute( + 'd', + expect.stringMatching(/^M50.1\d+,0A50,50,0,0,0,50,0/) + ); + expect(slice2).toHaveAttribute( + 'd', + expect.stringMatching(/^M49.9\d*,0A50,50,0,1,0,50,0/) + ); }); it('should render correctly with very small slices on startAngle', async () => { options.startAngle = 90; await createChart(); - const [slice1, slice2] = Array.from(fixture.wrapper.querySelectorAll('.ct-slice-pie')); - - expect(slice1.getAttribute('d')).toMatch(/^M100,50.1\d*A50,50,0,0,0,100,50/); - expect(slice2.getAttribute('d')).toMatch(/^M100,49.97\d*A50,50,0,1,0,100,49.98\d*/); + const [slice1, slice2] = Array.from( + fixture.wrapper.querySelectorAll('.ct-slice-pie') + ); + + expect(slice1).toHaveAttribute( + 'd', + expect.stringMatching(/^M100,50.1\d*A50,50,0,0,0,100,50/) + ); + expect(slice2).toHaveAttribute( + 'd', + expect.stringMatching(/^M100,49.97\d*A50,50,0,1,0,100,49.98\d*/) + ); }); it('should render correctly with very small slices', async () => { options.donut = true; await createChart(); - const [slice1, slice2] = Array.from(fixture.wrapper.querySelectorAll('.ct-slice-donut')); - - expect(slice1.getAttribute('d')).toMatch(/^M50.\d+,30A20,20,0,0,0,50,30/); - expect(slice2.getAttribute('d')).toMatch(/^M49.9\d*,30A20,20,0,1,0,50,30/); + const [slice1, slice2] = Array.from( + fixture.wrapper.querySelectorAll('.ct-slice-donut') + ); + + expect(slice1).toHaveAttribute( + 'd', + expect.stringMatching(/^M50.\d+,30A20,20,0,0,0,50,30/) + ); + expect(slice2).toHaveAttribute( + 'd', + expect.stringMatching(/^M49.9\d*,30A20,20,0,1,0,50,30/) + ); }); }); @@ -250,9 +306,18 @@ describe('Charts', () => { expect(slices[1].getAttributeNS(namespaces.ct, 'value')).toBe('0'); expect(slices[2].getAttributeNS(namespaces.ct, 'value')).toBe('0'); - expect(slices[0].getAttribute('d')).toBe('M200,5A195,195,0,0,0,200,5L200,200Z'); - expect(slices[1].getAttribute('d')).toBe('M200,5A195,195,0,0,0,200,5L200,200Z'); - expect(slices[2].getAttribute('d')).toBe('M200,5A195,195,0,0,0,200,5L200,200Z'); + expect(slices[0]).toHaveAttribute( + 'd', + 'M200,5A195,195,0,0,0,200,5L200,200Z' + ); + expect(slices[1]).toHaveAttribute( + 'd', + 'M200,5A195,195,0,0,0,200,5L200,200Z' + ); + expect(slices[2]).toHaveAttribute( + 'd', + 'M200,5A195,195,0,0,0,200,5L200,200Z' + ); }); it('should render empty slices', async () => { @@ -291,13 +356,15 @@ describe('Charts', () => { startAngle: 270, total: 200, showLabel: false - } + }; }); it('should render four strokes', async () => { await createChart(); - expect(fixture.wrapper.querySelectorAll('.ct-slice-donut').length).toBe(4); + expect(fixture.wrapper.querySelectorAll('.ct-slice-donut').length).toBe( + 4 + ); }); it('should set value attribute', async () => { @@ -312,19 +379,29 @@ describe('Charts', () => { it('should create slice path', async () => { const num = '\\d+(\\.\\d*)?'; - const pattern = new RegExp(`^M${num},${num}A170,170,0,0,0,${num},${num}$`); + const pattern = new RegExp( + `^M${num},${num}A170,170,0,0,0,${num},${num}$` + ); await createChart(); - Array.from(fixture.wrapper.querySelectorAll('.ct-slice-donut')) - .forEach((element) => expect(element.getAttribute('d')).toMatch(pattern)); + Array.from(fixture.wrapper.querySelectorAll('.ct-slice-donut')).forEach( + element => + expect(element).toHaveAttribute('d', expect.stringMatching(pattern)) + ); }); it('should set stroke-width', async () => { const strokeWidth = new RegExp('stroke-width:\\s*60px'); await createChart(); - Array.from(fixture.wrapper.querySelectorAll('.ct-slice-donut')) - .forEach((element) => expect(element.getAttribute('style')).toMatch(strokeWidth)); + Array.from(fixture.wrapper.querySelectorAll('.ct-slice-donut')).forEach( + element => + expect(element).toHaveAttribute( + // eslint-disable-next-line jest-dom/prefer-to-have-style + 'style', + expect.stringMatching(strokeWidth) + ) + ); }); it('should not add labels', async () => { @@ -353,24 +430,36 @@ describe('Charts', () => { it('should render four strokes', async () => { await createChart(); - expect(fixture.wrapper.querySelectorAll('.ct-slice-donut').length).toBe(4); + expect(fixture.wrapper.querySelectorAll('.ct-slice-donut').length).toBe( + 4 + ); }); it('should create slice path', async () => { const num = '\\d+(\\.\\d*)?'; - const pattern = new RegExp(`^M${num},${num}A175,175,0,0,0,${num},${num}$`); + const pattern = new RegExp( + `^M${num},${num}A175,175,0,0,0,${num},${num}$` + ); await createChart(); - Array.from(fixture.wrapper.querySelectorAll('.ct-slice-donut')) - .forEach((element) => expect(element.getAttribute('d')).toMatch(pattern)); + Array.from(fixture.wrapper.querySelectorAll('.ct-slice-donut')).forEach( + element => + expect(element).toHaveAttribute('d', expect.stringMatching(pattern)) + ); }); it('should set stroke-width', async () => { const strokeWidth = new RegExp('stroke-width:\\s?50px'); await createChart(); - Array.from(fixture.wrapper.querySelectorAll('.ct-slice-donut')) - .forEach((element) => expect(element.getAttribute('style')).toMatch(strokeWidth)); + Array.from(fixture.wrapper.querySelectorAll('.ct-slice-donut')).forEach( + element => + expect(element).toHaveAttribute( + // eslint-disable-next-line jest-dom/prefer-to-have-style + 'style', + expect.stringMatching(strokeWidth) + ) + ); }); }); }); diff --git a/src/charts/pie.stories.js b/src/charts/pie.stories.js index f86fff5a..349d5e32 100644 --- a/src/charts/pie.stories.js +++ b/src/charts/pie.stories.js @@ -9,26 +9,34 @@ export default { export function Default() { const root = document.createElement('div'); - new PieChart(root, { - series: [5, 3, 4] - }, { - width: 100, - height: 100, - chartPadding: 10 - }); - - return root + new PieChart( + root, + { + series: [5, 3, 4] + }, + { + width: 100, + height: 100, + chartPadding: 10 + } + ); + + return root; } export function Labels() { const root = document.createElement('div'); - new PieChart(root, { - labels: ['A', 'B', 'C'], - series: [5, 8, 1] - }, {}); + new PieChart( + root, + { + labels: ['A', 'B', 'C'], + series: [5, 8, 1] + }, + {} + ); - return root + return root; } export function LabelInterpolation() { @@ -42,110 +50,139 @@ export function LabelInterpolation() { width: 100, height: 100, chartPadding: 10, - labelInterpolationFnc: (value) => `${Math.round(value / data.series.reduce(sum) * 100)}%` + labelInterpolationFnc: value => + `${Math.round((value / data.series.reduce(sum)) * 100)}%` }); - return root + return root; } export function StartAngle() { const root = document.createElement('div'); - new PieChart(root, { - series: [5, 3, 4] - }, { - startAngle: 90 - }); - - return root + new PieChart( + root, + { + series: [5, 3, 4] + }, + { + startAngle: 90 + } + ); + + return root; } export function SmallSlices() { const root = document.createElement('div'); - new PieChart(root, { - series: [0.001, 2] - }, { - width: 100, - height: 100, - chartPadding: 0 - }); - - return root + new PieChart( + root, + { + series: [0.001, 2] + }, + { + width: 100, + height: 100, + chartPadding: 0 + } + ); + + return root; } export function IgnoreEmptyValues() { const root = document.createElement('div'); - new PieChart(root, { - series: [1, 2, 0, 4] - }, { - ignoreEmptyValues: true - }); - - return root + new PieChart( + root, + { + series: [1, 2, 0, 4] + }, + { + ignoreEmptyValues: true + } + ); + + return root; } export function Donut() { const root = document.createElement('div'); - new PieChart(root, { - series: [5, 3, 4] - }, { - donut: true - }); - - return root + new PieChart( + root, + { + series: [5, 3, 4] + }, + { + donut: true + } + ); + + return root; } export function GaugeDonut() { const root = document.createElement('div'); - new PieChart(root, { - series: [20, 10, 30, 40] - }, { - chartPadding: 50, - height: 500, - width: 500, - donut: true, - donutWidth: 60, - startAngle: 270, - total: 200, - showLabel: false - }); - - return root + new PieChart( + root, + { + series: [20, 10, 30, 40] + }, + { + chartPadding: 50, + height: 500, + width: 500, + donut: true, + donutWidth: 60, + startAngle: 270, + total: 200, + showLabel: false + } + ); + + return root; } export function RelativeDonutWidth() { const root = document.createElement('div'); - new PieChart(root, { - series: [20, 10, 30, 40] - }, { - chartPadding: 50, - height: 500, - width: 500, - donut: true, - donutWidth: '25%', - showLabel: false - }); - - return root + new PieChart( + root, + { + series: [20, 10, 30, 40] + }, + { + chartPadding: 50, + height: 500, + width: 500, + donut: true, + donutWidth: '25%', + showLabel: false + } + ); + + return root; } export function Solid() { const root = document.createElement('div'); - new PieChart(root, { - series: [20, 10, 30, 40] - }, { - donut: true, - donutWidth: 60, - donutSolid: true, - startAngle: 270, - showLabel: true - }); - - return root + new PieChart( + root, + { + series: [20, 10, 30, 40] + }, + { + donut: true, + donutWidth: 60, + donutSolid: true, + startAngle: 270, + showLabel: true + } + ); + + return root; } diff --git a/src/core/core.js b/src/core/core.js index 01430174..c8a372d0 100644 --- a/src/core/core.js +++ b/src/core/core.js @@ -4,5 +4,5 @@ export * from './functional'; export * from './math'; export * from './data'; export * from './creation'; -export {extend} from './extend'; -export {optionsProvider} from './options-provider'; +export { extend } from './extend'; +export { optionsProvider } from './options-provider'; diff --git a/src/core/creation.js b/src/core/creation.js index 88ba77c3..4ac310ae 100644 --- a/src/core/creation.js +++ b/src/core/creation.js @@ -1,7 +1,7 @@ -import {namespaces} from './globals'; -import {Svg} from '../svg/svg'; -import {quantity} from './lang'; -import {extend} from './extend'; +import { namespaces } from './globals'; +import { Svg } from '../svg/svg'; +import { quantity } from './lang'; +import { extend } from './extend'; /** * Create or reinitialize the SVG element for the chart @@ -13,21 +13,29 @@ import {extend} from './extend'; * @param {String} className Specify a class to be added to the SVG element * @return {Object} The created/reinitialized SVG element */ -export function createSvg(container, width = '100%', height = '100%', className) { +export function createSvg( + container, + width = '100%', + height = '100%', + className +) { // Check if there is a previous SVG element in the container that contains the Chartist XML namespace and remove it // Since the DOM API does not support namespaces we need to manually search the returned list http://www.w3.org/TR/selectors-api/ Array.from(container.querySelectorAll('svg')) - .filter((svg) => svg.getAttributeNS(namespaces.xmlns, 'ct')) - .forEach((svg) => container.removeChild(svg)); + .filter(svg => svg.getAttributeNS(namespaces.xmlns, 'ct')) + .forEach(svg => container.removeChild(svg)); // Create svg object with width and height or use 100% as default - const svg = new Svg('svg').attr({ - width, - height - }).addClass(className).attr({ - // TODO: Check better solution (browser support) and remove inline styles due to CSP - style: `width: ${width}; height: ${height};` - }); + const svg = new Svg('svg') + .attr({ + width, + height + }) + .addClass(className) + .attr({ + // TODO: Check better solution (browser support) and remove inline styles due to CSP + style: `width: ${width}; height: ${height};` + }); // Add the DOM node to our container container.appendChild(svg._node); @@ -44,17 +52,19 @@ export function createSvg(container, width = '100%', height = '100%', className) * @returns {Object} Returns a padding object containing top, right, bottom, left properties filled with the padding number passed in as argument. If the argument is something else than a number (presumably already a correct padding object) then this argument is directly returned. */ export function normalizePadding(padding, fallback = 0) { - return typeof padding === 'number' ? { - top: padding, - right: padding, - bottom: padding, - left: padding - } : { - top: typeof padding.top === 'number' ? padding.top : fallback, - right: typeof padding.right === 'number' ? padding.right : fallback, - bottom: typeof padding.bottom === 'number' ? padding.bottom : fallback, - left: typeof padding.left === 'number' ? padding.left : fallback - }; + return typeof padding === 'number' + ? { + top: padding, + right: padding, + bottom: padding, + left: padding + } + : { + top: typeof padding.top === 'number' ? padding.top : fallback, + right: typeof padding.right === 'number' ? padding.right : fallback, + bottom: typeof padding.bottom === 'number' ? padding.bottom : fallback, + left: typeof padding.left === 'number' ? padding.left : fallback + }; } /** @@ -73,43 +83,67 @@ export function createChartRect(svg, options, fallbackPadding) { // If width or height results in invalid value (including 0) we fallback to the unitless settings or even 0 let width = svg.width() || quantity(options.width).value || 0; let height = svg.height() || quantity(options.height).value || 0; - const normalizedPadding = normalizePadding(options.chartPadding, fallbackPadding); + const normalizedPadding = normalizePadding( + options.chartPadding, + fallbackPadding + ); // If settings were to small to cope with offset (legacy) and padding, we'll adjust - width = Math.max(width, yAxisOffset + normalizedPadding.left + normalizedPadding.right); - height = Math.max(height, xAxisOffset + normalizedPadding.top + normalizedPadding.bottom); + width = Math.max( + width, + yAxisOffset + normalizedPadding.left + normalizedPadding.right + ); + height = Math.max( + height, + xAxisOffset + normalizedPadding.top + normalizedPadding.bottom + ); const chartRect = { padding: normalizedPadding, - width: function() { + width: function () { return this.x2 - this.x1; }, - height: function() { + height: function () { return this.y1 - this.y2; } }; - if(hasAxis) { - if(options.axisX.position === 'start') { + if (hasAxis) { + if (options.axisX.position === 'start') { chartRect.y2 = normalizedPadding.top + xAxisOffset; - chartRect.y1 = Math.max(height - normalizedPadding.bottom, chartRect.y2 + 1); + chartRect.y1 = Math.max( + height - normalizedPadding.bottom, + chartRect.y2 + 1 + ); } else { chartRect.y2 = normalizedPadding.top; - chartRect.y1 = Math.max(height - normalizedPadding.bottom - xAxisOffset, chartRect.y2 + 1); + chartRect.y1 = Math.max( + height - normalizedPadding.bottom - xAxisOffset, + chartRect.y2 + 1 + ); } - if(options.axisY.position === 'start') { + if (options.axisY.position === 'start') { chartRect.x1 = normalizedPadding.left + yAxisOffset; - chartRect.x2 = Math.max(width - normalizedPadding.right, chartRect.x1 + 1); + chartRect.x2 = Math.max( + width - normalizedPadding.right, + chartRect.x1 + 1 + ); } else { chartRect.x1 = normalizedPadding.left; - chartRect.x2 = Math.max(width - normalizedPadding.right - yAxisOffset, chartRect.x1 + 1); + chartRect.x2 = Math.max( + width - normalizedPadding.right - yAxisOffset, + chartRect.x1 + 1 + ); } } else { chartRect.x1 = normalizedPadding.left; chartRect.x2 = Math.max(width - normalizedPadding.right, chartRect.x1 + 1); chartRect.y2 = normalizedPadding.top; - chartRect.y1 = Math.max(height - normalizedPadding.bottom, chartRect.y2 + 1); + chartRect.y1 = Math.max( + height - normalizedPadding.bottom, + chartRect.y2 + 1 + ); } return chartRect; @@ -128,7 +162,16 @@ export function createChartRect(svg, options, fallbackPadding) { * @param classes * @param eventEmitter */ -export function createGrid(position, index, axis, offset, length, group, classes, eventEmitter) { +export function createGrid( + position, + index, + axis, + offset, + length, + group, + classes, + eventEmitter +) { const positionalData = {}; positionalData[`${axis.units.pos}1`] = position; positionalData[`${axis.units.pos}2`] = position; @@ -138,14 +181,18 @@ export function createGrid(position, index, axis, offset, length, group, classes const gridElement = group.elem('line', positionalData, classes.join(' ')); // Event for grid draw - eventEmitter.emit('draw', - extend({ - type: 'grid', - axis, - index, - group, - element: gridElement - }, positionalData) + eventEmitter.emit( + 'draw', + extend( + { + type: 'grid', + axis, + index, + group, + element: gridElement + }, + positionalData + ) ); } @@ -158,13 +205,23 @@ export function createGrid(position, index, axis, offset, length, group, classes * @param className * @param eventEmitter */ -export function createGridBackground(gridGroup, chartRect, className, eventEmitter) { - const gridBackground = gridGroup.elem('rect', { - x: chartRect.x1, - y: chartRect.y2, - width: chartRect.width(), - height: chartRect.height() - }, className, true); +export function createGridBackground( + gridGroup, + chartRect, + className, + eventEmitter +) { + const gridBackground = gridGroup.elem( + 'rect', + { + x: chartRect.x1, + y: chartRect.y2, + width: chartRect.width(), + height: chartRect.height() + }, + className, + true + ); // Event for grid background draw eventEmitter.emit('draw', { @@ -190,7 +247,19 @@ export function createGridBackground(gridGroup, chartRect, className, eventEmitt * @param useForeignObject * @param eventEmitter */ -export function createLabel(position, length, index, labels, axis, axisOffset, labelOffset, group, classes, useForeignObject, eventEmitter) { +export function createLabel( + position, + length, + index, + labels, + axis, + axisOffset, + labelOffset, + group, + classes, + useForeignObject, + eventEmitter +) { let labelElement; const positionalData = {}; @@ -199,31 +268,47 @@ export function createLabel(position, length, index, labels, axis, axisOffset, l positionalData[axis.units.len] = length; positionalData[axis.counterUnits.len] = Math.max(0, axisOffset - 10); - if(useForeignObject) { + if (useForeignObject) { // We need to set width and height explicitly to px as span will not expand with width and height being // 100% in all browsers const stepLength = Math.round(positionalData[axis.units.len]); const stepCounterLength = Math.round(positionalData[axis.counterUnits.len]); const content = ` <span class="${classes.join(' ')}" - style="${axis.units.len}: ${stepLength}px; ${axis.counterUnits.len}: ${stepCounterLength}px"> + style="${axis.units.len}: ${stepLength}px; ${ + axis.counterUnits.len + }: ${stepCounterLength}px"> ${labels[index]} </span> `.trim(); - labelElement = group.foreignObject(content, extend({ - style: 'overflow: visible;' - }, positionalData)); + labelElement = group.foreignObject( + content, + extend( + { + style: 'overflow: visible;' + }, + positionalData + ) + ); } else { - labelElement = group.elem('text', positionalData, classes.join(' ')).text(labels[index]); + labelElement = group + .elem('text', positionalData, classes.join(' ')) + .text(labels[index]); } - eventEmitter.emit('draw', extend({ - type: 'label', - axis, - index, - group, - element: labelElement, - text: labels[index] - }, positionalData)); + eventEmitter.emit( + 'draw', + extend( + { + type: 'label', + axis, + index, + group, + element: labelElement, + text: labels[index] + }, + positionalData + ) + ); } diff --git a/src/core/creation.spec.js b/src/core/creation.spec.js index afc8645b..c54ec976 100644 --- a/src/core/creation.spec.js +++ b/src/core/creation.spec.js @@ -1,7 +1,12 @@ -import {addMockWrapper, mockDom, destroyMockDom} from '../../test/mock/dom'; -import {createSvg, createGrid, createGridBackground, normalizePadding} from './creation'; -import {EventEmitter} from '../event/event-emitter'; -import {Svg} from '../svg/svg'; +import { addMockWrapper, mockDom, destroyMockDom } from '../../test/mock/dom'; +import { + createSvg, + createGrid, + createGridBackground, + normalizePadding +} from './creation'; +import { EventEmitter } from '../event/event-emitter'; +import { Svg } from '../svg/svg'; describe('Core', () => { describe('Creation', () => { @@ -39,8 +44,12 @@ describe('Core', () => { expect(svg1.classes()).toContain('ct-fish-bar'); expect(svg2).toBeDefined(); expect(svg2.classes()).toContain('ct-snake-bar'); - expect(container).not.toContainElement(document.querySelector('.ct-fish-bar')); - expect(container).toContainElement(document.querySelector('.ct-snake-bar')); + expect(container).not.toContainElement( + document.querySelector('.ct-fish-bar') + ); + expect(container).toContainElement( + document.querySelector('.ct-snake-bar') + ); }); }); @@ -65,18 +74,31 @@ describe('Core', () => { }); function onCreated(fn, done) { - eventEmitter.addEventHandler('draw', (grid) => { + eventEmitter.addEventHandler('draw', grid => { fn(grid); done(); }); - createGrid(position, 1, axis, offset, length, group, classes, eventEmitter); + createGrid( + position, + 1, + axis, + offset, + length, + group, + classes, + eventEmitter + ); } - it('should add single grid line to group', (done) => { - onCreated(() => expect(group.querySelectorAll('line').svgElements.length).toBe(1), done); + it('should add single grid line to group', done => { + onCreated( + () => + expect(group.querySelectorAll('line').svgElements.length).toBe(1), + done + ); }); - it('should draw line', (done) => { + it('should draw line', done => { onCreated(() => { const line = group.querySelector('line'); expect(line.attr('x1')).toBe('10'); @@ -86,7 +108,7 @@ describe('Core', () => { }, done); }); - it('should draw horizontal line', (done) => { + it('should draw horizontal line', done => { axis.units.pos = 'y'; axis.counterUnits.pos = 'x'; onCreated(() => { @@ -121,14 +143,14 @@ describe('Core', () => { }); function onCreated(fn, done) { - eventEmitter.addEventHandler('draw', (data) => { + eventEmitter.addEventHandler('draw', data => { fn(data); done(); }); createGridBackground(group, chartRect, className, eventEmitter); } - it('should add rect', (done) => { + it('should add rect', done => { onCreated(() => { const rects = group.querySelectorAll('rect').svgElements; expect(rects.length).toBe(1); @@ -141,8 +163,8 @@ describe('Core', () => { }, done); }); - it('should pass grid to event', (done) => { - onCreated((data) => { + it('should pass grid to event', done => { + onCreated(data => { expect(data.type).toBe('gridBackground'); const rect = data.element; expect(rect.attr('x')).toBe('5'); @@ -189,10 +211,15 @@ describe('Core', () => { }); it('should normalize partial padding object with specified fallback', () => { - expect(normalizePadding({ - top: 5, - left: 5 - }, 10)).toEqual({ + expect( + normalizePadding( + { + top: 5, + left: 5 + }, + 10 + ) + ).toEqual({ top: 5, right: 10, bottom: 10, @@ -201,12 +228,17 @@ describe('Core', () => { }); it('should not modify complete padding object', () => { - expect(normalizePadding({ - top: 5, - right: 5, - bottom: 5, - left: 5 - }, 10)).toEqual({ + expect( + normalizePadding( + { + top: 5, + right: 5, + bottom: 5, + left: 5 + }, + 10 + ) + ).toEqual({ top: 5, right: 5, bottom: 5, diff --git a/src/core/data.js b/src/core/data.js index 0e5a5f80..b3ceb484 100644 --- a/src/core/data.js +++ b/src/core/data.js @@ -1,8 +1,14 @@ -import {escapingMap} from './globals'; -import {replaceAll, safeHasProperty, getNumberOrUndefined} from './lang'; -import {times} from './functional'; -import {extend} from './extend'; -import {orderOfMagnitude, projectLength, roundWithPrecision, rho, EPSILON} from './math'; +import { escapingMap } from './globals'; +import { replaceAll, safeHasProperty, getNumberOrUndefined } from './lang'; +import { times } from './functional'; +import { extend } from './extend'; +import { + orderOfMagnitude, + projectLength, + roundWithPrecision, + rho, + EPSILON +} from './math'; /** * This function serializes arbitrary data to a string. In case of data that can't be easily converted to a string, this function will create a wrapper object and serialize the data using JSON.stringify. The outcoming string will always be escaped using Chartist.escapingMap. @@ -13,16 +19,18 @@ import {orderOfMagnitude, projectLength, roundWithPrecision, rho, EPSILON} from * @return {String} */ export function serialize(data) { - if(data === null || data === undefined) { + if (data === null || data === undefined) { return data; - } else if(typeof data === 'number') { + } else if (typeof data === 'number') { data = '' + data; - } else if(typeof data === 'object') { - data = JSON.stringify({data: data}); + } else if (typeof data === 'object') { + data = JSON.stringify({ data: data }); } - return Object.keys(escapingMap) - .reduce((result, key) => replaceAll(result, key, escapingMap[key]), data); + return Object.keys(escapingMap).reduce( + (result, key) => replaceAll(result, key, escapingMap[key]), + data + ); } /** @@ -33,21 +41,24 @@ export function serialize(data) { * @return {String|Number|Object} */ export function deserialize(data) { - if(typeof data !== 'string') { + if (typeof data !== 'string') { return data; } - if(data === 'NaN') { + if (data === 'NaN') { return NaN; } - data = Object.keys(escapingMap) - .reduce((result, key) => replaceAll(result, escapingMap[key], key), data); + data = Object.keys(escapingMap).reduce( + (result, key) => replaceAll(result, escapingMap[key], key), + data + ); try { data = JSON.parse(data); data = data.data !== undefined ? data.data : data; - } catch(e) { + } catch (e) { + /* Ingore */ } return data; @@ -67,15 +78,21 @@ export function normalizeData(data, reverse, multi) { }; // Check if we should generate some labels based on existing series data - output.normalized.series = getDataArray({ - series: data.series || [] - }, reverse, multi); + output.normalized.series = getDataArray( + { + series: data.series || [] + }, + reverse, + multi + ); // If all elements of the normalized data array are arrays we're dealing with // multi series data and we need to find the largest series if they are un-even - if(output.normalized.series.every((value) => value instanceof Array)) { + if (output.normalized.series.every(value => value instanceof Array)) { // Getting the series with the the most elements - labelCount = Math.max(...output.normalized.series.map((series) => series.length)); + labelCount = Math.max( + ...output.normalized.series.map(series => series.length) + ); } else { // We're dealing with Pie data so we just take the normalized array length labelCount = output.normalized.series.length; @@ -83,11 +100,13 @@ export function normalizeData(data, reverse, multi) { output.normalized.labels = (data.labels || []).slice(); // Padding the labels to labelCount with empty strings - output.normalized.labels - .push(...times(Math.max(0, labelCount - output.normalized.labels.length)) - .map(() => '')); + output.normalized.labels.push( + ...times(Math.max(0, labelCount - output.normalized.labels.length)).map( + () => '' + ) + ); - if(reverse) { + if (reverse) { reverseData(output.normalized); } @@ -113,9 +132,11 @@ export function getMetaData(series, index) { * @returns {boolean} True if the value is considered a data hole */ export function isDataHoleValue(value) { - return value === null || + return ( + value === null || value === undefined || - (typeof value === 'number' && isNaN(value)); + (typeof value === 'number' && isNaN(value)) + ); } /** @@ -127,10 +148,10 @@ export function isDataHoleValue(value) { export function reverseData(data) { data.labels.reverse(); data.series.reverse(); - for(let series of data.series) { - if(typeof(series) === 'object' && series.data !== undefined) { + for (let series of data.series) { + if (typeof series === 'object' && series.data !== undefined) { series.data.reverse(); - } else if(series instanceof Array) { + } else if (series instanceof Array) { series.reverse(); } } @@ -149,38 +170,41 @@ export function getDataArray(data, reverse, multi) { // Recursively walks through nested arrays and convert string values to numbers and objects with value properties // to values. Check the tests in data core -> data normalization for a detailed specification of expected values function recursiveConvert(value) { - if(safeHasProperty(value, 'value')) { + if (safeHasProperty(value, 'value')) { // We are dealing with value object notation so we need to recurse on value property return recursiveConvert(value.value); - } else if(safeHasProperty(value, 'data')) { + } else if (safeHasProperty(value, 'data')) { // We are dealing with series object notation so we need to recurse on data property return recursiveConvert(value.data); - } else if(value instanceof Array) { + } else if (value instanceof Array) { // Data is of type array so we need to recurse on the series return value.map(recursiveConvert); - } else if(isDataHoleValue(value)) { + } else if (isDataHoleValue(value)) { // We're dealing with a hole in the data and therefore need to return undefined // We're also returning undefined for multi value output return undefined; } else { // We need to prepare multi value output (x and y data) - if(multi) { + if (multi) { const multiValue = {}; // Single series value arrays are assumed to specify the Y-Axis value // For example: [1, 2] => [{x: undefined, y: 1}, {x: undefined, y: 2}] // If multi is a string then it's assumed that it specified which dimension should be filled as default - if(typeof multi === 'string') { + if (typeof multi === 'string') { multiValue[multi] = getNumberOrUndefined(value); } else { multiValue.y = getNumberOrUndefined(value); } - multiValue.x = value.hasOwnProperty('x') ? getNumberOrUndefined(value.x) : multiValue.x; - multiValue.y = value.hasOwnProperty('y') ? getNumberOrUndefined(value.y) : multiValue.y; + multiValue.x = safeHasProperty(value, 'x') + ? getNumberOrUndefined(value.x) + : multiValue.x; + multiValue.y = safeHasProperty(value, 'y') + ? getNumberOrUndefined(value.y) + : multiValue.y; return multiValue; - } else { // We can return simple data return getNumberOrUndefined(value); @@ -198,8 +222,10 @@ export function getDataArray(data, reverse, multi) { * @param value */ export function isMultiValue(value) { - return typeof value === 'object' && - (value.hasOwnProperty('x') || value.hasOwnProperty('y')); + return ( + typeof value === 'object' && + (Reflect.has(value, 'x') || Reflect.has(value, 'y')) + ); } /** @@ -211,7 +237,7 @@ export function isMultiValue(value) { * @returns {*} */ export function getMultiValue(value, dimension = 'y') { - if(isMultiValue(value)) { + if (isMultiValue(value)) { return getNumberOrUndefined(value[dimension]); } else { return getNumberOrUndefined(value); @@ -228,9 +254,9 @@ export function getMultiValue(value, dimension = 'y') { * @returns {*} */ export function getSeriesOption(series, options, key) { - if(series.name && options.series && options.series[series.name]) { + if (series.name && options.series && options.series[series.name]) { const seriesOptions = options.series[series.name]; - return seriesOptions.hasOwnProperty(key) ? seriesOptions[key] : options[key]; + return Reflect.has(seriesOptions, key) ? seriesOptions[key] : options[key]; } else { return options[key]; } @@ -271,22 +297,25 @@ export function splitIntoSegments(pathCoordinates, valueData, options) { const segments = []; let hole = true; - for(let i = 0; i < pathCoordinates.length; i += 2) { + for (let i = 0; i < pathCoordinates.length; i += 2) { // If this value is a "hole" we set the hole flag - if(getMultiValue(valueData[i / 2].value) === undefined) { + if (getMultiValue(valueData[i / 2].value) === undefined) { // if(valueData[i / 2].value === undefined) { - if(!options.fillHoles) { + if (!options.fillHoles) { hole = true; } } else { - if(options.increasingX && i >= 2 && pathCoordinates[i] <= pathCoordinates[i - 2]) { + if ( + options.increasingX && + i >= 2 && + pathCoordinates[i] <= pathCoordinates[i - 2] + ) { // X is not increasing, so we need to make sure we start a new segment hole = true; } - // If it's a valid value we need to check if we're coming out of a hole and create a new empty segment - if(hole) { + if (hole) { segments.push({ pathCoordinates: [], valueData: [] @@ -296,7 +325,10 @@ export function splitIntoSegments(pathCoordinates, valueData, options) { } // Add to the segment pathCoordinates and valueData - segments[segments.length - 1].pathCoordinates.push(pathCoordinates[i], pathCoordinates[i + 1]); + segments[segments.length - 1].pathCoordinates.push( + pathCoordinates[i], + pathCoordinates[i + 1] + ); segments[segments.length - 1].valueData.push(valueData[i / 2]); } } @@ -315,7 +347,11 @@ export function splitIntoSegments(pathCoordinates, valueData, options) { */ export function getHighLow(data, options, dimension) { // TODO: Remove workaround for deprecated global high / low config. Axis high / low configuration is preferred - options = extend({}, options, dimension ? options['axis' + dimension.toUpperCase()] : {}); + options = extend( + {}, + options, + dimension ? options['axis' + dimension.toUpperCase()] : {} + ); const highLow = { high: options.high === undefined ? -Number.MAX_VALUE : +options.high, @@ -326,48 +362,48 @@ export function getHighLow(data, options, dimension) { // Function to recursively walk through arrays and find highest and lowest number function recursiveHighLow(sourceData) { - if(sourceData === undefined) { + if (sourceData === undefined) { return undefined; - } else if(sourceData instanceof Array) { - for(let i = 0; i < sourceData.length; i++) { + } else if (sourceData instanceof Array) { + for (let i = 0; i < sourceData.length; i++) { recursiveHighLow(sourceData[i]); } } else { const value = dimension ? +sourceData[dimension] : +sourceData; - if(findHigh && value > highLow.high) { + if (findHigh && value > highLow.high) { highLow.high = value; } - if(findLow && value < highLow.low) { + if (findLow && value < highLow.low) { highLow.low = value; } } } // Start to find highest and lowest number recursively - if(findHigh || findLow) { + if (findHigh || findLow) { recursiveHighLow(data); } // Overrides of high / low based on reference value, it will make sure that the invisible reference value is // used to generate the chart. This is useful when the chart always needs to contain the position of the // invisible reference value in the view i.e. for bipolar scales. - if(options.referenceValue || options.referenceValue === 0) { + if (options.referenceValue || options.referenceValue === 0) { highLow.high = Math.max(options.referenceValue, highLow.high); highLow.low = Math.min(options.referenceValue, highLow.low); } // If high and low are the same because of misconfiguration or flat data (only the same value) we need // to set the high or low to 0 depending on the polarity - if(highLow.high <= highLow.low) { + if (highLow.high <= highLow.low) { // If both values are 0 we set high to 1 - if(highLow.low === 0) { + if (highLow.low === 0) { highLow.high = 1; - } else if(highLow.low < 0) { + } else if (highLow.low < 0) { // If we have the same negative value for the bounds we set bounds.high to 0 highLow.high = 0; - } else if(highLow.high > 0) { + } else if (highLow.high > 0) { // If we have the same positive value for the bounds we set bounds.low to 0 highLow.low = 0; } else { @@ -411,9 +447,13 @@ export function getBounds(axisLength, highLow, scaleMinSpace, onlyInteger) { const smallestFactor = onlyInteger ? rho(bounds.range) : 0; // First check if we should only use integer steps and if step 1 is still larger than scaleMinSpace so we can use 1 - if(onlyInteger && projectLength(axisLength, 1, bounds) >= scaleMinSpace) { + if (onlyInteger && projectLength(axisLength, 1, bounds) >= scaleMinSpace) { bounds.step = 1; - } else if(onlyInteger && smallestFactor < bounds.step && projectLength(axisLength, smallestFactor, bounds) >= scaleMinSpace) { + } else if ( + onlyInteger && + smallestFactor < bounds.step && + projectLength(axisLength, smallestFactor, bounds) >= scaleMinSpace + ) { // If step 1 was too small, we can try the smallest factor of range // If the smallest factor is smaller than the current bounds.step and the projected length of smallest factor // is larger than the scaleMinSpace we should go for it. @@ -421,12 +461,18 @@ export function getBounds(axisLength, highLow, scaleMinSpace, onlyInteger) { } else { // Trying to divide or multiply by 2 and find the best step value let optimizationCounter = 0; - while(true) { - if(scaleUp && projectLength(axisLength, bounds.step, bounds) <= scaleMinSpace) { + for (;;) { + if ( + scaleUp && + projectLength(axisLength, bounds.step, bounds) <= scaleMinSpace + ) { bounds.step *= 2; - } else if(!scaleUp && projectLength(axisLength, bounds.step / 2, bounds) >= scaleMinSpace) { + } else if ( + !scaleUp && + projectLength(axisLength, bounds.step / 2, bounds) >= scaleMinSpace + ) { bounds.step /= 2; - if(onlyInteger && bounds.step % 1 !== 0) { + if (onlyInteger && bounds.step % 1 !== 0) { bounds.step *= 2; break; } @@ -434,8 +480,10 @@ export function getBounds(axisLength, highLow, scaleMinSpace, onlyInteger) { break; } - if(optimizationCounter++ > 1000) { - throw new Error('Exceeded maximum number of iterations while optimizing scale step!'); + if (optimizationCounter++ > 1000) { + throw new Error( + 'Exceeded maximum number of iterations while optimizing scale step!' + ); } } } @@ -443,8 +491,8 @@ export function getBounds(axisLength, highLow, scaleMinSpace, onlyInteger) { bounds.step = Math.max(bounds.step, EPSILON); function safeIncrement(value, increment) { // If increment is too small use *= (1+EPSILON) as a simple nextafter - if(value === (value += increment)) { - value *= (1 + (increment > 0 ? EPSILON : -EPSILON)); + if (value === (value += increment)) { + value *= 1 + (increment > 0 ? EPSILON : -EPSILON); } return value; } @@ -452,10 +500,10 @@ export function getBounds(axisLength, highLow, scaleMinSpace, onlyInteger) { // Narrow min and max based on new step let newMin = bounds.min; let newMax = bounds.max; - while(newMin + bounds.step <= bounds.low) { + while (newMin + bounds.step <= bounds.low) { newMin = safeIncrement(newMin, bounds.step); } - while(newMax - bounds.step >= bounds.high) { + while (newMax - bounds.step >= bounds.high) { newMax = safeIncrement(newMax, -bounds.step); } bounds.min = newMin; @@ -463,9 +511,9 @@ export function getBounds(axisLength, highLow, scaleMinSpace, onlyInteger) { bounds.range = bounds.max - bounds.min; const values = []; - for(let i = bounds.min; i <= bounds.max; i = safeIncrement(i, bounds.step)) { + for (let i = bounds.min; i <= bounds.max; i = safeIncrement(i, bounds.step)) { const value = roundWithPrecision(i); - if(value !== values[values.length - 1]) { + if (value !== values[values.length - 1]) { values.push(value); } } diff --git a/src/core/data.spec.js b/src/core/data.spec.js index 8b57ffa1..2f2a53d5 100644 --- a/src/core/data.spec.js +++ b/src/core/data.spec.js @@ -1,5 +1,11 @@ -import {serialize, deserialize, getDataArray, getBounds, splitIntoSegments} from './data'; -import {roundWithPrecision} from './math'; +import { + serialize, + deserialize, + getDataArray, + getBounds, + splitIntoSegments +} from './data'; +import { roundWithPrecision } from './math'; describe('Core', () => { describe('Data', () => { @@ -51,130 +57,122 @@ describe('Core', () => { const data = { labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], series: [ - {data: [1, 0, 3, 4, 5, 6]}, - [1, {value: 0}, 3, {value: 4}, 5, 6, 7, 8], - {data: [1, 0, {value: 3}]} + { data: [1, 0, 3, 4, 5, 6] }, + [1, { value: 0 }, 3, { value: 4 }, 5, 6, 7, 8], + { data: [1, 0, { value: 3 }] } ] }; - expect(getDataArray(data)).toEqual( - [ - [1, 0, 3, 4, 5, 6], - [1, 0, 3, 4, 5, 6, 7, 8], - [1, 0, 3] - ] - ); + expect(getDataArray(data)).toEqual([ + [1, 0, 3, 4, 5, 6], + [1, 0, 3, 4, 5, 6, 7, 8], + [1, 0, 3] + ]); }); it('should normalize mixed series for pie chart correctly', () => { const data = { - series: [1, {value: 0}, 3, {value: 4}, 5, 6, 7, 8] + series: [1, { value: 0 }, 3, { value: 4 }, 5, 6, 7, 8] }; - expect(getDataArray(data)).toEqual( - [1, 0, 3, 4, 5, 6, 7, 8] - ); + expect(getDataArray(data)).toEqual([1, 0, 3, 4, 5, 6, 7, 8]); }); it('should normalize mixed series with string values for pie chart correctly', () => { const data = { - series: ['1', {value: '0'}, '3', {value: '4'}, '5', '6', '7', '8'] + series: ['1', { value: '0' }, '3', { value: '4' }, '5', '6', '7', '8'] }; - expect(getDataArray(data)).toEqual( - [1, 0, 3, 4, 5, 6, 7, 8] - ); + expect(getDataArray(data)).toEqual([1, 0, 3, 4, 5, 6, 7, 8]); }); it('should normalize mixed series types with string values correctly', () => { const data = { labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], series: [ - {data: ['1', '0', '3', '4', '5', '6']}, - ['1', {value: '0'}, '3', {value: '4'}, '5', '6', '7', '8'], - {data: ['1', '0', {value: '3'}]} + { data: ['1', '0', '3', '4', '5', '6'] }, + ['1', { value: '0' }, '3', { value: '4' }, '5', '6', '7', '8'], + { data: ['1', '0', { value: '3' }] } ] }; - expect(getDataArray(data)).toEqual( - [ - [1, 0, 3, 4, 5, 6], - [1, 0, 3, 4, 5, 6, 7, 8], - [1, 0, 3] - ] - ); + expect(getDataArray(data)).toEqual([ + [1, 0, 3, 4, 5, 6], + [1, 0, 3, 4, 5, 6, 7, 8], + [1, 0, 3] + ]); }); it('should normalize mixed series types with weird values correctly', () => { const data = { labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], series: [ - {data: [null, NaN, undefined, '4', '5', '6']}, - ['1', {value: null}, '3', {value: NaN}, '5', '6', '7', '8'], - {data: ['1', '0', {value: undefined}]} + { data: [null, NaN, undefined, '4', '5', '6'] }, + ['1', { value: null }, '3', { value: NaN }, '5', '6', '7', '8'], + { data: ['1', '0', { value: undefined }] } ] }; - expect(getDataArray(data)).toEqual( - [ - [undefined, undefined, undefined, 4, 5, 6], - [1, undefined, 3, undefined, 5, 6, 7, 8], - [1, 0, undefined] - ] - ); + expect(getDataArray(data)).toEqual([ + [undefined, undefined, undefined, 4, 5, 6], + [1, undefined, 3, undefined, 5, 6, 7, 8], + [1, 0, undefined] + ]); }); it('should normalize correctly with 0 values in data series array objects', () => { const data = { labels: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri'], - series: [{ - data: [ - {value: 1}, - {value: 4}, - {value: 2}, - {value: 7}, - {value: 2}, - {value: 0} - ] - }] + series: [ + { + data: [ + { value: 1 }, + { value: 4 }, + { value: 2 }, + { value: 7 }, + { value: 2 }, + { value: 0 } + ] + } + ] }; - expect(getDataArray(data)).toEqual( - [[1, 4, 2, 7, 2, 0]] - ); + expect(getDataArray(data)).toEqual([[1, 4, 2, 7, 2, 0]]); }); it('should normalize correctly with mixed dimensional input into multi dimensional output', () => { const data = { labels: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri'], - series: [{ - data: [ - {value: 1}, - {value: {y: 4, x: 1}}, - {y: 2, x: 2}, - NaN, - null, - {value: 7}, - {value: 2}, - {value: null}, - {y: undefined, x: NaN} - ] - }] + series: [ + { + data: [ + { value: 1 }, + { value: { y: 4, x: 1 } }, + { y: 2, x: 2 }, + NaN, + null, + { value: 7 }, + { value: 2 }, + { value: null }, + { y: undefined, x: NaN } + ] + } + ] }; - expect(getDataArray(data, false, true)).toEqual( - [[ - {x: undefined, y: 1}, - {x: 1, y: 4}, - {x: 2, y: 2}, + expect(getDataArray(data, false, true)).toEqual([ + [ + { x: undefined, y: 1 }, + { x: 1, y: 4 }, + { x: 2, y: 2 }, undefined, undefined, - {x: undefined, y: 7}, - {x: undefined, y: 2}, + { x: undefined, y: 7 }, + { x: undefined, y: 2 }, undefined, - {x: undefined, y: undefined} - ]] - ); + { x: undefined, y: undefined } + ] + ]); }); it('should normalize boolean series correctly', () => { @@ -182,9 +180,7 @@ describe('Core', () => { series: [true, false, false, true] }; - expect(getDataArray(data)).toEqual( - [1, 0, 0, 1] - ); + expect(getDataArray(data)).toEqual([1, 0, 0, 1]); }); it('should normalize date series correctly', () => { @@ -192,92 +188,95 @@ describe('Core', () => { series: [new Date(0), new Date(1), new Date(2), new Date(3)] }; - expect(getDataArray(data)).toEqual( - [0, 1, 2, 3] - ); + expect(getDataArray(data)).toEqual([0, 1, 2, 3]); }); }); describe('getBounds', () => { it('should return 10 steps', () => { - const bounds = getBounds(100, {high: 10, low: 1}, 10, false); + const bounds = getBounds(100, { high: 10, low: 1 }, 10, false); expect(bounds.min).toBe(1); expect(bounds.max).toBe(10); expect(bounds.values).toEqual([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]); }); it('should return 5 steps', () => { - const bounds = getBounds(100, {high: 10, low: 1}, 20, false); + const bounds = getBounds(100, { high: 10, low: 1 }, 20, false); expect(bounds.min).toBe(1); expect(bounds.max).toBe(10); expect(bounds.values).toEqual([1, 3, 5, 7, 9]); }); it('should return non integer steps', () => { - const bounds = getBounds(100, {high: 2, low: 1}, 20, false); + const bounds = getBounds(100, { high: 2, low: 1 }, 20, false); expect(bounds.min).toBe(1); expect(bounds.max).toBe(2); expect(bounds.values).toEqual([1, 1.25, 1.5, 1.75, 2]); }); it('should return integer steps only', () => { - const bounds = getBounds(100, {high: 3, low: 1}, 20, true); + const bounds = getBounds(100, { high: 3, low: 1 }, 20, true); expect(bounds.min).toBe(1); expect(bounds.max).toBe(3); expect(bounds.values).toEqual([1, 2, 3]); }); it('should return single integer step', () => { - const bounds = getBounds(100, {high: 2, low: 1}, 20, true); + const bounds = getBounds(100, { high: 2, low: 1 }, 20, true); expect(bounds.min).toBe(1); expect(bounds.max).toBe(2); expect(bounds.values).toEqual([1, 2]); }); it('should floor/ceil min/max', () => { - const bounds = getBounds(100, {high: 9.9, low: 1.01}, 20, false); + const bounds = getBounds(100, { high: 9.9, low: 1.01 }, 20, false); expect(bounds.min).toBe(1); expect(bounds.max).toBe(10); expect(bounds.values).toEqual([1, 3, 5, 7, 9]); }); it('should floor/ceil min/max for non integers', () => { - const bounds = getBounds(100, {high: 2.9, low: 1.01}, 20, false); + const bounds = getBounds(100, { high: 2.9, low: 1.01 }, 20, false); expect(bounds.min).toBe(1); expect(bounds.max).toBe(3); expect(bounds.values).toEqual([1, 1.5, 2, 2.5, 3]); }); it('should floor/ceil min/max if integers only', () => { - const bounds = getBounds(100, {high: 2.9, low: 1.01}, 20, true); + const bounds = getBounds(100, { high: 2.9, low: 1.01 }, 20, true); expect(bounds.min).toBe(1); expect(bounds.max).toBe(3); expect(bounds.values).toEqual([1, 2, 3]); }); it('should return neg and pos values', () => { - const bounds = getBounds(100, {high: 1.9, low: -0.9}, 20, false); + const bounds = getBounds(100, { high: 1.9, low: -0.9 }, 20, false); expect(bounds.min).toBe(-1); expect(bounds.max).toBe(2); expect(bounds.values).toEqual([-1, 0, 1, 2]); }); it('should return two steps if no space', () => { - const bounds = getBounds(100, {high: 5, low: 0}, 45, false); + const bounds = getBounds(100, { high: 5, low: 0 }, 45, false); expect(bounds.min).toBe(0); expect(bounds.max).toBe(5); expect(bounds.values).toEqual([0, 4]); }); it('should return single step if no space', () => { - const bounds = getBounds(100, {high: 5, low: 0}, 80, false); + const bounds = getBounds(100, { high: 5, low: 0 }, 80, false); expect(bounds.min).toBe(0); expect(bounds.max).toBe(5); expect(bounds.values).toEqual([0]); }); it('should return single step if range is less than epsilon', () => { - const bounds = getBounds(100, {high: 1.0000000000000002, low: 1}, 20, false); + const bounds = getBounds( + 100, + { high: 1.0000000000000002, low: 1 }, + 20, + false + ); expect(bounds.min).toBe(1); expect(bounds.max).toBe(1.0000000000000002); expect(bounds.low).toBe(1); @@ -286,7 +285,12 @@ describe('Core', () => { }); it('should return single step if range is less than smallest increment', () => { - const bounds = getBounds(613.234375, {high: 1000.0000000000001, low: 999.9999999999997}, 50, false); + const bounds = getBounds( + 613.234375, + { high: 1000.0000000000001, low: 999.9999999999997 }, + 50, + false + ); expect(bounds.min).toBe(999.9999999999999); expect(bounds.max).toBe(1000); expect(bounds.low).toBe(999.9999999999997); @@ -297,7 +301,7 @@ describe('Core', () => { describe('splitIntoSegments', () => { function makeValues(arr) { - return arr.map(x => ({value: x})); + return arr.map(x => ({ value: x })); } it('should return empty array for empty input', () => { @@ -308,16 +312,20 @@ describe('Core', () => { const coords = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]; const values = makeValues([1, undefined, undefined, 4, undefined, 6]); - expect(splitIntoSegments(coords, values)).toEqual([{ - pathCoordinates: [1, 2], - valueData: makeValues([1]) - }, { - pathCoordinates: [7, 8], - valueData: makeValues([4]) - }, { - pathCoordinates: [11, 12], - valueData: makeValues([6]) - }]); + expect(splitIntoSegments(coords, values)).toEqual([ + { + pathCoordinates: [1, 2], + valueData: makeValues([1]) + }, + { + pathCoordinates: [7, 8], + valueData: makeValues([4]) + }, + { + pathCoordinates: [11, 12], + valueData: makeValues([6]) + } + ]); }); it('should respect fillHoles option', () => { @@ -327,10 +335,12 @@ describe('Core', () => { fillHoles: true }; - expect(splitIntoSegments(coords, values, options)).toEqual([{ - pathCoordinates: [1, 2, 7, 8, 11, 12], - valueData: makeValues([1, 4, 6]) - }]); + expect(splitIntoSegments(coords, values, options)).toEqual([ + { + pathCoordinates: [1, 2, 7, 8, 11, 12], + valueData: makeValues([1, 4, 6]) + } + ]); }); it('should respect increasingX option', () => { @@ -340,16 +350,20 @@ describe('Core', () => { increasingX: true }; - expect(splitIntoSegments(coords, values, options)).toEqual([{ - pathCoordinates: [1, 2, 3, 4, 5, 6], - valueData: makeValues([1, 2, 3]) - }, { - pathCoordinates: [5, 6, 7, 8], - valueData: makeValues([4, 5]) - }, { - pathCoordinates: [1, 2], - valueData: makeValues([6]) - }]); + expect(splitIntoSegments(coords, values, options)).toEqual([ + { + pathCoordinates: [1, 2, 3, 4, 5, 6], + valueData: makeValues([1, 2, 3]) + }, + { + pathCoordinates: [5, 6, 7, 8], + valueData: makeValues([4, 5]) + }, + { + pathCoordinates: [1, 2], + valueData: makeValues([6]) + } + ]); }); }); }); diff --git a/src/core/extend.js b/src/core/extend.js index f6bd4071..73ec008d 100644 --- a/src/core/extend.js +++ b/src/core/extend.js @@ -9,11 +9,15 @@ export function extend(target = {}, ...sources) { target = target || {}; - for(let i = 0; i < sources.length; i++) { + for (let i = 0; i < sources.length; i++) { const source = sources[i]; - for(let prop in source) { + for (let prop in source) { const sourceProp = source[prop]; - if(typeof sourceProp === 'object' && sourceProp !== null && !(sourceProp instanceof Array)) { + if ( + typeof sourceProp === 'object' && + sourceProp !== null && + !(sourceProp instanceof Array) + ) { target[prop] = extend(target[prop], sourceProp); } else { target[prop] = sourceProp; diff --git a/src/core/functional.js b/src/core/functional.js index 461c5bcb..2f32e2ea 100644 --- a/src/core/functional.js +++ b/src/core/functional.js @@ -5,7 +5,7 @@ * @param {*} n This exact value will be returned by the noop function * @return {*} The same value that was provided to the n parameter */ -export const noop = (n) => n; +export const noop = n => n; /** * Functional style helper to produce array with given length initialized with undefined values @@ -14,7 +14,7 @@ export const noop = (n) => n; * @param length * @return {Array} */ -export const times = (length) => Array.from({length}); +export const times = length => Array.from({ length }); /** * Sum helper to be used in reduce functions @@ -46,5 +46,6 @@ export const sum = (previous, current) => previous + (current ? current : 0); * @return {Array} */ export const serialMap = (array, callback) => - times(Math.max(...array.map((element) => element.length))) - .map((inner, index) => callback(...array.map((element) => element[index]))); + times(Math.max(...array.map(element => element.length))).map((inner, index) => + callback(...array.map(element => element[index])) + ); diff --git a/src/core/globals.js b/src/core/globals.js index 7a86b285..e2a59178 100644 --- a/src/core/globals.js +++ b/src/core/globals.js @@ -1,4 +1,3 @@ - /** * This object contains all namespaces used within Chartist. * @@ -29,5 +28,5 @@ export let escapingMap = { '<': '&lt;', '>': '&gt;', '"': '&quot;', - '\'': '&#039;' + "'": '&#039;' }; diff --git a/src/core/lang.js b/src/core/lang.js index 72f606e6..520db6d3 100644 --- a/src/core/lang.js +++ b/src/core/lang.js @@ -29,9 +29,11 @@ export function querySelector(query) { * @returns {boolean} Returns true if the object owns the specified property */ export function safeHasProperty(object, property) { - return object !== null && + return ( + object !== null && typeof object === 'object' && - object.hasOwnProperty(property); + Reflect.has(object, property) + ); } /** @@ -76,7 +78,7 @@ export function getNumberOrUndefined(value) { * @return {String} Returns the passed number value with unit. */ export function ensureUnit(value, unit) { - if(typeof value === 'number') { + if (typeof value === 'number') { value = value + unit; } @@ -91,8 +93,8 @@ export function ensureUnit(value, unit) { * @return {Object} Returns an object containing the value as number and the unit as string. */ export function quantity(input) { - if(typeof input === 'string') { - const match = (/^(\d+)\s*(.*)$/g).exec(input); + if (typeof input === 'string') { + const match = /^(\d+)\s*(.*)$/g.exec(input); return { value: +match[1], unit: match[2] || undefined @@ -113,5 +115,5 @@ export function quantity(input) { */ export function alphaNumerate(n) { // Limit to a-z - return String.fromCharCode(97 + n % 26); + return String.fromCharCode(97 + (n % 26)); } diff --git a/src/core/lang.spec.js b/src/core/lang.spec.js index 6e011aa6..14f6fd82 100644 --- a/src/core/lang.spec.js +++ b/src/core/lang.spec.js @@ -1,25 +1,25 @@ -import {quantity} from './lang'; +import { quantity } from './lang'; describe('Core', () => { describe('Lang', () => { describe('quantity', () => { it('should return value for numbers', () => { - expect(quantity(100)).toEqual({value: 100}); - expect(quantity(0)).toEqual({value: 0}); - expect(quantity(NaN)).toEqual({value: NaN}); - expect(quantity(null)).toEqual({value: null}); - expect(quantity(undefined)).toEqual({value: undefined}); + expect(quantity(100)).toEqual({ value: 100 }); + expect(quantity(0)).toEqual({ value: 0 }); + expect(quantity(NaN)).toEqual({ value: NaN }); + expect(quantity(null)).toEqual({ value: null }); + expect(quantity(undefined)).toEqual({ value: undefined }); }); it('should return value without unit from string', () => { - expect(quantity('100')).toEqual({value: 100, unit: undefined}); - expect(quantity('0')).toEqual({value: 0, unit: undefined}); + expect(quantity('100')).toEqual({ value: 100, unit: undefined }); + expect(quantity('0')).toEqual({ value: 0, unit: undefined }); }); it('should return value and unit from string', () => { - expect(quantity('100%')).toEqual({value: 100, unit: '%'}); - expect(quantity('100 %')).toEqual({value: 100, unit: '%'}); - expect(quantity('0px')).toEqual({value: 0, unit: 'px'}); + expect(quantity('100%')).toEqual({ value: 100, unit: '%' }); + expect(quantity('100 %')).toEqual({ value: 100, unit: '%' }); + expect(quantity('0px')).toEqual({ value: 0, unit: 'px' }); }); }); }); diff --git a/src/core/math.js b/src/core/math.js index d6b21ede..917bf9ef 100644 --- a/src/core/math.js +++ b/src/core/math.js @@ -1,6 +1,6 @@ -import {precision as globalPrecision} from './globals'; +import { precision as globalPrecision } from './globals'; -export const EPSILON = 2.221E-16; +export const EPSILON = 2.221e-16; /** * Calculate the order of magnitude for the chart scale @@ -23,7 +23,7 @@ export function orderOfMagnitude(value) { * @return {Number} The projected data length in pixels */ export function projectLength(axisLength, length, bounds) { - return length / bounds.range * axisLength; + return (length / bounds.range) * axisLength; } /** @@ -47,12 +47,12 @@ export function roundWithPrecision(value, digits) { * @returns {Number} The smallest integer factor of the parameter num. */ export function rho(num) { - if(num === 1) { + if (num === 1) { return num; } function gcd(p, q) { - if(p % q === 0) { + if (p % q === 0) { return q; } else { return gcd(q, p % q); @@ -66,7 +66,7 @@ export function rho(num) { let x1 = 2; let x2 = 2; let divisor; - if(num % 2 === 0) { + if (num % 2 === 0) { return 2; } @@ -74,7 +74,7 @@ export function rho(num) { x1 = f(x1) % num; x2 = f(f(x2)) % num; divisor = gcd(Math.abs(x1 - x2), num); - } while(divisor === 1); + } while (divisor === 1); return divisor; } @@ -90,10 +90,10 @@ export function rho(num) { * @return {{x:Number, y:Number}} Coordinates of point on circumference */ export function polarToCartesian(centerX, centerY, radius, angleInDegrees) { - const angleInRadians = (angleInDegrees - 90) * Math.PI / 180.0; + const angleInRadians = ((angleInDegrees - 90) * Math.PI) / 180.0; return { - x: centerX + (radius * Math.cos(angleInRadians)), - y: centerY + (radius * Math.sin(angleInRadians)) + x: centerX + radius * Math.cos(angleInRadians), + y: centerY + radius * Math.sin(angleInRadians) }; } diff --git a/src/core/options-provider.js b/src/core/options-provider.js index aca37498..e9f4c0e6 100644 --- a/src/core/options-provider.js +++ b/src/core/options-provider.js @@ -1,4 +1,4 @@ -import {extend} from './extend'; +import { extend } from './extend'; /** * Provides options handling functionality with callback for options changes triggered by responsive options and media query matches @@ -18,16 +18,16 @@ export function optionsProvider(options, responsiveOptions, eventEmitter) { const previousOptions = currentOptions; currentOptions = extend({}, baseOptions); - if(responsiveOptions) { - responsiveOptions.forEach((responsiveOption) => { + if (responsiveOptions) { + responsiveOptions.forEach(responsiveOption => { const mql = window.matchMedia(responsiveOption[0]); - if(mql.matches) { + if (mql.matches) { currentOptions = extend(currentOptions, responsiveOption[1]); } }); } - if(eventEmitter && mediaEvent) { + if (eventEmitter && mediaEvent) { eventEmitter.emit('optionsChanged', { previousOptions, currentOptions @@ -36,13 +36,17 @@ export function optionsProvider(options, responsiveOptions, eventEmitter) { } function removeMediaQueryListeners() { - mediaQueryListeners.forEach((mql) => mql.removeListener(updateCurrentOptions)); + mediaQueryListeners.forEach(mql => + mql.removeListener(updateCurrentOptions) + ); } - if(!window.matchMedia) { - throw new Error('window.matchMedia not found! Make sure you\'re using a polyfill.'); - } else if(responsiveOptions) { - responsiveOptions.forEach((responsiveOption) => { + if (!window.matchMedia) { + throw new Error( + "window.matchMedia not found! Make sure you're using a polyfill." + ); + } else if (responsiveOptions) { + responsiveOptions.forEach(responsiveOption => { const mql = window.matchMedia(responsiveOption[0]); mql.addListener(updateCurrentOptions); mediaQueryListeners.push(mql); diff --git a/src/event/event-emitter.js b/src/event/event-emitter.js index d75966eb..2ab62345 100644 --- a/src/event/event-emitter.js +++ b/src/event/event-emitter.js @@ -24,11 +24,11 @@ export class EventEmitter { */ removeEventHandler(event, handler) { // Only do something if there are event handlers with this name existing - if(this.handlers[event]) { + if (this.handlers[event]) { // If handler is set we will look for a specific handler and only remove this - if(handler) { + if (handler) { this.handlers[event].splice(this.handlers[event].indexOf(handler), 1); - if(this.handlers[event].length === 0) { + if (this.handlers[event].length === 0) { delete this.handlers[event]; } } else { @@ -47,13 +47,13 @@ export class EventEmitter { */ emit(event, data) { // Only do something if there are event handlers with this name existing - if(this.handlers[event]) { - this.handlers[event].forEach((handler) => handler(data)); + if (this.handlers[event]) { + this.handlers[event].forEach(handler => handler(data)); } // Emit event to star event handlers - if(this.handlers['*']) { - this.handlers['*'].forEach((starHandler) => starHandler(event, data)); + if (this.handlers['*']) { + this.handlers['*'].forEach(starHandler => starHandler(event, data)); } } } diff --git a/src/index.js b/src/index.js index b2dad7d9..72759cf6 100644 --- a/src/index.js +++ b/src/index.js @@ -1,11 +1,9 @@ export * from './core/core'; -export {EventEmitter} from './event/event-emitter'; +export { EventEmitter } from './event/event-emitter'; export * from './charts/charts'; export * from './axes/axes'; import * as Interpolation from './interpolation/interpolation'; -export { - Interpolation -}; +export { Interpolation }; export * from './svg/svg'; export * from './svg/svg-list'; export * from './svg/svg-path'; diff --git a/src/interpolation/cardinal.js b/src/interpolation/cardinal.js index ecf982f3..6fe2664c 100644 --- a/src/interpolation/cardinal.js +++ b/src/interpolation/cardinal.js @@ -1,6 +1,6 @@ -import {extend, splitIntoSegments} from '../core/core'; -import {SvgPath} from '../svg/svg-path'; -import {none} from './none'; +import { extend, splitIntoSegments } from '../core/core'; +import { SvgPath } from '../svg/svg-path'; +import { none } from './none'; /** * Cardinal / Catmull-Rome spline interpolation is the default smoothing function in Chartist. It produces nice results where the splines will always meet the points. It produces some artifacts though when data values are increased or decreased rapidly. The line may not follow a very accurate path and if the line should be accurate this smoothing function does not produce the best results. @@ -11,14 +11,14 @@ import {none} from './none'; * * @example * var chart = new Chartist.Line('.ct-chart', { - * labels: [1, 2, 3, 4, 5], - * series: [[1, 2, 8, 1, 7]] - * }, { - * lineSmooth: Chartist.Interpolation.cardinal({ - * tension: 1, - * fillHoles: false - * }) - * }); + * labels: [1, 2, 3, 4, 5], + * series: [[1, 2, 8, 1, 7]] + * }, { + * lineSmooth: Chartist.Interpolation.cardinal({ + * tension: 1, + * fillHoles: false + * }) + * }); * * @memberof Chartist.Interpolation * @param {Object} options The options of the cardinal factory function. @@ -42,16 +42,18 @@ export function cardinal(options) { fillHoles: options.fillHoles }); - if(!segments.length) { + if (!segments.length) { // If there were no segments return 'none' interpolation return none()([]); - } else if(segments.length > 1) { + } else if (segments.length > 1) { // If the split resulted in more that one segment we need to interpolate each segment individually and join them // afterwards together into a single path. // For each segment we will recurse the cardinal function // Join the segment path data into a single path and return return SvgPath.join( - segments.map((segment) => cardinalInterpolation(segment.pathCoordinates, segment.valueData)) + segments.map(segment => + cardinalInterpolation(segment.pathCoordinates, segment.valueData) + ) ); } else { // If there was only one segment we can proceed regularly by using pathCoordinates and valueData from the first @@ -60,43 +62,55 @@ export function cardinal(options) { valueData = segments[0].valueData; // If less than two points we need to fallback to no smoothing - if(pathCoordinates.length <= 4) { + if (pathCoordinates.length <= 4) { return none()(pathCoordinates, valueData); } - const path = new SvgPath().move(pathCoordinates[0], pathCoordinates[1], false, valueData[0]); + const path = new SvgPath().move( + pathCoordinates[0], + pathCoordinates[1], + false, + valueData[0] + ); let z; - for(let i = 0, iLen = pathCoordinates.length; iLen - 2 * !z > i; i += 2) { + for ( + let i = 0, iLen = pathCoordinates.length; + iLen - 2 * !z > i; + i += 2 + ) { const p = [ - {x: +pathCoordinates[i - 2], y: +pathCoordinates[i - 1]}, - {x: +pathCoordinates[i], y: +pathCoordinates[i + 1]}, - {x: +pathCoordinates[i + 2], y: +pathCoordinates[i + 3]}, - {x: +pathCoordinates[i + 4], y: +pathCoordinates[i + 5]} + { x: +pathCoordinates[i - 2], y: +pathCoordinates[i - 1] }, + { x: +pathCoordinates[i], y: +pathCoordinates[i + 1] }, + { x: +pathCoordinates[i + 2], y: +pathCoordinates[i + 3] }, + { x: +pathCoordinates[i + 4], y: +pathCoordinates[i + 5] } ]; - if(z) { - if(!i) { - p[0] = {x: +pathCoordinates[iLen - 2], y: +pathCoordinates[iLen - 1]}; - } else if(iLen - 4 === i) { - p[3] = {x: +pathCoordinates[0], y: +pathCoordinates[1]}; - } else if(iLen - 2 === i) { - p[2] = {x: +pathCoordinates[0], y: +pathCoordinates[1]}; - p[3] = {x: +pathCoordinates[2], y: +pathCoordinates[3]}; + if (z) { + if (!i) { + p[0] = { + x: +pathCoordinates[iLen - 2], + y: +pathCoordinates[iLen - 1] + }; + } else if (iLen - 4 === i) { + p[3] = { x: +pathCoordinates[0], y: +pathCoordinates[1] }; + } else if (iLen - 2 === i) { + p[2] = { x: +pathCoordinates[0], y: +pathCoordinates[1] }; + p[3] = { x: +pathCoordinates[2], y: +pathCoordinates[3] }; } } else { - if(iLen - 4 === i) { + if (iLen - 4 === i) { p[3] = p[2]; - } else if(!i) { - p[0] = {x: +pathCoordinates[i], y: +pathCoordinates[i + 1]}; + } else if (!i) { + p[0] = { x: +pathCoordinates[i], y: +pathCoordinates[i + 1] }; } } path.curve( - (t * (-p[0].x + 6 * p[1].x + p[2].x) / 6) + (c * p[2].x), - (t * (-p[0].y + 6 * p[1].y + p[2].y) / 6) + (c * p[2].y), - (t * (p[1].x + 6 * p[2].x - p[3].x) / 6) + (c * p[2].x), - (t * (p[1].y + 6 * p[2].y - p[3].y) / 6) + (c * p[2].y), + (t * (-p[0].x + 6 * p[1].x + p[2].x)) / 6 + c * p[2].x, + (t * (-p[0].y + 6 * p[1].y + p[2].y)) / 6 + c * p[2].y, + (t * (p[1].x + 6 * p[2].x - p[3].x)) / 6 + c * p[2].x, + (t * (p[1].y + 6 * p[2].y - p[3].y)) / 6 + c * p[2].y, p[2].x, p[2].y, false, diff --git a/src/interpolation/interpolation.js b/src/interpolation/interpolation.js index 439af287..e6df59d9 100644 --- a/src/interpolation/interpolation.js +++ b/src/interpolation/interpolation.js @@ -1,5 +1,5 @@ -export {none} from './none'; -export {simple} from './simple'; -export {step} from './step'; -export {cardinal} from './cardinal'; -export {monotoneCubic} from './monotone-cubic'; +export { none } from './none'; +export { simple } from './simple'; +export { step } from './step'; +export { cardinal } from './cardinal'; +export { monotoneCubic } from './monotone-cubic'; diff --git a/src/interpolation/monotone-cubic.js b/src/interpolation/monotone-cubic.js index 00469598..9519fc8f 100644 --- a/src/interpolation/monotone-cubic.js +++ b/src/interpolation/monotone-cubic.js @@ -1,6 +1,6 @@ -import {extend, splitIntoSegments} from '../core/core'; -import {SvgPath} from '../svg/svg-path'; -import {none} from './none'; +import { extend, splitIntoSegments } from '../core/core'; +import { SvgPath } from '../svg/svg-path'; +import { none } from './none'; /** * Monotone Cubic spline interpolation produces a smooth curve which preserves monotonicity. Unlike cardinal splines, the curve will not extend beyond the range of y-values of the original data points. @@ -13,13 +13,13 @@ import {none} from './none'; * * @example * var chart = new Chartist.Line('.ct-chart', { - * labels: [1, 2, 3, 4, 5], - * series: [[1, 2, 8, 1, 7]] - * }, { - * lineSmooth: Chartist.Interpolation.monotoneCubic({ - * fillHoles: false - * }) - * }); + * labels: [1, 2, 3, 4, 5], + * series: [[1, 2, 8, 1, 7]] + * }, { + * lineSmooth: Chartist.Interpolation.monotoneCubic({ + * fillHoles: false + * }) + * }); * * @memberof Chartist.Interpolation * @param {Object} [options] The options of the monotoneCubic factory function. @@ -40,16 +40,18 @@ export function monotoneCubic(options) { increasingX: true }); - if(!segments.length) { + if (!segments.length) { // If there were no segments return 'Chartist.Interpolation.none' return none()([]); - } else if(segments.length > 1) { + } else if (segments.length > 1) { // If the split resulted in more that one segment we need to interpolate each segment individually and join them // afterwards together into a single path. // For each segment we will recurse the monotoneCubic fn function // Join the segment path data into a single path and return return SvgPath.join( - segments.map((segment) => monotoneCubicInterpolation(segment.pathCoordinates, segment.valueData)) + segments.map(segment => + monotoneCubicInterpolation(segment.pathCoordinates, segment.valueData) + ) ); } else { // If there was only one segment we can proceed regularly by using pathCoordinates and valueData from the first @@ -58,7 +60,7 @@ export function monotoneCubic(options) { valueData = segments[0].valueData; // If less than three points we need to fallback to no smoothing - if(pathCoordinates.length <= 4) { + if (pathCoordinates.length <= 4) { return none()(pathCoordinates, valueData); } @@ -71,13 +73,13 @@ export function monotoneCubic(options) { const dxs = []; // Populate x and y coordinates into separate arrays, for readability - for(let i = 0; i < n; i++) { + for (let i = 0; i < n; i++) { xs[i] = pathCoordinates[i * 2]; ys[i] = pathCoordinates[i * 2 + 1]; } // Calculate deltas and derivative - for(let i = 0; i < n - 1; i++) { + for (let i = 0; i < n - 1; i++) { dys[i] = ys[i + 1] - ys[i]; dxs[i] = xs[i + 1] - xs[i]; ds[i] = dys[i] / dxs[i]; @@ -88,15 +90,16 @@ export function monotoneCubic(options) { ms[0] = ds[0]; ms[n - 1] = ds[n - 2]; - for(let i = 1; i < n - 1; i++) { - if(ds[i] === 0 || ds[i - 1] === 0 || (ds[i - 1] > 0) !== (ds[i] > 0)) { + for (let i = 1; i < n - 1; i++) { + if (ds[i] === 0 || ds[i - 1] === 0 || ds[i - 1] > 0 !== ds[i] > 0) { ms[i] = 0; } else { - ms[i] = 3 * (dxs[i - 1] + dxs[i]) / ( - (2 * dxs[i] + dxs[i - 1]) / ds[i - 1] + - (dxs[i] + 2 * dxs[i - 1]) / ds[i]); + ms[i] = + (3 * (dxs[i - 1] + dxs[i])) / + ((2 * dxs[i] + dxs[i - 1]) / ds[i - 1] + + (dxs[i] + 2 * dxs[i - 1]) / ds[i]); - if(!isFinite(ms[i])) { + if (!isFinite(ms[i])) { ms[i] = 0; } } @@ -105,14 +108,14 @@ export function monotoneCubic(options) { // Now build a path from the slopes const path = new SvgPath().move(xs[0], ys[0], false, valueData[0]); - for(let i = 0; i < n - 1; i++) { + for (let i = 0; i < n - 1; i++) { path.curve( // First control point xs[i] + dxs[i] / 3, - ys[i] + ms[i] * dxs[i] / 3, + ys[i] + (ms[i] * dxs[i]) / 3, // Second control point xs[i + 1] - dxs[i] / 3, - ys[i + 1] - ms[i + 1] * dxs[i] / 3, + ys[i + 1] - (ms[i + 1] * dxs[i]) / 3, // End point xs[i + 1], ys[i + 1], diff --git a/src/interpolation/none.js b/src/interpolation/none.js index 90c64246..2077ff84 100644 --- a/src/interpolation/none.js +++ b/src/interpolation/none.js @@ -1,5 +1,5 @@ -import {extend, getMultiValue} from '../core/core'; -import {SvgPath} from '../svg/svg-path'; +import { extend, getMultiValue } from '../core/core'; +import { SvgPath } from '../svg/svg-path'; /** * This interpolation function does not smooth the path and the result is only containing lines and no curves. @@ -29,21 +29,20 @@ export function none(options) { const path = new SvgPath(); let hole = true; - for(let i = 0; i < pathCoordinates.length; i += 2) { + for (let i = 0; i < pathCoordinates.length; i += 2) { const currX = pathCoordinates[i]; const currY = pathCoordinates[i + 1]; const currData = valueData[i / 2]; - if(getMultiValue(currData.value) !== undefined) { - - if(hole) { + if (getMultiValue(currData.value) !== undefined) { + if (hole) { path.move(currX, currY, false, currData); } else { path.line(currX, currY, false, currData); } hole = false; - } else if(!options.fillHoles) { + } else if (!options.fillHoles) { hole = true; } } diff --git a/src/interpolation/simple.js b/src/interpolation/simple.js index 839d6c3b..20e4576f 100644 --- a/src/interpolation/simple.js +++ b/src/interpolation/simple.js @@ -1,5 +1,5 @@ -import {extend} from '../core/core'; -import {SvgPath} from '../svg/svg-path'; +import { extend } from '../core/core'; +import { SvgPath } from '../svg/svg-path'; /** * Simple smoothing creates horizontal handles that are positioned with a fraction of the length between two data points. You can use the divisor option to specify the amount of smoothing. @@ -10,14 +10,14 @@ import {SvgPath} from '../svg/svg-path'; * * @example * var chart = new Chartist.Line('.ct-chart', { - * labels: [1, 2, 3, 4, 5], - * series: [[1, 2, 8, 1, 7]] - * }, { - * lineSmooth: Chartist.Interpolation.simple({ - * divisor: 2, - * fillHoles: false - * }) - * }); + * labels: [1, 2, 3, 4, 5], + * series: [[1, 2, 8, 1, 7]] + * }, { + * lineSmooth: Chartist.Interpolation.simple({ + * divisor: 2, + * fillHoles: false + * }) + * }); * * * @memberof Chartist.Interpolation @@ -40,15 +40,14 @@ export function simple(options) { let prevY; let prevData; - for(let i = 0; i < pathCoordinates.length; i += 2) { + for (let i = 0; i < pathCoordinates.length; i += 2) { const currX = pathCoordinates[i]; const currY = pathCoordinates[i + 1]; const length = (currX - prevX) * d; const currData = valueData[i / 2]; - if(currData.value !== undefined) { - - if(prevData === undefined) { + if (currData.value !== undefined) { + if (prevData === undefined) { path.move(currX, currY, false, currData); } else { path.curve( @@ -66,7 +65,7 @@ export function simple(options) { prevX = currX; prevY = currY; prevData = currData; - } else if(!options.fillHoles) { + } else if (!options.fillHoles) { prevX = prevY = prevData = undefined; } } diff --git a/src/interpolation/step.js b/src/interpolation/step.js index 91513f28..1eafeb01 100644 --- a/src/interpolation/step.js +++ b/src/interpolation/step.js @@ -1,5 +1,5 @@ -import {extend} from '../core/core'; -import {SvgPath} from '../svg/svg-path'; +import { extend } from '../core/core'; +import { SvgPath } from '../svg/svg-path'; /** * Step interpolation will cause the line chart to move in steps rather than diagonal or smoothed lines. This interpolation will create additional points that will also be drawn when the `showPoint` option is enabled. @@ -8,14 +8,14 @@ import {SvgPath} from '../svg/svg-path'; * * @example * var chart = new Chartist.Line('.ct-chart', { - * labels: [1, 2, 3, 4, 5], - * series: [[1, 2, 8, 1, 7]] - * }, { - * lineSmooth: Chartist.Interpolation.step({ - * postpone: true, - * fillHoles: false - * }) - * }); + * labels: [1, 2, 3, 4, 5], + * series: [[1, 2, 8, 1, 7]] + * }, { + * lineSmooth: Chartist.Interpolation.step({ + * postpone: true, + * fillHoles: false + * }) + * }); * * @memberof Chartist.Interpolation * @param options @@ -36,17 +36,17 @@ export function step(options) { let prevY; let prevData; - for(let i = 0; i < pathCoordinates.length; i += 2) { + for (let i = 0; i < pathCoordinates.length; i += 2) { const currX = pathCoordinates[i]; const currY = pathCoordinates[i + 1]; const currData = valueData[i / 2]; // If the current point is also not a hole we can draw the step lines - if(currData.value !== undefined) { - if(prevData === undefined) { + if (currData.value !== undefined) { + if (prevData === undefined) { path.move(currX, currY, false, currData); } else { - if(options.postpone) { + if (options.postpone) { // If postponed we should draw the step line with the value of the previous value path.line(currX, prevY, false, prevData); } else { @@ -60,7 +60,7 @@ export function step(options) { prevX = currX; prevY = currY; prevData = currData; - } else if(!options.fillHoles) { + } else if (!options.fillHoles) { prevX = prevY = prevData = undefined; } } diff --git a/src/svg/svg-list.js b/src/svg/svg-list.js index aec6746a..458e1485 100644 --- a/src/svg/svg-list.js +++ b/src/svg/svg-list.js @@ -1,4 +1,4 @@ -import {Svg} from './svg'; +import { Svg } from './svg'; /** * This helper class is to wrap multiple `Svg` elements into a list where you can call the `Svg` functions on all elements in the list with one call. This is helpful when you'd like to perform calls with `Svg` on multiple elements. @@ -13,27 +13,32 @@ export class SvgList { const list = this; this.svgElements = []; - for(let i = 0; i < nodeList.length; i++) { + for (let i = 0; i < nodeList.length; i++) { this.svgElements.push(new Svg(nodeList[i])); } // Add delegation methods for Svg - Object.keys(Svg.prototype).filter((prototypeProperty) => [ - 'constructor', - 'parent', - 'querySelector', - 'querySelectorAll', - 'replace', - 'append', - 'classes', - 'height', - 'width' - ].indexOf(prototypeProperty) === -1) - .forEach((prototypeProperty) => { + Object.keys(Svg.prototype) + .filter( + prototypeProperty => + [ + 'constructor', + 'parent', + 'querySelector', + 'querySelectorAll', + 'replace', + 'append', + 'classes', + 'height', + 'width' + ].indexOf(prototypeProperty) === -1 + ) + .forEach(prototypeProperty => { list[prototypeProperty] = () => { const args = Array.from(arguments); - list.svgElements.forEach((element) => - Svg.prototype[prototypeProperty].apply(element, args)); + list.svgElements.forEach(element => + Svg.prototype[prototypeProperty].apply(element, args) + ); return list; }; }); diff --git a/src/svg/svg-path.js b/src/svg/svg-path.js index c59d6d18..14bbc970 100644 --- a/src/svg/svg-path.js +++ b/src/svg/svg-path.js @@ -1,4 +1,4 @@ -import {extend} from '../core/core'; +import { extend } from '../core/core'; /** * Contains the descriptors of supported element types in a SVG path. Currently only move, line and curve are supported. @@ -25,18 +25,24 @@ const defaultOptions = { }; function element(command, params, pathElements, pos, relative, data) { - const pathElement = extend({ - command: relative ? command.toLowerCase() : command.toUpperCase() - }, params, data ? {data: data} : {}); + const pathElement = extend( + { + command: relative ? command.toLowerCase() : command.toUpperCase() + }, + params, + data ? { data: data } : {} + ); pathElements.splice(pos, 0, pathElement); } function forEachParam(pathElements, cb) { pathElements.forEach((pathElement, pathElementIndex) => { - elementDescriptions[pathElement.command.toLowerCase()].forEach((paramName, paramIndex) => { - cb(pathElement, paramName, pathElementIndex, paramIndex, pathElements); - }); + elementDescriptions[pathElement.command.toLowerCase()].forEach( + (paramName, paramIndex) => { + cb(pathElement, paramName, pathElementIndex, paramIndex, pathElements); + } + ); }); } @@ -60,9 +66,9 @@ export class SvgPath { */ static join(paths, close, options) { const joinedPath = new SvgPath(close, options); - for(let i = 0; i < paths.length; i++) { + for (let i = 0; i < paths.length; i++) { const path = paths[i]; - for(let j = 0; j < path.pathElements.length; j++) { + for (let j = 0; j < path.pathElements.length; j++) { joinedPath.pathElements.push(path.pathElements[j]); } } @@ -84,7 +90,7 @@ export class SvgPath { * @return {SvgPath|Number} If the position parameter was passed then the return value will be the path object for easy call chaining. If no position parameter was passed then the current position is returned. */ position(pos) { - if(pos !== undefined) { + if (pos !== undefined) { this.pos = Math.max(0, Math.min(this.pathElements.length, pos)); return this; } else { @@ -115,10 +121,17 @@ export class SvgPath { * @return {SvgPath} The current path object for easy call chaining. */ move(x, y, relative, data) { - element('M', { - x: +x, - y: +y - }, this.pathElements, this.pos++, relative, data); + element( + 'M', + { + x: +x, + y: +y + }, + this.pathElements, + this.pos++, + relative, + data + ); return this; } @@ -133,10 +146,17 @@ export class SvgPath { * @return {SvgPath} The current path object for easy call chaining. */ line(x, y, relative, data) { - element('L', { - x: +x, - y: +y - }, this.pathElements, this.pos++, relative, data); + element( + 'L', + { + x: +x, + y: +y + }, + this.pathElements, + this.pos++, + relative, + data + ); return this; } @@ -155,14 +175,21 @@ export class SvgPath { * @return {SvgPath} The current path object for easy call chaining. */ curve(x1, y1, x2, y2, x, y, relative, data) { - element('C', { - x1: +x1, - y1: +y1, - x2: +x2, - y2: +y2, - x: +x, - y: +y - }, this.pathElements, this.pos++, relative, data); + element( + 'C', + { + x1: +x1, + y1: +y1, + x2: +x2, + y2: +y2, + x: +x, + y: +y + }, + this.pathElements, + this.pos++, + relative, + data + ); return this; } @@ -182,15 +209,22 @@ export class SvgPath { * @return {SvgPath} The current path object for easy call chaining. */ arc(rx, ry, xAr, lAf, sf, x, y, relative, data) { - element('A', { - rx: +rx, - ry: +ry, - xAr: +xAr, - lAf: +lAf, - sf: +sf, - x: +x, - y: +y - }, this.pathElements, this.pos++, relative, data); + element( + 'A', + { + rx: +rx, + ry: +ry, + xAr: +xAr, + lAf: +lAf, + sf: +sf, + x: +x, + y: +y + }, + this.pathElements, + this.pos++, + relative, + data + ); return this; } @@ -203,11 +237,12 @@ export class SvgPath { */ parse(path) { // Parsing the SVG path string into an array of arrays [['M', '10', '10'], ['L', '100', '100']] - const chunks = path.replace(/([A-Za-z])([0-9])/g, '$1 $2') + const chunks = path + .replace(/([A-Za-z])([0-9])/g, '$1 $2') .replace(/([0-9])([A-Za-z])/g, '$1 $2') .split(/[\s,]+/) .reduce((result, pathElement) => { - if(pathElement.match(/[A-Za-z]/)) { + if (pathElement.match(/[A-Za-z]/)) { result.push([]); } @@ -216,22 +251,25 @@ export class SvgPath { }, []); // If this is a closed path we remove the Z at the end because this is determined by the close option - if(chunks[chunks.length - 1][0].toUpperCase() === 'Z') { + if (chunks[chunks.length - 1][0].toUpperCase() === 'Z') { chunks.pop(); } // Using svgPathElementDescriptions to map raw path arrays into objects that contain the command and the parameters // For example {command: 'M', x: '10', y: '10'} - const elements = chunks.map((chunk) => { + const elements = chunks.map(chunk => { const command = chunk.shift(); const description = elementDescriptions[command.toLowerCase()]; - return extend({ - command: command - }, description.reduce((result, paramName, index) => { - result[paramName] = +chunk[index]; - return result; - }, {})); + return extend( + { + command: command + }, + description.reduce((result, paramName, index) => { + result[paramName] = +chunk[index]; + return result; + }, {}) + ); }); // Preparing a splice call with the elements array as var arg params and insert the parsed elements at the current position @@ -251,15 +289,20 @@ export class SvgPath { stringify() { const accuracyMultiplier = Math.pow(10, this.options.accuracy); - return this.pathElements.reduce((path, pathElement) => { - const params = elementDescriptions[pathElement.command.toLowerCase()].map((paramName) => - this.options.accuracy ? - (Math.round(pathElement[paramName] * accuracyMultiplier) / accuracyMultiplier) : - pathElement[paramName] + return ( + this.pathElements.reduce((path, pathElement) => { + const params = elementDescriptions[ + pathElement.command.toLowerCase() + ].map(paramName => + this.options.accuracy + ? Math.round(pathElement[paramName] * accuracyMultiplier) / + accuracyMultiplier + : pathElement[paramName] ); return path + pathElement.command + params.join(','); - }, '') + (this.close ? 'Z' : ''); + }, '') + (this.close ? 'Z' : '') + ); } /** @@ -271,8 +314,10 @@ export class SvgPath { * @return {SvgPath} The current path object for easy call chaining. */ scale(x, y) { - forEachParam(this.pathElements, (pathElement, paramName) => - pathElement[paramName] *= paramName[0] === 'x' ? x : y + forEachParam( + this.pathElements, + (pathElement, paramName) => + (pathElement[paramName] *= paramName[0] === 'x' ? x : y) ); return this; } @@ -286,8 +331,10 @@ export class SvgPath { * @return {SvgPath} The current path object for easy call chaining. */ translate(x, y) { - forEachParam(this.pathElements, (pathElement, paramName) => - pathElement[paramName] += paramName[0] === 'x' ? x : y + forEachParam( + this.pathElements, + (pathElement, paramName) => + (pathElement[paramName] += paramName[0] === 'x' ? x : y) ); return this; } @@ -305,12 +352,21 @@ export class SvgPath { * @return {SvgPath} The current path object for easy call chaining. */ transform(transformFnc) { - forEachParam(this.pathElements, (pathElement, paramName, pathElementIndex, paramIndex, pathElements) => { - const transformed = transformFnc(pathElement, paramName, pathElementIndex, paramIndex, pathElements); - if(transformed || transformed === 0) { - pathElement[paramName] = transformed; + forEachParam( + this.pathElements, + (pathElement, paramName, pathElementIndex, paramIndex, pathElements) => { + const transformed = transformFnc( + pathElement, + paramName, + pathElementIndex, + paramIndex, + pathElements + ); + if (transformed || transformed === 0) { + pathElement[paramName] = transformed; + } } - }); + ); return this; } @@ -324,7 +380,9 @@ export class SvgPath { clone(close) { const clone = new SvgPath(close || this.close); clone.pos = this.pos; - clone.pathElements = this.pathElements.slice().map((pathElement) => extend({}, pathElement)); + clone.pathElements = this.pathElements + .slice() + .map(pathElement => extend({}, pathElement)); clone.options = extend({}, this.options); return clone; } @@ -337,12 +395,13 @@ export class SvgPath { * @return {Array<SvgPath>} */ splitByCommand(command) { - const split = [ - new SvgPath() - ]; + const split = [new SvgPath()]; - this.pathElements.forEach((pathElement) => { - if(pathElement.command === command.toUpperCase() && split[split.length - 1].pathElements.length !== 0) { + this.pathElements.forEach(pathElement => { + if ( + pathElement.command === command.toUpperCase() && + split[split.length - 1].pathElements.length !== 0 + ) { split.push(new SvgPath()); } diff --git a/src/svg/svg-path.spec.js b/src/svg/svg-path.spec.js index cb5420ce..292dbf65 100644 --- a/src/svg/svg-path.spec.js +++ b/src/svg/svg-path.spec.js @@ -1,4 +1,4 @@ -import {SvgPath} from './svg-path'; +import { SvgPath } from './svg-path'; describe('Svg', () => { describe('SvgPath', () => { @@ -23,12 +23,12 @@ describe('Svg', () => { expect(path.pathElements.length).toBe(6); expect(path.pathElements).toEqual([ - {command: 'M', x: 1, y: 2}, - {command: 'm', x: 3, y: 4}, - {command: 'L', x: 5, y: 6}, - {command: 'l', x: 7, y: 8}, - {command: 'C', x1: 9, y1: 10, x2: 11, y2: 12, x: 13, y: 14}, - {command: 'c', x1: 15, y1: 16, x2: 17, y2: 18, x: 19, y: 20} + { command: 'M', x: 1, y: 2 }, + { command: 'm', x: 3, y: 4 }, + { command: 'L', x: 5, y: 6 }, + { command: 'l', x: 7, y: 8 }, + { command: 'C', x1: 9, y1: 10, x2: 11, y2: 12, x: 13, y: 14 }, + { command: 'c', x1: 15, y1: 16, x2: 17, y2: 18, x: 19, y: 20 } ]); }); @@ -47,25 +47,32 @@ describe('Svg', () => { expect(path.pathElements.length).toBe(7); expect(path.pathElements).toEqual([ - {command: 'M', x: -1, y: 0}, - {command: 'M', x: 1, y: 2}, - {command: 'M', x: 3, y: 4}, - {command: 'M', x: 5, y: 6}, - {command: 'M', x: 7, y: 8}, - {command: 'M', x: 9, y: 10}, - {command: 'M', x: 11, y: 12} + { command: 'M', x: -1, y: 0 }, + { command: 'M', x: 1, y: 2 }, + { command: 'M', x: 3, y: 4 }, + { command: 'M', x: 5, y: 6 }, + { command: 'M', x: 7, y: 8 }, + { command: 'M', x: 9, y: 10 }, + { command: 'M', x: 11, y: 12 } ]); }); it('should stringify simple shape correctly', () => { - const path = new SvgPath(true).move(10, 10).line(10, 100).line(100, 100).line(100, 10); + const path = new SvgPath(true) + .move(10, 10) + .line(10, 100) + .line(100, 100) + .line(100, 10); expect(path.stringify()).toEqual('M10,10L10,100L100,100L100,10Z'); }); it('should stringify with configured precision', () => { const path = new SvgPath(false, { accuracy: 2 - }).move(10.12345, 10.14345).line(10.14545, 10).line(10.14000000645, 10.3333333333); + }) + .move(10.12345, 10.14345) + .line(10.14545, 10) + .line(10.14000000645, 10.3333333333); expect(path.stringify()).toEqual('M10.12,10.14L10.15,10L10.14,10.33'); }); @@ -75,20 +82,32 @@ describe('Svg', () => { }); it('should parse MDN SVG path style correctly', () => { - const path = new SvgPath().parse('M10 10 L 10 100 L 100 100 L 100 10 C 1 1, 1 1, 1 1'); - expect(path.stringify()).toEqual('M10,10L10,100L100,100L100,10C1,1,1,1,1,1'); + const path = new SvgPath().parse( + 'M10 10 L 10 100 L 100 100 L 100 10 C 1 1, 1 1, 1 1' + ); + expect(path.stringify()).toEqual( + 'M10,10L10,100L100,100L100,10C1,1,1,1,1,1' + ); }); it('should parse path with closing command', () => { - const path = new SvgPath().parse('M10 10 L 10 100 L 100 100 L 100 10 C 1 1, 1 1, 1 1 Z'); - expect(path.stringify()).toEqual('M10,10L10,100L100,100L100,10C1,1,1,1,1,1'); + const path = new SvgPath().parse( + 'M10 10 L 10 100 L 100 100 L 100 10 C 1 1, 1 1, 1 1 Z' + ); + expect(path.stringify()).toEqual( + 'M10,10L10,100L100,100L100,10C1,1,1,1,1,1' + ); }); it('should parse complex path correctly', () => { const path = new SvgPath(false, { accuracy: false - }).parse('M7.566371681415929,313.5870318472049L15.132743362831858,322.1479887268699L22.699115044247787,292.49058976570063L30.265486725663717,284.9469379116152L37.83185840707964,277.62070141556273L45.39823008849557,285.4043086222666L52.9646017699115,295.16905806058617L60.530973451327434,288.5395967440654L68.09734513274336,282.3023155078293L75.66371681415929,276.9420221519757L83.23008849557522,271.31296300227655L90.79646017699115,273.1827546735411L98.36283185840708,282.72148250847295L105.929203539823,276.55760703185683L113.49557522123892,278.16318930715545L121.06194690265487,279.67913384762466L128.6283185840708,296.53529757775897L136.1946902654867,324.4003397770142L143.76106194690263,317.1376004332516L151.32743362831857,323.3390406432677L158.89380530973452,328.5597479599146L166.46017699115043,329.67851354926904L174.02654867256635,327.71837583373326L181.5929203539823,335.05972598190976L189.15929203539824,334.29372633331286L196.72566371681415,332.68724934321176L204.29203539823007,330.6752327006325L211.858407079646,325.971917329413L219.42477876106196,328.13057177790404L226.99115044247785,309.6546479835954L234.5575221238938,310.6637826993739L242.12389380530973,310.65221523366176L249.69026548672568,318.40285733188773L257.2566371681416,298.18154267575227L264.8230088495575,307.4788389000347L272.3893805309734,304.189264255087L279.95575221238937,289.0288876874009L287.52212389380526,300.20654714775424L295.0884955752212,298.0164127652739L302.65486725663715,287.69192345832175L310.2212389380531,293.1860711045035L317.78761061946904,300.4760502113585L325.3539823008849,297.94852206276937L332.92035398230087,305.6594311405378L340.4867256637168,306.7859423144216L348.0530973451327,275.68998851331963L355.61946902654864,286.5550640745874L363.1858407079646,288.4952543187362L370.75221238938053,290.1896066608983L378.3185840707965,277.8447927515142L385.88495575221236,282.46018876596827L393.4513274336283,261.617847596371L401.01769911504425,265.06101027918726L408.58407079646014,264.60492966286677L416.1504424778761,252.35288845280365L423.716814159292,239.29220756750195L431.283185840708,229.73170018586225L438.8495575221239,224.1580859168795L446.41592920353986,217.20551113129414L453.9823008849557,212.63435660265037L461.54867256637164,210.4425212857057L469.1150442477876,201.0077146146342L476.6814159292035,182.3934004122068L484.24778761061947,176.98732946386616L491.8141592920354,175.3660655079267L499.38053097345136,181.1589144624976L506.9469026548673,172.81581557677976L514.5132743362832,177.82343674256106L522.079646017699,183.5573714672562L529.646017699115,184.4980688436067L537.2123893805309,201.60789339862924L544.7787610619469,193.42268767053048L552.3451327433628,209.9219909677575L559.9115044247787,221.1318944868172L567.4778761061947,222.47350026973174L575.0442477876105,229.94061399967882L582.6106194690265,213.57676800697396L590.1769911504424,232.97280246785252L597.7433628318583,232.8915724787845L605.3097345132743,231.486089735319L612.8761061946902,234.26534000120475L620.4424778761062,219.90951817170736L628.0088495575221,214.36149678900725L635.5752212389381,204.7245641444236L643.1415929203539,205.04759319834227L650.7079646017698,178.61624621480792L658.2743362831858,174.30656351022486L665.8407079646017,194.06864637030463L673.4070796460177,191.38404795482728L680.9734513274336,188.88380371217903L688.5398230088496,182.47430260433697L696.1061946902654,192.70175438596493L703.6725663716813,182.37945067166908L711.2389380530973,163.80499447227572L718.8053097345132,157.4839718811134L726.3716814159292,149.57403342725343L733.9380530973451,142.6076734278762L741.5044247787611,144.9954413314636L749.070796460177,152.29112878815386L756.637168141593,150.02544379977235L764.2035398230088,139.40203164917125L771.7699115044247,149.22935357717972L779.3362831858407,155.78116263659354L786.9026548672566,145.09966219897575L794.4690265486726,157.52407467202426L802.0353982300885,147.01645902195105L809.6017699115044,141.8658056183404L817.1681415929203,134.36135158737966L824.7345132743362,127.49269525433283L832.3008849557522,120.25886939571154L839.8672566371681,118.26230310074709L847.433628318584,98.76959064327474'); - expect(path.stringify()).toEqual('M7.566371681415929,313.5870318472049L15.132743362831858,322.1479887268699L22.699115044247787,292.49058976570063L30.265486725663717,284.9469379116152L37.83185840707964,277.62070141556273L45.39823008849557,285.4043086222666L52.9646017699115,295.16905806058617L60.530973451327434,288.5395967440654L68.09734513274336,282.3023155078293L75.66371681415929,276.9420221519757L83.23008849557522,271.31296300227655L90.79646017699115,273.1827546735411L98.36283185840708,282.72148250847295L105.929203539823,276.55760703185683L113.49557522123892,278.16318930715545L121.06194690265487,279.67913384762466L128.6283185840708,296.53529757775897L136.1946902654867,324.4003397770142L143.76106194690263,317.1376004332516L151.32743362831857,323.3390406432677L158.89380530973452,328.5597479599146L166.46017699115043,329.67851354926904L174.02654867256635,327.71837583373326L181.5929203539823,335.05972598190976L189.15929203539824,334.29372633331286L196.72566371681415,332.68724934321176L204.29203539823007,330.6752327006325L211.858407079646,325.971917329413L219.42477876106196,328.13057177790404L226.99115044247785,309.6546479835954L234.5575221238938,310.6637826993739L242.12389380530973,310.65221523366176L249.69026548672568,318.40285733188773L257.2566371681416,298.18154267575227L264.8230088495575,307.4788389000347L272.3893805309734,304.189264255087L279.95575221238937,289.0288876874009L287.52212389380526,300.20654714775424L295.0884955752212,298.0164127652739L302.65486725663715,287.69192345832175L310.2212389380531,293.1860711045035L317.78761061946904,300.4760502113585L325.3539823008849,297.94852206276937L332.92035398230087,305.6594311405378L340.4867256637168,306.7859423144216L348.0530973451327,275.68998851331963L355.61946902654864,286.5550640745874L363.1858407079646,288.4952543187362L370.75221238938053,290.1896066608983L378.3185840707965,277.8447927515142L385.88495575221236,282.46018876596827L393.4513274336283,261.617847596371L401.01769911504425,265.06101027918726L408.58407079646014,264.60492966286677L416.1504424778761,252.35288845280365L423.716814159292,239.29220756750195L431.283185840708,229.73170018586225L438.8495575221239,224.1580859168795L446.41592920353986,217.20551113129414L453.9823008849557,212.63435660265037L461.54867256637164,210.4425212857057L469.1150442477876,201.0077146146342L476.6814159292035,182.3934004122068L484.24778761061947,176.98732946386616L491.8141592920354,175.3660655079267L499.38053097345136,181.1589144624976L506.9469026548673,172.81581557677976L514.5132743362832,177.82343674256106L522.079646017699,183.5573714672562L529.646017699115,184.4980688436067L537.2123893805309,201.60789339862924L544.7787610619469,193.42268767053048L552.3451327433628,209.9219909677575L559.9115044247787,221.1318944868172L567.4778761061947,222.47350026973174L575.0442477876105,229.94061399967882L582.6106194690265,213.57676800697396L590.1769911504424,232.97280246785252L597.7433628318583,232.8915724787845L605.3097345132743,231.486089735319L612.8761061946902,234.26534000120475L620.4424778761062,219.90951817170736L628.0088495575221,214.36149678900725L635.5752212389381,204.7245641444236L643.1415929203539,205.04759319834227L650.7079646017698,178.61624621480792L658.2743362831858,174.30656351022486L665.8407079646017,194.06864637030463L673.4070796460177,191.38404795482728L680.9734513274336,188.88380371217903L688.5398230088496,182.47430260433697L696.1061946902654,192.70175438596493L703.6725663716813,182.37945067166908L711.2389380530973,163.80499447227572L718.8053097345132,157.4839718811134L726.3716814159292,149.57403342725343L733.9380530973451,142.6076734278762L741.5044247787611,144.9954413314636L749.070796460177,152.29112878815386L756.637168141593,150.02544379977235L764.2035398230088,139.40203164917125L771.7699115044247,149.22935357717972L779.3362831858407,155.78116263659354L786.9026548672566,145.09966219897575L794.4690265486726,157.52407467202426L802.0353982300885,147.01645902195105L809.6017699115044,141.8658056183404L817.1681415929203,134.36135158737966L824.7345132743362,127.49269525433283L832.3008849557522,120.25886939571154L839.8672566371681,118.26230310074709L847.433628318584,98.76959064327474'); + }).parse( + 'M7.566371681415929,313.5870318472049L15.132743362831858,322.1479887268699L22.699115044247787,292.49058976570063L30.265486725663717,284.9469379116152L37.83185840707964,277.62070141556273L45.39823008849557,285.4043086222666L52.9646017699115,295.16905806058617L60.530973451327434,288.5395967440654L68.09734513274336,282.3023155078293L75.66371681415929,276.9420221519757L83.23008849557522,271.31296300227655L90.79646017699115,273.1827546735411L98.36283185840708,282.72148250847295L105.929203539823,276.55760703185683L113.49557522123892,278.16318930715545L121.06194690265487,279.67913384762466L128.6283185840708,296.53529757775897L136.1946902654867,324.4003397770142L143.76106194690263,317.1376004332516L151.32743362831857,323.3390406432677L158.89380530973452,328.5597479599146L166.46017699115043,329.67851354926904L174.02654867256635,327.71837583373326L181.5929203539823,335.05972598190976L189.15929203539824,334.29372633331286L196.72566371681415,332.68724934321176L204.29203539823007,330.6752327006325L211.858407079646,325.971917329413L219.42477876106196,328.13057177790404L226.99115044247785,309.6546479835954L234.5575221238938,310.6637826993739L242.12389380530973,310.65221523366176L249.69026548672568,318.40285733188773L257.2566371681416,298.18154267575227L264.8230088495575,307.4788389000347L272.3893805309734,304.189264255087L279.95575221238937,289.0288876874009L287.52212389380526,300.20654714775424L295.0884955752212,298.0164127652739L302.65486725663715,287.69192345832175L310.2212389380531,293.1860711045035L317.78761061946904,300.4760502113585L325.3539823008849,297.94852206276937L332.92035398230087,305.6594311405378L340.4867256637168,306.7859423144216L348.0530973451327,275.68998851331963L355.61946902654864,286.5550640745874L363.1858407079646,288.4952543187362L370.75221238938053,290.1896066608983L378.3185840707965,277.8447927515142L385.88495575221236,282.46018876596827L393.4513274336283,261.617847596371L401.01769911504425,265.06101027918726L408.58407079646014,264.60492966286677L416.1504424778761,252.35288845280365L423.716814159292,239.29220756750195L431.283185840708,229.73170018586225L438.8495575221239,224.1580859168795L446.41592920353986,217.20551113129414L453.9823008849557,212.63435660265037L461.54867256637164,210.4425212857057L469.1150442477876,201.0077146146342L476.6814159292035,182.3934004122068L484.24778761061947,176.98732946386616L491.8141592920354,175.3660655079267L499.38053097345136,181.1589144624976L506.9469026548673,172.81581557677976L514.5132743362832,177.82343674256106L522.079646017699,183.5573714672562L529.646017699115,184.4980688436067L537.2123893805309,201.60789339862924L544.7787610619469,193.42268767053048L552.3451327433628,209.9219909677575L559.9115044247787,221.1318944868172L567.4778761061947,222.47350026973174L575.0442477876105,229.94061399967882L582.6106194690265,213.57676800697396L590.1769911504424,232.97280246785252L597.7433628318583,232.8915724787845L605.3097345132743,231.486089735319L612.8761061946902,234.26534000120475L620.4424778761062,219.90951817170736L628.0088495575221,214.36149678900725L635.5752212389381,204.7245641444236L643.1415929203539,205.04759319834227L650.7079646017698,178.61624621480792L658.2743362831858,174.30656351022486L665.8407079646017,194.06864637030463L673.4070796460177,191.38404795482728L680.9734513274336,188.88380371217903L688.5398230088496,182.47430260433697L696.1061946902654,192.70175438596493L703.6725663716813,182.37945067166908L711.2389380530973,163.80499447227572L718.8053097345132,157.4839718811134L726.3716814159292,149.57403342725343L733.9380530973451,142.6076734278762L741.5044247787611,144.9954413314636L749.070796460177,152.29112878815386L756.637168141593,150.02544379977235L764.2035398230088,139.40203164917125L771.7699115044247,149.22935357717972L779.3362831858407,155.78116263659354L786.9026548672566,145.09966219897575L794.4690265486726,157.52407467202426L802.0353982300885,147.01645902195105L809.6017699115044,141.8658056183404L817.1681415929203,134.36135158737966L824.7345132743362,127.49269525433283L832.3008849557522,120.25886939571154L839.8672566371681,118.26230310074709L847.433628318584,98.76959064327474' + ); + expect(path.stringify()).toEqual( + 'M7.566371681415929,313.5870318472049L15.132743362831858,322.1479887268699L22.699115044247787,292.49058976570063L30.265486725663717,284.9469379116152L37.83185840707964,277.62070141556273L45.39823008849557,285.4043086222666L52.9646017699115,295.16905806058617L60.530973451327434,288.5395967440654L68.09734513274336,282.3023155078293L75.66371681415929,276.9420221519757L83.23008849557522,271.31296300227655L90.79646017699115,273.1827546735411L98.36283185840708,282.72148250847295L105.929203539823,276.55760703185683L113.49557522123892,278.16318930715545L121.06194690265487,279.67913384762466L128.6283185840708,296.53529757775897L136.1946902654867,324.4003397770142L143.76106194690263,317.1376004332516L151.32743362831857,323.3390406432677L158.89380530973452,328.5597479599146L166.46017699115043,329.67851354926904L174.02654867256635,327.71837583373326L181.5929203539823,335.05972598190976L189.15929203539824,334.29372633331286L196.72566371681415,332.68724934321176L204.29203539823007,330.6752327006325L211.858407079646,325.971917329413L219.42477876106196,328.13057177790404L226.99115044247785,309.6546479835954L234.5575221238938,310.6637826993739L242.12389380530973,310.65221523366176L249.69026548672568,318.40285733188773L257.2566371681416,298.18154267575227L264.8230088495575,307.4788389000347L272.3893805309734,304.189264255087L279.95575221238937,289.0288876874009L287.52212389380526,300.20654714775424L295.0884955752212,298.0164127652739L302.65486725663715,287.69192345832175L310.2212389380531,293.1860711045035L317.78761061946904,300.4760502113585L325.3539823008849,297.94852206276937L332.92035398230087,305.6594311405378L340.4867256637168,306.7859423144216L348.0530973451327,275.68998851331963L355.61946902654864,286.5550640745874L363.1858407079646,288.4952543187362L370.75221238938053,290.1896066608983L378.3185840707965,277.8447927515142L385.88495575221236,282.46018876596827L393.4513274336283,261.617847596371L401.01769911504425,265.06101027918726L408.58407079646014,264.60492966286677L416.1504424778761,252.35288845280365L423.716814159292,239.29220756750195L431.283185840708,229.73170018586225L438.8495575221239,224.1580859168795L446.41592920353986,217.20551113129414L453.9823008849557,212.63435660265037L461.54867256637164,210.4425212857057L469.1150442477876,201.0077146146342L476.6814159292035,182.3934004122068L484.24778761061947,176.98732946386616L491.8141592920354,175.3660655079267L499.38053097345136,181.1589144624976L506.9469026548673,172.81581557677976L514.5132743362832,177.82343674256106L522.079646017699,183.5573714672562L529.646017699115,184.4980688436067L537.2123893805309,201.60789339862924L544.7787610619469,193.42268767053048L552.3451327433628,209.9219909677575L559.9115044247787,221.1318944868172L567.4778761061947,222.47350026973174L575.0442477876105,229.94061399967882L582.6106194690265,213.57676800697396L590.1769911504424,232.97280246785252L597.7433628318583,232.8915724787845L605.3097345132743,231.486089735319L612.8761061946902,234.26534000120475L620.4424778761062,219.90951817170736L628.0088495575221,214.36149678900725L635.5752212389381,204.7245641444236L643.1415929203539,205.04759319834227L650.7079646017698,178.61624621480792L658.2743362831858,174.30656351022486L665.8407079646017,194.06864637030463L673.4070796460177,191.38404795482728L680.9734513274336,188.88380371217903L688.5398230088496,182.47430260433697L696.1061946902654,192.70175438596493L703.6725663716813,182.37945067166908L711.2389380530973,163.80499447227572L718.8053097345132,157.4839718811134L726.3716814159292,149.57403342725343L733.9380530973451,142.6076734278762L741.5044247787611,144.9954413314636L749.070796460177,152.29112878815386L756.637168141593,150.02544379977235L764.2035398230088,139.40203164917125L771.7699115044247,149.22935357717972L779.3362831858407,155.78116263659354L786.9026548672566,145.09966219897575L794.4690265486726,157.52407467202426L802.0353982300885,147.01645902195105L809.6017699115044,141.8658056183404L817.1681415929203,134.36135158737966L824.7345132743362,127.49269525433283L832.3008849557522,120.25886939571154L839.8672566371681,118.26230310074709L847.433628318584,98.76959064327474' + ); }); it('should scale path along both axes', () => { @@ -99,9 +118,9 @@ describe('Svg', () => { .scale(10, 100); expect(path.pathElements).toEqual([ - {command: 'M', x: 10, y: 200}, - {command: 'L', x: 30, y: 400}, - {command: 'C', x1: 50, y1: 600, x2: 70, y2: 800, x: 90, y: 1000} + { command: 'M', x: 10, y: 200 }, + { command: 'L', x: 30, y: 400 }, + { command: 'C', x1: 50, y1: 600, x2: 70, y2: 800, x: 90, y: 1000 } ]); }); @@ -113,9 +132,9 @@ describe('Svg', () => { .translate(10, 100); expect(path.pathElements).toEqual([ - {command: 'M', x: 11, y: 102}, - {command: 'L', x: 13, y: 104}, - {command: 'C', x1: 15, y1: 106, x2: 17, y2: 108, x: 19, y: 110} + { command: 'M', x: 11, y: 102 }, + { command: 'L', x: 13, y: 104 }, + { command: 'C', x1: 15, y1: 106, x2: 17, y2: 108, x: 19, y: 110 } ]); }); @@ -125,22 +144,24 @@ describe('Svg', () => { .line(3, 4) .curve(5, 6, 7, 8, 9, 10) .transform((element, paramName, elementIndex, paramIndex) => { - if(paramIndex > 3) { + if (paramIndex > 3) { return 0; - } else if(paramName[0] === 'y') { + } else if (paramName[0] === 'y') { return 100; } }); expect(path.pathElements).toEqual([ - {command: 'M', x: 1, y: 100}, - {command: 'L', x: 3, y: 100}, - {command: 'C', x1: 5, y1: 100, x2: 7, y2: 100, x: 0, y: 0} + { command: 'M', x: 1, y: 100 }, + { command: 'L', x: 3, y: 100 }, + { command: 'C', x1: 5, y1: 100, x2: 7, y2: 100, x: 0, y: 0 } ]); }); it('should split correctly by move command', () => { - const paths = new SvgPath().parse('M0,0L0,0L0,0L0,0M0,0L0,0L0,0L0,0').splitByCommand('M'); + const paths = new SvgPath() + .parse('M0,0L0,0L0,0L0,0M0,0L0,0L0,0L0,0') + .splitByCommand('M'); expect(paths.length).toBe(2); expect(paths[0].pathElements[0].command).toBe('M'); expect(paths[0].pathElements.length).toBe(4); @@ -149,13 +170,17 @@ describe('Svg', () => { }); it('should split correctly by move command and tailing move element', () => { - const paths = new SvgPath().parse('M0,0L0,0L0,0L0,0M0,0L0,0L0,0L0,0M0,0').splitByCommand('M'); + const paths = new SvgPath() + .parse('M0,0L0,0L0,0L0,0M0,0L0,0L0,0L0,0M0,0') + .splitByCommand('M'); expect(paths.length).toBe(3); expect(paths[2].pathElements[0].command).toBe('M'); }); it('should split correctly by move command and leading other commands', () => { - const paths = new SvgPath().parse('L0,0C0,0,0,0,0,0M0,0L0,0L0,0L0,0M0,0L0,0L0,0L0,0').splitByCommand('M'); + const paths = new SvgPath() + .parse('L0,0C0,0,0,0,0,0M0,0L0,0L0,0L0,0M0,0L0,0L0,0L0,0') + .splitByCommand('M'); expect(paths.length).toBe(3); expect(paths[0].pathElements.length).toBe(2); expect(paths[0].pathElements[0].command).toBe('L'); diff --git a/src/svg/svg.js b/src/svg/svg.js index 9108e8a6..d79bd932 100644 --- a/src/svg/svg.js +++ b/src/svg/svg.js @@ -1,5 +1,5 @@ -import {namespaces, ensureUnit, quantity, extend} from '../core/core'; -import {SvgList} from './svg-list'; +import { namespaces, ensureUnit, quantity, extend } from '../core/core'; +import { SvgList } from './svg-list'; /** * Svg creates a new SVG object wrapper with a starting element. You can use the wrapper to fluently create sub-elements and modify them. @@ -13,32 +13,31 @@ import {SvgList} from './svg-list'; * @param {Boolean} insertFirst If this param is set to true in conjunction with a parent element the newly created element will be added as first child element in the parent element */ export class Svg { - constructor(name, attributes, className, parent, insertFirst) { // If Svg is getting called with an SVG element we just return the wrapper - if(name instanceof Element) { + if (name instanceof Element) { this._node = name; } else { this._node = document.createElementNS(namespaces.svg, name); // If this is an SVG element created then custom namespace - if(name === 'svg') { + if (name === 'svg') { this.attr({ 'xmlns:ct': namespaces.ct }); } } - if(attributes) { + if (attributes) { this.attr(attributes); } - if(className) { + if (className) { this.addClass(className); } - if(parent) { - if(insertFirst && parent._node.firstChild) { + if (parent) { + if (insertFirst && parent._node.firstChild) { parent._node.insertBefore(this._node, parent._node.firstChild); } else { parent._node.appendChild(this._node); @@ -55,27 +54,33 @@ export class Svg { * @return {Object|String} The current wrapper object will be returned so it can be used for chaining or the attribute value if used as getter function. */ attr(attributes, ns) { - if(typeof attributes === 'string') { - if(ns) { + if (typeof attributes === 'string') { + if (ns) { return this._node.getAttributeNS(ns, attributes); } else { return this._node.getAttribute(attributes); } } - Object.keys(attributes).forEach(function(key) { - // If the attribute value is undefined we can skip this one - if(attributes[key] === undefined) { - return; - } + Object.keys(attributes).forEach( + function (key) { + // If the attribute value is undefined we can skip this one + if (attributes[key] === undefined) { + return; + } - if(key.indexOf(':') !== -1) { - const namespacedAttribute = key.split(':'); - this._node.setAttributeNS(namespaces[namespacedAttribute[0]], key, attributes[key]); - } else { - this._node.setAttribute(key, attributes[key]); - } - }.bind(this)); + if (key.indexOf(':') !== -1) { + const namespacedAttribute = key.split(':'); + this._node.setAttributeNS( + namespaces[namespacedAttribute[0]], + key, + attributes[key] + ); + } else { + this._node.setAttribute(key, attributes[key]); + } + }.bind(this) + ); return this; } @@ -101,7 +106,9 @@ export class Svg { * @return {Svg} Returns a Svg wrapper around the parent node of the current node. If the parent node is not existing or it's not an SVG node then this function will return null. */ parent() { - return this._node.parentNode instanceof SVGElement ? new Svg(this._node.parentNode) : null; + return this._node.parentNode instanceof SVGElement + ? new Svg(this._node.parentNode) + : null; } /** @@ -112,7 +119,7 @@ export class Svg { */ root() { let node = this._node; - while(node.nodeName !== 'svg') { + while (node.nodeName !== 'svg') { node = node.parentNode; } return new Svg(node); @@ -165,7 +172,7 @@ export class Svg { foreignObject(content, attributes, className, insertFirst) { // If content is string then we convert it to DOM // TODO: Handle case where content is not a string nor a DOM Node - if(typeof content === 'string') { + if (typeof content === 'string') { const container = document.createElement('div'); container.innerHTML = content; content = container.firstChild; @@ -176,7 +183,12 @@ export class Svg { // Creating the foreignObject without required extension attribute (as described here // http://www.w3.org/TR/SVG/extend.html#ForeignObjectElement) - const fnObj = this.elem('foreignObject', attributes, className, insertFirst); + const fnObj = this.elem( + 'foreignObject', + attributes, + className, + insertFirst + ); // Add content to foreignObjectElement fnObj._node.appendChild(content); @@ -203,7 +215,7 @@ export class Svg { * @return {Svg} The same wrapper object that got emptied */ empty() { - while(this._node.firstChild) { + while (this._node.firstChild) { this._node.removeChild(this._node.firstChild); } @@ -242,7 +254,7 @@ export class Svg { * @return {Svg} The wrapper of the appended object */ append(element, insertFirst) { - if(insertFirst && this._node.firstChild) { + if (insertFirst && this._node.firstChild) { this._node.insertBefore(element._node, this._node.firstChild); } else { this._node.appendChild(element._node); @@ -258,7 +270,9 @@ export class Svg { * @return {Array} A list of classes or an empty array if there are no classes on the current element */ classes() { - return this._node.getAttribute('class') ? this._node.getAttribute('class').trim().split(/\s+/) : []; + return this._node.getAttribute('class') + ? this._node.getAttribute('class').trim().split(/\s+/) + : []; } /** @@ -269,12 +283,14 @@ export class Svg { * @return {Svg} The wrapper of the current element */ addClass(names) { - this._node.setAttribute('class', + this._node.setAttribute( + 'class', this.classes() .concat(names.trim().split(/\s+/)) - .filter(function(elem, pos, self) { + .filter(function (elem, pos, self) { return self.indexOf(elem) === pos; - }).join(' ') + }) + .join(' ') ); return this; @@ -290,8 +306,12 @@ export class Svg { removeClass(names) { const removedClasses = names.trim().split(/\s+/); - this._node.setAttribute('class', - this.classes().filter((name) => removedClasses.indexOf(name) === -1).join(' ')); + this._node.setAttribute( + 'class', + this.classes() + .filter(name => removedClasses.indexOf(name) === -1) + .join(' ') + ); return this; } @@ -332,23 +352,23 @@ export class Svg { * **An animations object could look like this:** * ```javascript * element.animate({ - * opacity: { - * dur: 1000, - * from: 0, - * to: 1 - * }, - * x1: { - * dur: '1000ms', - * from: 100, - * to: 200, - * easing: 'easeOutQuart' - * }, - * y1: { - * dur: '2s', - * from: 0, - * to: 100 - * } - * }); + * opacity: { + * dur: 1000, + * from: 0, + * to: 1 + * }, + * x1: { + * dur: '1000ms', + * from: 100, + * to: 200, + * easing: 'easeOutQuart' + * }, + * y1: { + * dur: '2s', + * from: 0, + * to: 100 + * } + * }); * ``` * **Automatic unit conversion** * For the `dur` and the `begin` animate attribute you can also omit a unit by passing a number. The number will automatically be converted to milli seconds. @@ -369,12 +389,11 @@ export class Svg { * @return {Svg} The current element where the animation was added */ animate(animations, guided, eventEmitter) { - if(guided === undefined) { + if (guided === undefined) { guided = true; } - Object.keys(animations).forEach((attribute) => { - + Object.keys(animations).forEach(attribute => { const createAnimate = (animationDefinition, createGuided) => { const attributeProperties = {}; let animationEasing; @@ -382,11 +401,12 @@ export class Svg { // Check if an easing is specified in the definition object and delete it from the object as it will not // be part of the animate element attributes. - if(animationDefinition.easing) { + if (animationDefinition.easing) { // If already an easing Bézier curve array we take it or we lookup a easing array in the Easing object - animationEasing = animationDefinition.easing instanceof Array ? - animationDefinition.easing : - easings[animationDefinition.easing]; + animationEasing = + animationDefinition.easing instanceof Array + ? animationDefinition.easing + : easings[animationDefinition.easing]; delete animationDefinition.easing; } @@ -394,14 +414,14 @@ export class Svg { animationDefinition.begin = ensureUnit(animationDefinition.begin, 'ms'); animationDefinition.dur = ensureUnit(animationDefinition.dur, 'ms'); - if(animationEasing) { + if (animationEasing) { animationDefinition.calcMode = 'spline'; animationDefinition.keySplines = animationEasing.join(' '); animationDefinition.keyTimes = '0;1'; } // Adding "fill: freeze" if we are in guided mode and set initial attribute values - if(createGuided) { + if (createGuided) { animationDefinition.fill = 'freeze'; // Animated property on our element should already be set to the animation from value in guided mode attributeProperties[attribute] = animationDefinition.from; @@ -413,11 +433,17 @@ export class Svg { animationDefinition.begin = 'indefinite'; } - const animate = this.elem('animate', extend({ - attributeName: attribute - }, animationDefinition)); - - if(createGuided) { + const animate = this.elem( + 'animate', + extend( + { + attributeName: attribute + }, + animationDefinition + ) + ); + + if (createGuided) { // If guided we take the value that was put aside in timeout and trigger the animation manually with a timeout setTimeout(() => { // If beginElement fails we set the animated attribute to the end position and remove the animate element @@ -425,7 +451,7 @@ export class Svg { // the browser. (Currently FF 34 does not support animate elements in foreignObjects) try { animate._node.beginElement(); - } catch(err) { + } catch (err) { // Set animated attribute to current animated value attributeProperties[attribute] = animationDefinition.to; this.attr(attributeProperties); @@ -435,7 +461,7 @@ export class Svg { }, timeout); } - if(eventEmitter) { + if (eventEmitter) { animate._node.addEventListener('beginEvent', () => eventEmitter.emit('animationBegin', { element: this, @@ -446,7 +472,7 @@ export class Svg { } animate._node.addEventListener('endEvent', () => { - if(eventEmitter) { + if (eventEmitter) { eventEmitter.emit('animationEnd', { element: this, animate: animate._node, @@ -454,7 +480,7 @@ export class Svg { }); } - if(createGuided) { + if (createGuided) { // Set animated attribute to current animated value attributeProperties[attribute] = animationDefinition.to; this.attr(attributeProperties); @@ -465,9 +491,10 @@ export class Svg { }; // If current attribute is an array of definition objects we create an animate for each and disable guided mode - if(animations[attribute] instanceof Array) { - animations[attribute] - .forEach((animationDefinition) => createAnimate(animationDefinition, false)); + if (animations[attribute] instanceof Array) { + animations[attribute].forEach(animationDefinition => + createAnimate(animationDefinition, false) + ); } else { createAnimate(animations[attribute], guided); } @@ -485,7 +512,10 @@ export class Svg { * @return {Boolean} True of false if the feature is supported or not */ export function isSupported(feature) { - return document.implementation.hasFeature('http://www.w3.org/TR/SVG11/feature#' + feature, '1.1'); + return document.implementation.hasFeature( + 'http://www.w3.org/TR/SVG11/feature#' + feature, + '1.1' + ); } /** diff --git a/src/svg/svg.spec.js b/src/svg/svg.spec.js index f71b3efe..61ba95fe 100644 --- a/src/svg/svg.spec.js +++ b/src/svg/svg.spec.js @@ -1,5 +1,5 @@ -import {Svg} from './svg'; -import {namespaces} from '../core/globals'; +import { Svg } from './svg'; +import { namespaces } from '../core/globals'; describe('Svg', () => { it('should create a valid svg dom element', () => { @@ -19,8 +19,8 @@ describe('Svg', () => { expect(svg).toBeDefined(); expect(svg._node).toBeDefined(); expect(svg._node.nodeName.toLowerCase()).toBe('svg'); - expect(svg._node.attributes.width.textContent).toBe('100%'); - expect(svg._node.attributes.height.textContent).toBe('100%'); + expect(svg._node.attributes.width).toHaveTextContent('100%'); + expect(svg._node.attributes.height).toHaveTextContent('100%'); }); it('should create nested objects with attributes', () => { @@ -33,9 +33,15 @@ describe('Svg', () => { expect(svg._node).toBeDefined(); expect(svg._node.firstChild.firstChild.firstChild).toBeDefined(); - expect(svg._node.firstChild.firstChild.firstChild.attributes.cx.textContent).toBe('100'); - expect(svg._node.firstChild.firstChild.firstChild.attributes.cy.textContent).toBe('100'); - expect(svg._node.firstChild.firstChild.firstChild.attributes.r.textContent).toBe('10'); + expect( + svg._node.firstChild.firstChild.firstChild.attributes.cx + ).toHaveTextContent('100'); + expect( + svg._node.firstChild.firstChild.firstChild.attributes.cy + ).toHaveTextContent('100'); + expect( + svg._node.firstChild.firstChild.firstChild.attributes.r + ).toHaveTextContent('10'); }); it('should allow to set attributes manually', () => { @@ -48,9 +54,9 @@ describe('Svg', () => { expect(svg._node).toBeDefined(); expect(svg._node.firstChild).toBeDefined(); - expect(svg._node.firstChild.attributes.cx.textContent).toBe('100'); - expect(svg._node.firstChild.attributes.cy.textContent).toBe('100'); - expect(svg._node.firstChild.attributes.r.textContent).toBe('10'); + expect(svg._node.firstChild.attributes.cx).toHaveTextContent('100'); + expect(svg._node.firstChild.attributes.cy).toHaveTextContent('100'); + expect(svg._node.firstChild.attributes.r).toHaveTextContent('10'); }); it('should allow to set namespaced attributes', () => { @@ -65,11 +71,13 @@ describe('Svg', () => { expect(svg._node).toBeDefined(); expect(svg._node.firstChild).toBeDefined(); - expect(svg._node.firstChild.getAttribute('x')).toBe('100'); - expect(svg._node.firstChild.getAttribute('y')).toBe('100'); - expect(svg._node.firstChild.getAttribute('width')).toBe('100'); - expect(svg._node.firstChild.getAttribute('height')).toBe('100'); - expect(svg._node.firstChild.getAttributeNS(namespaces.xlink, 'href')).toBe('image.jpg'); + expect(svg._node.firstChild).toHaveAttribute('x', '100'); + expect(svg._node.firstChild).toHaveAttribute('y', '100'); + expect(svg._node.firstChild).toHaveAttribute('width', '100'); + expect(svg._node.firstChild).toHaveAttribute('height', '100'); + expect(svg._node.firstChild.getAttributeNS(namespaces.xlink, 'href')).toBe( + 'image.jpg' + ); }); it('should clear on each nesting level', () => { @@ -86,7 +94,7 @@ describe('Svg', () => { expect(svg._node.firstChild.childNodes.length).toBe(0); svg.empty(); - expect(svg._node.firstChild).toBeNull(); + expect(svg._node).toBeEmptyDOMElement(); }); it('should allow to remove a certain element', () => { @@ -109,7 +117,7 @@ describe('Svg', () => { expect(svg._node.childNodes.length).toBe(1); expect(svg._node.firstChild.nodeName.toLowerCase()).toBe('text'); expect(svg._node.firstChild.firstChild.nodeType).toBe(3); - expect(svg._node.firstChild.firstChild.textContent).toBe('Hello World'); + expect(svg._node.firstChild.firstChild).toHaveTextContent('Hello World'); }); it('should allow to add and remove classes on elements', () => { @@ -133,33 +141,51 @@ describe('Svg', () => { // Should allow multiple classes with whitespaces svg.removeClass('test-class-2 test-class-3'); - expect(svg._node.getAttribute('class')).toBe('test-class-4'); + expect(svg._node).toHaveAttribute('class', 'test-class-4'); }); it('should allow to travers up in the fluent API chain and set attributes on the way', () => { const svg = new Svg('svg'); - svg.elem('g').elem('g').elem('g').elem('circle').parent().attr({ - transform: 'rotate(10 10 10)' - }).parent().attr({ - transform: 'rotate(20 20 20)' - }).parent().attr({ - transform: 'rotate(30 30 30)' - }).parent().attr({ - width: '100%', - height: '100%' - }); + svg + .elem('g') + .elem('g') + .elem('g') + .elem('circle') + .parent() + .attr({ + transform: 'rotate(10 10 10)' + }) + .parent() + .attr({ + transform: 'rotate(20 20 20)' + }) + .parent() + .attr({ + transform: 'rotate(30 30 30)' + }) + .parent() + .attr({ + width: '100%', + height: '100%' + }); expect(svg._node).toBeDefined(); - expect(svg._node.attributes.width.textContent).toBe('100%'); - expect(svg._node.attributes.height.textContent).toBe('100%'); + expect(svg._node.attributes.width).toHaveTextContent('100%'); + expect(svg._node.attributes.height).toHaveTextContent('100%'); expect(svg._node.firstChild).toBeDefined(); - expect(svg._node.firstChild.attributes.transform.textContent).toBe('rotate(30 30 30)'); + expect(svg._node.firstChild.attributes.transform).toHaveTextContent( + 'rotate(30 30 30)' + ); expect(svg._node.firstChild.firstChild).toBeDefined(); - expect(svg._node.firstChild.firstChild.attributes.transform.textContent).toBe('rotate(20 20 20)'); + expect( + svg._node.firstChild.firstChild.attributes.transform + ).toHaveTextContent('rotate(20 20 20)'); expect(svg._node.firstChild.firstChild.firstChild).toBeDefined(); - expect(svg._node.firstChild.firstChild.firstChild.attributes.transform.textContent).toBe('rotate(10 10 10)'); + expect( + svg._node.firstChild.firstChild.firstChild.attributes.transform + ).toHaveTextContent('rotate(10 10 10)'); }); }); diff --git a/test/mock/compat.js b/test/mock/compat.js index 13a43b00..2100863a 100644 --- a/test/mock/compat.js +++ b/test/mock/compat.js @@ -1,4 +1,4 @@ -import Chartist from 'chartist' +import Chartist from 'chartist'; export const { Bar: BarChart, @@ -8,8 +8,6 @@ export const { Svg, Interpolation, getMultiValue -} = Chartist +} = Chartist; -export const { - Easing: easings -} = Svg +export const { Easing: easings } = Svg; diff --git a/test/mock/cssModule.js b/test/mock/cssModule.js index 7c38dd6d..475289e2 100644 --- a/test/mock/cssModule.js +++ b/test/mock/cssModule.js @@ -2,9 +2,9 @@ const mock = new Proxy( {}, { get() { - return '' - }, + return ''; + } } -) +); -module.exports = mock +module.exports = mock; diff --git a/test/mock/dom.js b/test/mock/dom.js index ee3ed34e..6c5714f3 100644 --- a/test/mock/dom.js +++ b/test/mock/dom.js @@ -1,9 +1,9 @@ export let container = null; -let getBoundingClientRect = SVGElement.prototype.getBoundingClientRect +let getBoundingClientRect = SVGElement.prototype.getBoundingClientRect; export function mockDom() { - if(!container) { + if (!container) { container = document.createElement('div'); container.setAttribute('data-fixture-container', `${+new Date()}`); document.body.appendChild(container); @@ -11,7 +11,7 @@ export function mockDom() { } export function destroyMockDom() { - if(container) { + if (container) { document.body.removeChild(container); container = null; } @@ -37,7 +37,7 @@ export function mockDomRects() { top: 0, right: 0, bottom: 0, - left: 0, + left: 0 }); } diff --git a/test/setup.js b/test/setup.js index d7f98bdc..b69ed17e 100644 --- a/test/setup.js +++ b/test/setup.js @@ -1,3 +1,3 @@ import '@testing-library/jest-dom/extend-expect'; -window.matchMedia = () => ({}) +window.matchMedia = () => ({}); diff --git a/test/storyshots.spec.js b/test/storyshots.spec.js index 3c9a956e..d146e27c 100644 --- a/test/storyshots.spec.js +++ b/test/storyshots.spec.js @@ -1,7 +1,7 @@ -import { skipable } from './utils/skipable' -import { initStoryshots } from './utils/storyshots' +import { skipable } from './utils/skipable'; +import { initStoryshots } from './utils/storyshots'; -const testTimeout = 60 * 1000 * 10 +const testTimeout = 60 * 1000 * 10; const config = { url: 'http://localhost:6006', setupTimeout: testTimeout, @@ -9,13 +9,16 @@ const config = { getGotoOptions() { return { waitUntil: 'networkidle0', - timeout: 0, - } - }, -} + timeout: 0 + }; + } +}; -const describeWhenLinux = skipable(describe, process.platform !== 'linux' || Boolean(process.env.STORYSHOTS_SKIP)) +const describeWhenLinux = skipable( + describe, + process.platform !== 'linux' || Boolean(process.env.STORYSHOTS_SKIP) +); describeWhenLinux('Storyshots', () => { - initStoryshots(config) -}) + initStoryshots(config); +}); diff --git a/test/utils/skipable.js b/test/utils/skipable.js index 855f9c34..fa8a11ef 100644 --- a/test/utils/skipable.js +++ b/test/utils/skipable.js @@ -5,5 +5,5 @@ * @returns Skipable block definition methid. */ export function skipable(fn, skip) { - return skip ? fn.skip : fn + return skip ? fn.skip : fn; } diff --git a/test/utils/storyshots/imageSnapshotWithStoryParameters.js b/test/utils/storyshots/imageSnapshotWithStoryParameters.js index b98ada18..96b37499 100644 --- a/test/utils/storyshots/imageSnapshotWithStoryParameters.js +++ b/test/utils/storyshots/imageSnapshotWithStoryParameters.js @@ -1,10 +1,10 @@ -import { devices } from 'puppeteer' -import { imageSnapshot } from '@storybook/addon-storyshots-puppeteer' +import { devices } from 'puppeteer'; +import { imageSnapshot } from '@storybook/addon-storyshots-puppeteer'; -import { Viewport } from './viewport' +import { Viewport } from './viewport'; const captureRoot = true; -const offset = '40' +const offset = '40'; /** * Handle story parameters. @@ -15,37 +15,37 @@ const offset = '40' async function beforeScreenshotHook(page, options) { const { storyshots: { currentViewport } = {}, - parameters: { storyshots: { beforeScreenshot } = {} }, - } = options.context + parameters: { storyshots: { beforeScreenshot } = {} } + } = options.context; if (currentViewport && currentViewport !== Viewport.Default) { - await page.emulate(devices[currentViewport]) + await page.emulate(devices[currentViewport]); } if (beforeScreenshot) { - await beforeScreenshot(page, options) + await beforeScreenshot(page, options); } if (captureRoot) { await page.$eval( '#root', (root, offset) => { - root.style.padding = `${offset}px` + root.style.padding = `${offset}px`; }, offset - ) + ); - return page.$('#root') + return page.$('#root'); } - return null + return null; } function getCaptureRootScreenshotOptions() { return { encoding: 'base64', // encoding: 'base64' is a property required by puppeteer - fullPage: !captureRoot, - } + fullPage: !captureRoot + }; } /** @@ -54,58 +54,55 @@ function getCaptureRootScreenshotOptions() { * @returns Snapshot tests function. */ export function imageSnapshotWithStoryParameters(config) { - const { beforeScreenshot, getScreenshotOptions } = config + const { beforeScreenshot, getScreenshotOptions } = config; const configWithBeforeScreenshot = { ...config, getScreenshotOptions: getScreenshotOptions - ? (options) => ({ - ...getCaptureRootScreenshotOptions(options), - ...getScreenshotOptions(options), - }) + ? options => ({ + ...getCaptureRootScreenshotOptions(options), + ...getScreenshotOptions(options) + }) : getCaptureRootScreenshotOptions, beforeScreenshot: beforeScreenshot ? async (page, options) => { - const captureTarget = await beforeScreenshotHook(page, options) + const captureTarget = await beforeScreenshotHook(page, options); - await beforeScreenshot(page, options) + await beforeScreenshot(page, options); - return captureTarget - } - : beforeScreenshotHook, - } - const test = imageSnapshot(configWithBeforeScreenshot) - const testFn = async (options) => { - const { context } = options - const { - storyshots: { - viewports = [], - } = {}, - } = context.parameters + return captureTarget; + } + : beforeScreenshotHook + }; + const test = imageSnapshot(configWithBeforeScreenshot); + const testFn = async options => { + const { context } = options; + const { storyshots: { viewports = [] } = {} } = context.parameters; if (!viewports.length) { - await test(options) - return + await test(options); + return; } for (const viewport of viewports) { - const currentViewport = viewport === Viewport.Default ? undefined : viewport - const originalId = context.id + const currentViewport = + viewport === Viewport.Default ? undefined : viewport; + const originalId = context.id; context.storyshots = { - currentViewport, - } + currentViewport + }; - await test(options) + await test(options); - context.id = originalId + context.id = originalId; } - expect.assertions(viewports.length) - } + expect.assertions(viewports.length); + }; - testFn.timeout = test.timeout - testFn.beforeAll = test.beforeAll - testFn.afterAll = test.afterAll + testFn.timeout = test.timeout; + testFn.beforeAll = test.beforeAll; + testFn.afterAll = test.afterAll; - return testFn + return testFn; } diff --git a/test/utils/storyshots/index.js b/test/utils/storyshots/index.js index 1b80c689..d1620f4b 100644 --- a/test/utils/storyshots/index.js +++ b/test/utils/storyshots/index.js @@ -1,3 +1,3 @@ -export * from './initStoryshots' -export * from './imageSnapshotWithStoryParameters' -export * from './storybook' +export * from './initStoryshots'; +export * from './imageSnapshotWithStoryParameters'; +export * from './storybook'; diff --git a/test/utils/storyshots/initStoryshots.js b/test/utils/storyshots/initStoryshots.js index 6420cd23..28daaae9 100644 --- a/test/utils/storyshots/initStoryshots.js +++ b/test/utils/storyshots/initStoryshots.js @@ -1,9 +1,7 @@ -import baseInitStoryshots from '@storybook/addon-storyshots' +import baseInitStoryshots from '@storybook/addon-storyshots'; -import { - imageSnapshotWithStoryParameters, -} from './imageSnapshotWithStoryParameters' -import { startStorybook } from './storybook' +import { imageSnapshotWithStoryParameters } from './imageSnapshotWithStoryParameters'; +import { startStorybook } from './storybook'; /** * Default page customizer. @@ -13,8 +11,8 @@ import { startStorybook } from './storybook' export function defaultCustomizePage(page) { return page.setViewport({ width: 1920, - height: 1080, - }) + height: 1080 + }); } /** @@ -23,7 +21,7 @@ export function defaultCustomizePage(page) { * @returns Sanitized identifier ready for use in filename. */ export function sanitizeSnapshotIdentifierPart(indentifierPart) { - return indentifierPart.replace(/[\s/]|%20/g, '-').replace(/"|%22/g, '') + return indentifierPart.replace(/[\s/]|%20/g, '-').replace(/"|%22/g, ''); } /** @@ -35,17 +33,21 @@ export function sanitizeSnapshotIdentifierPart(indentifierPart) { * @param storyOptions.context.storyshots - Storyshots metadata. * @returns Match options. */ -export function defaultGetMatchOptions({ context: { kind, story, storyshots } }) { - const currentViewport = storyshots?.currentViewport - const sanitizedKind = sanitizeSnapshotIdentifierPart(kind) - const sanitizedStory = sanitizeSnapshotIdentifierPart(story) - const sanitizedParams = currentViewport ? `__${sanitizeSnapshotIdentifierPart(currentViewport)}` : '' +export function defaultGetMatchOptions({ + context: { kind, story, storyshots } +}) { + const currentViewport = storyshots?.currentViewport; + const sanitizedKind = sanitizeSnapshotIdentifierPart(kind); + const sanitizedStory = sanitizeSnapshotIdentifierPart(story); + const sanitizedParams = currentViewport + ? `__${sanitizeSnapshotIdentifierPart(currentViewport)}` + : ''; - process.stdout.write(`📷 ${kind} ${story} ${currentViewport || ''}\n`) + process.stdout.write(`📷 ${kind} ${story} ${currentViewport || ''}\n`); return { - customSnapshotIdentifier: `${sanitizedKind}__${sanitizedStory}${sanitizedParams}`, - } + customSnapshotIdentifier: `${sanitizedKind}__${sanitizedStory}${sanitizedParams}` + }; } /** @@ -53,37 +55,37 @@ export function defaultGetMatchOptions({ context: { kind, story, storyshots } }) * @param config - Storyshots config. */ export function initStoryshots(config) { - process.env.STORYBOOK_STORYSHOTS = JSON.stringify(true) + process.env.STORYBOOK_STORYSHOTS = JSON.stringify(true); const finalOptions = { getMatchOptions: defaultGetMatchOptions, customizePage: defaultCustomizePage, - ...config, - } - const storybook = startStorybook(config) + ...config + }; + const storybook = startStorybook(config); const test = imageSnapshotWithStoryParameters({ storybookUrl: config.url, - ...finalOptions, - }) - const { beforeAll, afterAll } = test - const { warn } = console + ...finalOptions + }); + const { beforeAll, afterAll } = test; + const { warn } = console; - test.beforeAll = (async () => { - await storybook.start() - await beforeAll() - }) - test.beforeAll.timeout = beforeAll.timeout + test.beforeAll = async () => { + await storybook.start(); + await beforeAll(); + }; + test.beforeAll.timeout = beforeAll.timeout; test.afterAll = async () => { - await storybook.stop() - await afterAll() - } + await storybook.stop(); + await afterAll(); + }; - console.warn = () => undefined + console.warn = () => undefined; baseInitStoryshots({ framework: 'html', suite: 'Storyshots', - test, - }) - console.warn = warn + test + }); + console.warn = warn; } diff --git a/test/utils/storyshots/storybook.js b/test/utils/storyshots/storybook.js index a085f643..184173c0 100644 --- a/test/utils/storyshots/storybook.js +++ b/test/utils/storyshots/storybook.js @@ -1,10 +1,10 @@ -import { spawn } from 'child_process' +import { spawn } from 'child_process'; -import { createServer } from 'http-server' -import del from 'del' +import { createServer } from 'http-server'; +import del from 'del'; -const STORYBOOK_STATIC = 'storybook-static' -const errorMatcher = /ERR!|Error:|ERROR in|UnhandledPromiseRejectionWarning/ +const STORYBOOK_STATIC = 'storybook-static'; +const errorMatcher = /ERR!|Error:|ERROR in|UnhandledPromiseRejectionWarning/; /** * Run storybook static build. @@ -20,33 +20,33 @@ export async function buildStorybook({ env = {}, verbose = false }) { env: { ...process.env, NODE_ENV: 'production', - ...env, + ...env }, - detached: true, - }) - const onData = (data) => { - const message = data.toString('utf8') + detached: true + }); + const onData = data => { + const message = data.toString('utf8'); if (verbose) { - process.stdout.write(message) + process.stdout.write(message); } if (errorMatcher.test(message)) { - reject(new Error(message)) + reject(new Error(message)); } - } + }; buildProcess.on('exit', (code, signal) => { if (code === 0) { - resolve() - return + resolve(); + return; } - reject(new Error(`Exit code: ${code || signal || 'unknown'}`)) - }) - buildProcess.stdout.on('data', onData) - buildProcess.stderr.on('data', onData) - }) + reject(new Error(`Exit code: ${code || signal || 'unknown'}`)); + }); + buildProcess.stdout.on('data', onData); + buildProcess.stderr.on('data', onData); + }); } /** @@ -55,28 +55,32 @@ export async function buildStorybook({ env = {}, verbose = false }) { * @returns Server controls. */ export function startStorybook(options) { - const { url, skipBuild } = options - const parsedUrl = new URL(url) + const { url, skipBuild } = options; + const parsedUrl = new URL(url); const server = createServer({ - root: STORYBOOK_STATIC, - }) + root: STORYBOOK_STATIC + }); return { async start() { if (!skipBuild) { - await buildStorybook(options) + await buildStorybook(options); } - await new Promise((resolve) => { - server.listen(parseInt(parsedUrl.port, 10), parsedUrl.hostname, resolve) - }) + await new Promise(resolve => { + server.listen( + parseInt(parsedUrl.port, 10), + parsedUrl.hostname, + resolve + ); + }); }, async stop() { - server.close() + server.close(); if (!skipBuild) { - await del(STORYBOOK_STATIC) + await del(STORYBOOK_STATIC); } - }, - } + } + }; } diff --git a/test/utils/storyshots/viewport.js b/test/utils/storyshots/viewport.js index 5244dcb6..b2163bb4 100644 --- a/test/utils/storyshots/viewport.js +++ b/test/utils/storyshots/viewport.js @@ -7,5 +7,5 @@ export const Viewport = { Tablet: 'iPad', TabletLandscape: 'iPad landscape', SmallTablet: 'Nexus 7', - SmallTabletLandscape: 'Nexus 7 landscape', -} + SmallTabletLandscape: 'Nexus 7 landscape' +}; From cab546608a65c8d477ea34e2710e6e666a59da9d Mon Sep 17 00:00:00 2001 From: dangreen <danon0404@gmail.com> Date: Thu, 7 Jul 2022 16:22:57 +0400 Subject: [PATCH 23/44] ci: fix update storyshots actions --- .github/workflows/update-storyshots.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/update-storyshots.yml b/.github/workflows/update-storyshots.yml index 2a4c538e..411c7b01 100644 --- a/.github/workflows/update-storyshots.yml +++ b/.github/workflows/update-storyshots.yml @@ -19,7 +19,7 @@ jobs: - name: Install dependencies run: pnpm install - name: Update snapshots - run: pnpm test:storyshots -- -- -u + run: pnpm test:storyshots -- -u - name: Collect artifacts uses: actions/upload-artifact@v3 if: always() @@ -44,7 +44,7 @@ jobs: - name: Install dependencies run: pnpm install - name: Update snapshots - run: pnpm test:storyshots -- -- -u + run: pnpm test:storyshots -- -u env: CHARTIST_COMPAT: true - name: Collect artifacts From ee4106e04f3c081805dd79675340378f895c8290 Mon Sep 17 00:00:00 2001 From: Dan Onoshko <danon0404@gmail.com> Date: Fri, 8 Jul 2022 19:06:30 +0400 Subject: [PATCH 24/44] refactor: rewrite to TypeScript (#14) --- .eslintrc.json | 12 +- .storybook/main.js | 3 +- package.json | 20 +- pnpm-lock.yaml | 556 ++++++++++++------ rollup.config.js | 8 +- src/axes/AutoScaleAxis.ts | 50 ++ src/axes/{axis.spec.js => Axis.spec.ts} | 80 ++- src/axes/{axis.js => Axis.ts} | 71 ++- ...le-axis.spec.js => FixedScaleAxis.spec.ts} | 15 +- src/axes/FixedScaleAxis.ts | 50 ++ .../{step-axis.spec.js => StepAxis.spec.ts} | 8 +- src/axes/StepAxis.ts | 26 + src/axes/auto-scale-axis.js | 30 - src/axes/axes.js | 4 - src/axes/fixed-scale-axis.js | 35 -- src/axes/index.ts | 5 + src/axes/step-axis.js | 15 - src/axes/types.ts | 8 + .../BarChart.spec.ts} | 51 +- .../BarChart.stories.ts} | 10 +- src/charts/{bar.js => BarChart/BarChart.ts} | 345 ++++++----- src/charts/BarChart/BarChart.types.ts | 82 +++ src/charts/BarChart/index.ts | 2 + src/charts/{base.js => BaseChart.ts} | 135 +++-- .../LineChart.spec.ts} | 63 +- .../LineChart.stories.ts} | 7 +- .../{line.js => LineChart/LineChart.ts} | 262 ++++++--- src/charts/LineChart/LineChart.types.ts | 108 ++++ src/charts/LineChart/index.ts | 2 + .../PieChart.spec.ts} | 36 +- .../PieChart.stories.ts} | 6 +- src/charts/{pie.js => PieChart/PieChart.ts} | 205 ++++--- src/charts/PieChart/PieChart.types.ts | 84 +++ src/charts/PieChart/index.ts | 2 + src/charts/charts.js | 4 - src/charts/index.ts | 4 + src/core/{globals.js => constants.ts} | 12 +- src/core/core.js | 8 - .../{creation.spec.js => creation.spec.ts} | 31 +- src/core/{creation.js => creation.ts} | 193 +++--- src/core/data.js | 523 ---------------- src/core/data.spec.js | 370 ------------ src/core/data/bound.spec.ts | 113 ++++ src/core/data/bounds.ts | 125 ++++ src/core/data/data.ts | 73 +++ src/core/data/highLow.ts | 96 +++ src/core/data/index.ts | 6 + src/core/data/normalize.spec.ts | 145 +++++ src/core/data/normalize.ts | 212 +++++++ src/core/data/segments.spec.ts | 84 +++ src/core/data/segments.ts | 81 +++ src/core/data/serialize.spec.ts | 48 ++ src/core/data/serialize.ts | 68 +++ src/core/index.ts | 7 + src/core/lang.js | 119 ---- src/core/{lang.spec.js => lang.spec.ts} | 4 +- src/core/lang.ts | 39 ++ src/core/math.js | 99 ---- src/core/math.ts | 100 ++++ ...options-provider.js => optionsProvider.ts} | 36 +- src/core/types.ts | 252 ++++++++ src/event/EventEmitter.ts | 87 +++ src/event/event-emitter.js | 59 -- src/event/index.ts | 1 + src/index.js | 9 - src/index.ts | 6 + .../{cardinal.js => cardinal.ts} | 42 +- src/interpolation/index.ts | 5 + src/interpolation/interpolation.js | 5 - .../{monotone-cubic.js => monotoneCubic.ts} | 35 +- src/interpolation/{none.js => none.ts} | 33 +- src/interpolation/{simple.js => simple.ts} | 43 +- src/interpolation/{step.js => step.ts} | 40 +- src/svg/Svg.spec.ts | 219 +++++++ src/svg/Svg.ts | 426 ++++++++++++++ src/svg/SvgList.ts | 90 +++ src/svg/{svg-path.spec.js => SvgPath.spec.ts} | 28 +- src/svg/{svg-path.js => SvgPath.ts} | 307 +++++----- src/svg/animation.ts | 142 +++++ src/svg/index.ts | 4 + src/svg/svg-list.js | 46 -- src/svg/svg.js | 551 ----------------- src/svg/svg.spec.js | 191 ------ src/svg/types.ts | 57 ++ src/{core/extend.js => utils/extend.ts} | 13 +- .../functional.js => utils/functional.ts} | 34 +- src/utils/index.ts | 4 + src/utils/types.ts | 8 + src/utils/utils.ts | 57 ++ .../PieChart__Solid-snap.png | Bin 8725 -> 8664 bytes test/mock/{compat.js => compat.ts} | 0 test/mock/{dom.js => dom.ts} | 11 +- .../storyshots/{viewport.js => viewport.ts} | 0 tsconfig.json | 39 ++ 94 files changed, 4637 insertions(+), 3203 deletions(-) create mode 100644 src/axes/AutoScaleAxis.ts rename src/axes/{axis.spec.js => Axis.spec.ts} (52%) rename src/axes/{axis.js => Axis.ts} (74%) rename src/axes/{fixed-scale-axis.spec.js => FixedScaleAxis.spec.ts} (77%) create mode 100644 src/axes/FixedScaleAxis.ts rename src/axes/{step-axis.spec.js => StepAxis.spec.ts} (75%) create mode 100644 src/axes/StepAxis.ts delete mode 100644 src/axes/auto-scale-axis.js delete mode 100644 src/axes/axes.js delete mode 100644 src/axes/fixed-scale-axis.js create mode 100644 src/axes/index.ts delete mode 100644 src/axes/step-axis.js create mode 100644 src/axes/types.ts rename src/charts/{bar.spec.js => BarChart/BarChart.spec.ts} (91%) rename src/charts/{bar.stories.js => BarChart/BarChart.stories.ts} (96%) rename src/charts/{bar.js => BarChart/BarChart.ts} (68%) create mode 100644 src/charts/BarChart/BarChart.types.ts create mode 100644 src/charts/BarChart/index.ts rename src/charts/{base.js => BaseChart.ts} (54%) rename src/charts/{line.spec.js => LineChart/LineChart.spec.ts} (95%) rename src/charts/{line.stories.js => LineChart/LineChart.stories.ts} (98%) rename src/charts/{line.js => LineChart/LineChart.ts} (71%) create mode 100644 src/charts/LineChart/LineChart.types.ts create mode 100644 src/charts/LineChart/index.ts rename src/charts/{pie.spec.js => PieChart/PieChart.spec.ts} (95%) rename src/charts/{pie.stories.js => PieChart/PieChart.stories.ts} (94%) rename src/charts/{pie.js => PieChart/PieChart.ts} (71%) create mode 100644 src/charts/PieChart/PieChart.types.ts create mode 100644 src/charts/PieChart/index.ts delete mode 100644 src/charts/charts.js create mode 100644 src/charts/index.ts rename src/core/{globals.js => constants.ts} (74%) delete mode 100644 src/core/core.js rename src/core/{creation.spec.js => creation.spec.ts} (89%) rename src/core/{creation.js => creation.ts} (61%) delete mode 100644 src/core/data.js delete mode 100644 src/core/data.spec.js create mode 100644 src/core/data/bound.spec.ts create mode 100644 src/core/data/bounds.ts create mode 100644 src/core/data/data.ts create mode 100644 src/core/data/highLow.ts create mode 100644 src/core/data/index.ts create mode 100644 src/core/data/normalize.spec.ts create mode 100644 src/core/data/normalize.ts create mode 100644 src/core/data/segments.spec.ts create mode 100644 src/core/data/segments.ts create mode 100644 src/core/data/serialize.spec.ts create mode 100644 src/core/data/serialize.ts create mode 100644 src/core/index.ts delete mode 100644 src/core/lang.js rename src/core/{lang.spec.js => lang.spec.ts} (87%) create mode 100644 src/core/lang.ts delete mode 100644 src/core/math.js create mode 100644 src/core/math.ts rename src/core/{options-provider.js => optionsProvider.ts} (57%) create mode 100644 src/core/types.ts create mode 100644 src/event/EventEmitter.ts delete mode 100644 src/event/event-emitter.js create mode 100644 src/event/index.ts delete mode 100644 src/index.js create mode 100644 src/index.ts rename src/interpolation/{cardinal.js => cardinal.ts} (82%) create mode 100644 src/interpolation/index.ts delete mode 100644 src/interpolation/interpolation.js rename src/interpolation/{monotone-cubic.js => monotoneCubic.ts} (84%) rename src/interpolation/{none.js => none.ts} (59%) rename src/interpolation/{simple.js => simple.ts} (68%) rename src/interpolation/{step.js => step.ts} (76%) create mode 100644 src/svg/Svg.spec.ts create mode 100644 src/svg/Svg.ts create mode 100644 src/svg/SvgList.ts rename src/svg/{svg-path.spec.js => SvgPath.spec.ts} (96%) rename src/svg/{svg-path.js => SvgPath.ts} (52%) create mode 100644 src/svg/animation.ts create mode 100644 src/svg/index.ts delete mode 100644 src/svg/svg-list.js delete mode 100644 src/svg/svg.js delete mode 100644 src/svg/svg.spec.js create mode 100644 src/svg/types.ts rename src/{core/extend.js => utils/extend.ts} (52%) rename src/{core/functional.js => utils/functional.ts} (51%) create mode 100644 src/utils/index.ts create mode 100644 src/utils/types.ts create mode 100644 src/utils/utils.ts rename test/mock/{compat.js => compat.ts} (100%) rename test/mock/{dom.js => dom.ts} (72%) rename test/utils/storyshots/{viewport.js => viewport.ts} (100%) create mode 100644 tsconfig.json diff --git a/.eslintrc.json b/.eslintrc.json index d7db095c..30529315 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -33,7 +33,6 @@ "no-array-constructor": 2, "no-mixed-spaces-and-tabs": 2, "no-multiple-empty-lines": 2, - "no-nested-ternary": 2, "semi-spacing": 2, "no-spaced-func": 2, "no-trailing-spaces": 2, @@ -43,7 +42,13 @@ }, "overrides": [ { - "files": ["test/**/*.js", "*.spec.js", "*.stories.js"], + "files": ["**/*.ts"], + "parser": "@typescript-eslint/parser", + "plugins": ["@typescript-eslint"], + "extends": ["plugin:@typescript-eslint/recommended"] + }, + { + "files": ["test/**/*.{js,ts}", "*.spec.{js,ts}", "*.stories.{js,ts}"], "plugins": [ "jest", "testing-library", @@ -55,7 +60,8 @@ }, "rules": { "no-console": 0, - "no-shadow": 0 + "no-shadow": 0, + "@typescript-eslint/no-explicit-any": 0 } } ] diff --git a/.storybook/main.js b/.storybook/main.js index d3461913..2ad3c60d 100644 --- a/.storybook/main.js +++ b/.storybook/main.js @@ -11,6 +11,7 @@ module.exports = { '@storybook/addon-viewport' ], webpackFinal: async config => { + config.module.rules[0].use = [require.resolve('swc-loader')]; config.module.rules.push({ test: /\.scss$/, sideEffects: true, @@ -23,7 +24,7 @@ module.exports = { ? 'chartist/dist/chartist.css' : path.resolve(__dirname, '..', 'src', 'styles', 'chartist.scss'); config.resolve.alias['chartist-dev$'] = isCompatMode - ? path.resolve(__dirname, '..', 'test', 'mock', 'compat.js') + ? path.resolve(__dirname, '..', 'test', 'mock', 'compat.ts') : path.resolve(__dirname, '..', 'src'); return config; diff --git a/package.json b/package.json index e1a6f80a..01aba18a 100644 --- a/package.json +++ b/package.json @@ -32,8 +32,9 @@ "node": ">=14" }, "sideEffects": false, + "types": "./dist/index.d.ts", "style": "./src/styles/chartist.scss", - "main": "./src/index.js", + "main": "./src/index.ts", "publishConfig": { "style": "./dist/index.css", "main": "./dist/index.cjs", @@ -50,15 +51,17 @@ "LICENSE-MIT" ], "scripts": { + "emitDeclarations": "tsc --emitDeclarationOnly", "build:styles": "./scripts/styles.js", - "build": "rollup -c & pnpm build:styles", + "build": "rollup -c & pnpm build:styles & pnpm emitDeclarations", "start:storybook": "start-storybook -p 6006 --ci", "build:storybook": "del ./storybook-static; NODE_ENV=production build-storybook", + "jest": "jest -c jest.config.json", "test:unit": "jest -c jest.config.json ./src", "test:storyshots": "jest -c jest.config.json ./test/storyshots.spec.js", "test": "pnpm lint && pnpm test:unit", - "lint": "eslint './*.js' 'test/**/*.js' 'src/**/*.js' '.storybook/**/*.js' 'scripts/**/*.js'", - "format": "prettier --write './*.js' 'test/**/*.js' 'src/**/*.js' '.storybook/**/*.js' 'scripts/**/*.js'", + "lint": "eslint './*.{js,ts}' 'test/**/*.{js,ts}' 'src/**/*.{js,ts}' '.storybook/**/*.{js,ts}' 'scripts/**/*.{js,ts}'", + "format": "prettier --write './*.{js,ts}' 'test/**/*.{js,ts}' 'src/**/*.{js,ts}' '.storybook/**/*.{js,ts}' 'scripts/**/*.{js,ts}'", "commit": "cz", "updateGitHooks": "simple-git-hooks" }, @@ -81,6 +84,10 @@ "@swc/jest": "^0.2.20", "@testing-library/jest-dom": "^5.16.4", "@types/faker": "^5.5.8", + "@types/jest": "^27.5.1", + "@types/node": "^17.0.34", + "@typescript-eslint/eslint-plugin": "^5.25.0", + "@typescript-eslint/parser": "^5.25.0", "browserslist": "^4.20.2", "chartist": "^0.11.4", "commitizen": "^4.2.4", @@ -107,7 +114,10 @@ "rollup-plugin-swc": "^0.2.1", "sass": "^1.50.1", "sass-loader": "^10.0.0", - "simple-git-hooks": "^2.7.0" + "simple-git-hooks": "^2.7.0", + "swc-loader": "^0.2.3", + "tsd": "^0.20.0", + "typescript": "^4.6.4" }, "readme": "" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 60a87b0d..43ec2884 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -19,6 +19,10 @@ specifiers: '@swc/jest': ^0.2.20 '@testing-library/jest-dom': ^5.16.4 '@types/faker': ^5.5.8 + '@types/jest': ^27.5.1 + '@types/node': ^17.0.34 + '@typescript-eslint/eslint-plugin': ^5.25.0 + '@typescript-eslint/parser': ^5.25.0 browserslist: ^4.20.2 chartist: ^0.11.4 commitizen: ^4.2.4 @@ -46,6 +50,9 @@ specifiers: sass: ^1.50.1 sass-loader: ^10.0.0 simple-git-hooks: ^2.7.0 + swc-loader: ^0.2.3 + tsd: ^0.20.0 + typescript: ^4.6.4 devDependencies: '@babel/core': 7.17.9 @@ -55,17 +62,21 @@ devDependencies: '@commitlint/cz-commitlint': 16.2.3_d728995458426a93696f083845656c00 '@rollup/plugin-node-resolve': 13.2.0_rollup@2.70.1 '@storybook/addon-actions': 6.4.22 - '@storybook/addon-controls': 6.4.22_eslint@8.15.0 - '@storybook/addon-docs': 6.4.22_bb08b3ace3da23babfac149a03b58596 - '@storybook/addon-storyshots': 6.4.22_eslint@8.15.0+jest@27.5.1 + '@storybook/addon-controls': 6.4.22_eslint@8.15.0+typescript@4.6.4 + '@storybook/addon-docs': 6.4.22_5d666fb5b9c479b3d907ef7c497df350 + '@storybook/addon-storyshots': 6.4.22_18f88eb32f74f372eb2564942362dd40 '@storybook/addon-storyshots-puppeteer': 6.4.22_ee73af2950fdda0cdee7b156fb6cc3b7 '@storybook/addon-viewport': 6.4.22 - '@storybook/html': 6.4.22_@babel+core@7.17.9+eslint@8.15.0 + '@storybook/html': 6.4.22_99ab00defb472bd59e7c8ea756614640 '@swc/core': 1.2.165 '@swc/helpers': 0.3.8 '@swc/jest': 0.2.20_@swc+core@1.2.165 '@testing-library/jest-dom': 5.16.4 '@types/faker': 5.5.9 + '@types/jest': 27.5.1 + '@types/node': 17.0.34 + '@typescript-eslint/eslint-plugin': 5.25.0_83b4734ba99fefa06dfff9f51a4c4301 + '@typescript-eslint/parser': 5.25.0_eslint@8.15.0+typescript@4.6.4 browserslist: 4.20.2 chartist: 0.11.4 commitizen: 4.2.4_@swc+core@1.2.165 @@ -74,10 +85,10 @@ devDependencies: del-cli: 4.0.1 eslint: 8.15.0 eslint-config-prettier: 8.5.0_eslint@8.15.0 - eslint-plugin-jest: 26.2.2_eslint@8.15.0+jest@27.5.1 + eslint-plugin-jest: 26.2.2_93a18a14fb19656958628faf0a8b5863 eslint-plugin-jest-dom: 4.0.1_eslint@8.15.0 eslint-plugin-prettier: 4.0.0_440b30a60bbe5bb6e3ad0057150b2782 - eslint-plugin-testing-library: 5.5.0_eslint@8.15.0 + eslint-plugin-testing-library: 5.5.0_eslint@8.15.0+typescript@4.6.4 faker: 5.5.3 http-server: 14.1.0 inquirer: 8.2.2 @@ -93,6 +104,9 @@ devDependencies: sass: 1.50.1 sass-loader: 10.2.1_sass@1.50.1 simple-git-hooks: 2.7.0 + swc-loader: 0.2.3_@swc+core@1.2.165 + tsd: 0.20.0 + typescript: 4.6.4 packages: @@ -1656,13 +1670,13 @@ packages: '@commitlint/execute-rule': 16.2.1 '@commitlint/resolve-extends': 16.2.1 '@commitlint/types': 16.2.1 - '@types/node': 17.0.23 + '@types/node': 17.0.34 chalk: 4.1.2 cosmiconfig: 7.0.1 - cosmiconfig-typescript-loader: 1.0.9_f533c3387680131348857b0baefd0f31 + cosmiconfig-typescript-loader: 1.0.9_8ffbbd0e65bf654299df3e9f6b2219d7 lodash: 4.17.21 resolve-from: 5.0.0 - typescript: 4.6.3 + typescript: 4.6.4 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' @@ -1676,10 +1690,10 @@ packages: '@commitlint/execute-rule': 17.0.0 '@commitlint/resolve-extends': 17.0.0 '@commitlint/types': 17.0.0 - '@types/node': 17.0.23 + '@types/node': 17.0.34 chalk: 4.1.2 cosmiconfig: 7.0.1 - cosmiconfig-typescript-loader: 2.0.0_5afcf6943f43533df426196350caf695 + cosmiconfig-typescript-loader: 2.0.0_8ffbbd0e65bf654299df3e9f6b2219d7 lodash: 4.17.21 resolve-from: 5.0.0 typescript: 4.6.4 @@ -1993,7 +2007,7 @@ packages: engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.5.1 - '@types/node': 17.0.23 + '@types/node': 17.0.34 chalk: 4.1.2 jest-message-util: 27.5.1 jest-util: 27.5.1 @@ -2014,7 +2028,7 @@ packages: '@jest/test-result': 27.5.1 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 17.0.23 + '@types/node': 17.0.34 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.8.1 @@ -2058,7 +2072,7 @@ packages: dependencies: '@jest/fake-timers': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 17.0.23 + '@types/node': 17.0.34 jest-mock: 27.5.1 dev: true @@ -2068,7 +2082,7 @@ packages: dependencies: '@jest/types': 27.5.1 '@sinonjs/fake-timers': 8.1.0 - '@types/node': 17.0.23 + '@types/node': 17.0.34 jest-message-util: 27.5.1 jest-mock: 27.5.1 jest-util: 27.5.1 @@ -2097,7 +2111,7 @@ packages: '@jest/test-result': 27.5.1 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 17.0.23 + '@types/node': 17.0.34 chalk: 4.1.2 collect-v8-coverage: 1.0.1 exit: 0.1.2 @@ -2204,7 +2218,7 @@ packages: dependencies: '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 17.0.23 + '@types/node': 17.0.34 '@types/yargs': 15.0.14 chalk: 4.1.2 dev: true @@ -2215,7 +2229,7 @@ packages: dependencies: '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 17.0.23 + '@types/node': 17.0.34 '@types/yargs': 16.0.4 chalk: 4.1.2 dev: true @@ -2416,7 +2430,7 @@ packages: - '@types/react' dev: true - /@storybook/addon-controls/6.4.22_eslint@8.15.0: + /@storybook/addon-controls/6.4.22_eslint@8.15.0+typescript@4.6.4: resolution: {integrity: sha512-f/M/W+7UTEUnr/L6scBMvksq+ZA8GTfh3bomE5FtWyOyaFppq9k8daKAvdYNlzXAOrUUsoZVJDgpb20Z2VBiSQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 @@ -2431,7 +2445,7 @@ packages: '@storybook/api': 6.4.22 '@storybook/client-logger': 6.4.22 '@storybook/components': 6.4.22 - '@storybook/core-common': 6.4.22_eslint@8.15.0 + '@storybook/core-common': 6.4.22_eslint@8.15.0+typescript@4.6.4 '@storybook/csf': 0.0.2--canary.87bc651.0 '@storybook/node-logger': 6.4.22 '@storybook/store': 6.4.22 @@ -2449,7 +2463,7 @@ packages: - webpack-command dev: true - /@storybook/addon-docs/6.4.22_bb08b3ace3da23babfac149a03b58596: + /@storybook/addon-docs/6.4.22_5d666fb5b9c479b3d907ef7c497df350: resolution: {integrity: sha512-9j+i+W+BGHJuRe4jUrqk6ubCzP4fc1xgFS2o8pakRiZgPn5kUQPdkticmsyh1XeEJifwhqjKJvkEDrcsleytDA==} peerDependencies: '@storybook/angular': 6.4.22 @@ -2507,14 +2521,14 @@ packages: '@mdx-js/react': 1.6.22 '@storybook/addons': 6.4.22 '@storybook/api': 6.4.22 - '@storybook/builder-webpack4': 6.4.22_eslint@8.15.0 + '@storybook/builder-webpack4': 6.4.22_eslint@8.15.0+typescript@4.6.4 '@storybook/client-logger': 6.4.22 '@storybook/components': 6.4.22 - '@storybook/core': 6.4.22_eslint@8.15.0 + '@storybook/core': 6.4.22_eslint@8.15.0+typescript@4.6.4 '@storybook/core-events': 6.4.22 '@storybook/csf': 0.0.2--canary.87bc651.0 '@storybook/csf-tools': 6.4.22 - '@storybook/html': 6.4.22_@babel+core@7.17.9+eslint@8.15.0 + '@storybook/html': 6.4.22_99ab00defb472bd59e7c8ea756614640 '@storybook/node-logger': 6.4.22 '@storybook/postinstall': 6.4.22 '@storybook/preview-web': 6.4.22 @@ -2568,7 +2582,7 @@ packages: optional: true dependencies: '@axe-core/puppeteer': 4.4.2_puppeteer@14.0.0 - '@storybook/addon-storyshots': 6.4.22_eslint@8.15.0+jest@27.5.1 + '@storybook/addon-storyshots': 6.4.22_18f88eb32f74f372eb2564942362dd40 '@storybook/csf': 0.0.2--canary.87bc651.0 '@storybook/node-logger': 6.4.22 '@types/jest-image-snapshot': 4.3.1 @@ -2580,7 +2594,7 @@ packages: - jest dev: true - /@storybook/addon-storyshots/6.4.22_eslint@8.15.0+jest@27.5.1: + /@storybook/addon-storyshots/6.4.22_18f88eb32f74f372eb2564942362dd40: resolution: {integrity: sha512-9u+uigHH4khxHB18z1TOau+RKpLo/8tdhvKVqgjy6pr3FSsgp+JyoI+ubDtgWAWFHQ0Zhh5MBWNDmPOo5pwBdA==} peerDependencies: '@angular/core': '>=6.0.0' @@ -2635,9 +2649,9 @@ packages: '@storybook/addons': 6.4.22 '@storybook/babel-plugin-require-context-hook': 1.0.1 '@storybook/client-api': 6.4.22 - '@storybook/core': 6.4.22_eslint@8.15.0 - '@storybook/core-client': 6.4.22 - '@storybook/core-common': 6.4.22_eslint@8.15.0 + '@storybook/core': 6.4.22_eslint@8.15.0+typescript@4.6.4 + '@storybook/core-client': 6.4.22_typescript@4.6.4 + '@storybook/core-common': 6.4.22_eslint@8.15.0+typescript@4.6.4 '@storybook/csf': 0.0.2--canary.87bc651.0 '@types/glob': 7.2.0 '@types/jest': 26.0.24 @@ -2791,7 +2805,7 @@ packages: resolution: {integrity: sha512-WM4vjgSVi8epvGiYfru7BtC3f0tGwNs7QK3Uc4xQn4t5hHQvISnCqbNrHdDYmNW56Do+bBztE8SwP6NGUvd7ww==} dev: true - /@storybook/builder-webpack4/6.4.22_92b9a5635cc8dc22d6ee778fa547da7f: + /@storybook/builder-webpack4/6.4.22_68167c448effea8d9d4b4729bd410c99: resolution: {integrity: sha512-A+GgGtKGnBneRFSFkDarUIgUTI8pYFdLmUVKEAGdh2hL+vLXAz9A46sEY7C8LQ85XWa8TKy3OTDxqR4+4iWj3A==} peerDependencies: react: ^16.8.0 || ^17.0.0 @@ -2829,7 +2843,7 @@ packages: '@storybook/client-api': 6.4.22_react-dom@16.14.0+react@16.14.0 '@storybook/client-logger': 6.4.22 '@storybook/components': 6.4.22_react-dom@16.14.0+react@16.14.0 - '@storybook/core-common': 6.4.22_92b9a5635cc8dc22d6ee778fa547da7f + '@storybook/core-common': 6.4.22_68167c448effea8d9d4b4729bd410c99 '@storybook/core-events': 6.4.22 '@storybook/node-logger': 6.4.22 '@storybook/preview-web': 6.4.22_react-dom@16.14.0+react@16.14.0 @@ -2854,7 +2868,7 @@ packages: glob-promise: 3.4.0_glob@7.2.0 global: 4.4.0 html-webpack-plugin: 4.5.2_webpack@4.46.0 - pnp-webpack-plugin: 1.6.4 + pnp-webpack-plugin: 1.6.4_typescript@4.6.4 postcss: 7.0.39 postcss-flexbugs-fixes: 4.2.1 postcss-loader: 4.3.0_postcss@7.0.39+webpack@4.46.0 @@ -2865,6 +2879,7 @@ packages: style-loader: 1.3.0_webpack@4.46.0 terser-webpack-plugin: 4.2.3_webpack@4.46.0 ts-dedent: 2.2.0 + typescript: 4.6.4 url-loader: 4.1.1_file-loader@6.2.0+webpack@4.46.0 util-deprecate: 1.0.2 webpack: 4.46.0 @@ -2881,7 +2896,7 @@ packages: - webpack-command dev: true - /@storybook/builder-webpack4/6.4.22_eslint@8.15.0: + /@storybook/builder-webpack4/6.4.22_eslint@8.15.0+typescript@4.6.4: resolution: {integrity: sha512-A+GgGtKGnBneRFSFkDarUIgUTI8pYFdLmUVKEAGdh2hL+vLXAz9A46sEY7C8LQ85XWa8TKy3OTDxqR4+4iWj3A==} peerDependencies: react: ^16.8.0 || ^17.0.0 @@ -2919,7 +2934,7 @@ packages: '@storybook/client-api': 6.4.22 '@storybook/client-logger': 6.4.22 '@storybook/components': 6.4.22 - '@storybook/core-common': 6.4.22_eslint@8.15.0 + '@storybook/core-common': 6.4.22_eslint@8.15.0+typescript@4.6.4 '@storybook/core-events': 6.4.22 '@storybook/node-logger': 6.4.22 '@storybook/preview-web': 6.4.22 @@ -2944,7 +2959,7 @@ packages: glob-promise: 3.4.0_glob@7.2.0 global: 4.4.0 html-webpack-plugin: 4.5.2_webpack@4.46.0 - pnp-webpack-plugin: 1.6.4 + pnp-webpack-plugin: 1.6.4_typescript@4.6.4 postcss: 7.0.39 postcss-flexbugs-fixes: 4.2.1 postcss-loader: 4.3.0_postcss@7.0.39+webpack@4.46.0 @@ -2953,6 +2968,7 @@ packages: style-loader: 1.3.0_webpack@4.46.0 terser-webpack-plugin: 4.2.3_webpack@4.46.0 ts-dedent: 2.2.0 + typescript: 4.6.4 url-loader: 4.1.1_file-loader@6.2.0+webpack@4.46.0 util-deprecate: 1.0.2 webpack: 4.46.0 @@ -3134,7 +3150,7 @@ packages: - '@types/react' dev: true - /@storybook/core-client/6.4.22: + /@storybook/core-client/6.4.22_1596ec9896079968c237ec0328822914: resolution: {integrity: sha512-uHg4yfCBeM6eASSVxStWRVTZrAnb4FT6X6v/xDqr4uXCpCttZLlBzrSDwPBLNNLtCa7ntRicHM8eGKIOD5lMYQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 @@ -3145,31 +3161,34 @@ packages: typescript: optional: true dependencies: - '@storybook/addons': 6.4.22 + '@storybook/addons': 6.4.22_react-dom@16.14.0+react@16.14.0 '@storybook/channel-postmessage': 6.4.22 '@storybook/channel-websocket': 6.4.22 - '@storybook/client-api': 6.4.22 + '@storybook/client-api': 6.4.22_react-dom@16.14.0+react@16.14.0 '@storybook/client-logger': 6.4.22 '@storybook/core-events': 6.4.22 '@storybook/csf': 0.0.2--canary.87bc651.0 - '@storybook/preview-web': 6.4.22 - '@storybook/store': 6.4.22 - '@storybook/ui': 6.4.22 + '@storybook/preview-web': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@storybook/store': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@storybook/ui': 6.4.22_react-dom@16.14.0+react@16.14.0 airbnb-js-shims: 2.2.1 ansi-to-html: 0.6.15 core-js: 3.21.1 global: 4.4.0 lodash: 4.17.21 qs: 6.10.3 + react: 16.14.0 + react-dom: 16.14.0_react@16.14.0 regenerator-runtime: 0.13.9 ts-dedent: 2.2.0 + typescript: 4.6.4 unfetch: 4.2.0 util-deprecate: 1.0.2 transitivePeerDependencies: - '@types/react' dev: true - /@storybook/core-client/6.4.22_e97e5e3809294a3414549b4ba42cd203: + /@storybook/core-client/6.4.22_1f8af36a8b5954de0d5333310cffb8de: resolution: {integrity: sha512-uHg4yfCBeM6eASSVxStWRVTZrAnb4FT6X6v/xDqr4uXCpCttZLlBzrSDwPBLNNLtCa7ntRicHM8eGKIOD5lMYQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 @@ -3200,6 +3219,7 @@ packages: react-dom: 16.14.0_react@16.14.0 regenerator-runtime: 0.13.9 ts-dedent: 2.2.0 + typescript: 4.6.4 unfetch: 4.2.0 util-deprecate: 1.0.2 webpack: 4.46.0 @@ -3207,7 +3227,7 @@ packages: - '@types/react' dev: true - /@storybook/core-client/6.4.22_react-dom@16.14.0+react@16.14.0: + /@storybook/core-client/6.4.22_typescript@4.6.4: resolution: {integrity: sha512-uHg4yfCBeM6eASSVxStWRVTZrAnb4FT6X6v/xDqr4uXCpCttZLlBzrSDwPBLNNLtCa7ntRicHM8eGKIOD5lMYQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 @@ -3218,33 +3238,32 @@ packages: typescript: optional: true dependencies: - '@storybook/addons': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@storybook/addons': 6.4.22 '@storybook/channel-postmessage': 6.4.22 '@storybook/channel-websocket': 6.4.22 - '@storybook/client-api': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@storybook/client-api': 6.4.22 '@storybook/client-logger': 6.4.22 '@storybook/core-events': 6.4.22 '@storybook/csf': 0.0.2--canary.87bc651.0 - '@storybook/preview-web': 6.4.22_react-dom@16.14.0+react@16.14.0 - '@storybook/store': 6.4.22_react-dom@16.14.0+react@16.14.0 - '@storybook/ui': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@storybook/preview-web': 6.4.22 + '@storybook/store': 6.4.22 + '@storybook/ui': 6.4.22 airbnb-js-shims: 2.2.1 ansi-to-html: 0.6.15 core-js: 3.21.1 global: 4.4.0 lodash: 4.17.21 qs: 6.10.3 - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 regenerator-runtime: 0.13.9 ts-dedent: 2.2.0 + typescript: 4.6.4 unfetch: 4.2.0 util-deprecate: 1.0.2 transitivePeerDependencies: - '@types/react' dev: true - /@storybook/core-client/6.4.22_webpack@4.46.0: + /@storybook/core-client/6.4.22_typescript@4.6.4+webpack@4.46.0: resolution: {integrity: sha512-uHg4yfCBeM6eASSVxStWRVTZrAnb4FT6X6v/xDqr4uXCpCttZLlBzrSDwPBLNNLtCa7ntRicHM8eGKIOD5lMYQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 @@ -3273,6 +3292,7 @@ packages: qs: 6.10.3 regenerator-runtime: 0.13.9 ts-dedent: 2.2.0 + typescript: 4.6.4 unfetch: 4.2.0 util-deprecate: 1.0.2 webpack: 4.46.0 @@ -3280,7 +3300,7 @@ packages: - '@types/react' dev: true - /@storybook/core-common/6.4.22_92b9a5635cc8dc22d6ee778fa547da7f: + /@storybook/core-common/6.4.22_68167c448effea8d9d4b4729bd410c99: resolution: {integrity: sha512-PD3N/FJXPNRHeQS2zdgzYFtqPLdi3MLwAicbnw+U3SokcsspfsAuyYHZOYZgwO8IAEKy6iCc7TpBdiSJZ/vAKQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 @@ -3323,7 +3343,7 @@ packages: express: 4.17.3 file-system-cache: 1.0.5 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.1_eslint@8.15.0+webpack@4.46.0 + fork-ts-checker-webpack-plugin: 6.5.1_fd9ac946626c89e3cf2883682b7adefb fs-extra: 9.1.0 glob: 7.2.0 handlebars: 4.7.7 @@ -3339,6 +3359,7 @@ packages: slash: 3.0.0 telejson: 5.3.3 ts-dedent: 2.2.0 + typescript: 4.6.4 util-deprecate: 1.0.2 webpack: 4.46.0 transitivePeerDependencies: @@ -3349,7 +3370,7 @@ packages: - webpack-command dev: true - /@storybook/core-common/6.4.22_eslint@8.15.0: + /@storybook/core-common/6.4.22_eslint@8.15.0+typescript@4.6.4: resolution: {integrity: sha512-PD3N/FJXPNRHeQS2zdgzYFtqPLdi3MLwAicbnw+U3SokcsspfsAuyYHZOYZgwO8IAEKy6iCc7TpBdiSJZ/vAKQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 @@ -3392,7 +3413,7 @@ packages: express: 4.17.3 file-system-cache: 1.0.5 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.1_eslint@8.15.0+webpack@4.46.0 + fork-ts-checker-webpack-plugin: 6.5.1_fd9ac946626c89e3cf2883682b7adefb fs-extra: 9.1.0 glob: 7.2.0 handlebars: 4.7.7 @@ -3406,6 +3427,7 @@ packages: slash: 3.0.0 telejson: 5.3.3 ts-dedent: 2.2.0 + typescript: 4.6.4 util-deprecate: 1.0.2 webpack: 4.46.0 transitivePeerDependencies: @@ -3422,7 +3444,7 @@ packages: core-js: 3.21.1 dev: true - /@storybook/core-server/6.4.22_92b9a5635cc8dc22d6ee778fa547da7f: + /@storybook/core-server/6.4.22_68167c448effea8d9d4b4729bd410c99: resolution: {integrity: sha512-wFh3e2fa0un1d4+BJP+nd3FVWUO7uHTqv3OGBfOmzQMKp4NU1zaBNdSQG7Hz6mw0fYPBPZgBjPfsJRwIYLLZyw==} peerDependencies: '@storybook/builder-webpack5': 6.4.22 @@ -3439,13 +3461,13 @@ packages: optional: true dependencies: '@discoveryjs/json-ext': 0.5.7 - '@storybook/builder-webpack4': 6.4.22_92b9a5635cc8dc22d6ee778fa547da7f - '@storybook/core-client': 6.4.22_e97e5e3809294a3414549b4ba42cd203 - '@storybook/core-common': 6.4.22_92b9a5635cc8dc22d6ee778fa547da7f + '@storybook/builder-webpack4': 6.4.22_68167c448effea8d9d4b4729bd410c99 + '@storybook/core-client': 6.4.22_1f8af36a8b5954de0d5333310cffb8de + '@storybook/core-common': 6.4.22_68167c448effea8d9d4b4729bd410c99 '@storybook/core-events': 6.4.22 '@storybook/csf': 0.0.2--canary.87bc651.0 '@storybook/csf-tools': 6.4.22 - '@storybook/manager-webpack4': 6.4.22_92b9a5635cc8dc22d6ee778fa547da7f + '@storybook/manager-webpack4': 6.4.22_68167c448effea8d9d4b4729bd410c99 '@storybook/node-logger': 6.4.22 '@storybook/semver': 7.3.2 '@storybook/store': 6.4.22_react-dom@16.14.0+react@16.14.0 @@ -3478,6 +3500,7 @@ packages: slash: 3.0.0 telejson: 5.3.3 ts-dedent: 2.2.0 + typescript: 4.6.4 util-deprecate: 1.0.2 watchpack: 2.3.1 webpack: 4.46.0 @@ -3494,7 +3517,7 @@ packages: - webpack-command dev: true - /@storybook/core-server/6.4.22_eslint@8.15.0: + /@storybook/core-server/6.4.22_eslint@8.15.0+typescript@4.6.4: resolution: {integrity: sha512-wFh3e2fa0un1d4+BJP+nd3FVWUO7uHTqv3OGBfOmzQMKp4NU1zaBNdSQG7Hz6mw0fYPBPZgBjPfsJRwIYLLZyw==} peerDependencies: '@storybook/builder-webpack5': 6.4.22 @@ -3511,13 +3534,13 @@ packages: optional: true dependencies: '@discoveryjs/json-ext': 0.5.7 - '@storybook/builder-webpack4': 6.4.22_eslint@8.15.0 - '@storybook/core-client': 6.4.22_webpack@4.46.0 - '@storybook/core-common': 6.4.22_eslint@8.15.0 + '@storybook/builder-webpack4': 6.4.22_eslint@8.15.0+typescript@4.6.4 + '@storybook/core-client': 6.4.22_typescript@4.6.4+webpack@4.46.0 + '@storybook/core-common': 6.4.22_eslint@8.15.0+typescript@4.6.4 '@storybook/core-events': 6.4.22 '@storybook/csf': 0.0.2--canary.87bc651.0 '@storybook/csf-tools': 6.4.22 - '@storybook/manager-webpack4': 6.4.22_eslint@8.15.0 + '@storybook/manager-webpack4': 6.4.22_eslint@8.15.0+typescript@4.6.4 '@storybook/node-logger': 6.4.22 '@storybook/semver': 7.3.2 '@storybook/store': 6.4.22 @@ -3548,6 +3571,7 @@ packages: slash: 3.0.0 telejson: 5.3.3 ts-dedent: 2.2.0 + typescript: 4.6.4 util-deprecate: 1.0.2 watchpack: 2.3.1 webpack: 4.46.0 @@ -3564,7 +3588,7 @@ packages: - webpack-command dev: true - /@storybook/core/6.4.22_92b9a5635cc8dc22d6ee778fa547da7f: + /@storybook/core/6.4.22_68167c448effea8d9d4b4729bd410c99: resolution: {integrity: sha512-KZYJt7GM5NgKFXbPRZZZPEONZ5u/tE/cRbMdkn/zWN3He8+VP+65/tz8hbriI/6m91AWVWkBKrODSkeq59NgRA==} peerDependencies: '@storybook/builder-webpack5': 6.4.22 @@ -3578,10 +3602,11 @@ packages: typescript: optional: true dependencies: - '@storybook/core-client': 6.4.22_react-dom@16.14.0+react@16.14.0 - '@storybook/core-server': 6.4.22_92b9a5635cc8dc22d6ee778fa547da7f + '@storybook/core-client': 6.4.22_1596ec9896079968c237ec0328822914 + '@storybook/core-server': 6.4.22_68167c448effea8d9d4b4729bd410c99 react: 16.14.0 react-dom: 16.14.0_react@16.14.0 + typescript: 4.6.4 transitivePeerDependencies: - '@storybook/manager-webpack5' - '@types/react' @@ -3595,7 +3620,7 @@ packages: - webpack-command dev: true - /@storybook/core/6.4.22_eslint@8.15.0: + /@storybook/core/6.4.22_eslint@8.15.0+typescript@4.6.4: resolution: {integrity: sha512-KZYJt7GM5NgKFXbPRZZZPEONZ5u/tE/cRbMdkn/zWN3He8+VP+65/tz8hbriI/6m91AWVWkBKrODSkeq59NgRA==} peerDependencies: '@storybook/builder-webpack5': 6.4.22 @@ -3609,8 +3634,9 @@ packages: typescript: optional: true dependencies: - '@storybook/core-client': 6.4.22 - '@storybook/core-server': 6.4.22_eslint@8.15.0 + '@storybook/core-client': 6.4.22_typescript@4.6.4 + '@storybook/core-server': 6.4.22_eslint@8.15.0+typescript@4.6.4 + typescript: 4.6.4 transitivePeerDependencies: - '@storybook/manager-webpack5' - '@types/react' @@ -3654,7 +3680,7 @@ packages: lodash: 4.17.21 dev: true - /@storybook/html/6.4.22_@babel+core@7.17.9+eslint@8.15.0: + /@storybook/html/6.4.22_99ab00defb472bd59e7c8ea756614640: resolution: {integrity: sha512-qOULn4db1bJlN6IuGCfH2g88utO+0h9aFityfRpmM0KntYx+tezLDD2/2yzdRy69Mh3KsIoqmDtX0hdsaFxH6w==} engines: {node: '>=10.13.0'} hasBin: true @@ -3664,8 +3690,8 @@ packages: '@babel/core': 7.17.9 '@storybook/addons': 6.4.22_react-dom@16.14.0+react@16.14.0 '@storybook/client-api': 6.4.22_react-dom@16.14.0+react@16.14.0 - '@storybook/core': 6.4.22_92b9a5635cc8dc22d6ee778fa547da7f - '@storybook/core-common': 6.4.22_92b9a5635cc8dc22d6ee778fa547da7f + '@storybook/core': 6.4.22_68167c448effea8d9d4b4729bd410c99 + '@storybook/core-common': 6.4.22_68167c448effea8d9d4b4729bd410c99 '@storybook/csf': 0.0.2--canary.87bc651.0 '@storybook/preview-web': 6.4.22_react-dom@16.14.0+react@16.14.0 '@storybook/store': 6.4.22_react-dom@16.14.0+react@16.14.0 @@ -3694,7 +3720,7 @@ packages: - webpack-command dev: true - /@storybook/manager-webpack4/6.4.22_92b9a5635cc8dc22d6ee778fa547da7f: + /@storybook/manager-webpack4/6.4.22_68167c448effea8d9d4b4729bd410c99: resolution: {integrity: sha512-nzhDMJYg0vXdcG0ctwE6YFZBX71+5NYaTGkxg3xT7gbgnP1YFXn9gVODvgq3tPb3gcRapjyOIxUa20rV+r8edA==} peerDependencies: react: ^16.8.0 || ^17.0.0 @@ -3708,8 +3734,8 @@ packages: '@babel/plugin-transform-template-literals': 7.16.7_@babel+core@7.17.9 '@babel/preset-react': 7.16.7_@babel+core@7.17.9 '@storybook/addons': 6.4.22_react-dom@16.14.0+react@16.14.0 - '@storybook/core-client': 6.4.22_e97e5e3809294a3414549b4ba42cd203 - '@storybook/core-common': 6.4.22_92b9a5635cc8dc22d6ee778fa547da7f + '@storybook/core-client': 6.4.22_1f8af36a8b5954de0d5333310cffb8de + '@storybook/core-common': 6.4.22_68167c448effea8d9d4b4729bd410c99 '@storybook/node-logger': 6.4.22 '@storybook/theming': 6.4.22_react-dom@16.14.0+react@16.14.0 '@storybook/ui': 6.4.22_react-dom@16.14.0+react@16.14.0 @@ -3727,7 +3753,7 @@ packages: fs-extra: 9.1.0 html-webpack-plugin: 4.5.2_webpack@4.46.0 node-fetch: 2.6.7 - pnp-webpack-plugin: 1.6.4 + pnp-webpack-plugin: 1.6.4_typescript@4.6.4 react: 16.14.0 react-dom: 16.14.0_react@16.14.0 read-pkg-up: 7.0.1 @@ -3737,6 +3763,7 @@ packages: telejson: 5.3.3 terser-webpack-plugin: 4.2.3_webpack@4.46.0 ts-dedent: 2.2.0 + typescript: 4.6.4 url-loader: 4.1.1_file-loader@6.2.0+webpack@4.46.0 util-deprecate: 1.0.2 webpack: 4.46.0 @@ -3752,7 +3779,7 @@ packages: - webpack-command dev: true - /@storybook/manager-webpack4/6.4.22_eslint@8.15.0: + /@storybook/manager-webpack4/6.4.22_eslint@8.15.0+typescript@4.6.4: resolution: {integrity: sha512-nzhDMJYg0vXdcG0ctwE6YFZBX71+5NYaTGkxg3xT7gbgnP1YFXn9gVODvgq3tPb3gcRapjyOIxUa20rV+r8edA==} peerDependencies: react: ^16.8.0 || ^17.0.0 @@ -3766,8 +3793,8 @@ packages: '@babel/plugin-transform-template-literals': 7.16.7_@babel+core@7.17.9 '@babel/preset-react': 7.16.7_@babel+core@7.17.9 '@storybook/addons': 6.4.22 - '@storybook/core-client': 6.4.22_webpack@4.46.0 - '@storybook/core-common': 6.4.22_eslint@8.15.0 + '@storybook/core-client': 6.4.22_typescript@4.6.4+webpack@4.46.0 + '@storybook/core-common': 6.4.22_eslint@8.15.0+typescript@4.6.4 '@storybook/node-logger': 6.4.22 '@storybook/theming': 6.4.22 '@storybook/ui': 6.4.22 @@ -3785,7 +3812,7 @@ packages: fs-extra: 9.1.0 html-webpack-plugin: 4.5.2_webpack@4.46.0 node-fetch: 2.6.7 - pnp-webpack-plugin: 1.6.4 + pnp-webpack-plugin: 1.6.4_typescript@4.6.4 read-pkg-up: 7.0.1 regenerator-runtime: 0.13.9 resolve-from: 5.0.0 @@ -3793,6 +3820,7 @@ packages: telejson: 5.3.3 terser-webpack-plugin: 4.2.3_webpack@4.46.0 ts-dedent: 2.2.0 + typescript: 4.6.4 url-loader: 4.1.1_file-loader@6.2.0+webpack@4.46.0 util-deprecate: 1.0.2 webpack: 4.46.0 @@ -4310,6 +4338,11 @@ packages: resolution: {integrity: sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==} dev: true + /@tsd/typescript/4.6.4: + resolution: {integrity: sha512-+9o716aWbcjKLbV4bCrGlJKJbS0UZNogfVk9U7ffooYSf/9GOJ6wwahTSrRjW7mWQdywQ/sIg9xxbuPLnkmhwg==} + hasBin: true + dev: true + /@types/aria-query/4.2.2: resolution: {integrity: sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig==} dev: true @@ -4353,6 +4386,13 @@ packages: resolution: {integrity: sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==} dev: true + /@types/eslint/7.29.0: + resolution: {integrity: sha512-VNcvioYDH8/FxaeTKkM4/TiTwt6pBV9E3OfGmvaw8tPl0rrHCJ4Ll15HRT+pMiFAf/MLQvAzC+6RzUMEL9Ceng==} + dependencies: + '@types/estree': 0.0.39 + '@types/json-schema': 7.0.11 + dev: true + /@types/estree/0.0.39: resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} dev: true @@ -4365,13 +4405,13 @@ packages: resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} dependencies: '@types/minimatch': 3.0.5 - '@types/node': 17.0.23 + '@types/node': 17.0.34 dev: true /@types/graceful-fs/4.1.5: resolution: {integrity: sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==} dependencies: - '@types/node': 17.0.23 + '@types/node': 17.0.34 dev: true /@types/hast/2.3.4: @@ -4407,7 +4447,7 @@ packages: /@types/jest-image-snapshot/4.3.1: resolution: {integrity: sha512-WDdUruGF14C53axe/mNDgQP2YIhtcwXrwmmVP8eOGyfNTVD+FbxWjWR7RTU+lzEy4K6V6+z7nkVDm/auI/r3xQ==} dependencies: - '@types/jest': 27.4.1 + '@types/jest': 27.5.1 '@types/pixelmatch': 5.2.4 ssim.js: 3.5.0 dev: true @@ -4415,7 +4455,7 @@ packages: /@types/jest-specific-snapshot/0.5.5: resolution: {integrity: sha512-AaPPw2tE8ewfjD6qGLkEd4DOfM6pPOK7ob/RSOe1Z8Oo70r9Jgo0SlWyfxslPAOvLfQukQtiVPm6DcnjSoZU5A==} dependencies: - '@types/jest': 27.4.1 + '@types/jest': 27.5.1 dev: true /@types/jest/26.0.24: @@ -4425,8 +4465,8 @@ packages: pretty-format: 26.6.2 dev: true - /@types/jest/27.4.1: - resolution: {integrity: sha512-23iPJADSmicDVrWk+HT58LMJtzLAnB2AgIzplQuq/bSrGaxCrlvRFjGbXmamnnk/mAmCdLStiGqggu28ocUyiw==} + /@types/jest/27.5.1: + resolution: {integrity: sha512-fUy7YRpT+rHXto1YlL+J9rs0uLGyiqVt3ZOTQR+4ROc47yNl8WLdVLgUloBRhOxP1PZvguHl44T3H0wAWxahYQ==} dependencies: jest-matcher-utils: 27.5.1 pretty-format: 27.5.1 @@ -4453,7 +4493,7 @@ packages: /@types/node-fetch/2.6.1: resolution: {integrity: sha512-oMqjURCaxoSIsHSr1E47QHzbmzNR5rK8McHuNb11BOM9cHcIK3Avy0s/b2JlXHoQGTYS3NsvWzV1M0iK7l0wbA==} dependencies: - '@types/node': 17.0.23 + '@types/node': 17.0.34 form-data: 3.0.1 dev: true @@ -4461,8 +4501,8 @@ packages: resolution: {integrity: sha512-Z6/KzgyWOga3pJNS42A+zayjhPbf2zM3hegRQaOPnLOzEi86VV++6FLDWgR1LGrVCRufP/ph2daa3tEa5br1zA==} dev: true - /@types/node/17.0.23: - resolution: {integrity: sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==} + /@types/node/17.0.34: + resolution: {integrity: sha512-XImEz7XwTvDBtzlTnm8YvMqGW/ErMWBsKZ+hMTvnDIjGCKxwK5Xpc+c/oQjOauwq8M4OS11hEkpjX8rrI/eEgA==} dev: true /@types/normalize-package-data/2.4.1: @@ -4488,7 +4528,7 @@ packages: /@types/pixelmatch/5.2.4: resolution: {integrity: sha512-HDaSHIAv9kwpMN7zlmwfTv6gax0PiporJOipcrGsVNF3Ba+kryOZc0Pio5pn6NhisgWr7TaajlPEKTbTAypIBQ==} dependencies: - '@types/node': 17.0.23 + '@types/node': 17.0.34 dev: true /@types/prettier/2.6.0: @@ -4528,7 +4568,7 @@ packages: /@types/resolve/1.17.1: resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} dependencies: - '@types/node': 17.0.23 + '@types/node': 17.0.34 dev: true /@types/scheduler/0.16.2: @@ -4550,7 +4590,7 @@ packages: /@types/testing-library__jest-dom/5.14.3: resolution: {integrity: sha512-oKZe+Mf4ioWlMuzVBaXQ9WDnEm1+umLx0InILg+yvZVBBDmzV5KfZyLrCvadtWcx8+916jLmHafcmqqffl+iIw==} dependencies: - '@types/jest': 27.4.1 + '@types/jest': 27.5.1 dev: true /@types/uglify-js/3.13.2: @@ -4570,7 +4610,7 @@ packages: /@types/webpack-sources/3.2.0: resolution: {integrity: sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg==} dependencies: - '@types/node': 17.0.23 + '@types/node': 17.0.34 '@types/source-list-map': 0.1.2 source-map: 0.7.3 dev: true @@ -4578,7 +4618,7 @@ packages: /@types/webpack/4.41.32: resolution: {integrity: sha512-cb+0ioil/7oz5//7tZUSwbrSAN/NWHrQylz5cW8G0dWTcF/g+/dSdMlKVZspBYuMAN1+WnwHrkxiRrLcwd0Heg==} dependencies: - '@types/node': 17.0.23 + '@types/node': 17.0.34 '@types/tapable': 1.0.8 '@types/uglify-js': 3.13.2 '@types/webpack-sources': 3.2.0 @@ -4606,10 +4646,57 @@ packages: resolution: {integrity: sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==} requiresBuild: true dependencies: - '@types/node': 17.0.23 + '@types/node': 17.0.34 dev: true optional: true + /@typescript-eslint/eslint-plugin/5.25.0_83b4734ba99fefa06dfff9f51a4c4301: + resolution: {integrity: sha512-icYrFnUzvm+LhW0QeJNKkezBu6tJs9p/53dpPLFH8zoM9w1tfaKzVurkPotEpAqQ8Vf8uaFyL5jHd0Vs6Z0ZQg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/parser': 5.25.0_eslint@8.15.0+typescript@4.6.4 + '@typescript-eslint/scope-manager': 5.25.0 + '@typescript-eslint/type-utils': 5.25.0_eslint@8.15.0+typescript@4.6.4 + '@typescript-eslint/utils': 5.25.0_eslint@8.15.0+typescript@4.6.4 + debug: 4.3.4 + eslint: 8.15.0 + functional-red-black-tree: 1.0.1 + ignore: 5.2.0 + regexpp: 3.2.0 + semver: 7.3.7 + tsutils: 3.21.0_typescript@4.6.4 + typescript: 4.6.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/parser/5.25.0_eslint@8.15.0+typescript@4.6.4: + resolution: {integrity: sha512-r3hwrOWYbNKP1nTcIw/aZoH+8bBnh/Lh1iDHoFpyG4DnCpvEdctrSl6LOo19fZbzypjQMHdajolxs6VpYoChgA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 5.25.0 + '@typescript-eslint/types': 5.25.0 + '@typescript-eslint/typescript-estree': 5.25.0_typescript@4.6.4 + debug: 4.3.4 + eslint: 8.15.0 + typescript: 4.6.4 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/scope-manager/5.24.0: resolution: {integrity: sha512-WpMWipcDzGmMzdT7NtTjRXFabx10WleLUGrJpuJLGaxSqpcyq5ACpKSD5VE40h2nz3melQ91aP4Du7lh9FliCA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -4618,12 +4705,44 @@ packages: '@typescript-eslint/visitor-keys': 5.24.0 dev: true + /@typescript-eslint/scope-manager/5.25.0: + resolution: {integrity: sha512-p4SKTFWj+2VpreUZ5xMQsBMDdQ9XdRvODKXN4EksyBjFp2YvQdLkyHqOffakYZPuWJUDNu3jVXtHALDyTv3cww==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.25.0 + '@typescript-eslint/visitor-keys': 5.25.0 + dev: true + + /@typescript-eslint/type-utils/5.25.0_eslint@8.15.0+typescript@4.6.4: + resolution: {integrity: sha512-B6nb3GK3Gv1Rsb2pqalebe/RyQoyG/WDy9yhj8EE0Ikds4Xa8RR28nHz+wlt4tMZk5bnAr0f3oC8TuDAd5CPrw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/utils': 5.25.0_eslint@8.15.0+typescript@4.6.4 + debug: 4.3.4 + eslint: 8.15.0 + tsutils: 3.21.0_typescript@4.6.4 + typescript: 4.6.4 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/types/5.24.0: resolution: {integrity: sha512-Tpg1c3shTDgTmZd3qdUyd+16r/pGmVaVEbLs+ufuWP0EruVbUiEOmpBBQxBb9a8iPRxi8Rb2oiwOxuZJzSq11A==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@typescript-eslint/typescript-estree/5.24.0: + /@typescript-eslint/types/5.25.0: + resolution: {integrity: sha512-7fWqfxr0KNHj75PFqlGX24gWjdV/FDBABXL5dyvBOWHpACGyveok8Uj4ipPX/1fGU63fBkzSIycEje4XsOxUFA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@typescript-eslint/typescript-estree/5.24.0_typescript@4.6.4: resolution: {integrity: sha512-zcor6vQkQmZAQfebSPVwUk/FD+CvnsnlfKXYeQDsWXRF+t7SBPmIfNia/wQxCSeu1h1JIjwV2i9f5/DdSp/uDw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -4638,12 +4757,34 @@ packages: globby: 11.1.0 is-glob: 4.0.3 semver: 7.3.7 - tsutils: 3.21.0 + tsutils: 3.21.0_typescript@4.6.4 + typescript: 4.6.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils/5.24.0_eslint@8.15.0: + /@typescript-eslint/typescript-estree/5.25.0_typescript@4.6.4: + resolution: {integrity: sha512-MrPODKDych/oWs/71LCnuO7NyR681HuBly2uLnX3r5i4ME7q/yBqC4hW33kmxtuauLTM0OuBOhhkFaxCCOjEEw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 5.25.0 + '@typescript-eslint/visitor-keys': 5.25.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.3.7 + tsutils: 3.21.0_typescript@4.6.4 + typescript: 4.6.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/utils/5.24.0_eslint@8.15.0+typescript@4.6.4: resolution: {integrity: sha512-K05sbWoeCBJH8KXu6hetBJ+ukG0k2u2KlgD3bN+v+oBKm8adJqVHpSSLHNzqyuv0Lh4GVSAUgZ5lB4icmPmWLw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -4652,7 +4793,25 @@ packages: '@types/json-schema': 7.0.11 '@typescript-eslint/scope-manager': 5.24.0 '@typescript-eslint/types': 5.24.0 - '@typescript-eslint/typescript-estree': 5.24.0 + '@typescript-eslint/typescript-estree': 5.24.0_typescript@4.6.4 + eslint: 8.15.0 + eslint-scope: 5.1.1 + eslint-utils: 3.0.0_eslint@8.15.0 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/utils/5.25.0_eslint@8.15.0+typescript@4.6.4: + resolution: {integrity: sha512-qNC9bhnz/n9Kba3yI6HQgQdBLuxDoMgdjzdhSInZh6NaDnFpTUlwNGxplUFWfY260Ya0TRPvkg9dd57qxrJI9g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@types/json-schema': 7.0.11 + '@typescript-eslint/scope-manager': 5.25.0 + '@typescript-eslint/types': 5.25.0 + '@typescript-eslint/typescript-estree': 5.25.0_typescript@4.6.4 eslint: 8.15.0 eslint-scope: 5.1.1 eslint-utils: 3.0.0_eslint@8.15.0 @@ -4669,6 +4828,14 @@ packages: eslint-visitor-keys: 3.3.0 dev: true + /@typescript-eslint/visitor-keys/5.25.0: + resolution: {integrity: sha512-yd26vFgMsC4h2dgX4+LR+GeicSKIfUvZREFLf3DDjZPtqgLx5AJZr6TetMNwFP9hcKreTTeztQYBTNbNoOycwA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.25.0 + eslint-visitor-keys: 3.3.0 + dev: true + /@webassemblyjs/ast/1.9.0: resolution: {integrity: sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==} dependencies: @@ -4998,7 +5165,7 @@ packages: dev: true /ansi-styles/2.2.1: - resolution: {integrity: sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=} + resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} engines: {node: '>=0.10.0'} dev: true @@ -5118,7 +5285,7 @@ packages: dev: true /array-union/1.0.2: - resolution: {integrity: sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=} + resolution: {integrity: sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==} engines: {node: '>=0.10.0'} dependencies: array-uniq: 1.0.3 @@ -5171,7 +5338,7 @@ packages: dev: true /arrify/1.0.1: - resolution: {integrity: sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=} + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} engines: {node: '>=0.10.0'} dev: true @@ -6407,32 +6574,32 @@ packages: engines: {node: '>= 0.4.0'} dev: true - /cosmiconfig-typescript-loader/1.0.9_f533c3387680131348857b0baefd0f31: + /cosmiconfig-typescript-loader/1.0.9_8ffbbd0e65bf654299df3e9f6b2219d7: resolution: {integrity: sha512-tRuMRhxN4m1Y8hP9SNYfz7jRwt8lZdWxdjg/ohg5esKmsndJIn4yT96oJVcf5x0eA11taXl+sIp+ielu529k6g==} engines: {node: '>=12', npm: '>=6'} peerDependencies: '@types/node': '*' typescript: '>=3' dependencies: - '@types/node': 17.0.23 + '@types/node': 17.0.34 cosmiconfig: 7.0.1 - ts-node: 10.7.0_f533c3387680131348857b0baefd0f31 - typescript: 4.6.3 + ts-node: 10.7.0_8ffbbd0e65bf654299df3e9f6b2219d7 + typescript: 4.6.4 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' dev: true - /cosmiconfig-typescript-loader/2.0.0_5afcf6943f43533df426196350caf695: + /cosmiconfig-typescript-loader/2.0.0_8ffbbd0e65bf654299df3e9f6b2219d7: resolution: {integrity: sha512-2NlGul/E3vTQEANqPziqkA01vfiuUU8vT0jZAuUIjEW8u3eCcnCQWLggapCjhbF76s7KQF0fM0kXSKmzaDaG1g==} engines: {node: '>=12', npm: '>=6'} peerDependencies: '@types/node': '*' typescript: '>=3' dependencies: - '@types/node': 17.0.23 + '@types/node': 17.0.34 cosmiconfig: 7.0.1 - ts-node: 10.7.0_5afcf6943f43533df426196350caf695 + ts-node: 10.7.0_8ffbbd0e65bf654299df3e9f6b2219d7 typescript: 4.6.4 transitivePeerDependencies: - '@swc/core' @@ -7421,6 +7588,20 @@ packages: eslint: 8.15.0 dev: true + /eslint-formatter-pretty/4.1.0: + resolution: {integrity: sha512-IsUTtGxF1hrH6lMWiSl1WbGaiP01eT6kzywdY1U+zLc0MP+nwEnUiS9UI8IaOTUhTeQJLlCEWIbXINBH4YJbBQ==} + engines: {node: '>=10'} + dependencies: + '@types/eslint': 7.29.0 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + eslint-rule-docs: 1.1.231 + log-symbols: 4.1.0 + plur: 4.0.0 + string-width: 4.2.3 + supports-hyperlinks: 2.2.0 + dev: true + /eslint-plugin-jest-dom/4.0.1_eslint@8.15.0: resolution: {integrity: sha512-9aUaX4AtlFBziLqKSjc7DKHQ/y1T32qNapG3uSeLDMJYKswASoQLJWOfLIE+zEHKvCNzNIz8T7282tQkuu0TKQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6', yarn: '>=1'} @@ -7433,7 +7614,7 @@ packages: requireindex: 1.2.0 dev: true - /eslint-plugin-jest/26.2.2_eslint@8.15.0+jest@27.5.1: + /eslint-plugin-jest/26.2.2_93a18a14fb19656958628faf0a8b5863: resolution: {integrity: sha512-etSFZ8VIFX470aA6kTqDPhIq7YWe0tjBcboFNV3WeiC18PJ/AVonGhuTwlmuz2fBkH8FJHA7JQ4k7GsQIj1Gew==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -7446,7 +7627,8 @@ packages: jest: optional: true dependencies: - '@typescript-eslint/utils': 5.24.0_eslint@8.15.0 + '@typescript-eslint/eslint-plugin': 5.25.0_83b4734ba99fefa06dfff9f51a4c4301 + '@typescript-eslint/utils': 5.24.0_eslint@8.15.0+typescript@4.6.4 eslint: 8.15.0 jest: 27.5.1 transitivePeerDependencies: @@ -7471,19 +7653,23 @@ packages: prettier-linter-helpers: 1.0.0 dev: true - /eslint-plugin-testing-library/5.5.0_eslint@8.15.0: + /eslint-plugin-testing-library/5.5.0_eslint@8.15.0+typescript@4.6.4: resolution: {integrity: sha512-eWQ19l6uWL7LW8oeMyQVSGjVYFnBqk7DMHjadm0yOHBvX3Xi9OBrsNuxoAMdX4r7wlQ5WWpW46d+CB6FWFL/PQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6'} peerDependencies: eslint: ^7.5.0 || ^8.0.0 dependencies: - '@typescript-eslint/utils': 5.24.0_eslint@8.15.0 + '@typescript-eslint/utils': 5.24.0_eslint@8.15.0+typescript@4.6.4 eslint: 8.15.0 transitivePeerDependencies: - supports-color - typescript dev: true + /eslint-rule-docs/1.1.231: + resolution: {integrity: sha512-egHz9A1WG7b8CS0x1P6P/Rj5FqZOjray/VjpJa14tMZalfRKvpE2ONJ3plCM7+PcinmU4tcmbPLv0VtwzSdLVA==} + dev: true + /eslint-scope/4.0.3: resolution: {integrity: sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==} engines: {node: '>=4.0.0'} @@ -8076,7 +8262,7 @@ packages: worker-rpc: 0.1.1 dev: true - /fork-ts-checker-webpack-plugin/6.5.1_eslint@8.15.0+webpack@4.46.0: + /fork-ts-checker-webpack-plugin/6.5.1_fd9ac946626c89e3cf2883682b7adefb: resolution: {integrity: sha512-x1wumpHOEf4gDROmKTaB6i4/Q6H3LwmjVO7fIX47vBwlZbtPjU33hgoMuD/Q/y6SU8bnuYSoN6ZQOLshGp0T/g==} engines: {node: '>=10', yarn: '>=1.0.0'} peerDependencies: @@ -8104,6 +8290,7 @@ packages: schema-utils: 2.7.0 semver: 7.3.7 tapable: 1.1.3 + typescript: 4.6.4 webpack: 4.46.0 dev: true @@ -9093,6 +9280,11 @@ packages: engines: {node: '>= 0.10'} dev: true + /irregular-plurals/3.3.0: + resolution: {integrity: sha512-MVBLKUTangM3EfRPFROhmWQQKRDsrgI83J8GS3jXy+OwYqiR2/aoWndYQ5416jLE3uaGgLH7ncme3X9y09gZ3g==} + engines: {node: '>=8'} + dev: true + /is-absolute-url/2.1.0: resolution: {integrity: sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=} engines: {node: '>=0.10.0'} @@ -9611,7 +9803,7 @@ packages: '@jest/environment': 27.5.1 '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 17.0.23 + '@types/node': 17.0.34 chalk: 4.1.2 co: 4.6.0 dedent: 0.7.0 @@ -9746,7 +9938,7 @@ packages: '@jest/environment': 27.5.1 '@jest/fake-timers': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 17.0.23 + '@types/node': 17.0.34 jest-mock: 27.5.1 jest-util: 27.5.1 jsdom: 16.7.0 @@ -9764,7 +9956,7 @@ packages: '@jest/environment': 27.5.1 '@jest/fake-timers': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 17.0.23 + '@types/node': 17.0.34 jest-mock: 27.5.1 jest-util: 27.5.1 dev: true @@ -9785,7 +9977,7 @@ packages: dependencies: '@jest/types': 26.6.2 '@types/graceful-fs': 4.1.5 - '@types/node': 17.0.23 + '@types/node': 17.0.34 anymatch: 3.1.2 fb-watchman: 2.0.1 graceful-fs: 4.2.10 @@ -9806,7 +9998,7 @@ packages: dependencies: '@jest/types': 27.5.1 '@types/graceful-fs': 4.1.5 - '@types/node': 17.0.23 + '@types/node': 17.0.34 anymatch: 3.1.2 fb-watchman: 2.0.1 graceful-fs: 4.2.10 @@ -9846,7 +10038,7 @@ packages: '@jest/source-map': 27.5.1 '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 17.0.23 + '@types/node': 17.0.34 chalk: 4.1.2 co: 4.6.0 expect: 27.5.1 @@ -9926,7 +10118,7 @@ packages: engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.5.1 - '@types/node': 17.0.23 + '@types/node': 17.0.34 dev: true /jest-pnp-resolver/1.2.2_jest-resolve@26.6.2: @@ -10013,7 +10205,7 @@ packages: '@jest/test-result': 27.5.1 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 17.0.23 + '@types/node': 17.0.34 chalk: 4.1.2 emittery: 0.8.1 graceful-fs: 4.2.10 @@ -10070,7 +10262,7 @@ packages: resolution: {integrity: sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==} engines: {node: '>= 10.14.2'} dependencies: - '@types/node': 17.0.23 + '@types/node': 17.0.34 graceful-fs: 4.2.10 dev: true @@ -10078,7 +10270,7 @@ packages: resolution: {integrity: sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@types/node': 17.0.23 + '@types/node': 17.0.34 graceful-fs: 4.2.10 dev: true @@ -10148,7 +10340,7 @@ packages: engines: {node: '>= 10.14.2'} dependencies: '@jest/types': 26.6.2 - '@types/node': 17.0.23 + '@types/node': 17.0.34 chalk: 4.1.2 graceful-fs: 4.2.10 is-ci: 2.0.0 @@ -10160,7 +10352,7 @@ packages: engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.5.1 - '@types/node': 17.0.23 + '@types/node': 17.0.34 chalk: 4.1.2 ci-info: 3.3.0 graceful-fs: 4.2.10 @@ -10185,7 +10377,7 @@ packages: dependencies: '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 17.0.23 + '@types/node': 17.0.34 ansi-escapes: 4.3.2 chalk: 4.1.2 jest-util: 27.5.1 @@ -10196,7 +10388,7 @@ packages: resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 17.0.23 + '@types/node': 17.0.34 merge-stream: 2.0.0 supports-color: 7.2.0 dev: true @@ -10205,7 +10397,7 @@ packages: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 17.0.23 + '@types/node': 17.0.34 merge-stream: 2.0.0 supports-color: 8.1.1 dev: true @@ -10760,6 +10952,24 @@ packages: yargs-parser: 20.2.9 dev: true + /meow/9.0.0: + resolution: {integrity: sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==} + engines: {node: '>=10'} + dependencies: + '@types/minimist': 1.2.2 + camelcase-keys: 6.2.2 + decamelize: 1.2.0 + decamelize-keys: 1.1.0 + hard-rejection: 2.1.0 + minimist-options: 4.1.0 + normalize-package-data: 3.0.3 + read-pkg-up: 7.0.1 + redent: 3.0.0 + trim-newlines: 3.0.1 + type-fest: 0.18.1 + yargs-parser: 20.2.9 + dev: true + /merge-descriptors/1.0.1: resolution: {integrity: sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=} dev: true @@ -11692,6 +11902,13 @@ packages: find-up: 5.0.0 dev: true + /plur/4.0.0: + resolution: {integrity: sha512-4UGewrYgqDFw9vV6zNV+ADmPAUAfJPKtGvb/VdpQAx25X5f3xXdGdyOEVFwkl8Hl/tl7+xbeHqSEM+D5/TirUg==} + engines: {node: '>=10'} + dependencies: + irregular-plurals: 3.3.0 + dev: true + /pngjs/3.4.0: resolution: {integrity: sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==} engines: {node: '>=4.0.0'} @@ -11702,11 +11919,11 @@ packages: engines: {node: '>=12.13.0'} dev: true - /pnp-webpack-plugin/1.6.4: + /pnp-webpack-plugin/1.6.4_typescript@4.6.4: resolution: {integrity: sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg==} engines: {node: '>=6'} dependencies: - ts-pnp: 1.2.0 + ts-pnp: 1.2.0_typescript@4.6.4 transitivePeerDependencies: - typescript dev: true @@ -14149,6 +14366,15 @@ packages: util.promisify: 1.0.0 dev: true + /swc-loader/0.2.3_@swc+core@1.2.165: + resolution: {integrity: sha512-D1p6XXURfSPleZZA/Lipb3A8pZ17fP4NObZvFCDjK/OKljroqDpPmsBdTraWhVBqUNpcWBQY1imWdoPScRlQ7A==} + peerDependencies: + '@swc/core': ^1.2.147 + webpack: '>=2' + dependencies: + '@swc/core': 1.2.165 + dev: true + /symbol-tree/3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} dev: true @@ -14445,7 +14671,7 @@ packages: engines: {node: '>=6.10'} dev: true - /ts-node/10.7.0_5afcf6943f43533df426196350caf695: + /ts-node/10.7.0_8ffbbd0e65bf654299df3e9f6b2219d7: resolution: {integrity: sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A==} hasBin: true peerDependencies: @@ -14465,7 +14691,7 @@ packages: '@tsconfig/node12': 1.0.9 '@tsconfig/node14': 1.0.1 '@tsconfig/node16': 1.0.2 - '@types/node': 17.0.23 + '@types/node': 17.0.34 acorn: 8.7.1 acorn-walk: 8.2.0 arg: 4.1.3 @@ -14476,41 +14702,8 @@ packages: v8-compile-cache-lib: 3.0.0 yn: 3.1.1 dev: true - optional: true - - /ts-node/10.7.0_f533c3387680131348857b0baefd0f31: - resolution: {integrity: sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A==} - hasBin: true - peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' - peerDependenciesMeta: - '@swc/core': - optional: true - '@swc/wasm': - optional: true - dependencies: - '@cspotcode/source-map-support': 0.7.0 - '@swc/core': 1.2.165 - '@tsconfig/node10': 1.0.8 - '@tsconfig/node12': 1.0.9 - '@tsconfig/node14': 1.0.1 - '@tsconfig/node16': 1.0.2 - '@types/node': 17.0.23 - acorn: 8.7.1 - acorn-walk: 8.2.0 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 4.6.3 - v8-compile-cache-lib: 3.0.0 - yn: 3.1.1 - dev: true - /ts-pnp/1.2.0: + /ts-pnp/1.2.0_typescript@4.6.4: resolution: {integrity: sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==} engines: {node: '>=6'} peerDependencies: @@ -14518,6 +14711,21 @@ packages: peerDependenciesMeta: typescript: optional: true + dependencies: + typescript: 4.6.4 + dev: true + + /tsd/0.20.0: + resolution: {integrity: sha512-iba/JlyT3qtnA9t8VrX2Fipu3L31U48oRIf1PNs+lIwQ7n63GTkt9eQlB5bLtfb7nYfy9t8oZzs+K4QEoEIS8Q==} + engines: {node: '>=12'} + hasBin: true + dependencies: + '@tsd/typescript': 4.6.4 + eslint-formatter-pretty: 4.1.0 + globby: 11.1.0 + meow: 9.0.0 + path-exists: 4.0.0 + read-pkg-up: 7.0.1 dev: true /tslib/1.14.1: @@ -14528,13 +14736,14 @@ packages: resolution: {integrity: sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==} dev: true - /tsutils/3.21.0: + /tsutils/3.21.0_typescript@4.6.4: resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} peerDependencies: typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' dependencies: tslib: 1.14.1 + typescript: 4.6.4 dev: true /tty-browserify/0.0.0: @@ -14608,18 +14817,11 @@ packages: resolution: {integrity: sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=} dev: true - /typescript/4.6.3: - resolution: {integrity: sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==} - engines: {node: '>=4.2.0'} - hasBin: true - dev: true - /typescript/4.6.4: resolution: {integrity: sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg==} engines: {node: '>=4.2.0'} hasBin: true dev: true - optional: true /uglify-js/3.15.5: resolution: {integrity: sha512-hNM5q5GbBRB5xB+PMqVRcgYe4c8jbyZ1pzZhS6jbq54/4F2gFK869ZheiE5A8/t+W5jtTNpWef/5Q9zk639FNQ==} diff --git a/rollup.config.js b/rollup.config.js index 3df4868d..f5e19354 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -11,13 +11,7 @@ const plugins = targets => [ swc({ jsc: { parser: { - syntax: 'typescript', - tsx: true - }, - transform: { - react: { - useBuiltins: true - } + syntax: 'typescript' }, externalHelpers: true }, diff --git a/src/axes/AutoScaleAxis.ts b/src/axes/AutoScaleAxis.ts new file mode 100644 index 00000000..26d9d7a0 --- /dev/null +++ b/src/axes/AutoScaleAxis.ts @@ -0,0 +1,50 @@ +import type { + ChartRect, + AxisOptions, + Bounds, + NormalizedSeries, + NormalizedSeriesPrimitiveValue +} from '../core'; +import { getBounds, getHighLow, getMultiValue } from '../core'; +import { AxisUnits, Axis } from './Axis'; + +export class AutoScaleAxis extends Axis { + private readonly bounds: Bounds; + public override readonly range: { + min: number; + max: number; + }; + + constructor( + axisUnit: AxisUnits, + data: NormalizedSeries[], + chartRect: ChartRect, + options: AxisOptions + ) { + // Usually we calculate highLow based on the data but this can be overriden by a highLow object in the options + const highLow = options.highLow || getHighLow(data, options, axisUnit.pos); + const bounds = getBounds( + chartRect[axisUnit.rectEnd] - chartRect[axisUnit.rectStart], + highLow, + options.scaleMinSpace || 20, + options.onlyInteger + ); + const range = { + min: bounds.min, + max: bounds.max + }; + + super(axisUnit, chartRect, bounds.values); + + this.bounds = bounds; + this.range = range; + } + + projectValue(value: NormalizedSeriesPrimitiveValue) { + const finalValue = Number(getMultiValue(value, this.units.pos)); + + return ( + (this.axisLength * (finalValue - this.bounds.min)) / this.bounds.range + ); + } +} diff --git a/src/axes/axis.spec.js b/src/axes/Axis.spec.ts similarity index 52% rename from src/axes/axis.spec.js rename to src/axes/Axis.spec.ts index ddec767b..5cb5165c 100644 --- a/src/axes/axis.spec.js +++ b/src/axes/Axis.spec.ts @@ -1,10 +1,22 @@ -import { Svg } from '../svg/svg'; -import { EventEmitter } from '../event/event-emitter'; -import { Axis, axisUnits } from './axis'; +import type { ChartRect } from '../core'; +import { Svg } from '../svg'; +import { EventEmitter } from '../event'; +import { Axis, axisUnits } from './Axis'; + +class MockAxis extends Axis { + projectValue(value: number) { + return value; + } +} describe('Axes', () => { describe('Axis', () => { - let ticks, chartRect, chartOptions, eventEmitter, gridGroup, labelGroup; + let ticks: number[]; + let chartRect: ChartRect; + let chartOptions: any; + let eventEmitter: EventEmitter; + let gridGroup: Svg; + let labelGroup: Svg; beforeEach(() => { eventEmitter = new EventEmitter(); @@ -55,12 +67,12 @@ describe('Axes', () => { }); it('should skip all grid lines and labels for interpolated value of null', () => { - chartOptions.axisX.labelInterpolationFnc = (value, index) => - index === 0 ? null : value; + chartOptions.axisX.labelInterpolationFnc = ( + value: number, + index: number + ) => (index === 0 ? null : value); - const axis = new Axis(); - axis.initialize(axisUnits.x, chartRect, ticks, null); - axis.projectValue = value => value; + const axis = new MockAxis(axisUnits.x, chartRect, ticks); axis.createGridAndLabels( gridGroup, @@ -69,19 +81,21 @@ describe('Axes', () => { chartOptions, eventEmitter ); - expect(gridGroup.querySelectorAll('.ct-grid').svgElements.length).toBe(1); - expect(labelGroup.querySelectorAll('.ct-label').svgElements.length).toBe( - 1 - ); + expect( + (gridGroup.querySelectorAll('.ct-grid') as any).svgElements.length + ).toBe(1); + expect( + (labelGroup.querySelectorAll('.ct-label') as any).svgElements.length + ).toBe(1); }); it('should skip all grid lines and labels for interpolated value of undefined', () => { - chartOptions.axisX.labelInterpolationFnc = (value, index) => - index === 0 ? undefined : value; + chartOptions.axisX.labelInterpolationFnc = ( + value: number, + index: number + ) => (index === 0 ? undefined : value); - const axis = new Axis(); - axis.initialize(axisUnits.x, chartRect, ticks, null); - axis.projectValue = value => value; + const axis = new MockAxis(axisUnits.x, chartRect, ticks); axis.createGridAndLabels( gridGroup, @@ -90,19 +104,21 @@ describe('Axes', () => { chartOptions, eventEmitter ); - expect(gridGroup.querySelectorAll('.ct-grid').svgElements.length).toBe(1); - expect(labelGroup.querySelectorAll('.ct-label').svgElements.length).toBe( - 1 - ); + expect( + (gridGroup.querySelectorAll('.ct-grid') as any).svgElements.length + ).toBe(1); + expect( + (labelGroup.querySelectorAll('.ct-label') as any).svgElements.length + ).toBe(1); }); it('should include all grid lines and labels for interpolated value of empty strings', () => { - chartOptions.axisX.labelInterpolationFnc = (value, index) => - index === 0 ? '' : value; + chartOptions.axisX.labelInterpolationFnc = ( + value: number, + index: number + ) => (index === 0 ? '' : value); - const axis = new Axis(); - axis.initialize(axisUnits.x, chartRect, ticks, null); - axis.projectValue = value => value; + const axis = new MockAxis(axisUnits.x, chartRect, ticks); axis.createGridAndLabels( gridGroup, @@ -111,10 +127,12 @@ describe('Axes', () => { chartOptions, eventEmitter ); - expect(gridGroup.querySelectorAll('.ct-grid').svgElements.length).toBe(2); - expect(labelGroup.querySelectorAll('.ct-label').svgElements.length).toBe( - 2 - ); + expect( + (gridGroup.querySelectorAll('.ct-grid') as any).svgElements.length + ).toBe(2); + expect( + (labelGroup.querySelectorAll('.ct-label') as any).svgElements.length + ).toBe(2); }); }); }); diff --git a/src/axes/axis.js b/src/axes/Axis.ts similarity index 74% rename from src/axes/axis.js rename to src/axes/Axis.ts index 7c52f578..27456892 100644 --- a/src/axes/axis.js +++ b/src/axes/Axis.ts @@ -1,5 +1,14 @@ -import { isFalseyButZero } from '../core/lang'; -import { createGrid, createLabel } from '../core/creation'; +import type { + Label, + ChartRect, + OptionsWithDefaults, + NormalizedSeriesPrimitiveValue, + NormalizedSeries +} from '../core'; +import type { Svg } from '../svg'; +import type { EventEmitter } from '../event'; +import { isFalseyButZero } from '../utils'; +import { createGrid, createLabel } from '../core'; export const axisUnits = { x: { @@ -18,36 +27,56 @@ export const axisUnits = { rectEnd: 'y1', rectOffset: 'x1' } -}; +} as const; -export class Axis { - initialize(units, chartRect, ticks, options) { - this.units = units; +export type XAxisUnits = typeof axisUnits.x; +export type YAxisUnits = typeof axisUnits.y; +export type AxisUnits = XAxisUnits | YAxisUnits; + +export abstract class Axis { + public readonly counterUnits: AxisUnits; + public readonly range: + | { + min: number; + max: number; + } + | undefined; + readonly axisLength: number; + private readonly gridOffset: number; + + constructor( + public readonly units: AxisUnits, + private readonly chartRect: ChartRect, + private readonly ticks: Label[] + ) { this.counterUnits = units === axisUnits.x ? axisUnits.y : axisUnits.x; - this.options = options; - this.chartRect = chartRect; this.axisLength = chartRect[this.units.rectEnd] - chartRect[this.units.rectStart]; this.gridOffset = chartRect[this.units.rectOffset]; - this.ticks = ticks; } - projectValue() { - throw new Error("Base axis can't be instantiated!"); - } + abstract projectValue( + value: NormalizedSeriesPrimitiveValue | Label, + index?: number, + series?: NormalizedSeries + ): number; createGridAndLabels( - gridGroup, - labelGroup, - useForeignObject, - chartOptions, - eventEmitter + gridGroup: Svg, + labelGroup: Svg, + useForeignObject: boolean, + chartOptions: OptionsWithDefaults, + eventEmitter: EventEmitter ) { - const axisOptions = chartOptions['axis' + this.units.pos.toUpperCase()]; - const projectedValues = this.ticks.map(this.projectValue.bind(this)); + const axisOptions = + this.units.pos === 'x' ? chartOptions.axisX : chartOptions.axisY; + const projectedValues = this.ticks.map((tick, i) => + this.projectValue(tick, i) + ); const labelValues = this.ticks.map(axisOptions.labelInterpolationFnc); projectedValues.forEach((projectedValue, index) => { + const labelValue = labelValues[index]; const labelOffset = { x: 0, y: 0 @@ -67,7 +96,7 @@ export class Axis { } // Skip grid lines and labels where interpolated label values are falsey (except for 0) - if (isFalseyButZero(labelValues[index]) && labelValues[index] !== '') { + if (labelValue !== '' && isFalseyButZero(labelValue)) { return; } @@ -129,7 +158,7 @@ export class Axis { projectedValue, labelLength, index, - labelValues, + labelValue, this, axisOptions.offset, labelOffset, diff --git a/src/axes/fixed-scale-axis.spec.js b/src/axes/FixedScaleAxis.spec.ts similarity index 77% rename from src/axes/fixed-scale-axis.spec.js rename to src/axes/FixedScaleAxis.spec.ts index 74f3a0be..c9075b71 100644 --- a/src/axes/fixed-scale-axis.spec.js +++ b/src/axes/FixedScaleAxis.spec.ts @@ -1,4 +1,4 @@ -import { FixedScaleAxis } from './fixed-scale-axis'; +import { FixedScaleAxis } from './FixedScaleAxis'; describe('Axes', () => { describe('FixedScaleAxis', () => { @@ -11,7 +11,7 @@ describe('Axes', () => { rectStart: 'y2', rectEnd: 'y1', rectOffset: 'x1' - }; + } as const; const data = [ [ { x: 1, y: 10 }, @@ -19,7 +19,7 @@ describe('Axes', () => { { x: 3, y: -5 } ] ]; - const chartRect = { + const chartRect: any = { padding: { top: 15, right: 15, @@ -33,7 +33,7 @@ describe('Axes', () => { }; const options = { offset: 40, - position: 'start', + position: 'start' as const, labelOffset: { x: 0, y: 0 }, showLabel: true, showGrid: true, @@ -41,7 +41,12 @@ describe('Axes', () => { onlyInteger: false, ticks }; - const fsaxis = new FixedScaleAxis(axisUnit, data, chartRect, options); + const fsaxis: any = new FixedScaleAxis( + axisUnit, + data, + chartRect, + options + ); expect(fsaxis.ticks).toEqual([-10, -5, 0, 5, 10]); }); }); diff --git a/src/axes/FixedScaleAxis.ts b/src/axes/FixedScaleAxis.ts new file mode 100644 index 00000000..314d782d --- /dev/null +++ b/src/axes/FixedScaleAxis.ts @@ -0,0 +1,50 @@ +import type { + ChartRect, + AxisOptions, + NormalizedSeries, + NormalizedSeriesPrimitiveValue +} from '../core'; +import { getMultiValue, getHighLow } from '../core/data'; +import { times } from '../utils'; +import { AxisUnits, Axis } from './Axis'; + +export class FixedScaleAxis extends Axis { + public override readonly range: { + min: number; + max: number; + }; + + constructor( + axisUnit: AxisUnits, + data: NormalizedSeries[], + chartRect: ChartRect, + options: AxisOptions + ) { + const highLow = options.highLow || getHighLow(data, options, axisUnit.pos); + const divisor = options.divisor || 1; + const ticks = ( + options.ticks || + times(divisor).map( + (_value, index) => + highLow.low + ((highLow.high - highLow.low) / divisor) * index + ) + ).sort((a, b) => Number(a) - Number(b)); + const range = { + min: highLow.low, + max: highLow.high + }; + + super(axisUnit, chartRect, ticks); + + this.range = range; + } + + projectValue(value: NormalizedSeriesPrimitiveValue) { + const finalValue = Number(getMultiValue(value, this.units.pos)); + + return ( + (this.axisLength * (finalValue - this.range.min)) / + (this.range.max - this.range.min) + ); + } +} diff --git a/src/axes/step-axis.spec.js b/src/axes/StepAxis.spec.ts similarity index 75% rename from src/axes/step-axis.spec.js rename to src/axes/StepAxis.spec.ts index e635e2ed..473de025 100644 --- a/src/axes/step-axis.spec.js +++ b/src/axes/StepAxis.spec.ts @@ -1,4 +1,4 @@ -import { StepAxis } from './step-axis'; +import { StepAxis } from './StepAxis'; describe('Axes', () => { describe('StepAxis', () => { @@ -11,9 +11,9 @@ describe('Axes', () => { rectStart: 'y2', rectEnd: 'y1', rectOffset: 'x1' - }; + } as const; const data = [[1]]; - const chartRect = { + const chartRect: any = { y2: 0, y1: 15, x1: 50, @@ -22,7 +22,7 @@ describe('Axes', () => { const options = { ticks }; - const stepAxis = new StepAxis(axisUnit, data, chartRect, options); + const stepAxis: any = new StepAxis(axisUnit, data, chartRect, options); expect(stepAxis.stepLength).toEqual(15); }); }); diff --git a/src/axes/StepAxis.ts b/src/axes/StepAxis.ts new file mode 100644 index 00000000..4a4ad960 --- /dev/null +++ b/src/axes/StepAxis.ts @@ -0,0 +1,26 @@ +import type { ChartRect, AxisOptions } from '../core'; +import { AxisUnits, Axis } from './Axis'; + +export class StepAxis extends Axis { + private readonly stepLength: number; + public readonly stretch: boolean; + + constructor( + axisUnit: AxisUnits, + _data: unknown, + chartRect: ChartRect, + options: AxisOptions + ) { + const ticks = options.ticks || []; + + super(axisUnit, chartRect, ticks); + + const calc = Math.max(1, ticks.length - (options.stretch ? 1 : 0)); + this.stepLength = this.axisLength / calc; + this.stretch = Boolean(options.stretch); + } + + projectValue(_value: unknown, index: number) { + return this.stepLength * index; + } +} diff --git a/src/axes/auto-scale-axis.js b/src/axes/auto-scale-axis.js deleted file mode 100644 index db71b299..00000000 --- a/src/axes/auto-scale-axis.js +++ /dev/null @@ -1,30 +0,0 @@ -import { getBounds, getHighLow, getMultiValue } from '../core/data'; -import { Axis } from './axis'; - -export class AutoScaleAxis extends Axis { - constructor(axisUnit, data, chartRect, options) { - super(); - // Usually we calculate highLow based on the data but this can be overriden by a highLow object in the options - const highLow = options.highLow || getHighLow(data, options, axisUnit.pos); - this.bounds = getBounds( - chartRect[axisUnit.rectEnd] - chartRect[axisUnit.rectStart], - highLow, - options.scaleMinSpace || 20, - options.onlyInteger - ); - this.range = { - min: this.bounds.min, - max: this.bounds.max - }; - - super.initialize(axisUnit, chartRect, this.bounds.values, options); - } - - projectValue(value) { - return ( - (this.axisLength * - (+getMultiValue(value, this.units.pos) - this.bounds.min)) / - this.bounds.range - ); - } -} diff --git a/src/axes/axes.js b/src/axes/axes.js deleted file mode 100644 index 7714b4b4..00000000 --- a/src/axes/axes.js +++ /dev/null @@ -1,4 +0,0 @@ -export { Axis, axisUnits } from './axis'; -export { AutoScaleAxis } from './auto-scale-axis'; -export { FixedScaleAxis } from './fixed-scale-axis'; -export { StepAxis } from './step-axis'; diff --git a/src/axes/fixed-scale-axis.js b/src/axes/fixed-scale-axis.js deleted file mode 100644 index cfb31d87..00000000 --- a/src/axes/fixed-scale-axis.js +++ /dev/null @@ -1,35 +0,0 @@ -import { getMultiValue, getHighLow } from '../core/data'; -import { times } from '../core/functional'; -import { Axis } from './axis'; - -export class FixedScaleAxis extends Axis { - constructor(axisUnit, data, chartRect, options) { - super(); - - const highLow = options.highLow || getHighLow(data, options, axisUnit.pos); - this.divisor = options.divisor || 1; - this.ticks = - options.ticks || - times(this.divisor).map( - (value, index) => - highLow.low + ((highLow.high - highLow.low) / this.divisor) * index - ); - this.ticks.sort((a, b) => a - b); - this.range = { - min: highLow.low, - max: highLow.high - }; - - super.initialize(axisUnit, chartRect, this.ticks, options); - - this.stepLength = this.axisLength / this.divisor; - } - - projectValue(value) { - return ( - (this.axisLength * - (+getMultiValue(value, this.units.pos) - this.range.min)) / - (this.range.max - this.range.min) - ); - } -} diff --git a/src/axes/index.ts b/src/axes/index.ts new file mode 100644 index 00000000..1e237b22 --- /dev/null +++ b/src/axes/index.ts @@ -0,0 +1,5 @@ +export * from './Axis'; +export * from './AutoScaleAxis'; +export * from './FixedScaleAxis'; +export * from './StepAxis'; +export * from './types'; diff --git a/src/axes/step-axis.js b/src/axes/step-axis.js deleted file mode 100644 index d676df2f..00000000 --- a/src/axes/step-axis.js +++ /dev/null @@ -1,15 +0,0 @@ -import { Axis } from './axis'; - -export class StepAxis extends Axis { - constructor(axisUnit, data, chartRect, options) { - super(); - super.initialize(axisUnit, chartRect, options.ticks, options); - - const calc = Math.max(1, options.ticks.length - (options.stretch ? 1 : 0)); - this.stepLength = this.axisLength / calc; - } - - projectValue(value, index) { - return this.stepLength * index; - } -} diff --git a/src/axes/types.ts b/src/axes/types.ts new file mode 100644 index 00000000..978023d3 --- /dev/null +++ b/src/axes/types.ts @@ -0,0 +1,8 @@ +import type { AutoScaleAxis } from './AutoScaleAxis'; +import type { FixedScaleAxis } from './FixedScaleAxis'; +import type { StepAxis } from './StepAxis'; + +export type AxisType = + | typeof AutoScaleAxis + | typeof FixedScaleAxis + | typeof StepAxis; diff --git a/src/charts/bar.spec.js b/src/charts/BarChart/BarChart.spec.ts similarity index 91% rename from src/charts/bar.spec.js rename to src/charts/BarChart/BarChart.spec.ts index 167741ff..4330f40e 100644 --- a/src/charts/bar.spec.js +++ b/src/charts/BarChart/BarChart.spec.ts @@ -1,24 +1,24 @@ -import { AutoScaleAxis } from '../axes/axes'; -import { BarChart } from './bar'; -import { namespaces } from '../core/globals'; -import { deserialize } from '../core/data'; +import { AutoScaleAxis } from '../../axes'; +import { BarChartOptions, BarChartData, BarChart } from '.'; +import { namespaces, deserialize } from '../../core'; import { + Fixture, addMockWrapper, destroyMockDom, mockDom, mockDomRects, destroyMockDomRects -} from '../../test/mock/dom'; +} from '../../../test/mock/dom'; describe('Charts', () => { describe('BarChart', () => { - let fixture; - let chart; - let options; - let data; + let fixture: Fixture; + let chart: BarChart; + let options: BarChartOptions; + let data: BarChartData; function createChart() { - return new Promise(resolve => { + return new Promise<void>(resolve => { fixture = addMockWrapper( '<div class="ct-chart ct-golden-section"></div>' ); @@ -41,8 +41,8 @@ describe('Charts', () => { afterEach(() => { destroyMockDom(); destroyMockDomRects(); - data = undefined; - options = undefined; + data = { series: [] }; + options = {}; }); describe('grids', () => { @@ -68,8 +68,8 @@ describe('Charts', () => { }); it('should contain ct-grids group', async () => { - data = null; - options = null; + data = { series: [] }; + options = {}; await createChart(); expect(fixture.wrapper.querySelectorAll('g.ct-grids').length).toBe(1); @@ -261,7 +261,7 @@ describe('Charts', () => { deserialize( fixture.wrapper .querySelector('.ct-series-b') - .getAttributeNS(namespaces.ct, 'meta') + ?.getAttributeNS(namespaces.ct, 'meta') ) ).toEqual(seriesMeta); @@ -277,8 +277,8 @@ describe('Charts', () => { describe('Empty data tests', () => { it('should render empty grid with no data', async () => { - data = null; - options = null; + data = { series: [] }; + options = {}; await createChart(); // Find at least one vertical grid line @@ -289,7 +289,8 @@ describe('Charts', () => { it('should render empty grid with only labels', async () => { data = { - labels: [1, 2, 3, 4] + labels: [1, 2, 3, 4], + series: [] }; await createChart(); @@ -300,7 +301,7 @@ describe('Charts', () => { // Find exactly as many horizontal grid lines as labels were specified (Step Axis) expect( document.querySelectorAll('.ct-grids .ct-grid.ct-horizontal').length - ).toBe(data.labels.length); + ).toBe(data.labels?.length); }); it('should generate labels and render empty grid with only series in data', async () => { @@ -320,7 +321,13 @@ describe('Charts', () => { // Should generate the labels using the largest series count expect( document.querySelectorAll('.ct-grids .ct-grid.ct-horizontal').length - ).toBe(Math.max(...data.series.map(series => series.length))); + ).toBe( + Math.max( + ...data.series.map(series => + Array.isArray(series) ? series.length : 0 + ) + ) + ); }); it('should render empty grid with no data and specified high low', async () => { @@ -339,8 +346,8 @@ describe('Charts', () => { const firstLabel = labels[0]; const lastLabel = labels[labels.length - 1]; - expect(firstLabel.textContent.trim()).toBe('-100'); - expect(lastLabel.textContent.trim()).toBe('100'); + expect(firstLabel.textContent?.trim()).toBe('-100'); + expect(lastLabel.textContent?.trim()).toBe('100'); }); it('should render empty grid with no data and reverseData option', async () => { diff --git a/src/charts/bar.stories.js b/src/charts/BarChart/BarChart.stories.ts similarity index 96% rename from src/charts/bar.stories.js rename to src/charts/BarChart/BarChart.stories.ts index fa54e35e..410af720 100644 --- a/src/charts/bar.stories.js +++ b/src/charts/BarChart/BarChart.stories.ts @@ -1,6 +1,6 @@ import 'chartist-dev/styles'; import { BarChart, AutoScaleAxis, Svg, getMultiValue } from 'chartist-dev'; -import { Viewport } from '../../test/utils/storyshots/viewport'; +import { Viewport } from '../../../test/utils/storyshots/viewport'; export default { title: 'BarChart', @@ -208,7 +208,7 @@ export function Stack() { stackBars: true, axisY: { labelInterpolationFnc(value) { - return value / 1000 + 'k'; + return Number(value) / 1000 + 'k'; } } } @@ -276,7 +276,7 @@ export function Adaptive() { stackBars: true, axisX: { labelInterpolationFnc: value => - value + String(value) .split(/\s+/) .map(word => word[0]) .join('') @@ -369,7 +369,7 @@ export function OverlappingBarsOnMobile() { seriesBarDistance: 5, axisX: { labelInterpolationFnc(value) { - return value[0]; + return String(value)[0]; } } } @@ -414,7 +414,7 @@ export function PeakCircles() { { cx: data.x2, cy: data.y2, - r: Math.abs(getMultiValue(data.value)) * 2 + 5 + r: Math.abs(Number(getMultiValue(data.value))) * 2 + 5 }, 'ct-slice-pie' ) diff --git a/src/charts/bar.js b/src/charts/BarChart/BarChart.ts similarity index 68% rename from src/charts/bar.js rename to src/charts/BarChart/BarChart.ts index 06c72a6a..1ff329e1 100644 --- a/src/charts/bar.js +++ b/src/charts/BarChart/BarChart.ts @@ -1,24 +1,49 @@ -import { isNumeric, alphaNumerate } from '../core/lang'; -import { noop, serialMap } from '../core/functional'; -import { extend } from '../core/extend'; +import type { Axis } from '../../axes'; +import type { + BarChartData, + BarChartOptions, + BarChartOptionsWithDefaults, + BarChartCreatedEvent, + BarDrawEvent +} from './BarChart.types'; +import type { NormalizedSeries } from '../../core'; +import type { EventListener, AllEventsListener } from '../../event'; import { + isNumeric, + noop, + serialMap, + extend, + safeHasProperty +} from '../../utils'; +import { + alphaNumerate, normalizeData, serialize, getMetaData, - getHighLow -} from '../core/data'; -import { + getHighLow, createSvg, createChartRect, createGridBackground -} from '../core/creation'; -import { AutoScaleAxis, StepAxis, axisUnits } from '../axes/axes'; -import { BaseChart } from './base'; +} from '../../core'; +import { AutoScaleAxis, StepAxis, axisUnits } from '../../axes'; +import { BaseChart, supportsForeignObject } from '../BaseChart'; + +function getSerialSums(series: NormalizedSeries[]) { + return serialMap(series, (...args) => + Array.from(args).reduce<{ x: number; y: number }>( + (prev, curr) => { + return { + x: prev.x + (safeHasProperty(curr, 'x') ? curr.x : 0), + y: prev.y + (safeHasProperty(curr, 'y') ? curr.y : 0) + }; + }, + { x: 0, y: 0 } + ) + ); +} /** * Default options in bar charts. Expand the code view to see a detailed list of options with comments. - * - * @memberof Chartist.Bar */ const defaultOptions = { // Options for X-Axis @@ -26,7 +51,7 @@ const defaultOptions = { // The offset of the chart drawing area to the border of the container offset: 30, // Position where labels are placed. Can be set to `start` or `end` where `start` is equivalent to left or top on vertical axis and `end` is equivalent to right or bottom on horizontal axis. - position: 'end', + position: 'end' as const, // Allows you to correct label positioning on this axis by positive or negative x and y offset. labelOffset: { x: 0, @@ -48,7 +73,7 @@ const defaultOptions = { // The offset of the chart drawing area to the border of the container offset: 40, // Position where labels are placed. Can be set to `start` or `end` where `start` is equivalent to left or top on vertical axis and `end` is equivalent to right or bottom on horizontal axis. - position: 'start', + position: 'start' as const, // Allows you to correct label positioning on this axis by positive or negative x and y offset. labelOffset: { x: 0, @@ -88,7 +113,7 @@ const defaultOptions = { stackBars: false, // If set to 'overlap' this property will force the stacked bars to draw from the zero line. // If set to 'accumulate' this property will form a total for each series point. This will also influence the y-axis and the overall bounds of the chart. In stacked mode the seriesBarDistance property will have no effect. - stackMode: 'accumulate', + stackMode: 'accumulate' as const, // Inverts the axes of the bar chart in order to draw a horizontal bar chart. Be aware that you also need to invert your axis settings as the Y Axis will now display the labels and the X Axis the values. horizontalBars: false, // If set to true then each bar will represent a series and the data array is expected to be a one dimensional array of data values rather than a series array of series. This is useful if the bar chart should represent a profile rather than some data over time. @@ -118,17 +143,15 @@ const defaultOptions = { export class BarChart extends BaseChart { /** * This method creates a new bar chart and returns API object that you can use for later changes. - * - * @memberof Chartist.Bar - * @param {String|Node} query A selector query string or directly a DOM element - * @param {Object} data The data object that needs to consist of a labels and a series array - * @param {Object} [options] The options object with options that override the default options. Check the examples for a detailed list. - * @param {Array} [responsiveOptions] Specify an array of responsive option arrays which are a media query and options object pair => [[mediaQueryString, optionsObject],[more...]] - * @return {Object} An object which exposes the API for the created chart + * @param query A selector query string or directly a DOM element + * @param data The data object that needs to consist of a labels and a series array + * @param options The options object with options that override the default options. Check the examples for a detailed list. + * @param responsiveOptions Specify an array of responsive option arrays which are a media query and options object pair => [[mediaQueryString, optionsObject],[more...]] + * @return An object which exposes the API for the created chart * * @example * // Create a simple bar chart - * var data = { + * const data = { * labels: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri'], * series: [ * [5, 2, 4, 2, 0] @@ -136,11 +159,11 @@ export class BarChart extends BaseChart { * }; * * // In the global name space Chartist we call the Bar function to initialize a bar chart. As a first parameter we pass in a selector where we would like to get our chart created and as a second parameter we pass our data object. - * new Chartist.Bar('.ct-chart', data); + * new BarChart('.ct-chart', data); * * @example * // This example creates a bipolar grouped bar chart where the boundaries are limitted to -10 and 10 - * new Chartist.Bar('.ct-chart', { + * new BarChart('.ct-chart', { * labels: [1, 2, 3, 4, 5, 6, 7], * series: [ * [1, 3, 2, -5, -3, 1, -6], @@ -153,7 +176,12 @@ export class BarChart extends BaseChart { * }); * */ - constructor(query, data, options, responsiveOptions) { + constructor( + query: string | Element | null, + protected override data: BarChartData, + options?: BarChartOptions, + responsiveOptions?: [string, BarChartOptions][] + ) { super( query, data, @@ -163,107 +191,93 @@ export class BarChart extends BaseChart { ); } + override on( + event: 'created', + listener: EventListener<BarChartCreatedEvent> + ): this; + override on(event: 'draw', listener: EventListener<BarDrawEvent>): this; + override on(event: '*', listener: AllEventsListener): this; + override on(event: string, listener: EventListener): this; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + override on(event: string, listener: any) { + return super.on(event, listener); + } + /** * Creates a new chart - * */ - createChart(options) { - let data; - let highLow; - - if (options.distributeSeries) { - data = normalizeData( - this.data, - options.reverseData, - options.horizontalBars ? 'x' : 'y' - ); - data.normalized.series = data.normalized.series.map(value => [value]); - } else { - data = normalizeData( - this.data, - options.reverseData, - options.horizontalBars ? 'x' : 'y' - ); - } - + createChart(options: BarChartOptionsWithDefaults) { + const { data } = this; + const normalizedData = normalizeData( + data, + options.reverseData, + options.horizontalBars ? 'x' : 'y', + true + ); // Create new svg element - this.svg = createSvg( + const svg = createSvg( this.container, options.width, options.height, options.classNames.chart + (options.horizontalBars ? ' ' + options.classNames.horizontalBars : '') ); + const highLow = + options.stackBars && normalizedData.series.length + ? // If stacked bars we need to calculate the high low from stacked values from each series + getHighLow( + [getSerialSums(normalizedData.series)], + options, + options.horizontalBars ? 'x' : 'y' + ) + : getHighLow( + normalizedData.series, + options, + options.horizontalBars ? 'x' : 'y' + ); + + this.svg = svg; // Drawing groups in correct order - const gridGroup = this.svg.elem('g').addClass(options.classNames.gridGroup); - const seriesGroup = this.svg.elem('g'); - const labelGroup = this.svg - .elem('g') - .addClass(options.classNames.labelGroup); - - if (options.stackBars && data.normalized.series.length !== 0) { - // If stacked bars we need to calculate the high low from stacked values from each series - const serialSums = serialMap(data.normalized.series, () => - Array.from(arguments) - .map(value => value) - .reduce( - (prev, curr) => { - return { - x: prev.x + (curr && curr.x) || 0, - y: prev.y + (curr && curr.y) || 0 - }; - }, - { x: 0, y: 0 } - ) - ); + const gridGroup = svg.elem('g').addClass(options.classNames.gridGroup); + const seriesGroup = svg.elem('g'); + const labelGroup = svg.elem('g').addClass(options.classNames.labelGroup); - highLow = getHighLow( - [serialSums], - options, - options.horizontalBars ? 'x' : 'y' - ); - } else { - highLow = getHighLow( - data.normalized.series, - options, - options.horizontalBars ? 'x' : 'y' - ); + // Overrides of high / low from settings + if (typeof options.high === 'number') { + highLow.high = options.high; } - // Overrides of high / low from settings - highLow.high = +options.high || (options.high === 0 ? 0 : highLow.high); - highLow.low = +options.low || (options.low === 0 ? 0 : highLow.low); + if (typeof options.low === 'number') { + highLow.low = options.low; + } const chartRect = createChartRect( - this.svg, - options, - defaultOptions.padding + svg, + options + // @todo Fix padding. + // defaultOptions.padding ); - let valueAxis; - let labelAxisTicks; - let labelAxis; - let axisX; - let axisY; - - // We need to set step count based on some options combinations - if (options.distributeSeries && options.stackBars) { - // If distributed series are enabled and bars need to be stacked, we'll only have one bar and therefore should - // use only the first label for the step axis - labelAxisTicks = data.normalized.labels.slice(0, 1); - } else { - // If distributed series are enabled but stacked bars aren't, we should use the series labels - // If we are drawing a regular bar chart with two dimensional series data, we just use the labels array - // as the bars are normalized - labelAxisTicks = data.normalized.labels; - } + let valueAxis: Axis; + const labelAxisTicks = // We need to set step count based on some options combinations + options.distributeSeries && options.stackBars + ? // If distributed series are enabled and bars need to be stacked, we'll only have one bar and therefore should + // use only the first label for the step axis + normalizedData.labels.slice(0, 1) + : // If distributed series are enabled but stacked bars aren't, we should use the series labels + // If we are drawing a regular bar chart with two dimensional series data, we just use the labels array + // as the bars are normalized + normalizedData.labels; + let labelAxis: Axis; + let axisX: Axis; + let axisY: Axis; // Set labelAxis and valueAxis based on the horizontalBars setting. This setting will flip the axes if necessary. if (options.horizontalBars) { if (options.axisX.type === undefined) { valueAxis = axisX = new AutoScaleAxis( axisUnits.x, - data.normalized.series, + normalizedData.series, chartRect, extend({}, options.axisX, { highLow: highLow, @@ -271,9 +285,10 @@ export class BarChart extends BaseChart { }) ); } else { + // eslint-disable-next-line new-cap valueAxis = axisX = new options.axisX.type( axisUnits.x, - data.normalized.series, + normalizedData.series, chartRect, extend({}, options.axisX, { highLow: highLow, @@ -285,16 +300,17 @@ export class BarChart extends BaseChart { if (options.axisY.type === undefined) { labelAxis = axisY = new StepAxis( axisUnits.y, - data.normalized.series, + normalizedData.series, chartRect, { ticks: labelAxisTicks } ); } else { + // eslint-disable-next-line new-cap labelAxis = axisY = new options.axisY.type( axisUnits.y, - data.normalized.series, + normalizedData.series, chartRect, options.axisY ); @@ -303,16 +319,17 @@ export class BarChart extends BaseChart { if (options.axisX.type === undefined) { labelAxis = axisX = new StepAxis( axisUnits.x, - data.normalized.series, + normalizedData.series, chartRect, { ticks: labelAxisTicks } ); } else { + // eslint-disable-next-line new-cap labelAxis = axisX = new options.axisX.type( axisUnits.x, - data.normalized.series, + normalizedData.series, chartRect, options.axisX ); @@ -321,7 +338,7 @@ export class BarChart extends BaseChart { if (options.axisY.type === undefined) { valueAxis = axisY = new AutoScaleAxis( axisUnits.y, - data.normalized.series, + normalizedData.series, chartRect, extend({}, options.axisY, { highLow: highLow, @@ -329,9 +346,10 @@ export class BarChart extends BaseChart { }) ); } else { + // eslint-disable-next-line new-cap valueAxis = axisY = new options.axisY.type( axisUnits.y, - data.normalized.series, + normalizedData.series, chartRect, extend({}, options.axisY, { highLow: highLow, @@ -346,19 +364,19 @@ export class BarChart extends BaseChart { ? chartRect.x1 + valueAxis.projectValue(0) : chartRect.y1 - valueAxis.projectValue(0); // Used to track the screen coordinates of stacked bars - const stackedBarValues = []; + const stackedBarValues: number[] = []; labelAxis.createGridAndLabels( gridGroup, labelGroup, - this.supportsForeignObject, + supportsForeignObject, options, this.eventEmitter ); valueAxis.createGridAndLabels( gridGroup, labelGroup, - this.supportsForeignObject, + supportsForeignObject, options, this.eventEmitter ); @@ -373,18 +391,18 @@ export class BarChart extends BaseChart { } // Draw the series - data.raw.series.forEach((series, seriesIndex) => { + data.series.forEach((series, seriesIndex) => { // Calculating bi-polar value of index for seriesOffset. For i = 0..4 biPol will be -1.5, -0.5, 0.5, 1.5 etc. - const biPol = seriesIndex - (data.raw.series.length - 1) / 2; + const biPol = seriesIndex - (data.series.length - 1) / 2; // Half of the period width between vertical grid lines used to position bars - let periodHalfLength; + let periodHalfLength: number; // We need to set periodHalfLength based on some options combinations if (options.distributeSeries && !options.stackBars) { // If distributed series are enabled but stacked bars aren't, we need to use the length of the normaizedData array // which is the series count and divide by 2 periodHalfLength = - labelAxis.axisLength / data.normalized.series.length / 2; + labelAxis.axisLength / normalizedData.series.length / 2; } else if (options.distributeSeries && options.stackBars) { // If distributed series and stacked bars are enabled we'll only get one bar so we should just divide the axis // length by 2 @@ -392,28 +410,41 @@ export class BarChart extends BaseChart { } else { // On regular bar charts we should just use the series length periodHalfLength = - labelAxis.axisLength / data.normalized.series[seriesIndex].length / 2; + labelAxis.axisLength / normalizedData.series[seriesIndex].length / 2; } // Adding the series group to the series element const seriesElement = seriesGroup.elem('g'); + const seriesName = safeHasProperty(series, 'name') && series.name; + const seriesClassName = + safeHasProperty(series, 'className') && series.className; + const seriesMeta = safeHasProperty(series, 'meta') + ? series.meta + : undefined; // Write attributes to series group element. If series name or meta is undefined the attributes will not be written - seriesElement.attr({ - 'ct:series-name': series.name, - 'ct:meta': serialize(series.meta) - }); + if (seriesName) { + seriesElement.attr({ + 'ct:series-name': seriesName + }); + } + + if (seriesMeta) { + seriesElement.attr({ + 'ct:meta': serialize(seriesMeta) + }); + } // Use series class from series data or if not set generate one seriesElement.addClass( [ options.classNames.series, - series.className || + seriesClassName || `${options.classNames.series}-${alphaNumerate(seriesIndex)}` ].join(' ') ); - data.normalized.series[seriesIndex].forEach((value, valueIndex) => { + normalizedData.series[seriesIndex].forEach((value, valueIndex) => { let labelAxisValueIndex; // We need to set labelAxisValueIndex based on some options combinations if (options.distributeSeries && !options.stackBars) { @@ -436,16 +467,16 @@ export class BarChart extends BaseChart { x: chartRect.x1 + valueAxis.projectValue( - value && value.x ? value.x : 0, + safeHasProperty(value, 'x') ? value.x : 0, valueIndex, - data.normalized.series[seriesIndex] + normalizedData.series[seriesIndex] ), y: chartRect.y1 - labelAxis.projectValue( - value && value.y ? value.y : 0, + safeHasProperty(value, 'y') ? value.y : 0, labelAxisValueIndex, - data.normalized.series[seriesIndex] + normalizedData.series[seriesIndex] ) }; } else { @@ -453,16 +484,16 @@ export class BarChart extends BaseChart { x: chartRect.x1 + labelAxis.projectValue( - value && value.x ? value.x : 0, + safeHasProperty(value, 'x') ? value.x : 0, labelAxisValueIndex, - data.normalized.series[seriesIndex] + normalizedData.series[seriesIndex] ), y: chartRect.y1 - valueAxis.projectValue( - value && value.y ? value.y : 0, + safeHasProperty(value, 'y') ? value.y : 0, valueIndex, - data.normalized.series[seriesIndex] + normalizedData.series[seriesIndex] ) }; } @@ -473,7 +504,7 @@ export class BarChart extends BaseChart { // add any automated positioning. if (labelAxis instanceof StepAxis) { // Offset to center bar between grid lines, but only if the step axis is not stretched - if (!labelAxis.options.stretch) { + if (!labelAxis.stretch) { projected[labelAxis.units.pos] += periodHalfLength * (options.horizontalBars ? -1 : 1); } @@ -496,7 +527,7 @@ export class BarChart extends BaseChart { return; } - const positions = {}; + const positions: Record<string, number> = {}; positions[`${labelAxis.units.pos}1`] = projected[labelAxis.units.pos]; positions[`${labelAxis.units.pos}2`] = projected[labelAxis.units.pos]; @@ -543,38 +574,40 @@ export class BarChart extends BaseChart { const bar = seriesElement .elem('line', positions, options.classNames.bar) .attr({ - 'ct:value': [value.x, value.y].filter(isNumeric).join(','), + 'ct:value': [ + safeHasProperty(value, 'x') && value.x, + safeHasProperty(value, 'y') && value.y + ] + .filter(isNumeric) + .join(','), 'ct:meta': serialize(metaData) }); - this.eventEmitter.emit( - 'draw', - extend( - { - type: 'bar', - value, - index: valueIndex, - meta: metaData, - series, - seriesIndex, - axisX, - axisY, - chartRect, - group: seriesElement, - element: bar - }, - positions - ) - ); + this.eventEmitter.emit<BarDrawEvent>('draw', { + type: 'bar', + value, + index: valueIndex, + meta: metaData, + series, + seriesIndex, + axisX, + axisY, + chartRect, + group: seriesElement, + element: bar, + x1: positions.x1, + y1: positions.y1, + x2: positions.x2, + y2: positions.y2 + }); }); }); - this.eventEmitter.emit('created', { - bounds: valueAxis.bounds, + this.eventEmitter.emit<BarChartCreatedEvent>('created', { chartRect, axisX, axisY, - svg: this.svg, + svg, options }); } diff --git a/src/charts/BarChart/BarChart.types.ts b/src/charts/BarChart/BarChart.types.ts new file mode 100644 index 00000000..b3cc7880 --- /dev/null +++ b/src/charts/BarChart/BarChart.types.ts @@ -0,0 +1,82 @@ +import type { + Options, + AxisOptions, + Data, + CreatedEvent, + DrawEvent, + NormalizedMulti +} from '../../core'; +import type { RequiredKeys } from '../../utils'; + +export type BarChartData = Data; + +export interface BarChartOptions< + TXAxisOptions = AxisOptions, + TYAxisOptions = TXAxisOptions +> extends Options<TXAxisOptions, TYAxisOptions> { + classNames?: { + chart?: string; + horizontalBars?: string; + label?: string; + labelGroup?: string; + series?: string; + bar?: string; + grid?: string; + gridGroup?: string; + gridBackground?: string; + vertical?: string; + horizontal?: string; + start?: string; + end?: string; + }; + seriesBarDistance?: number; + stackBars?: boolean; + stackMode?: 'accumulate' | boolean; + horizontalBars?: boolean; + distributeSeries?: boolean; + reverseData?: boolean; + showGridBackground?: boolean; +} + +export type BarChartOptionsWithDefaults = RequiredKeys< + BarChartOptions< + RequiredKeys< + AxisOptions, + | 'offset' + | 'position' + | 'labelOffset' + | 'showLabel' + | 'showGrid' + | 'labelInterpolationFnc' + | 'scaleMinSpace' + >, + RequiredKeys< + AxisOptions, + | 'offset' + | 'position' + | 'labelOffset' + | 'showLabel' + | 'showGrid' + | 'labelInterpolationFnc' + | 'scaleMinSpace' + > + >, + | 'referenceValue' + | 'chartPadding' + | 'seriesBarDistance' + | 'stackMode' + | 'axisX' + | 'axisY', + 'classNames' +>; + +export type BarChartCreatedEvent = CreatedEvent<BarChartOptions>; + +export interface BarDrawEvent extends DrawEvent { + type: 'bar'; + value: number | NormalizedMulti; + x1: number; + y1: number; + x2: number; + y2: number; +} diff --git a/src/charts/BarChart/index.ts b/src/charts/BarChart/index.ts new file mode 100644 index 00000000..340742b5 --- /dev/null +++ b/src/charts/BarChart/index.ts @@ -0,0 +1,2 @@ +export * from './BarChart'; +export * from './BarChart.types'; diff --git a/src/charts/base.js b/src/charts/BaseChart.ts similarity index 54% rename from src/charts/base.js rename to src/charts/BaseChart.ts index b11b9b7c..065789a5 100644 --- a/src/charts/base.js +++ b/src/charts/BaseChart.ts @@ -1,48 +1,55 @@ -import { querySelector, extend, optionsProvider } from '../core/core'; -import { EventEmitter } from '../event/event-emitter'; -import { isSupported } from '../svg/svg'; +import type { Data, Options } from '../core'; +import type { Svg } from '../svg'; +import { OptionsProvider, optionsProvider } from '../core'; +import { extend } from '../utils'; +import { EventListener, AllEventsListener, EventEmitter } from '../event'; +import { isSupported } from '../svg'; + +export const supportsForeignObject = isSupported('Extensibility'); +export const supportsAnimations = isSupported('AnimationEventsAttribute'); + +const instances = new WeakMap<Element, BaseChart>(); + +export abstract class BaseChart { + protected svg?: Svg; + protected readonly container: Element; + protected readonly eventEmitter = new EventEmitter(); + private readonly resizeListener = () => this.update(); + // Using event loop for first draw to make it possible to register event listeners in the same call stack where + // the chart was created. + private initializeTimeoutId: NodeJS.Timer | null = setTimeout( + () => this.initialize(), + 0 + ); + private optionsProvider?: OptionsProvider<Options>; + + constructor( + query: string | Element | null, + protected data: Data, + private readonly defaultOptions: Options, + private options: Options, + private readonly responsiveOptions?: [string, Options][] + ) { + const container = + typeof query === 'string' ? document.querySelector(query) : query; + + if (!container) { + throw new Error('Target element is not found'); + } -export class BaseChart { - /** - * Constructor of chart base class. - * - * @param query - * @param data - * @param defaultOptions - * @param options - * @param responsiveOptions - * @constructor - */ - constructor(query, data, defaultOptions, options, responsiveOptions) { - this.container = querySelector(query); - this.data = data || {}; - this.data.labels = this.data.labels || []; - this.data.series = this.data.series || []; - this.defaultOptions = defaultOptions; - this.options = options; - this.responsiveOptions = responsiveOptions; - this.eventEmitter = new EventEmitter(); - this.supportsForeignObject = isSupported('Extensibility'); - this.supportsAnimations = isSupported('AnimationEventsAttribute'); - this.resizeListener = () => this.update(); - - if (this.container) { - // If chartist was already initialized in this container we are detaching all event listeners first - if (this.container.__chartist__) { - this.container.__chartist__.detach(); - } + this.container = container; - this.container.__chartist__ = this; + const prevInstance = instances.get(container); + + // If chartist was already initialized in this container we are detaching all event listeners first + if (prevInstance) { + prevInstance.detach(); } - // Using event loop for first draw to make it possible to register event listeners in the same call stack where - // the chart was created. - this.initializeTimeoutId = setTimeout(() => this.initialize(), 0); + instances.set(container, this); } - createChart() { - throw new Error("Base chart type can't be instantiated!"); - } + abstract createChart(options: Options): void; // TODO: Currently we need to re-draw the chart on window resize. This is usually very bad and will affect performance. // This is done because we can't work with relative coordinates when drawing the chart because SVG Path does not @@ -52,13 +59,11 @@ export class BaseChart { // The problem is with the label offsets that can't be converted into percentage and affecting the chart container /** * Updates the chart which currently does a full reconstruction of the SVG DOM - * - * @param {Object} [data] Optional data you'd like to set for the chart before it will update. If not specified the update method will use the data that is already configured with the chart. - * @param {Object} [options] Optional options you'd like to add to the previous options for the chart before it will update. If not specified the update method will use the options that have been already configured with the chart. - * @param {Boolean} [override] If set to true, the passed options will be used to extend the options that have been configured already. Otherwise the chart default options will be used as the base - * @memberof Chartist.Base + * @param data Optional data you'd like to set for the chart before it will update. If not specified the update method will use the data that is already configured with the chart. + * @param options Optional options you'd like to add to the previous options for the chart before it will update. If not specified the update method will use the options that have been already configured with the chart. + * @param override If set to true, the passed options will be used to extend the options that have been configured already. Otherwise the chart default options will be used as the base */ - update(data, options, override) { + update(data?: Data, options?: Options, override = false) { if (data) { this.data = data || {}; this.data.labels = this.data.labels || []; @@ -80,7 +85,7 @@ export class BaseChart { // If chartist was not initialized yet, we just set the options and leave the rest to the initialization // Otherwise we re-create the optionsProvider at this point if (!this.initializeTimeoutId) { - this.optionsProvider.removeMediaQueryListeners(); + this.optionsProvider?.removeMediaQueryListeners(); this.optionsProvider = optionsProvider( this.options, this.responsiveOptions, @@ -90,7 +95,7 @@ export class BaseChart { } // Only re-created the chart if it has been initialized yet - if (!this.initializeTimeoutId) { + if (!this.initializeTimeoutId && this.optionsProvider) { this.createChart(this.optionsProvider.getCurrentOptions()); } @@ -100,43 +105,45 @@ export class BaseChart { /** * This method can be called on the API object of each chart and will un-register all event listeners that were added to other components. This currently includes a window.resize listener as well as media query listeners if any responsive options have been provided. Use this function if you need to destroy and recreate Chartist charts dynamically. - * - * @memberof Chartist.Base */ detach() { // Only detach if initialization already occurred on this chart. If this chart still hasn't initialized (therefore // the initializationTimeoutId is still a valid timeout reference, we will clear the timeout if (!this.initializeTimeoutId) { window.removeEventListener('resize', this.resizeListener); - this.optionsProvider.removeMediaQueryListeners(); + this.optionsProvider?.removeMediaQueryListeners(); } else { window.clearTimeout(this.initializeTimeoutId); } + instances.delete(this.container); + return this; } /** * Use this function to register event handlers. The handler callbacks are synchronous and will run in the main thread rather than the event loop. - * - * @memberof Chartist.Base - * @param {String} event Name of the event. Check the examples for supported events. - * @param {Function} handler The handler function that will be called when an event with the given name was emitted. This function will receive a data argument which contains event data. See the example for more details. + * @param event Name of the event. Check the examples for supported events. + * @param listener The handler function that will be called when an event with the given name was emitted. This function will receive a data argument which contains event data. See the example for more details. */ - on(event, handler) { - this.eventEmitter.addEventHandler(event, handler); + on(event: '*', listener: AllEventsListener): this; + on(event: string, listener: EventListener): this; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + on(event: string, listener: any) { + this.eventEmitter.addEventHandler(event, listener); return this; } /** * Use this function to un-register event handlers. If the handler function parameter is omitted all handlers for the given event will be un-registered. - * - * @memberof Chartist.Base - * @param {String} event Name of the event for which a handler should be removed - * @param {Function} [handler] The handler function that that was previously used to register a new event handler. This handler will be removed from the event handler list. If this parameter is omitted then all event handlers for the given event are removed from the list. + * @param event Name of the event for which a handler should be removed + * @param listener The handler function that that was previously used to register a new event handler. This handler will be removed from the event handler list. If this parameter is omitted then all event handlers for the given event are removed from the list. */ - off(event, handler) { - this.eventEmitter.removeEventHandler(event, handler); + off(event: '*', listener?: AllEventsListener): this; + off(event: string, listener?: EventListener): this; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + off(event: string, listener?: any) { + this.eventEmitter.removeEventHandler(event, listener); return this; } @@ -158,7 +165,7 @@ export class BaseChart { // Initialize all relevant plugins with our chart object and the plugin options specified in the config if (this.options.plugins) { this.options.plugins.forEach(plugin => { - if (plugin instanceof Array) { + if (Array.isArray(plugin)) { plugin[0](this, plugin[1]); } else { plugin(this); @@ -177,6 +184,6 @@ export class BaseChart { // As chart is initialized from the event loop now we can reset our timeout reference // This is important if the chart gets initialized on the same element twice - this.initializeTimeoutId = undefined; + this.initializeTimeoutId = null; } } diff --git a/src/charts/line.spec.js b/src/charts/LineChart/LineChart.spec.ts similarity index 95% rename from src/charts/line.spec.js rename to src/charts/LineChart/LineChart.spec.ts index 12927dd0..4e272d53 100644 --- a/src/charts/line.spec.js +++ b/src/charts/LineChart/LineChart.spec.ts @@ -1,25 +1,25 @@ -import { AutoScaleAxis, FixedScaleAxis } from '../axes/axes'; -import { LineChart } from './line'; -import * as Interpolation from '../interpolation/interpolation'; -import { namespaces } from '../core/globals'; -import { deserialize } from '../core/data'; +import { AutoScaleAxis, FixedScaleAxis } from '../../axes'; +import { LineChartOptions, LineChartData, LineChart } from '.'; +import * as Interpolation from '../../interpolation'; +import { namespaces, deserialize } from '../../core'; import { + Fixture, addMockWrapper, destroyMockDom, mockDom, mockDomRects, destroyMockDomRects -} from '../../test/mock/dom'; +} from '../../../test/mock/dom'; describe('Charts', () => { describe('LineChart', () => { - let fixture; - let chart; - let options; - let data; + let fixture: Fixture; + let chart: LineChart; + let options: LineChartOptions; + let data: LineChartData; function createChart() { - return new Promise(resolve => { + return new Promise<void>(resolve => { fixture = addMockWrapper( '<div class="ct-chart ct-golden-section"></div>' ); @@ -42,8 +42,8 @@ describe('Charts', () => { afterEach(() => { destroyMockDom(); destroyMockDomRects(); - data = undefined; - options = undefined; + data = { series: [] }; + options = {}; }); describe('grids', () => { @@ -142,7 +142,7 @@ describe('Charts', () => { it('should have ct-end class if position is any other value than start', async () => { options = { axisY: { - position: 'right' + position: 'end' as const } }; await createChart(); @@ -308,7 +308,7 @@ describe('Charts', () => { deserialize( fixture.wrapper .querySelector('.ct-series-b') - .getAttributeNS(namespaces.ct, 'meta') + ?.getAttributeNS(namespaces.ct, 'meta') ) ).toEqual(seriesMeta); @@ -934,7 +934,8 @@ describe('Charts', () => { it('should render empty grid with only labels', async () => { data = { - labels: [1, 2, 3, 4] + labels: [1, 2, 3, 4], + series: [] }; await createChart(); @@ -945,7 +946,7 @@ describe('Charts', () => { // Find exactly as many horizontal grid lines as labels were specified (Step Axis) expect( document.querySelectorAll('.ct-grids .ct-grid.ct-horizontal').length - ).toBe(data.labels.length); + ).toBe(data.labels?.length); }); it('should generate labels and render empty grid with only series in data', async () => { @@ -965,11 +966,17 @@ describe('Charts', () => { // Should generate the labels using the largest series count expect( document.querySelectorAll('.ct-grids .ct-grid.ct-horizontal').length - ).toBe(Math.max(...data.series.map(series => series.length))); + ).toBe( + Math.max( + ...data.series.map(series => + Array.isArray(series) ? series.length : 0 + ) + ) + ); }); it('should render empty grid with no data and specified high low', async () => { - data = null; + data = { series: [] }; options = { width: 400, height: 300, @@ -985,12 +992,12 @@ describe('Charts', () => { const firstLabel = labels[0]; const lastLabel = labels[labels.length - 1]; - expect(firstLabel.textContent.trim()).toBe('-100'); - expect(lastLabel.textContent.trim()).toBe('100'); + expect(firstLabel.textContent?.trim()).toBe('-100'); + expect(lastLabel.textContent?.trim()).toBe('100'); }); it('should render empty grid with no data and reverseData option', async () => { - data = null; + data = { series: [] }; options = { reverseData: true }; @@ -1013,12 +1020,12 @@ describe('Charts', () => { }; await createChart(); - expect(document.querySelector('.ct-point').getAttribute('x1')).not.toBe( - 'NaN' - ); - expect(document.querySelector('.ct-point').getAttribute('x2')).not.toBe( - 'NaN' - ); + expect( + document.querySelector('.ct-point')?.getAttribute('x1') + ).not.toBe('NaN'); + expect( + document.querySelector('.ct-point')?.getAttribute('x2') + ).not.toBe('NaN'); }); }); }); diff --git a/src/charts/line.stories.js b/src/charts/LineChart/LineChart.stories.ts similarity index 98% rename from src/charts/line.stories.js rename to src/charts/LineChart/LineChart.stories.ts index b7b781d0..90cf0386 100644 --- a/src/charts/line.stories.js +++ b/src/charts/LineChart/LineChart.stories.ts @@ -448,7 +448,10 @@ export function FullWidth() { export function Scatter() { const root = document.createElement('div'); - const data = Array.from({ length: 52 }).reduce( + const data = Array.from({ length: 52 }).reduce<{ + labels: number[]; + series: number[][]; + }>( (data, _, index) => { data.labels.push(index + 1); data.series.forEach(series => { @@ -550,7 +553,7 @@ export function CustomPoints() { // If the draw event was triggered from drawing a point on the line chart if (data.type === 'point') { // We are creating a new path SVG element that draws a triangle around the point coordinates - let triangle = new Svg( + const triangle = new Svg( 'path', { d: [ diff --git a/src/charts/line.js b/src/charts/LineChart/LineChart.ts similarity index 71% rename from src/charts/line.js rename to src/charts/LineChart/LineChart.ts index 7926a29b..222db2ec 100644 --- a/src/charts/line.js +++ b/src/charts/LineChart/LineChart.ts @@ -1,25 +1,53 @@ -import { isNumeric, alphaNumerate } from '../core/lang'; -import { noop } from '../core/functional'; -import { extend } from '../core/extend'; +import type { Axis } from '../../axes'; +import type { + LineChartData, + LineChartOptions, + LineChartOptionsWithDefaults, + LineChartCreatedEvent, + PointDrawEvent, + LineDrawEvent, + AreaDrawEvent +} from './LineChart.types'; +import type { SegmentData, Series, SeriesObject } from '../../core'; +import type { EventListener, AllEventsListener } from '../../event'; import { + alphaNumerate, normalizeData, serialize, getMetaData, - getSeriesOption -} from '../core/data'; -import { createSvg, createChartRect, createGridBackground -} from '../core/creation'; -import { StepAxis, AutoScaleAxis, axisUnits } from '../axes/axes'; -import { BaseChart } from './base'; -import { monotoneCubic, none } from '../interpolation/interpolation'; +} from '../../core'; +import { isNumeric, noop, extend, safeHasProperty } from '../../utils'; +import { StepAxis, AutoScaleAxis, axisUnits } from '../../axes'; +import { monotoneCubic, none } from '../../interpolation'; +import { BaseChart, supportsForeignObject } from './../BaseChart'; + +export function getSeriesOption< + T extends keyof Omit<LineChartOptionsWithDefaults, 'series'> +>( + series: Series | SeriesObject, + options: LineChartOptionsWithDefaults, + key: T +) { + if ( + safeHasProperty(series, 'name') && + series.name && + options.series?.[series.name] + ) { + const seriesOptions = options?.series[series.name]; + const value = seriesOptions[key]; + const result = value === undefined ? options[key] : value; + + return result as LineChartOptionsWithDefaults[T]; + } else { + return options[key]; + } +} /** * Default options in line charts. Expand the code view to see a detailed list of options with comments. - * - * @memberof Chartist.Line */ const defaultOptions = { // Options for X-Axis @@ -27,7 +55,7 @@ const defaultOptions = { // The offset of the labels to the chart area offset: 30, // Position where labels are placed. Can be set to `start` or `end` where `start` is equivalent to left or top on vertical axis and `end` is equivalent to right or bottom on horizontal axis. - position: 'end', + position: 'end' as const, // Allows you to correct label positioning on this axis by positive or negative x and y offset. labelOffset: { x: 0, @@ -47,7 +75,7 @@ const defaultOptions = { // The offset of the labels to the chart area offset: 40, // Position where labels are placed. Can be set to `start` or `end` where `start` is equivalent to left or top on vertical axis and `end` is equivalent to right or bottom on horizontal axis. - position: 'start', + position: 'start' as const, // Allows you to correct label positioning on this axis by positive or negative x and y offset. labelOffset: { x: 0, @@ -119,17 +147,15 @@ const defaultOptions = { export class LineChart extends BaseChart { /** * This method creates a new line chart. - * - * @memberof Chartist.Line - * @param {String|Node} query A selector query string or directly a DOM element - * @param {Object} data The data object that needs to consist of a labels and a series array - * @param {Object} [options] The options object with options that override the default options. Check the examples for a detailed list. - * @param {Array} [responsiveOptions] Specify an array of responsive option arrays which are a media query and options object pair => [[mediaQueryString, optionsObject],[more...]] - * @return {Object} An object which exposes the API for the created chart + * @param query A selector query string or directly a DOM element + * @param data The data object that needs to consist of a labels and a series array + * @param options The options object with options that override the default options. Check the examples for a detailed list. + * @param responsiveOptions Specify an array of responsive option arrays which are a media query and options object pair => [[mediaQueryString, optionsObject],[more...]] + * @return An object which exposes the API for the created chart * * @example * // Create a simple line chart - * var data = { + * const data = { * // A labels array that can contain any sort of values * labels: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri'], * // Our series array that contains series objects or in this case series data arrays @@ -139,18 +165,18 @@ export class LineChart extends BaseChart { * }; * * // As options we currently only set a static size of 300x200 px - * var options = { + * const options = { * width: '300px', * height: '200px' * }; * * // In the global name space Chartist we call the Line function to initialize a line chart. As a first parameter we pass in a selector where we would like to get our chart created. Second parameter is the actual data object and as a third parameter we pass in our options - * new Chartist.Line('.ct-chart', data, options); + * new LineChart('.ct-chart', data, options); * * @example * // Use specific interpolation function with configuration from the Chartist.Interpolation module * - * var chart = new Chartist.Line('.ct-chart', { + * const chart = new LineChart('.ct-chart', { * labels: [1, 2, 3, 4, 5], * series: [ * [1, 1, 8, 1, 7] @@ -164,7 +190,7 @@ export class LineChart extends BaseChart { * @example * // Create a line chart with responsive options * - * var data = { + * const data = { * // A labels array that can contain any sort of values * labels: ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'], * // Our series array that contains series objects or in this case series data arrays @@ -174,7 +200,7 @@ export class LineChart extends BaseChart { * }; * * // In addition to the regular options we specify responsive option overrides that will override the default configutation based on the matching media queries. - * var responsiveOptions = [ + * const responsiveOptions = [ * ['screen and (min-width: 641px) and (max-width: 1024px)', { * showPoint: false, * axisX: { @@ -195,10 +221,15 @@ export class LineChart extends BaseChart { * }] * ]; * - * new Chartist.Line('.ct-chart', data, null, responsiveOptions); + * new LineChart('.ct-chart', data, null, responsiveOptions); * */ - constructor(query, data, options, responsiveOptions) { + constructor( + query: string | Element | null, + protected override data: LineChartData, + options?: LineChartOptions, + responsiveOptions?: [string, LineChartOptions][] + ) { super( query, data, @@ -208,49 +239,67 @@ export class LineChart extends BaseChart { ); } + override on( + event: 'created', + listener: EventListener<LineChartCreatedEvent> + ): this; + override on( + event: 'draw', + listener: EventListener<PointDrawEvent | LineDrawEvent | AreaDrawEvent> + ): this; + override on(event: '*', listener: AllEventsListener): this; + override on(event: string, listener: EventListener): this; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + override on(event: string, listener: any) { + return super.on(event, listener); + } + /** * Creates a new chart - * */ - createChart(options) { - const data = normalizeData(this.data, options.reverseData, true); + createChart(options: LineChartOptionsWithDefaults) { + const { data } = this; + const normalizedData = normalizeData(data, options.reverseData, true); // Create new svg object - this.svg = createSvg( + const svg = createSvg( this.container, options.width, options.height, options.classNames.chart ); + + this.svg = svg; + // Create groups for labels, grid and series - const gridGroup = this.svg.elem('g').addClass(options.classNames.gridGroup); - const seriesGroup = this.svg.elem('g'); - const labelGroup = this.svg - .elem('g') - .addClass(options.classNames.labelGroup); + const gridGroup = svg.elem('g').addClass(options.classNames.gridGroup); + const seriesGroup = svg.elem('g'); + const labelGroup = svg.elem('g').addClass(options.classNames.labelGroup); const chartRect = createChartRect( - this.svg, - options, - defaultOptions.padding + svg, + options + // @todo Fix padding. + // defaultOptions.padding ); - let axisX; - let axisY; + let axisX: Axis; + let axisY: Axis; if (options.axisX.type === undefined) { axisX = new StepAxis( axisUnits.x, - data.normalized.series, + normalizedData.series, chartRect, extend({}, options.axisX, { - ticks: data.normalized.labels, + ticks: normalizedData.labels, stretch: options.fullWidth }) ); } else { + // eslint-disable-next-line new-cap axisX = new options.axisX.type( axisUnits.x, - data.normalized.series, + normalizedData.series, chartRect, options.axisX ); @@ -259,7 +308,7 @@ export class LineChart extends BaseChart { if (options.axisY.type === undefined) { axisY = new AutoScaleAxis( axisUnits.y, - data.normalized.series, + normalizedData.series, chartRect, extend({}, options.axisY, { high: isNumeric(options.high) ? options.high : options.axisY.high, @@ -267,9 +316,10 @@ export class LineChart extends BaseChart { }) ); } else { + // eslint-disable-next-line new-cap axisY = new options.axisY.type( axisUnits.y, - data.normalized.series, + normalizedData.series, chartRect, options.axisY ); @@ -278,14 +328,14 @@ export class LineChart extends BaseChart { axisX.createGridAndLabels( gridGroup, labelGroup, - this.supportsForeignObject, + supportsForeignObject, options, this.eventEmitter ); axisY.createGridAndLabels( gridGroup, labelGroup, - this.supportsForeignObject, + supportsForeignObject, options, this.eventEmitter ); @@ -300,42 +350,55 @@ export class LineChart extends BaseChart { } // Draw the series - data.raw.series.forEach((series, seriesIndex) => { + data.series.forEach((series, seriesIndex) => { const seriesElement = seriesGroup.elem('g'); + const seriesName = safeHasProperty(series, 'name') && series.name; + const seriesClassName = + safeHasProperty(series, 'className') && series.className; + const seriesMeta = safeHasProperty(series, 'meta') + ? series.meta + : undefined; // Write attributes to series group element. If series name or meta is undefined the attributes will not be written - seriesElement.attr({ - 'ct:series-name': series.name, - 'ct:meta': serialize(series.meta) - }); + if (seriesName) { + seriesElement.attr({ + 'ct:series-name': seriesName + }); + } + + if (seriesMeta) { + seriesElement.attr({ + 'ct:meta': serialize(seriesMeta) + }); + } // Use series class from series data or if not set generate one seriesElement.addClass( [ options.classNames.series, - series.className || + seriesClassName || `${options.classNames.series}-${alphaNumerate(seriesIndex)}` ].join(' ') ); - const pathCoordinates = []; - const pathData = []; + const pathCoordinates: number[] = []; + const pathData: SegmentData[] = []; - data.normalized.series[seriesIndex].forEach((value, valueIndex) => { + normalizedData.series[seriesIndex].forEach((value, valueIndex) => { const p = { x: chartRect.x1 + axisX.projectValue( value, valueIndex, - data.normalized.series[seriesIndex] + normalizedData.series[seriesIndex] ), y: chartRect.y1 - axisY.projectValue( value, valueIndex, - data.normalized.series[seriesIndex] + normalizedData.series[seriesIndex] ) }; pathCoordinates.push(p.x, p.y); @@ -370,29 +433,41 @@ export class LineChart extends BaseChart { // Small offset for Firefox to render squares correctly if (seriesOptions.showPoint) { path.pathElements.forEach(pathElement => { - const point = seriesElement - .elem( - 'line', - { - x1: pathElement.x, - y1: pathElement.y, - x2: pathElement.x + 0.01, - y2: pathElement.y - }, - options.classNames.point - ) - .attr({ - 'ct:value': [pathElement.data.value.x, pathElement.data.value.y] - .filter(isNumeric) - .join(','), - 'ct:meta': serialize(pathElement.data.meta) + const { data: pathElementData } = pathElement; + const point = seriesElement.elem( + 'line', + { + x1: pathElement.x, + y1: pathElement.y, + x2: pathElement.x + 0.01, + y2: pathElement.y + }, + options.classNames.point + ); + + if (pathElementData) { + let x: number | undefined; + let y: number | undefined; + + if (safeHasProperty(pathElementData.value, 'x')) { + x = pathElementData.value.x; + } + + if (safeHasProperty(pathElementData.value, 'y')) { + y = pathElementData.value.y; + } + + point.attr({ + 'ct:value': [x, y].filter(isNumeric).join(','), + 'ct:meta': serialize(pathElementData.meta) }); + } - this.eventEmitter.emit('draw', { + this.eventEmitter.emit<PointDrawEvent>('draw', { type: 'point', - value: pathElement.data.value, - index: pathElement.data.valueIndex, - meta: pathElement.data.meta, + value: pathElementData?.value, + index: pathElementData?.valueIndex || 0, + meta: pathElementData?.meta, series, seriesIndex, axisX, @@ -400,7 +475,8 @@ export class LineChart extends BaseChart { group: seriesElement, element: point, x: pathElement.x, - y: pathElement.y + y: pathElement.y, + chartRect }); }); } @@ -415,16 +491,16 @@ export class LineChart extends BaseChart { true ); - this.eventEmitter.emit('draw', { + this.eventEmitter.emit<LineDrawEvent>('draw', { type: 'line', - values: data.normalized.series[seriesIndex], + values: normalizedData.series[seriesIndex], path: path.clone(), chartRect, // TODO: Remove redundant index: seriesIndex, series, seriesIndex, - seriesMeta: series.meta, + meta: seriesMeta, axisX, axisY, group: seriesElement, @@ -442,6 +518,7 @@ export class LineChart extends BaseChart { ); // We project the areaBase value into screen coordinates + // @todo Check with StepAxis const areaBaseProjected = chartRect.y1 - axisY.projectValue(areaBase); // In order to form the area we'll first split the path by move commands so we can chunk it up into segments @@ -483,9 +560,9 @@ export class LineChart extends BaseChart { ); // Emit an event for each area that was drawn - this.eventEmitter.emit('draw', { + this.eventEmitter.emit<AreaDrawEvent>('draw', { type: 'area', - values: data.normalized.series[seriesIndex], + values: normalizedData.series[seriesIndex], path: areaPath.clone(), series, seriesIndex, @@ -495,19 +572,20 @@ export class LineChart extends BaseChart { // TODO: Remove redundant index: seriesIndex, group: seriesElement, - element: area + element: area, + meta: seriesMeta }); }); } }); - this.eventEmitter.emit('created', { - // TODO: Remove redundant - bounds: axisY.bounds, + this.eventEmitter.emit<LineChartCreatedEvent>('created', { + // @todo Remove redundant + // bounds: axisY.bounds, chartRect, axisX, axisY, - svg: this.svg, + svg, options }); } diff --git a/src/charts/LineChart/LineChart.types.ts b/src/charts/LineChart/LineChart.types.ts new file mode 100644 index 00000000..f7ff63fe --- /dev/null +++ b/src/charts/LineChart/LineChart.types.ts @@ -0,0 +1,108 @@ +import type { + Options, + AxisOptions, + Data, + Series, + SeriesObject, + SegmentData, + CreatedEvent, + DrawEvent, + NormalizedSeriesValue, + NormalizedSeries +} from '../../core'; +import type { SvgPath } from '../../svg'; +import type { RequiredKeys } from '../../utils'; + +export type LineInterpolation = ( + pathCoordinates: number[], + valueData: SegmentData[] +) => SvgPath; + +export type LineChartData = Data<(Series | SeriesObject)[]>; + +export interface LineChartOptions< + TXAxisOptions = AxisOptions, + TYAxisOptions = TXAxisOptions +> extends Options<TXAxisOptions, TYAxisOptions> { + classNames?: { + chart?: string; + label?: string; + labelGroup?: string; + series?: string; + line?: string; + point?: string; + area?: string; + grid?: string; + gridGroup?: string; + gridBackground?: string; + vertical?: string; + horizontal?: string; + start?: string; + end?: string; + }; + showLine?: boolean; + showPoint?: boolean; + showArea?: boolean; + areaBase?: number; + lineSmooth?: boolean | LineInterpolation; + showGridBackground?: boolean; + fullWidth?: boolean; + reverseData?: boolean; + series?: Record< + string, + Omit<LineChartOptions<TXAxisOptions, TYAxisOptions>, 'series'> + >; +} + +export type LineChartOptionsWithDefaults = RequiredKeys< + LineChartOptions< + RequiredKeys< + AxisOptions, + | 'offset' + | 'position' + | 'labelOffset' + | 'showLabel' + | 'showGrid' + | 'labelInterpolationFnc' + >, + RequiredKeys< + AxisOptions, + | 'offset' + | 'position' + | 'labelOffset' + | 'showLabel' + | 'showGrid' + | 'labelInterpolationFnc' + | 'scaleMinSpace' + > + >, + | 'showLine' + | 'showPoint' + | 'areaBase' + | 'lineSmooth' + | 'chartPadding' + | 'axisX' + | 'axisY', + 'classNames' +>; + +export type LineChartCreatedEvent = CreatedEvent<LineChartOptions>; + +export interface PointDrawEvent extends DrawEvent { + type: 'point'; + value: NormalizedSeriesValue; + x: number; + y: number; +} + +export interface LineDrawEvent extends DrawEvent { + type: 'line'; + values: NormalizedSeries; + path: SvgPath; +} + +export interface AreaDrawEvent extends DrawEvent { + type: 'area'; + values: NormalizedSeries; + path: SvgPath; +} diff --git a/src/charts/LineChart/index.ts b/src/charts/LineChart/index.ts new file mode 100644 index 00000000..ec51482d --- /dev/null +++ b/src/charts/LineChart/index.ts @@ -0,0 +1,2 @@ +export * from './LineChart'; +export * from './LineChart.types'; diff --git a/src/charts/pie.spec.js b/src/charts/PieChart/PieChart.spec.ts similarity index 95% rename from src/charts/pie.spec.js rename to src/charts/PieChart/PieChart.spec.ts index fde205df..8ec742bc 100644 --- a/src/charts/pie.spec.js +++ b/src/charts/PieChart/PieChart.spec.ts @@ -1,17 +1,21 @@ -import { namespaces } from '../core/globals'; -import { deserialize } from '../core/data'; -import { PieChart } from './pie'; -import { addMockWrapper, destroyMockDom, mockDom } from '../../test/mock/dom'; +import { namespaces, deserialize } from '../../core'; +import { PieChartOptions, PieChartData, PieChart } from '.'; +import { + Fixture, + addMockWrapper, + destroyMockDom, + mockDom +} from '../../../test/mock/dom'; describe('Charts', () => { describe('PieChart', () => { - let fixture; - let chart; - let options; - let data; + let fixture: Fixture; + let chart: PieChart; + let options: PieChartOptions; + let data: PieChartData; function createChart() { - return new Promise(resolve => { + return new Promise<void>(resolve => { fixture = addMockWrapper( '<div class="ct-chart ct-golden-section"></div>' ); @@ -32,8 +36,8 @@ describe('Charts', () => { }); afterEach(() => { destroyMockDom(); - data = undefined; - options = undefined; + data = { series: [] }; + options = {}; }); describe('Meta data tests', () => { @@ -62,7 +66,7 @@ describe('Charts', () => { chart.on('created', () => { const metaAttribute = chartContainer - .querySelectorAll('.ct-slice-pie')[1] + ?.querySelectorAll('.ct-slice-pie')[1] .getAttributeNS(namespaces.ct, 'meta'); expect(deserialize(metaAttribute)).toEqual(meta); chart.off('created'); @@ -72,18 +76,20 @@ describe('Charts', () => { describe('Simple Pie Chart', () => { const num = '\\d+(\\.\\d*)?'; - const sum = (a, b) => a + b; + const sum = (a: number, b: number) => a + b; beforeEach(() => { + const series = [5, 3, 4]; + data = { - series: [5, 3, 4] + series }; options = { width: 100, height: 100, chartPadding: 10, labelInterpolationFnc: value => - `${Math.round((value / data.series.reduce(sum)) * 100)}%` + `${Math.round((Number(value) / series.reduce(sum)) * 100)}%` }; }); diff --git a/src/charts/pie.stories.js b/src/charts/PieChart/PieChart.stories.ts similarity index 94% rename from src/charts/pie.stories.js rename to src/charts/PieChart/PieChart.stories.ts index 349d5e32..0aa01286 100644 --- a/src/charts/pie.stories.js +++ b/src/charts/PieChart/PieChart.stories.ts @@ -44,14 +44,14 @@ export function LabelInterpolation() { const data = { series: [5, 3, 4] }; - const sum = (a, b) => a + b; + const sum = (a: number, b: number) => a + b; new PieChart(root, data, { width: 100, height: 100, chartPadding: 10, labelInterpolationFnc: value => - `${Math.round((value / data.series.reduce(sum)) * 100)}%` + `${Math.round((Number(value) / data.series.reduce(sum)) * 100)}%` }); return root; @@ -178,7 +178,7 @@ export function Solid() { { donut: true, donutWidth: 60, - donutSolid: true, + // donutSolid: true, startAngle: 270, showLabel: true } diff --git a/src/charts/pie.js b/src/charts/PieChart/PieChart.ts similarity index 71% rename from src/charts/pie.js rename to src/charts/PieChart/PieChart.ts index e21a863c..e889a350 100644 --- a/src/charts/pie.js +++ b/src/charts/PieChart/PieChart.ts @@ -1,23 +1,39 @@ +import type { + LabelDirection, + AnchorPosition, + Dot, + PieChartData, + PieChartOptions, + PieChartOptionsWithDefaults, + PieChartCreatedEvent, + SliceDrawEvent, + LabelDrawEvent +} from './PieChart.types'; +import type { Svg } from '../../svg'; +import type { EventListener, AllEventsListener } from '../../event'; import { alphaNumerate, quantity, + normalizeData, + serialize, + createSvg, + createChartRect, + polarToCartesian +} from '../../core'; +import { + noop, + sum, + extend, isFalseyButZero, safeHasProperty -} from '../core/lang'; -import { noop, sum } from '../core/functional'; -import { polarToCartesian } from '../core/math'; -import { extend } from '../core/extend'; -import { normalizeData, serialize } from '../core/data'; -import { createSvg, createChartRect } from '../core/creation'; -import { SvgPath } from '../svg/svg-path'; -import { BaseChart } from './base'; +} from '../../utils'; +import { SvgPath } from '../../svg'; +import { BaseChart } from '../BaseChart'; /** * Default options in line charts. Expand the code view to see a detailed list of options with comments. - * - * @memberof Chartist.Pie */ -const defaultOptions = { +const defaultOptions: PieChartOptions = { // Specify a fixed width for the chart as a string (i.e. '100px' or '50%') width: undefined, // Specify a fixed height for the chart as a string (i.e. '100px' or '50%') @@ -60,13 +76,12 @@ const defaultOptions = { /** * Determines SVG anchor position based on direction and center parameter - * - * @param center - * @param label - * @param direction - * @return {string} */ -export function determineAnchorPosition(center, label, direction) { +export function determineAnchorPosition( + center: Dot, + label: Dot, + direction: LabelDirection +): AnchorPosition { const toTheRight = label.x > center.x; if ( @@ -87,23 +102,20 @@ export function determineAnchorPosition(center, label, direction) { export class PieChart extends BaseChart { /** * This method creates a new pie chart and returns an object that can be used to redraw the chart. - * - * @memberof Chartist.Pie - * @param {String|Node} query A selector query string or directly a DOM element - * @param {Object} data The data object in the pie chart needs to have a series property with a one dimensional data array. The values will be normalized against each other and don't necessarily need to be in percentage. The series property can also be an array of value objects that contain a value property and a className property to override the CSS class name for the series group. - * @param {Object} [options] The options object with options that override the default options. Check the examples for a detailed list. - * @param {Array} [responsiveOptions] Specify an array of responsive option arrays which are a media query and options object pair => [[mediaQueryString, optionsObject],[more...]] - * @return {Object} An object with a version and an update method to manually redraw the chart + * @param query A selector query string or directly a DOM element + * @param data The data object in the pie chart needs to have a series property with a one dimensional data array. The values will be normalized against each other and don't necessarily need to be in percentage. The series property can also be an array of value objects that contain a value property and a className property to override the CSS class name for the series group. + * @param options The options object with options that override the default options. Check the examples for a detailed list. + * @param responsiveOptions Specify an array of responsive option arrays which are a media query and options object pair => [[mediaQueryString, optionsObject],[more...]] * * @example * // Simple pie chart example with four series - * new Chartist.Pie('.ct-chart', { + * new PieChart('.ct-chart', { * series: [10, 2, 4, 3] * }); * * @example * // Drawing a donut chart - * new Chartist.Pie('.ct-chart', { + * new PieChart('.ct-chart', { * series: [10, 2, 4, 3] * }, { * donut: true @@ -111,7 +123,7 @@ export class PieChart extends BaseChart { * * @example * // Using donut, startAngle and total to draw a gauge chart - * new Chartist.Pie('.ct-chart', { + * new PieChart('.ct-chart', { * series: [20, 10, 30, 40] * }, { * donut: true, @@ -122,7 +134,7 @@ export class PieChart extends BaseChart { * * @example * // Drawing a pie chart with padding and labels that are outside the pie - * new Chartist.Pie('.ct-chart', { + * new PieChart('.ct-chart', { * series: [20, 10, 30, 40] * }, { * chartPadding: 30, @@ -134,7 +146,7 @@ export class PieChart extends BaseChart { * // Overriding the class names for individual series as well as a name and meta data. * // The name will be written as ct:series-name attribute and the meta data will be serialized and written * // to a ct:meta attribute. - * new Chartist.Pie('.ct-chart', { + * new PieChart('.ct-chart', { * series: [{ * value: 20, * name: 'Series 1', @@ -153,7 +165,12 @@ export class PieChart extends BaseChart { * }] * }); */ - constructor(query, data, options, responsiveOptions) { + constructor( + query: string | Element | null, + protected override data: PieChartData, + options?: PieChartOptions, + responsiveOptions?: [string, PieChartOptions][] + ) { super( query, data, @@ -163,20 +180,36 @@ export class PieChart extends BaseChart { ); } + override on( + event: 'created', + listener: EventListener<PieChartCreatedEvent> + ): this; + override on( + event: 'draw', + listener: EventListener<SliceDrawEvent | LabelDrawEvent> + ): this; + override on(event: '*', listener: AllEventsListener): this; + override on(event: string, listener: EventListener): this; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + override on(event: string, listener: any) { + return super.on(event, listener); + } + /** * Creates the pie chart * * @param options */ - createChart(options) { - const data = normalizeData(this.data); - const seriesGroups = []; - let labelsGroup; - let labelRadius; + createChart(options: PieChartOptionsWithDefaults) { + const { data } = this; + const normalizedData = normalizeData(data); + const seriesGroups: Svg[] = []; + let labelsGroup: Svg; + let labelRadius: number; let startAngle = options.startAngle; // Create SVG.js draw - this.svg = createSvg( + const svg = createSvg( this.container, options.width, options.height, @@ -184,16 +217,20 @@ export class PieChart extends BaseChart { ? options.classNames.chartDonut : options.classNames.chartPie ); + + this.svg = svg; + // Calculate charting rect const chartRect = createChartRect( - this.svg, - options, - defaultOptions.padding + svg, + options + // @todo Fix padding. + // defaultOptions.padding ); // Get biggest circle radius possible within chartRect let radius = Math.min(chartRect.width() / 2, chartRect.height() / 2); // Calculate total of all series to get reference value or use total reference from optional options - const totalDataSum = options.total || data.normalized.series.reduce(sum, 0); + const totalDataSum = options.total || normalizedData.series.reduce(sum, 0); const donutWidth = quantity(options.donutWidth); if (donutWidth.unit === '%') { @@ -218,7 +255,9 @@ export class PieChart extends BaseChart { labelRadius = radius / 2; } // Add the offset to the labelRadius where a negative offset means closed to the center of the chart - labelRadius += options.labelOffset; + if (options.labelOffset) { + labelRadius += options.labelOffset; + } // Calculate end angle based on total sum and current data value and offset with padding const center = { @@ -228,45 +267,53 @@ export class PieChart extends BaseChart { // Check if there is only one non-zero value in the series array. const hasSingleValInSeries = - data.raw.series.filter(val => + data.series.filter(val => safeHasProperty(val, 'value') ? val.value !== 0 : val !== 0 ).length === 1; // Creating the series groups - data.raw.series.forEach( - (series, index) => (seriesGroups[index] = this.svg.elem('g', null, null)) - ); + data.series.forEach((_, index) => (seriesGroups[index] = svg.elem('g'))); // if we need to show labels we create the label group now if (options.showLabel) { - labelsGroup = this.svg.elem('g', null, null); + labelsGroup = svg.elem('g'); } // Draw the series // initialize series groups - data.raw.series.forEach((series, index) => { + data.series.forEach((series, index) => { // If current value is zero and we are ignoring empty values then skip to next value - if (data.normalized.series[index] === 0 && options.ignoreEmptyValues) { + if (normalizedData.series[index] === 0 && options.ignoreEmptyValues) { return; } + const seriesName = safeHasProperty(series, 'name') && series.name; + const seriesClassName = + safeHasProperty(series, 'className') && series.className; + // @todo getMetaData + const seriesMeta = safeHasProperty(series, 'meta') + ? series.meta + : undefined; + // If the series is an object and contains a name or meta data we add a custom attribute - seriesGroups[index].attr({ - 'ct:series-name': series.name - }); + if (seriesName) { + seriesGroups[index].attr({ + 'ct:series-name': seriesName + }); + } // Use series class from series data or if not set generate one seriesGroups[index].addClass( [ - options.classNames.series, - series.className || - `${options.classNames.series}-${alphaNumerate(index)}` + options.classNames?.series, + seriesClassName || + `${options.classNames?.series}-${alphaNumerate(index)}` ].join(' ') ); // If the whole dataset is 0 endAngle should be zero. Can't divide by 0. let endAngle = totalDataSum > 0 - ? startAngle + (data.normalized.series[index] / totalDataSum) * 360 + ? startAngle + (normalizedData.series[index] / totalDataSum) * 360 : 0; // Use slight offset so there are no transparent hairline issues @@ -296,7 +343,7 @@ export class PieChart extends BaseChart { radius, radius, 0, - endAngle - startAngle > 180, + Number(endAngle - startAngle > 180), 0, start.x, start.y @@ -321,8 +368,8 @@ export class PieChart extends BaseChart { // Adding the pie series value to the path pathElement.attr({ - 'ct:value': data.normalized.series[index], - 'ct:meta': serialize(series.meta) + 'ct:value': normalizedData.series[index], + 'ct:meta': serialize(seriesMeta) }); // If this is a donut, we add the stroke-width as style attribute @@ -333,27 +380,28 @@ export class PieChart extends BaseChart { } // Fire off draw event - this.eventEmitter.emit('draw', { + this.eventEmitter.emit<SliceDrawEvent>('draw', { type: 'slice', - value: data.normalized.series[index], + value: normalizedData.series[index], totalDataSum: totalDataSum, - index: index, - meta: series.meta, - series: series, + index, + meta: seriesMeta, + series, group: seriesGroups[index], element: pathElement, path: path.clone(), - center: center, - radius: radius, - startAngle: startAngle, - endAngle: endAngle + center, + radius, + startAngle, + endAngle, + chartRect }); // If we need to show labels we need to add the label for this slice now if (options.showLabel) { let labelPosition; - if (data.raw.series.length === 1) { + if (data.series.length === 1) { // If we have only 1 series, we can position the label in the center of the pie labelPosition = { x: center.x, @@ -371,12 +419,12 @@ export class PieChart extends BaseChart { let rawValue; if ( - data.normalized.labels && - !isFalseyButZero(data.normalized.labels[index]) + normalizedData.labels && + !isFalseyButZero(normalizedData.labels[index]) ) { - rawValue = data.normalized.labels[index]; + rawValue = normalizedData.labels[index]; } else { - rawValue = data.normalized.series[index]; + rawValue = normalizedData.series[index]; } const interpolatedValue = options.labelInterpolationFnc( @@ -399,17 +447,20 @@ export class PieChart extends BaseChart { }, options.classNames.label ) - .text('' + interpolatedValue); + .text(String(interpolatedValue)); // Fire off draw event - this.eventEmitter.emit('draw', { + this.eventEmitter.emit<LabelDrawEvent>('draw', { type: 'label', index, group: labelsGroup, element: labelElement, text: '' + interpolatedValue, x: labelPosition.x, - y: labelPosition.y + y: labelPosition.y, + chartRect, + series, + meta: seriesMeta }); } } @@ -419,9 +470,9 @@ export class PieChart extends BaseChart { startAngle = endAngle; }); - this.eventEmitter.emit('created', { + this.eventEmitter.emit<PieChartCreatedEvent>('created', { chartRect, - svg: this.svg, + svg: svg, options }); } diff --git a/src/charts/PieChart/PieChart.types.ts b/src/charts/PieChart/PieChart.types.ts new file mode 100644 index 00000000..0659c726 --- /dev/null +++ b/src/charts/PieChart/PieChart.types.ts @@ -0,0 +1,84 @@ +import type { + Options, + Label, + Data, + FlatSeries, + CreatedEvent, + DrawEvent, + NormalizedSeriesValue +} from '../../core'; +import type { RequiredKeys } from '../../utils'; +import type { SvgPath } from '../../svg'; + +export type PieChartData = Data<FlatSeries>; + +export type LabelDirection = 'implode' | 'neutral' | 'explode'; + +export type AnchorPosition = 'start' | 'middle' | 'end'; + +export type RadialLabelPosition = 'inside' | 'center' | 'outside'; + +export interface Dot { + x: number; + y: number; +} + +export interface PieChartOptions extends Omit<Options, 'axisX' | 'axisY'> { + classNames?: { + chartPie?: string; + chartDonut?: string; + series?: string; + slicePie?: string; + sliceDonut?: string; + label?: string; + }; + startAngle?: number; + total?: number; + donut?: boolean; + donutWidth?: number | string; + showLabel?: boolean; + labelOffset?: number; + labelPosition?: RadialLabelPosition; + labelInterpolationFnc?(value: Label, index: number): Label | null | undefined; + labelDirection?: LabelDirection; + reverseData?: boolean; + ignoreEmptyValues?: boolean; +} + +export type PieChartOptionsWithDefaults = RequiredKeys< + PieChartOptions, + | 'chartPadding' + | 'startAngle' + | 'donutWidth' + | 'showLabel' + | 'labelOffset' + | 'labelPosition' + | 'labelInterpolationFnc' + | 'labelDirection', + 'classNames' +>; + +export type PieChartCreatedEvent = Omit< + CreatedEvent<PieChartOptions>, + 'axisX' | 'axisY' +>; + +export interface SliceDrawEvent + extends Omit<DrawEvent, 'axisX' | 'axisY' | 'seriesIndex'> { + type: 'slice'; + value: NormalizedSeriesValue; + totalDataSum: number; + path: SvgPath; + center: Dot; + radius: number; + startAngle: number; + endAngle: number; +} + +export interface LabelDrawEvent + extends Omit<DrawEvent, 'axisX' | 'axisY' | 'seriesIndex'> { + type: 'label'; + text: string; + x: number; + y: number; +} diff --git a/src/charts/PieChart/index.ts b/src/charts/PieChart/index.ts new file mode 100644 index 00000000..70a6c91e --- /dev/null +++ b/src/charts/PieChart/index.ts @@ -0,0 +1,2 @@ +export * from './PieChart'; +export * from './PieChart.types'; diff --git a/src/charts/charts.js b/src/charts/charts.js deleted file mode 100644 index bcd11824..00000000 --- a/src/charts/charts.js +++ /dev/null @@ -1,4 +0,0 @@ -export { BaseChart } from './base'; -export { LineChart } from './line'; -export { BarChart } from './bar'; -export { PieChart } from './pie'; diff --git a/src/charts/index.ts b/src/charts/index.ts new file mode 100644 index 00000000..7313e5ba --- /dev/null +++ b/src/charts/index.ts @@ -0,0 +1,4 @@ +export * from './BaseChart'; +export * from './LineChart'; +export * from './BarChart'; +export * from './PieChart'; diff --git a/src/core/globals.js b/src/core/constants.ts similarity index 74% rename from src/core/globals.js rename to src/core/constants.ts index e2a59178..10c55df9 100644 --- a/src/core/globals.js +++ b/src/core/constants.ts @@ -1,9 +1,7 @@ /** * This object contains all namespaces used within Chartist. - * - * @type {{svg: string, xmlns: string, xhtml: string, xlink: string, ct: string}} */ -export let namespaces = { +export const namespaces: Record<string, string> = { svg: 'http://www.w3.org/2000/svg', xmlns: 'http://www.w3.org/2000/xmlns/', xhtml: 'http://www.w3.org/1999/xhtml', @@ -13,17 +11,13 @@ export let namespaces = { /** * Precision level used internally in Chartist for rounding. If you require more decimal places you can increase this number. - * - * @type {number} */ -export let precision = 8; +export const precision = 8; /** * A map with characters to escape for strings to be safely used as attribute values. - * - * @type {Object} */ -export let escapingMap = { +export const escapingMap: Record<string, string> = { '&': '&amp;', '<': '&lt;', '>': '&gt;', diff --git a/src/core/core.js b/src/core/core.js deleted file mode 100644 index c8a372d0..00000000 --- a/src/core/core.js +++ /dev/null @@ -1,8 +0,0 @@ -export * from './globals'; -export * from './lang'; -export * from './functional'; -export * from './math'; -export * from './data'; -export * from './creation'; -export { extend } from './extend'; -export { optionsProvider } from './options-provider'; diff --git a/src/core/creation.spec.js b/src/core/creation.spec.ts similarity index 89% rename from src/core/creation.spec.js rename to src/core/creation.spec.ts index c54ec976..93e33524 100644 --- a/src/core/creation.spec.js +++ b/src/core/creation.spec.ts @@ -5,8 +5,8 @@ import { createGridBackground, normalizePadding } from './creation'; -import { EventEmitter } from '../event/event-emitter'; -import { Svg } from '../svg/svg'; +import { EventEmitter } from '../event'; +import { Svg } from '../svg'; describe('Core', () => { describe('Creation', () => { @@ -24,7 +24,8 @@ describe('Core', () => { </div> `); - const container = fixture.wrapper.querySelector('#chart-container'); + const container: any = + fixture.wrapper.querySelector('#chart-container'); const svg = createSvg(container, '500px', '400px', 'ct-fish-bar'); expect(svg).toBeDefined(); @@ -36,7 +37,8 @@ describe('Core', () => { it('should remove previous chartist svg elements', () => { const fixture = addMockWrapper('<div id="chart-container"></div>'); - const container = fixture.wrapper.querySelector('#chart-container'); + const container: any = + fixture.wrapper.querySelector('#chart-container'); const svg1 = createSvg(container, '500px', '400px', 'ct-fish-bar'); const svg2 = createSvg(container, '800px', '200px', 'ct-snake-bar'); @@ -54,7 +56,13 @@ describe('Core', () => { }); describe('createGrid', () => { - let group, axis, classes, eventEmitter, position, length, offset; + let group: any; + let axis: any; + let classes: any; + let eventEmitter: EventEmitter; + let position: any; + let length: any; + let offset: any; beforeEach(() => { eventEmitter = new EventEmitter(); @@ -73,7 +81,7 @@ describe('Core', () => { offset = 20; }); - function onCreated(fn, done) { + function onCreated(fn: any, done: any) { eventEmitter.addEventHandler('draw', grid => { fn(grid); done(); @@ -122,7 +130,10 @@ describe('Core', () => { }); describe('createGridBackground', () => { - let group, chartRect, className, eventEmitter; + let group: any; + let chartRect: any; + let className: any; + let eventEmitter: any; beforeEach(() => { eventEmitter = new EventEmitter(); @@ -142,8 +153,8 @@ describe('Core', () => { }; }); - function onCreated(fn, done) { - eventEmitter.addEventHandler('draw', data => { + function onCreated(fn: any, done: any) { + eventEmitter.addEventHandler('draw', (data: any) => { fn(data); done(); }); @@ -164,7 +175,7 @@ describe('Core', () => { }); it('should pass grid to event', done => { - onCreated(data => { + onCreated((data: any) => { expect(data.type).toBe('gridBackground'); const rect = data.element; expect(rect.attr('x')).toBe('5'); diff --git a/src/core/creation.js b/src/core/creation.ts similarity index 61% rename from src/core/creation.js rename to src/core/creation.ts index 4ac310ae..cb8ebc49 100644 --- a/src/core/creation.js +++ b/src/core/creation.ts @@ -1,23 +1,24 @@ -import { namespaces } from './globals'; -import { Svg } from '../svg/svg'; +import type { ChartPadding, ChartRect, Options, Label } from './types'; +import type { EventEmitter } from '../event'; +import type { Axis } from '../axes'; +import { namespaces } from './constants'; +import { Svg } from '../svg/Svg'; import { quantity } from './lang'; -import { extend } from './extend'; +import { extend } from '../utils'; /** * Create or reinitialize the SVG element for the chart - * - * @memberof Chartist.Core - * @param {Node} container The containing DOM Node object that will be used to plant the SVG element - * @param {String} width Set the width of the SVG element. Default is 100% - * @param {String} height Set the height of the SVG element. Default is 100% - * @param {String} className Specify a class to be added to the SVG element - * @return {Object} The created/reinitialized SVG element + * @param container The containing DOM Node object that will be used to plant the SVG element + * @param width Set the width of the SVG element. Default is 100% + * @param height Set the height of the SVG element. Default is 100% + * @param className Specify a class to be added to the SVG element + * @return The created/reinitialized SVG element */ export function createSvg( - container, - width = '100%', - height = '100%', - className + container: Element, + width: number | string = '100%', + height: number | string = '100%', + className?: string ) { // Check if there is a previous SVG element in the container that contains the Chartist XML namespace and remove it // Since the DOM API does not support namespaces we need to manually search the returned list http://www.w3.org/TR/selectors-api/ @@ -31,27 +32,31 @@ export function createSvg( width, height }) - .addClass(className) .attr({ // TODO: Check better solution (browser support) and remove inline styles due to CSP style: `width: ${width}; height: ${height};` }); + if (className) { + svg.addClass(className); + } + // Add the DOM node to our container - container.appendChild(svg._node); + container.appendChild(svg.getNode()); return svg; } /** * Converts a number into a padding object. - * - * @memberof Chartist.Core - * @param {Object|Number} padding - * @param {Number} [fallback] This value is used to fill missing values if a incomplete padding object was passed - * @returns {Object} Returns a padding object containing top, right, bottom, left properties filled with the padding number passed in as argument. If the argument is something else than a number (presumably already a correct padding object) then this argument is directly returned. + * @param padding + * @param fallback This value is used to fill missing values if a incomplete padding object was passed + * @returns Returns a padding object containing top, right, bottom, left properties filled with the padding number passed in as argument. If the argument is something else than a number (presumably already a correct padding object) then this argument is directly returned. */ -export function normalizePadding(padding, fallback = 0) { +export function normalizePadding( + padding: number | Partial<ChartPadding> | undefined, + fallback = 0 +) { return typeof padding === 'number' ? { top: padding, @@ -59,6 +64,8 @@ export function normalizePadding(padding, fallback = 0) { bottom: padding, left: padding } + : padding === undefined + ? { top: fallback, right: fallback, bottom: fallback, left: fallback } : { top: typeof padding.top === 'number' ? padding.top : fallback, right: typeof padding.right === 'number' ? padding.right : fallback, @@ -69,17 +76,21 @@ export function normalizePadding(padding, fallback = 0) { /** * Initialize chart drawing rectangle (area where chart is drawn) x1,y1 = bottom left / x2,y2 = top right - * - * @memberof Chartist.Core - * @param {Object} svg The svg element for the chart - * @param {Object} options The Object that contains all the optional values for the chart - * @param {Number} [fallbackPadding] The fallback padding if partial padding objects are used - * @return {Object} The chart rectangles coordinates inside the svg element plus the rectangles measurements + * @param svg The svg element for the chart + * @param options The Object that contains all the optional values for the chart + * @param fallbackPadding The fallback padding if partial padding objects are used + * @return The chart rectangles coordinates inside the svg element plus the rectangles measurements */ -export function createChartRect(svg, options, fallbackPadding) { - const hasAxis = !!(options.axisX || options.axisY); - const yAxisOffset = hasAxis ? options.axisY.offset : 0; - const xAxisOffset = hasAxis ? options.axisX.offset : 0; +export function createChartRect( + svg: Svg, + options: Options, + fallbackPadding?: number +) { + const hasAxis = Boolean(options.axisX || options.axisY); + const yAxisOffset = options.axisY?.offset || 0; + const xAxisOffset = options.axisX?.offset || 0; + const yAxisPosition = options.axisY?.position; + const xAxisPosition = options.axisX?.position; // If width or height results in invalid value (including 0) we fallback to the unitless settings or even 0 let width = svg.width() || quantity(options.width).value || 0; let height = svg.height() || quantity(options.height).value || 0; @@ -99,17 +110,23 @@ export function createChartRect(svg, options, fallbackPadding) { ); const chartRect = { + x1: 0, + x2: 0, + y1: 0, + y2: 0, padding: normalizedPadding, - width: function () { + /** @todo Is it even used?? */ + width() { return this.x2 - this.x1; }, - height: function () { + /** @todo Is it even used?? */ + height() { return this.y1 - this.y2; } }; if (hasAxis) { - if (options.axisX.position === 'start') { + if (xAxisPosition === 'start') { chartRect.y2 = normalizedPadding.top + xAxisOffset; chartRect.y1 = Math.max( height - normalizedPadding.bottom, @@ -123,7 +140,7 @@ export function createChartRect(svg, options, fallbackPadding) { ); } - if (options.axisY.position === 'start') { + if (yAxisPosition === 'start') { chartRect.x1 = normalizedPadding.left + yAxisOffset; chartRect.x2 = Math.max( width - normalizedPadding.right, @@ -151,32 +168,23 @@ export function createChartRect(svg, options, fallbackPadding) { /** * Creates a grid line based on a projected value. - * - * @memberof Chartist.Core - * @param position - * @param index - * @param axis - * @param offset - * @param length - * @param group - * @param classes - * @param eventEmitter */ export function createGrid( - position, - index, - axis, - offset, - length, - group, - classes, - eventEmitter + position: number, + index: number, + axis: Axis, + offset: number, + length: number, + group: Svg, + classes: string[], + eventEmitter: EventEmitter ) { - const positionalData = {}; - positionalData[`${axis.units.pos}1`] = position; - positionalData[`${axis.units.pos}2`] = position; - positionalData[`${axis.counterUnits.pos}1`] = offset; - positionalData[`${axis.counterUnits.pos}2`] = offset + length; + const positionalData = { + [`${axis.units.pos}1`]: position, + [`${axis.units.pos}2`]: position, + [`${axis.counterUnits.pos}1`]: offset, + [`${axis.counterUnits.pos}2`]: offset + length + }; const gridElement = group.elem('line', positionalData, classes.join(' ')); @@ -198,18 +206,12 @@ export function createGrid( /** * Creates a grid background rect and emits the draw event. - * - * @memberof Chartist.Core - * @param gridGroup - * @param chartRect - * @param className - * @param eventEmitter */ export function createGridBackground( - gridGroup, - chartRect, - className, - eventEmitter + gridGroup: Svg, + chartRect: ChartRect, + className: string, + eventEmitter: EventEmitter ) { const gridBackground = gridGroup.elem( 'rect', @@ -233,40 +235,27 @@ export function createGridBackground( /** * Creates a label based on a projected value and an axis. - * - * @memberof Chartist.Core - * @param position - * @param length - * @param index - * @param labels - * @param axis - * @param axisOffset - * @param labelOffset - * @param group - * @param classes - * @param useForeignObject - * @param eventEmitter */ export function createLabel( - position, - length, - index, - labels, - axis, - axisOffset, - labelOffset, - group, - classes, - useForeignObject, - eventEmitter + position: number, + length: number, + index: number, + label: Label, + axis: Axis, + axisOffset: number, + labelOffset: { x: number; y: number }, + group: Svg, + classes: string[], + useForeignObject: boolean, + eventEmitter: EventEmitter ) { let labelElement; - const positionalData = {}; - - positionalData[axis.units.pos] = position + labelOffset[axis.units.pos]; - positionalData[axis.counterUnits.pos] = labelOffset[axis.counterUnits.pos]; - positionalData[axis.units.len] = length; - positionalData[axis.counterUnits.len] = Math.max(0, axisOffset - 10); + const positionalData = { + [axis.units.pos]: position + labelOffset[axis.units.pos], + [axis.counterUnits.pos]: labelOffset[axis.counterUnits.pos], + [axis.units.len]: length, + [axis.counterUnits.len]: Math.max(0, axisOffset - 10) + }; if (useForeignObject) { // We need to set width and height explicitly to px as span will not expand with width and height being @@ -278,7 +267,7 @@ export function createLabel( style="${axis.units.len}: ${stepLength}px; ${ axis.counterUnits.len }: ${stepCounterLength}px"> - ${labels[index]} + ${label} </span> `.trim(); @@ -294,7 +283,7 @@ export function createLabel( } else { labelElement = group .elem('text', positionalData, classes.join(' ')) - .text(labels[index]); + .text(String(label)); } eventEmitter.emit( @@ -306,7 +295,7 @@ export function createLabel( index, group, element: labelElement, - text: labels[index] + text: label }, positionalData ) diff --git a/src/core/data.js b/src/core/data.js deleted file mode 100644 index b3ceb484..00000000 --- a/src/core/data.js +++ /dev/null @@ -1,523 +0,0 @@ -import { escapingMap } from './globals'; -import { replaceAll, safeHasProperty, getNumberOrUndefined } from './lang'; -import { times } from './functional'; -import { extend } from './extend'; -import { - orderOfMagnitude, - projectLength, - roundWithPrecision, - rho, - EPSILON -} from './math'; - -/** - * This function serializes arbitrary data to a string. In case of data that can't be easily converted to a string, this function will create a wrapper object and serialize the data using JSON.stringify. The outcoming string will always be escaped using Chartist.escapingMap. - * If called with null or undefined the function will return immediately with null or undefined. - * - * @memberof Chartist.Core - * @param {Number|String|Object} data - * @return {String} - */ -export function serialize(data) { - if (data === null || data === undefined) { - return data; - } else if (typeof data === 'number') { - data = '' + data; - } else if (typeof data === 'object') { - data = JSON.stringify({ data: data }); - } - - return Object.keys(escapingMap).reduce( - (result, key) => replaceAll(result, key, escapingMap[key]), - data - ); -} - -/** - * This function de-serializes a string previously serialized with Chartist.serialize. The string will always be unescaped using Chartist.escapingMap before it's returned. Based on the input value the return type can be Number, String or Object. JSON.parse is used with try / catch to see if the unescaped string can be parsed into an Object and this Object will be returned on success. - * - * @memberof Chartist.Core - * @param {String} data - * @return {String|Number|Object} - */ -export function deserialize(data) { - if (typeof data !== 'string') { - return data; - } - - if (data === 'NaN') { - return NaN; - } - - data = Object.keys(escapingMap).reduce( - (result, key) => replaceAll(result, escapingMap[key], key), - data - ); - - try { - data = JSON.parse(data); - data = data.data !== undefined ? data.data : data; - } catch (e) { - /* Ingore */ - } - - return data; -} - -/** - * Ensures that the data object passed as second argument to the charts is present and correctly initialized. - * - * @param {Object} data The data object that is passed as second argument to the charts - * @return {Object} The normalized data object - */ -export function normalizeData(data, reverse, multi) { - let labelCount; - const output = { - raw: data, - normalized: {} - }; - - // Check if we should generate some labels based on existing series data - output.normalized.series = getDataArray( - { - series: data.series || [] - }, - reverse, - multi - ); - - // If all elements of the normalized data array are arrays we're dealing with - // multi series data and we need to find the largest series if they are un-even - if (output.normalized.series.every(value => value instanceof Array)) { - // Getting the series with the the most elements - labelCount = Math.max( - ...output.normalized.series.map(series => series.length) - ); - } else { - // We're dealing with Pie data so we just take the normalized array length - labelCount = output.normalized.series.length; - } - - output.normalized.labels = (data.labels || []).slice(); - // Padding the labels to labelCount with empty strings - output.normalized.labels.push( - ...times(Math.max(0, labelCount - output.normalized.labels.length)).map( - () => '' - ) - ); - - if (reverse) { - reverseData(output.normalized); - } - - return output; -} - -/** - * Get meta data of a specific value in a series. - * - * @param series - * @param index - * @returns {*} - */ -export function getMetaData(series, index) { - const value = series.data ? series.data[index] : series[index]; - return value ? value.meta : undefined; -} - -/** - * Checks if a value is considered a hole in the data series. - * - * @param {*} value - * @returns {boolean} True if the value is considered a data hole - */ -export function isDataHoleValue(value) { - return ( - value === null || - value === undefined || - (typeof value === 'number' && isNaN(value)) - ); -} - -/** - * Reverses the series, labels and series data arrays. - * - * @memberof Chartist.Core - * @param data - */ -export function reverseData(data) { - data.labels.reverse(); - data.series.reverse(); - for (let series of data.series) { - if (typeof series === 'object' && series.data !== undefined) { - series.data.reverse(); - } else if (series instanceof Array) { - series.reverse(); - } - } -} - -/** - * Convert data series into plain array - * - * @memberof Chartist.Core - * @param {Object} data The series object that contains the data to be visualized in the chart - * @param {Boolean} [reverse] If true the whole data is reversed by the getDataArray call. This will modify the data object passed as first parameter. The labels as well as the series order is reversed. The whole series data arrays are reversed too. - * @param {Boolean} [multi] Create a multi dimensional array from a series data array where a value object with `x` and `y` values will be created. - * @return {Array} A plain array that contains the data to be visualized in the chart - */ -export function getDataArray(data, reverse, multi) { - // Recursively walks through nested arrays and convert string values to numbers and objects with value properties - // to values. Check the tests in data core -> data normalization for a detailed specification of expected values - function recursiveConvert(value) { - if (safeHasProperty(value, 'value')) { - // We are dealing with value object notation so we need to recurse on value property - return recursiveConvert(value.value); - } else if (safeHasProperty(value, 'data')) { - // We are dealing with series object notation so we need to recurse on data property - return recursiveConvert(value.data); - } else if (value instanceof Array) { - // Data is of type array so we need to recurse on the series - return value.map(recursiveConvert); - } else if (isDataHoleValue(value)) { - // We're dealing with a hole in the data and therefore need to return undefined - // We're also returning undefined for multi value output - return undefined; - } else { - // We need to prepare multi value output (x and y data) - if (multi) { - const multiValue = {}; - - // Single series value arrays are assumed to specify the Y-Axis value - // For example: [1, 2] => [{x: undefined, y: 1}, {x: undefined, y: 2}] - // If multi is a string then it's assumed that it specified which dimension should be filled as default - if (typeof multi === 'string') { - multiValue[multi] = getNumberOrUndefined(value); - } else { - multiValue.y = getNumberOrUndefined(value); - } - - multiValue.x = safeHasProperty(value, 'x') - ? getNumberOrUndefined(value.x) - : multiValue.x; - multiValue.y = safeHasProperty(value, 'y') - ? getNumberOrUndefined(value.y) - : multiValue.y; - - return multiValue; - } else { - // We can return simple data - return getNumberOrUndefined(value); - } - } - } - - return data.series.map(recursiveConvert); -} - -/** - * Checks if provided value object is multi value (contains x or y properties) - * - * @memberof Chartist.Core - * @param value - */ -export function isMultiValue(value) { - return ( - typeof value === 'object' && - (Reflect.has(value, 'x') || Reflect.has(value, 'y')) - ); -} - -/** - * Gets a value from a dimension `value.x` or `value.y` while returning value directly if it's a valid numeric value. If the value is not numeric and it's falsey this function will return `defaultValue`. - * - * @memberof Chartist.Core - * @param value - * @param dimension - * @returns {*} - */ -export function getMultiValue(value, dimension = 'y') { - if (isMultiValue(value)) { - return getNumberOrUndefined(value[dimension]); - } else { - return getNumberOrUndefined(value); - } -} - -/** - * Helper to read series specific options from options object. It automatically falls back to the global option if - * there is no option in the series options. - * - * @param {Object} series Series object - * @param {Object} options Chartist options object - * @param {string} key The options key that should be used to obtain the options - * @returns {*} - */ -export function getSeriesOption(series, options, key) { - if (series.name && options.series && options.series[series.name]) { - const seriesOptions = options.series[series.name]; - return Reflect.has(seriesOptions, key) ? seriesOptions[key] : options[key]; - } else { - return options[key]; - } -} - -/** - * Splits a list of coordinates and associated values into segments. Each returned segment contains a pathCoordinates - * valueData property describing the segment. - * - * With the default options, segments consist of contiguous sets of points that do not have an undefined value. Any - * points with undefined values are discarded. - * - * **Options** - * The following options are used to determine how segments are formed - * ```javascript - * var options = { - * // If fillHoles is true, undefined values are simply discarded without creating a new segment. Assuming other options are default, this returns single segment. - * fillHoles: false, - * // If increasingX is true, the coordinates in all segments have strictly increasing x-values. - * increasingX: false - * }; - * ``` - * - * @memberof Chartist.Core - * @param {Array} pathCoordinates List of point coordinates to be split in the form [x1, y1, x2, y2 ... xn, yn] - * @param {Array} valueData List of associated point values in the form [v1, v2 .. vn] - * @param {Object} [options] Options set by user - * @return {Array} List of segments, each containing a pathCoordinates and valueData property. - */ -export function splitIntoSegments(pathCoordinates, valueData, options) { - const defaultOptions = { - increasingX: false, - fillHoles: false - }; - - options = extend({}, defaultOptions, options); - - const segments = []; - let hole = true; - - for (let i = 0; i < pathCoordinates.length; i += 2) { - // If this value is a "hole" we set the hole flag - if (getMultiValue(valueData[i / 2].value) === undefined) { - // if(valueData[i / 2].value === undefined) { - if (!options.fillHoles) { - hole = true; - } - } else { - if ( - options.increasingX && - i >= 2 && - pathCoordinates[i] <= pathCoordinates[i - 2] - ) { - // X is not increasing, so we need to make sure we start a new segment - hole = true; - } - - // If it's a valid value we need to check if we're coming out of a hole and create a new empty segment - if (hole) { - segments.push({ - pathCoordinates: [], - valueData: [] - }); - // As we have a valid value now, we are not in a "hole" anymore - hole = false; - } - - // Add to the segment pathCoordinates and valueData - segments[segments.length - 1].pathCoordinates.push( - pathCoordinates[i], - pathCoordinates[i + 1] - ); - segments[segments.length - 1].valueData.push(valueData[i / 2]); - } - } - - return segments; -} - -/** - * Get highest and lowest value of data array. This Array contains the data that will be visualized in the chart. - * - * @memberof Chartist.Core - * @param {Array} data The array that contains the data to be visualized in the chart - * @param {Object} options The Object that contains the chart options - * @param {String} dimension Axis dimension 'x' or 'y' used to access the correct value and high / low configuration - * @return {Object} An object that contains the highest and lowest value that will be visualized on the chart. - */ -export function getHighLow(data, options, dimension) { - // TODO: Remove workaround for deprecated global high / low config. Axis high / low configuration is preferred - options = extend( - {}, - options, - dimension ? options['axis' + dimension.toUpperCase()] : {} - ); - - const highLow = { - high: options.high === undefined ? -Number.MAX_VALUE : +options.high, - low: options.low === undefined ? Number.MAX_VALUE : +options.low - }; - const findHigh = options.high === undefined; - const findLow = options.low === undefined; - - // Function to recursively walk through arrays and find highest and lowest number - function recursiveHighLow(sourceData) { - if (sourceData === undefined) { - return undefined; - } else if (sourceData instanceof Array) { - for (let i = 0; i < sourceData.length; i++) { - recursiveHighLow(sourceData[i]); - } - } else { - const value = dimension ? +sourceData[dimension] : +sourceData; - - if (findHigh && value > highLow.high) { - highLow.high = value; - } - - if (findLow && value < highLow.low) { - highLow.low = value; - } - } - } - - // Start to find highest and lowest number recursively - if (findHigh || findLow) { - recursiveHighLow(data); - } - - // Overrides of high / low based on reference value, it will make sure that the invisible reference value is - // used to generate the chart. This is useful when the chart always needs to contain the position of the - // invisible reference value in the view i.e. for bipolar scales. - if (options.referenceValue || options.referenceValue === 0) { - highLow.high = Math.max(options.referenceValue, highLow.high); - highLow.low = Math.min(options.referenceValue, highLow.low); - } - - // If high and low are the same because of misconfiguration or flat data (only the same value) we need - // to set the high or low to 0 depending on the polarity - if (highLow.high <= highLow.low) { - // If both values are 0 we set high to 1 - if (highLow.low === 0) { - highLow.high = 1; - } else if (highLow.low < 0) { - // If we have the same negative value for the bounds we set bounds.high to 0 - highLow.high = 0; - } else if (highLow.high > 0) { - // If we have the same positive value for the bounds we set bounds.low to 0 - highLow.low = 0; - } else { - // If data array was empty, values are Number.MAX_VALUE and -Number.MAX_VALUE. Set bounds to prevent errors - highLow.high = 1; - highLow.low = 0; - } - } - - return highLow; -} - -/** - * Calculate and retrieve all the bounds for the chart and return them in one array - * - * @memberof Chartist.Core - * @param {Number} axisLength The length of the Axis used for - * @param {Object} highLow An object containing a high and low property indicating the value range of the chart. - * @param {Number} scaleMinSpace The minimum projected length a step should result in - * @param {Boolean} onlyInteger - * @return {Object} All the values to set the bounds of the chart - */ -export function getBounds(axisLength, highLow, scaleMinSpace, onlyInteger) { - const bounds = { - high: highLow.high, - low: highLow.low - }; - - bounds.valueRange = bounds.high - bounds.low; - bounds.oom = orderOfMagnitude(bounds.valueRange); - bounds.step = Math.pow(10, bounds.oom); - bounds.min = Math.floor(bounds.low / bounds.step) * bounds.step; - bounds.max = Math.ceil(bounds.high / bounds.step) * bounds.step; - bounds.range = bounds.max - bounds.min; - bounds.numberOfSteps = Math.round(bounds.range / bounds.step); - - // Optimize scale step by checking if subdivision is possible based on horizontalGridMinSpace - // If we are already below the scaleMinSpace value we will scale up - const length = projectLength(axisLength, bounds.step, bounds); - const scaleUp = length < scaleMinSpace; - const smallestFactor = onlyInteger ? rho(bounds.range) : 0; - - // First check if we should only use integer steps and if step 1 is still larger than scaleMinSpace so we can use 1 - if (onlyInteger && projectLength(axisLength, 1, bounds) >= scaleMinSpace) { - bounds.step = 1; - } else if ( - onlyInteger && - smallestFactor < bounds.step && - projectLength(axisLength, smallestFactor, bounds) >= scaleMinSpace - ) { - // If step 1 was too small, we can try the smallest factor of range - // If the smallest factor is smaller than the current bounds.step and the projected length of smallest factor - // is larger than the scaleMinSpace we should go for it. - bounds.step = smallestFactor; - } else { - // Trying to divide or multiply by 2 and find the best step value - let optimizationCounter = 0; - for (;;) { - if ( - scaleUp && - projectLength(axisLength, bounds.step, bounds) <= scaleMinSpace - ) { - bounds.step *= 2; - } else if ( - !scaleUp && - projectLength(axisLength, bounds.step / 2, bounds) >= scaleMinSpace - ) { - bounds.step /= 2; - if (onlyInteger && bounds.step % 1 !== 0) { - bounds.step *= 2; - break; - } - } else { - break; - } - - if (optimizationCounter++ > 1000) { - throw new Error( - 'Exceeded maximum number of iterations while optimizing scale step!' - ); - } - } - } - - bounds.step = Math.max(bounds.step, EPSILON); - function safeIncrement(value, increment) { - // If increment is too small use *= (1+EPSILON) as a simple nextafter - if (value === (value += increment)) { - value *= 1 + (increment > 0 ? EPSILON : -EPSILON); - } - return value; - } - - // Narrow min and max based on new step - let newMin = bounds.min; - let newMax = bounds.max; - while (newMin + bounds.step <= bounds.low) { - newMin = safeIncrement(newMin, bounds.step); - } - while (newMax - bounds.step >= bounds.high) { - newMax = safeIncrement(newMax, -bounds.step); - } - bounds.min = newMin; - bounds.max = newMax; - bounds.range = bounds.max - bounds.min; - - const values = []; - for (let i = bounds.min; i <= bounds.max; i = safeIncrement(i, bounds.step)) { - const value = roundWithPrecision(i); - if (value !== values[values.length - 1]) { - values.push(value); - } - } - bounds.values = values; - - return bounds; -} diff --git a/src/core/data.spec.js b/src/core/data.spec.js deleted file mode 100644 index 2f2a53d5..00000000 --- a/src/core/data.spec.js +++ /dev/null @@ -1,370 +0,0 @@ -import { - serialize, - deserialize, - getDataArray, - getBounds, - splitIntoSegments -} from './data'; -import { roundWithPrecision } from './math'; - -describe('Core', () => { - describe('Data', () => { - describe('serialization', () => { - it('should serialize and deserialize regular strings', () => { - const input = 'String test'; - expect(input).toMatch(deserialize(serialize(input))); - }); - - it('should serialize and deserialize strings with critical characters', () => { - const input = 'String test with critical characters " < > \' & &amp;'; - expect(input).toMatch(deserialize(serialize(input))); - }); - - it('should serialize and deserialize numbers', () => { - const input = 12345.6789; - expect(input).toEqual(deserialize(serialize(input))); - }); - - it('should serialize and deserialize dates', () => { - const input = new Date(0); - expect(+input).toEqual(+new Date(deserialize(serialize(input)))); - }); - - it('should serialize and deserialize complex object types', () => { - const input = { - a: { - b: 100, - c: 'String test', - d: 'String test with critical characters " < > \' & &amp;', - e: { - f: 'String test' - } - } - }; - - expect(input).toEqual(deserialize(serialize(input))); - }); - - it('should serialize and deserialize null, undefined and NaN', () => { - expect(null).toEqual(deserialize(serialize(null))); - expect(undefined).toEqual(deserialize(serialize(undefined))); - expect(deserialize(serialize(NaN))).toBeNaN(); - }); - }); - - describe('data normalization', () => { - it('should normalize mixed series types correctly', () => { - const data = { - labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], - series: [ - { data: [1, 0, 3, 4, 5, 6] }, - [1, { value: 0 }, 3, { value: 4 }, 5, 6, 7, 8], - { data: [1, 0, { value: 3 }] } - ] - }; - - expect(getDataArray(data)).toEqual([ - [1, 0, 3, 4, 5, 6], - [1, 0, 3, 4, 5, 6, 7, 8], - [1, 0, 3] - ]); - }); - - it('should normalize mixed series for pie chart correctly', () => { - const data = { - series: [1, { value: 0 }, 3, { value: 4 }, 5, 6, 7, 8] - }; - - expect(getDataArray(data)).toEqual([1, 0, 3, 4, 5, 6, 7, 8]); - }); - - it('should normalize mixed series with string values for pie chart correctly', () => { - const data = { - series: ['1', { value: '0' }, '3', { value: '4' }, '5', '6', '7', '8'] - }; - - expect(getDataArray(data)).toEqual([1, 0, 3, 4, 5, 6, 7, 8]); - }); - - it('should normalize mixed series types with string values correctly', () => { - const data = { - labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], - series: [ - { data: ['1', '0', '3', '4', '5', '6'] }, - ['1', { value: '0' }, '3', { value: '4' }, '5', '6', '7', '8'], - { data: ['1', '0', { value: '3' }] } - ] - }; - - expect(getDataArray(data)).toEqual([ - [1, 0, 3, 4, 5, 6], - [1, 0, 3, 4, 5, 6, 7, 8], - [1, 0, 3] - ]); - }); - - it('should normalize mixed series types with weird values correctly', () => { - const data = { - labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], - series: [ - { data: [null, NaN, undefined, '4', '5', '6'] }, - ['1', { value: null }, '3', { value: NaN }, '5', '6', '7', '8'], - { data: ['1', '0', { value: undefined }] } - ] - }; - - expect(getDataArray(data)).toEqual([ - [undefined, undefined, undefined, 4, 5, 6], - [1, undefined, 3, undefined, 5, 6, 7, 8], - [1, 0, undefined] - ]); - }); - - it('should normalize correctly with 0 values in data series array objects', () => { - const data = { - labels: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri'], - series: [ - { - data: [ - { value: 1 }, - { value: 4 }, - { value: 2 }, - { value: 7 }, - { value: 2 }, - { value: 0 } - ] - } - ] - }; - - expect(getDataArray(data)).toEqual([[1, 4, 2, 7, 2, 0]]); - }); - - it('should normalize correctly with mixed dimensional input into multi dimensional output', () => { - const data = { - labels: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri'], - series: [ - { - data: [ - { value: 1 }, - { value: { y: 4, x: 1 } }, - { y: 2, x: 2 }, - NaN, - null, - { value: 7 }, - { value: 2 }, - { value: null }, - { y: undefined, x: NaN } - ] - } - ] - }; - - expect(getDataArray(data, false, true)).toEqual([ - [ - { x: undefined, y: 1 }, - { x: 1, y: 4 }, - { x: 2, y: 2 }, - undefined, - undefined, - { x: undefined, y: 7 }, - { x: undefined, y: 2 }, - undefined, - { x: undefined, y: undefined } - ] - ]); - }); - - it('should normalize boolean series correctly', () => { - const data = { - series: [true, false, false, true] - }; - - expect(getDataArray(data)).toEqual([1, 0, 0, 1]); - }); - - it('should normalize date series correctly', () => { - const data = { - series: [new Date(0), new Date(1), new Date(2), new Date(3)] - }; - - expect(getDataArray(data)).toEqual([0, 1, 2, 3]); - }); - }); - - describe('getBounds', () => { - it('should return 10 steps', () => { - const bounds = getBounds(100, { high: 10, low: 1 }, 10, false); - expect(bounds.min).toBe(1); - expect(bounds.max).toBe(10); - expect(bounds.values).toEqual([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]); - }); - - it('should return 5 steps', () => { - const bounds = getBounds(100, { high: 10, low: 1 }, 20, false); - expect(bounds.min).toBe(1); - expect(bounds.max).toBe(10); - expect(bounds.values).toEqual([1, 3, 5, 7, 9]); - }); - - it('should return non integer steps', () => { - const bounds = getBounds(100, { high: 2, low: 1 }, 20, false); - expect(bounds.min).toBe(1); - expect(bounds.max).toBe(2); - expect(bounds.values).toEqual([1, 1.25, 1.5, 1.75, 2]); - }); - - it('should return integer steps only', () => { - const bounds = getBounds(100, { high: 3, low: 1 }, 20, true); - expect(bounds.min).toBe(1); - expect(bounds.max).toBe(3); - expect(bounds.values).toEqual([1, 2, 3]); - }); - - it('should return single integer step', () => { - const bounds = getBounds(100, { high: 2, low: 1 }, 20, true); - expect(bounds.min).toBe(1); - expect(bounds.max).toBe(2); - expect(bounds.values).toEqual([1, 2]); - }); - - it('should floor/ceil min/max', () => { - const bounds = getBounds(100, { high: 9.9, low: 1.01 }, 20, false); - expect(bounds.min).toBe(1); - expect(bounds.max).toBe(10); - expect(bounds.values).toEqual([1, 3, 5, 7, 9]); - }); - - it('should floor/ceil min/max for non integers', () => { - const bounds = getBounds(100, { high: 2.9, low: 1.01 }, 20, false); - expect(bounds.min).toBe(1); - expect(bounds.max).toBe(3); - expect(bounds.values).toEqual([1, 1.5, 2, 2.5, 3]); - }); - - it('should floor/ceil min/max if integers only', () => { - const bounds = getBounds(100, { high: 2.9, low: 1.01 }, 20, true); - expect(bounds.min).toBe(1); - expect(bounds.max).toBe(3); - expect(bounds.values).toEqual([1, 2, 3]); - }); - - it('should return neg and pos values', () => { - const bounds = getBounds(100, { high: 1.9, low: -0.9 }, 20, false); - expect(bounds.min).toBe(-1); - expect(bounds.max).toBe(2); - expect(bounds.values).toEqual([-1, 0, 1, 2]); - }); - - it('should return two steps if no space', () => { - const bounds = getBounds(100, { high: 5, low: 0 }, 45, false); - expect(bounds.min).toBe(0); - expect(bounds.max).toBe(5); - expect(bounds.values).toEqual([0, 4]); - }); - - it('should return single step if no space', () => { - const bounds = getBounds(100, { high: 5, low: 0 }, 80, false); - expect(bounds.min).toBe(0); - expect(bounds.max).toBe(5); - expect(bounds.values).toEqual([0]); - }); - - it('should return single step if range is less than epsilon', () => { - const bounds = getBounds( - 100, - { high: 1.0000000000000002, low: 1 }, - 20, - false - ); - expect(bounds.min).toBe(1); - expect(bounds.max).toBe(1.0000000000000002); - expect(bounds.low).toBe(1); - expect(bounds.high).toBe(1.0000000000000002); - expect(bounds.values).toEqual([1]); - }); - - it('should return single step if range is less than smallest increment', () => { - const bounds = getBounds( - 613.234375, - { high: 1000.0000000000001, low: 999.9999999999997 }, - 50, - false - ); - expect(bounds.min).toBe(999.9999999999999); - expect(bounds.max).toBe(1000); - expect(bounds.low).toBe(999.9999999999997); - expect(bounds.high).toBe(1000.0000000000001); - expect(bounds.values).toEqual([roundWithPrecision(999.9999999999999)]); - }); - }); - - describe('splitIntoSegments', () => { - function makeValues(arr) { - return arr.map(x => ({ value: x })); - } - - it('should return empty array for empty input', () => { - expect(splitIntoSegments([], [])).toEqual([]); - }); - - it('should remove undefined values', () => { - const coords = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]; - const values = makeValues([1, undefined, undefined, 4, undefined, 6]); - - expect(splitIntoSegments(coords, values)).toEqual([ - { - pathCoordinates: [1, 2], - valueData: makeValues([1]) - }, - { - pathCoordinates: [7, 8], - valueData: makeValues([4]) - }, - { - pathCoordinates: [11, 12], - valueData: makeValues([6]) - } - ]); - }); - - it('should respect fillHoles option', () => { - const coords = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]; - const values = makeValues([1, undefined, undefined, 4, undefined, 6]); - const options = { - fillHoles: true - }; - - expect(splitIntoSegments(coords, values, options)).toEqual([ - { - pathCoordinates: [1, 2, 7, 8, 11, 12], - valueData: makeValues([1, 4, 6]) - } - ]); - }); - - it('should respect increasingX option', () => { - const coords = [1, 2, 3, 4, 5, 6, 5, 6, 7, 8, 1, 2]; - const values = makeValues([1, 2, 3, 4, 5, 6]); - const options = { - increasingX: true - }; - - expect(splitIntoSegments(coords, values, options)).toEqual([ - { - pathCoordinates: [1, 2, 3, 4, 5, 6], - valueData: makeValues([1, 2, 3]) - }, - { - pathCoordinates: [5, 6, 7, 8], - valueData: makeValues([4, 5]) - }, - { - pathCoordinates: [1, 2], - valueData: makeValues([6]) - } - ]); - }); - }); - }); -}); diff --git a/src/core/data/bound.spec.ts b/src/core/data/bound.spec.ts new file mode 100644 index 00000000..5760c8e1 --- /dev/null +++ b/src/core/data/bound.spec.ts @@ -0,0 +1,113 @@ +import { getBounds } from './bounds'; +import { roundWithPrecision } from '../math'; + +describe('Core', () => { + describe('Data', () => { + describe('Bounds', () => { + it('should return 10 steps', () => { + const bounds = getBounds(100, { high: 10, low: 1 }, 10, false); + expect(bounds.min).toBe(1); + expect(bounds.max).toBe(10); + expect(bounds.values).toEqual([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]); + }); + + it('should return 5 steps', () => { + const bounds = getBounds(100, { high: 10, low: 1 }, 20, false); + expect(bounds.min).toBe(1); + expect(bounds.max).toBe(10); + expect(bounds.values).toEqual([1, 3, 5, 7, 9]); + }); + + it('should return non integer steps', () => { + const bounds = getBounds(100, { high: 2, low: 1 }, 20, false); + expect(bounds.min).toBe(1); + expect(bounds.max).toBe(2); + expect(bounds.values).toEqual([1, 1.25, 1.5, 1.75, 2]); + }); + + it('should return integer steps only', () => { + const bounds = getBounds(100, { high: 3, low: 1 }, 20, true); + expect(bounds.min).toBe(1); + expect(bounds.max).toBe(3); + expect(bounds.values).toEqual([1, 2, 3]); + }); + + it('should return single integer step', () => { + const bounds = getBounds(100, { high: 2, low: 1 }, 20, true); + expect(bounds.min).toBe(1); + expect(bounds.max).toBe(2); + expect(bounds.values).toEqual([1, 2]); + }); + + it('should floor/ceil min/max', () => { + const bounds = getBounds(100, { high: 9.9, low: 1.01 }, 20, false); + expect(bounds.min).toBe(1); + expect(bounds.max).toBe(10); + expect(bounds.values).toEqual([1, 3, 5, 7, 9]); + }); + + it('should floor/ceil min/max for non integers', () => { + const bounds = getBounds(100, { high: 2.9, low: 1.01 }, 20, false); + expect(bounds.min).toBe(1); + expect(bounds.max).toBe(3); + expect(bounds.values).toEqual([1, 1.5, 2, 2.5, 3]); + }); + + it('should floor/ceil min/max if integers only', () => { + const bounds = getBounds(100, { high: 2.9, low: 1.01 }, 20, true); + expect(bounds.min).toBe(1); + expect(bounds.max).toBe(3); + expect(bounds.values).toEqual([1, 2, 3]); + }); + + it('should return neg and pos values', () => { + const bounds = getBounds(100, { high: 1.9, low: -0.9 }, 20, false); + expect(bounds.min).toBe(-1); + expect(bounds.max).toBe(2); + expect(bounds.values).toEqual([-1, 0, 1, 2]); + }); + + it('should return two steps if no space', () => { + const bounds = getBounds(100, { high: 5, low: 0 }, 45, false); + expect(bounds.min).toBe(0); + expect(bounds.max).toBe(5); + expect(bounds.values).toEqual([0, 4]); + }); + + it('should return single step if no space', () => { + const bounds = getBounds(100, { high: 5, low: 0 }, 80, false); + expect(bounds.min).toBe(0); + expect(bounds.max).toBe(5); + expect(bounds.values).toEqual([0]); + }); + + it('should return single step if range is less than epsilon', () => { + const bounds = getBounds( + 100, + { high: 1.0000000000000002, low: 1 }, + 20, + false + ); + expect(bounds.min).toBe(1); + expect(bounds.max).toBe(1.0000000000000002); + expect(bounds.low).toBe(1); + expect(bounds.high).toBe(1.0000000000000002); + expect(bounds.values).toEqual([1]); + }); + + it('should return single step if range is less than smallest increment', () => { + const bounds = getBounds( + 613.234375, + { high: 1000.0000000000001, low: 999.9999999999997 }, + 50, + false + ); + expect(bounds.min).toBe(999.9999999999999); + expect(bounds.max).toBe(1000); + expect(bounds.low).toBe(999.9999999999997); + expect(bounds.high).toBe(1000.0000000000001); + expect(bounds.values).toEqual([roundWithPrecision(999.9999999999999)]); + }); + }); + }); +}); diff --git a/src/core/data/bounds.ts b/src/core/data/bounds.ts new file mode 100644 index 00000000..69a3ea23 --- /dev/null +++ b/src/core/data/bounds.ts @@ -0,0 +1,125 @@ +import type { Bounds } from '../types'; +import { + orderOfMagnitude, + projectLength, + roundWithPrecision, + rho, + EPSILON +} from '../math'; + +/** + * Calculate and retrieve all the bounds for the chart and return them in one array + * @param axisLength The length of the Axis used for + * @param highLow An object containing a high and low property indicating the value range of the chart. + * @param scaleMinSpace The minimum projected length a step should result in + * @param onlyInteger + * @return All the values to set the bounds of the chart + */ +export function getBounds( + axisLength: number, + highLow: { high: number; low: number }, + scaleMinSpace: number, + onlyInteger = false +) { + const bounds: Bounds = { + high: highLow.high, + low: highLow.low, + valueRange: 0, + oom: 0, + step: 0, + min: 0, + max: 0, + range: 0, + numberOfSteps: 0, + values: [] + }; + + bounds.valueRange = bounds.high - bounds.low; + bounds.oom = orderOfMagnitude(bounds.valueRange); + bounds.step = Math.pow(10, bounds.oom); + bounds.min = Math.floor(bounds.low / bounds.step) * bounds.step; + bounds.max = Math.ceil(bounds.high / bounds.step) * bounds.step; + bounds.range = bounds.max - bounds.min; + bounds.numberOfSteps = Math.round(bounds.range / bounds.step); + + // Optimize scale step by checking if subdivision is possible based on horizontalGridMinSpace + // If we are already below the scaleMinSpace value we will scale up + const length = projectLength(axisLength, bounds.step, bounds); + const scaleUp = length < scaleMinSpace; + const smallestFactor = onlyInteger ? rho(bounds.range) : 0; + + // First check if we should only use integer steps and if step 1 is still larger than scaleMinSpace so we can use 1 + if (onlyInteger && projectLength(axisLength, 1, bounds) >= scaleMinSpace) { + bounds.step = 1; + } else if ( + onlyInteger && + smallestFactor < bounds.step && + projectLength(axisLength, smallestFactor, bounds) >= scaleMinSpace + ) { + // If step 1 was too small, we can try the smallest factor of range + // If the smallest factor is smaller than the current bounds.step and the projected length of smallest factor + // is larger than the scaleMinSpace we should go for it. + bounds.step = smallestFactor; + } else { + // Trying to divide or multiply by 2 and find the best step value + let optimizationCounter = 0; + for (;;) { + if ( + scaleUp && + projectLength(axisLength, bounds.step, bounds) <= scaleMinSpace + ) { + bounds.step *= 2; + } else if ( + !scaleUp && + projectLength(axisLength, bounds.step / 2, bounds) >= scaleMinSpace + ) { + bounds.step /= 2; + if (onlyInteger && bounds.step % 1 !== 0) { + bounds.step *= 2; + break; + } + } else { + break; + } + + if (optimizationCounter++ > 1000) { + throw new Error( + 'Exceeded maximum number of iterations while optimizing scale step!' + ); + } + } + } + + bounds.step = Math.max(bounds.step, EPSILON); + function safeIncrement(value: number, increment: number) { + // If increment is too small use *= (1+EPSILON) as a simple nextafter + if (value === (value += increment)) { + value *= 1 + (increment > 0 ? EPSILON : -EPSILON); + } + return value; + } + + // Narrow min and max based on new step + let newMin = bounds.min; + let newMax = bounds.max; + while (newMin + bounds.step <= bounds.low) { + newMin = safeIncrement(newMin, bounds.step); + } + while (newMax - bounds.step >= bounds.high) { + newMax = safeIncrement(newMax, -bounds.step); + } + bounds.min = newMin; + bounds.max = newMax; + bounds.range = bounds.max - bounds.min; + + const values: number[] = []; + for (let i = bounds.min; i <= bounds.max; i = safeIncrement(i, bounds.step)) { + const value = roundWithPrecision(i); + if (value !== values[values.length - 1]) { + values.push(value); + } + } + bounds.values = values; + + return bounds; +} diff --git a/src/core/data/data.ts b/src/core/data/data.ts new file mode 100644 index 00000000..b63398b2 --- /dev/null +++ b/src/core/data/data.ts @@ -0,0 +1,73 @@ +import type { + Multi, + AxisName, + FlatSeriesValue, + Series, + SeriesObject +} from '../types'; +import { safeHasProperty, getNumberOrUndefined } from '../../utils'; + +/** + * Get meta data of a specific value in a series. + */ +export function getMetaData( + seriesData: FlatSeriesValue | Series | SeriesObject, + index: number +) { + const value = Array.isArray(seriesData) + ? seriesData[index] + : safeHasProperty(seriesData, 'data') + ? seriesData.data[index] + : null; + return safeHasProperty(value, 'meta') ? value.meta : undefined; +} + +/** + * Checks if a value is considered a hole in the data series. + * @returns True if the value is considered a data hole + */ +export function isDataHoleValue(value: unknown): value is null | undefined; +export function isDataHoleValue(value: unknown) { + return ( + value === null || + value === undefined || + (typeof value === 'number' && isNaN(value)) + ); +} + +/** + * Checks if value is array of series objects. + */ +export function isArrayOfSeries( + value: unknown +): value is (Series | SeriesObject)[] { + return ( + Array.isArray(value) && + value.every(_ => Array.isArray(_) || safeHasProperty(_, 'data')) + ); +} + +/** + * Checks if provided value object is multi value (contains x or y properties) + */ +export function isMultiValue(value: unknown): value is Multi { + return ( + typeof value === 'object' && + value !== null && + (Reflect.has(value, 'x') || Reflect.has(value, 'y')) + ); +} + +/** + * Gets a value from a dimension `value.x` or `value.y` while returning value directly if it's a valid numeric value. If the value is not numeric and it's falsey this function will return `defaultValue`. + */ +export function getMultiValue( + value: Multi | number | unknown, + dimension: AxisName = 'y' +) { + if (isMultiValue(value) && safeHasProperty(value, dimension)) { + return getNumberOrUndefined(value[dimension]); + } else { + return getNumberOrUndefined(value); + } +} diff --git a/src/core/data/highLow.ts b/src/core/data/highLow.ts new file mode 100644 index 00000000..d18ca74e --- /dev/null +++ b/src/core/data/highLow.ts @@ -0,0 +1,96 @@ +import type { + Options, + AxisName, + NormalizedSeries, + NormalizedSeriesValue +} from '../types'; +import { extend, safeHasProperty } from '../../utils'; +import { isDataHoleValue } from './data'; + +/** + * Get highest and lowest value of data array. This Array contains the data that will be visualized in the chart. + * @param data The array that contains the data to be visualized in the chart + * @param options The Object that contains the chart options + * @param dimension Axis dimension 'x' or 'y' used to access the correct value and high / low configuration + * @return An object that contains the highest and lowest value that will be visualized on the chart. + */ +export function getHighLow( + data: NormalizedSeries[], + options: Options, + dimension?: AxisName +) { + // TODO: Remove workaround for deprecated global high / low config. Axis high / low configuration is preferred + options = extend( + {}, + options, + dimension ? (dimension === 'x' ? options.axisX : options.axisY) : {} + ); + + const highLow = { + high: options.high === undefined ? -Number.MAX_VALUE : +options.high, + low: options.low === undefined ? Number.MAX_VALUE : +options.low + }; + const findHigh = options.high === undefined; + const findLow = options.low === undefined; + + // Function to recursively walk through arrays and find highest and lowest number + function recursiveHighLow( + sourceData: NormalizedSeriesValue | NormalizedSeries | NormalizedSeries[] + ) { + if (isDataHoleValue(sourceData)) { + return; + } else if (Array.isArray(sourceData)) { + for (let i = 0; i < sourceData.length; i++) { + recursiveHighLow(sourceData[i]); + } + } else { + const value = Number( + dimension && safeHasProperty(sourceData, dimension) + ? sourceData[dimension] + : sourceData + ); + + if (findHigh && value > highLow.high) { + highLow.high = value; + } + + if (findLow && value < highLow.low) { + highLow.low = value; + } + } + } + + // Start to find highest and lowest number recursively + if (findHigh || findLow) { + recursiveHighLow(data); + } + + // Overrides of high / low based on reference value, it will make sure that the invisible reference value is + // used to generate the chart. This is useful when the chart always needs to contain the position of the + // invisible reference value in the view i.e. for bipolar scales. + if (options.referenceValue || options.referenceValue === 0) { + highLow.high = Math.max(options.referenceValue, highLow.high); + highLow.low = Math.min(options.referenceValue, highLow.low); + } + + // If high and low are the same because of misconfiguration or flat data (only the same value) we need + // to set the high or low to 0 depending on the polarity + if (highLow.high <= highLow.low) { + // If both values are 0 we set high to 1 + if (highLow.low === 0) { + highLow.high = 1; + } else if (highLow.low < 0) { + // If we have the same negative value for the bounds we set bounds.high to 0 + highLow.high = 0; + } else if (highLow.high > 0) { + // If we have the same positive value for the bounds we set bounds.low to 0 + highLow.low = 0; + } else { + // If data array was empty, values are Number.MAX_VALUE and -Number.MAX_VALUE. Set bounds to prevent errors + highLow.high = 1; + highLow.low = 0; + } + } + + return highLow; +} diff --git a/src/core/data/index.ts b/src/core/data/index.ts new file mode 100644 index 00000000..6803b91b --- /dev/null +++ b/src/core/data/index.ts @@ -0,0 +1,6 @@ +export * from './bounds'; +export * from './data'; +export * from './highLow'; +export * from './normalize'; +export * from './segments'; +export * from './serialize'; diff --git a/src/core/data/normalize.spec.ts b/src/core/data/normalize.spec.ts new file mode 100644 index 00000000..074829ad --- /dev/null +++ b/src/core/data/normalize.spec.ts @@ -0,0 +1,145 @@ +import { normalizeData } from './normalize'; + +describe('Core', () => { + describe('Data', () => { + describe('Normalize', () => { + it('should normalize mixed series types correctly', () => { + const data = { + labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + series: [ + { data: [1, 0, 3, 4, 5, 6] }, + [1, { value: 0 }, 3, { value: 4 }, 5, 6, 7, 8], + { data: [1, 0, { value: 3 }] } + ] + }; + + expect(normalizeData(data).series).toEqual([ + [1, 0, 3, 4, 5, 6], + [1, 0, 3, 4, 5, 6, 7, 8], + [1, 0, 3] + ]); + }); + + it('should normalize mixed series for pie chart correctly', () => { + const data = { + series: [1, { value: 0 }, 3, { value: 4 }, 5, 6, 7, 8] + }; + + expect(normalizeData(data).series).toEqual([1, 0, 3, 4, 5, 6, 7, 8]); + }); + + it('should normalize mixed series with string values for pie chart correctly', () => { + const data = { + series: ['1', { value: '0' }, '3', { value: '4' }, '5', '6', '7', '8'] + }; + + expect(normalizeData(data).series).toEqual([1, 0, 3, 4, 5, 6, 7, 8]); + }); + + it('should normalize mixed series types with string values correctly', () => { + const data = { + labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + series: [ + { data: ['1', '0', '3', '4', '5', '6'] }, + ['1', { value: '0' }, '3', { value: '4' }, '5', '6', '7', '8'], + { data: ['1', '0', { value: '3' }] } + ] + }; + + expect(normalizeData(data).series).toEqual([ + [1, 0, 3, 4, 5, 6], + [1, 0, 3, 4, 5, 6, 7, 8], + [1, 0, 3] + ]); + }); + + it('should normalize mixed series types with weird values correctly', () => { + const data = { + labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + series: [ + { data: [null, NaN, undefined, '4', '5', '6'] }, + ['1', { value: null }, '3', { value: NaN }, '5', '6', '7', '8'], + { data: ['1', '0', { value: undefined }] } + ] + }; + + expect(normalizeData(data).series).toEqual([ + [undefined, undefined, undefined, 4, 5, 6], + [1, undefined, 3, undefined, 5, 6, 7, 8], + [1, 0, undefined] + ]); + }); + + it('should normalize correctly with 0 values in data series array objects', () => { + const data = { + labels: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri'], + series: [ + { + data: [ + { value: 1 }, + { value: 4 }, + { value: 2 }, + { value: 7 }, + { value: 2 }, + { value: 0 } + ] + } + ] + }; + + expect(normalizeData(data).series).toEqual([[1, 4, 2, 7, 2, 0]]); + }); + + it('should normalize correctly with mixed dimensional input into multi dimensional output', () => { + const data = { + labels: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri'], + series: [ + { + data: [ + { value: 1 }, + { value: { y: 4, x: 1 } }, + { y: 2, x: 2 }, + NaN, + null, + { value: 7 }, + { value: 2 }, + { value: null }, + { y: undefined, x: NaN } + ] + } + ] + }; + + expect(normalizeData(data, false, true).series).toEqual([ + [ + { x: undefined, y: 1 }, + { x: 1, y: 4 }, + { x: 2, y: 2 }, + undefined, + undefined, + { x: undefined, y: 7 }, + { x: undefined, y: 2 }, + undefined, + undefined + ] + ]); + }); + + it('should normalize boolean series correctly', () => { + const data = { + series: [[true, false, false, true]] + }; + + expect(normalizeData(data).series).toEqual([[1, 0, 0, 1]]); + }); + + it('should normalize date series correctly', () => { + const data = { + series: [[new Date(0), new Date(1), new Date(2), new Date(3)]] + }; + + expect(normalizeData(data).series).toEqual([[0, 1, 2, 3]]); + }); + }); + }); +}); diff --git a/src/core/data/normalize.ts b/src/core/data/normalize.ts new file mode 100644 index 00000000..0050c440 --- /dev/null +++ b/src/core/data/normalize.ts @@ -0,0 +1,212 @@ +import type { + Data, + NormalizedData, + Multi, + AxisName, + NormalizedMulti, + Series, + FlatSeries, + NormalizedSeries, + NormalizedFlatSeries, + SeriesObject, + SeriesPrimitiveValue +} from '../types'; +import { + isArrayOfArrays, + times, + safeHasProperty, + getNumberOrUndefined +} from '../../utils'; +import { isDataHoleValue, isArrayOfSeries } from './data'; + +/** + * Ensures that the data object passed as second argument to the charts is present and correctly initialized. + * @param data The data object that is passed as second argument to the charts + * @return The normalized data object + */ +export function normalizeData( + data: Data<FlatSeries>, + reverse?: boolean, + multi?: false +): NormalizedData<NormalizedFlatSeries>; +export function normalizeData( + data: Data<(Series | SeriesObject)[]>, + reverse: boolean | undefined, + multi: true | AxisName +): NormalizedData<NormalizedSeries[]>; +export function normalizeData( + data: Data<FlatSeries | (Series | SeriesObject)[]>, + reverse: boolean | undefined, + multi: boolean | AxisName, + distributed: true +): NormalizedData<NormalizedSeries[]>; +export function normalizeData( + data: Data<FlatSeries | (Series | SeriesObject)[]>, + reverse?: boolean, + multi?: boolean | AxisName +): NormalizedData<NormalizedFlatSeries | NormalizedSeries[]>; +export function normalizeData( + data: Data, + reverse = false, + multi?: boolean | AxisName, + distributed?: boolean +) { + let labelCount: number; + const normalized: NormalizedData = { + labels: [], + series: normalizeSeries(data.series, multi, distributed) + }; + + // If all elements of the normalized data array are arrays we're dealing with + // multi series data and we need to find the largest series if they are un-even + if (isArrayOfArrays(normalized.series)) { + // Getting the series with the the most elements + labelCount = Math.max(...normalized.series.map(series => series.length)); + } else { + // We're dealing with Pie data so we just take the normalized array length + labelCount = normalized.series.length; + } + + normalized.labels = (data.labels || []).slice(); + // Padding the labels to labelCount with empty strings + normalized.labels.push( + ...times(Math.max(0, labelCount - normalized.labels.length)).map(() => '') + ); + + if (reverse) { + reverseData(normalized); + } + + return normalized; +} + +/** + * Reverses the series, labels and series data arrays. + */ +function reverseData(data: Data) { + data.labels?.reverse(); + data.series.reverse(); + for (const series of data.series) { + if (safeHasProperty(series, 'data')) { + series.data.reverse(); + } else if (Array.isArray(series)) { + series.reverse(); + } + } +} + +function normalizeMulti( + value: number | string | boolean | Date | Multi, + multi?: boolean | AxisName +) { + // We need to prepare multi value output (x and y data) + let x: number | undefined; + let y: number | undefined; + + // Single series value arrays are assumed to specify the Y-Axis value + // For example: [1, 2] => [{x: undefined, y: 1}, {x: undefined, y: 2}] + // If multi is a string then it's assumed that it specified which dimension should be filled as default + if (typeof value !== 'object') { + const num = getNumberOrUndefined(value); + + if (multi === 'x') { + x = num; + } else { + y = num; + } + } else { + if (safeHasProperty(value, 'x')) { + x = getNumberOrUndefined(value.x); + } + + if (safeHasProperty(value, 'y')) { + y = getNumberOrUndefined(value.y); + } + } + + if (x === undefined && y === undefined) { + return undefined; + } + + return { x, y } as NormalizedMulti; +} + +function normalizePrimitive( + value: SeriesPrimitiveValue, + multi?: boolean | AxisName +) { + if (isDataHoleValue(value)) { + // We're dealing with a hole in the data and therefore need to return undefined + // We're also returning undefined for multi value output + return undefined; + } + + if (multi) { + return normalizeMulti(value, multi); + } + + return getNumberOrUndefined(value); +} + +function normalizeSingleSeries( + series: Series | SeriesObject, + multi?: boolean | AxisName +): NormalizedSeries { + if (!Array.isArray(series)) { + // We are dealing with series object notation so we need to recurse on data property + return normalizeSingleSeries(series.data, multi); + } + + return series.map(value => { + if (safeHasProperty(value, 'value')) { + // We are dealing with value object notation so we need to recurse on value property + return normalizePrimitive(value.value, multi); + } + + return normalizePrimitive(value, multi); + }); +} + +/** + * Convert data series into plain array + * @param series The series object that contains the data to be visualized in the chart + * @param multi Create a multi dimensional array from a series data array where a value object with `x` and `y` values will be created. + * @return A plain array that contains the data to be visualized in the chart + */ +function normalizeSeries( + series: FlatSeries, + multi?: false, + distributed?: false +): NormalizedFlatSeries; +function normalizeSeries( + series: (Series | SeriesObject)[], + multi: true | AxisName, + distributed?: false +): NormalizedSeries[]; +function normalizeSeries( + series: FlatSeries | (Series | SeriesObject)[], + multi: boolean | undefined | AxisName, + distributed: true +): NormalizedSeries[]; +function normalizeSeries( + series: FlatSeries | (Series | SeriesObject)[], + multi?: boolean | undefined | AxisName, + distributed?: boolean +): NormalizedFlatSeries | NormalizedSeries[]; +function normalizeSeries( + series: FlatSeries | (Series | SeriesObject)[], + multi?: boolean | undefined | AxisName, + distributed?: boolean +) { + if (isArrayOfSeries(series)) { + return series.map(_ => normalizeSingleSeries(_, multi)); + } + + const normalizedSeries = normalizeSingleSeries(series, multi); + + if (distributed) { + return normalizedSeries.map(value => [value]); + } + + return normalizedSeries; +} diff --git a/src/core/data/segments.spec.ts b/src/core/data/segments.spec.ts new file mode 100644 index 00000000..2052e29a --- /dev/null +++ b/src/core/data/segments.spec.ts @@ -0,0 +1,84 @@ +import { splitIntoSegments } from './segments'; + +describe('Core', () => { + describe('Data', () => { + describe('Segments', () => { + function makeValues<T>(arr: T[]) { + return arr.map((x, i) => ({ value: x, valueIndex: i })); + } + + it('should return empty array for empty input', () => { + expect(splitIntoSegments([], [])).toEqual([]); + }); + + it('should remove undefined values', () => { + const coords = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]; + const values = makeValues([1, undefined, undefined, 4, undefined, 6]); + + expect(splitIntoSegments(coords, values)).toEqual([ + { + pathCoordinates: [1, 2], + valueData: [{ value: 1, valueIndex: 0 }] + }, + { + pathCoordinates: [7, 8], + valueData: [{ value: 4, valueIndex: 3 }] + }, + { + pathCoordinates: [11, 12], + valueData: [{ value: 6, valueIndex: 5 }] + } + ]); + }); + + it('should respect fillHoles option', () => { + const coords = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]; + const values = makeValues([1, undefined, undefined, 4, undefined, 6]); + const options = { + fillHoles: true + }; + + expect(splitIntoSegments(coords, values, options)).toEqual([ + { + pathCoordinates: [1, 2, 7, 8, 11, 12], + valueData: [ + { value: 1, valueIndex: 0 }, + { value: 4, valueIndex: 3 }, + { value: 6, valueIndex: 5 } + ] + } + ]); + }); + + it('should respect increasingX option', () => { + const coords = [1, 2, 3, 4, 5, 6, 5, 6, 7, 8, 1, 2]; + const values = makeValues([1, 2, 3, 4, 5, 6]); + const options = { + increasingX: true + }; + + expect(splitIntoSegments(coords, values, options)).toEqual([ + { + pathCoordinates: [1, 2, 3, 4, 5, 6], + valueData: [ + { value: 1, valueIndex: 0 }, + { value: 2, valueIndex: 1 }, + { value: 3, valueIndex: 2 } + ] + }, + { + pathCoordinates: [5, 6, 7, 8], + valueData: [ + { value: 4, valueIndex: 3 }, + { value: 5, valueIndex: 4 } + ] + }, + { + pathCoordinates: [1, 2], + valueData: [{ value: 6, valueIndex: 5 }] + } + ]); + }); + }); + }); +}); diff --git a/src/core/data/segments.ts b/src/core/data/segments.ts new file mode 100644 index 00000000..77867189 --- /dev/null +++ b/src/core/data/segments.ts @@ -0,0 +1,81 @@ +import type { Segment, SegmentData } from '../types'; +import { getMultiValue } from './data'; + +/** + * Splits a list of coordinates and associated values into segments. Each returned segment contains a pathCoordinates + * valueData property describing the segment. + * + * With the default options, segments consist of contiguous sets of points that do not have an undefined value. Any + * points with undefined values are discarded. + * + * **Options** + * The following options are used to determine how segments are formed + * ```javascript + * var options = { + * // If fillHoles is true, undefined values are simply discarded without creating a new segment. Assuming other options are default, this returns single segment. + * fillHoles: false, + * // If increasingX is true, the coordinates in all segments have strictly increasing x-values. + * increasingX: false + * }; + * ``` + * + * @param pathCoordinates List of point coordinates to be split in the form [x1, y1, x2, y2 ... xn, yn] + * @param valueData List of associated point values in the form [v1, v2 .. vn] + * @param options Options set by user + * @return List of segments, each containing a pathCoordinates and valueData property. + */ +export function splitIntoSegments( + pathCoordinates: number[], + valueData: SegmentData[], + options?: { + increasingX?: boolean; + fillHoles?: boolean; + } +) { + const finalOptions = { + increasingX: false, + fillHoles: false, + ...options + }; + + const segments: Segment[] = []; + let hole = true; + + for (let i = 0; i < pathCoordinates.length; i += 2) { + // If this value is a "hole" we set the hole flag + if (getMultiValue(valueData[i / 2].value) === undefined) { + // if(valueData[i / 2].value === undefined) { + if (!finalOptions.fillHoles) { + hole = true; + } + } else { + if ( + finalOptions.increasingX && + i >= 2 && + pathCoordinates[i] <= pathCoordinates[i - 2] + ) { + // X is not increasing, so we need to make sure we start a new segment + hole = true; + } + + // If it's a valid value we need to check if we're coming out of a hole and create a new empty segment + if (hole) { + segments.push({ + pathCoordinates: [], + valueData: [] + }); + // As we have a valid value now, we are not in a "hole" anymore + hole = false; + } + + // Add to the segment pathCoordinates and valueData + segments[segments.length - 1].pathCoordinates.push( + pathCoordinates[i], + pathCoordinates[i + 1] + ); + segments[segments.length - 1].valueData.push(valueData[i / 2]); + } + } + + return segments; +} diff --git a/src/core/data/serialize.spec.ts b/src/core/data/serialize.spec.ts new file mode 100644 index 00000000..7c1126d5 --- /dev/null +++ b/src/core/data/serialize.spec.ts @@ -0,0 +1,48 @@ +import { serialize, deserialize } from './serialize'; + +describe('Core', () => { + describe('Data', () => { + describe('Serialize', () => { + it('should serialize and deserialize regular strings', () => { + const input = 'String test'; + expect(input).toMatch(deserialize(serialize(input))); + }); + + it('should serialize and deserialize strings with critical characters', () => { + const input = 'String test with critical characters " < > \' & &amp;'; + expect(input).toMatch(deserialize(serialize(input))); + }); + + it('should serialize and deserialize numbers', () => { + const input = 12345.6789; + expect(input).toEqual(deserialize(serialize(input))); + }); + + it('should serialize and deserialize dates', () => { + const input = new Date(0); + expect(+input).toEqual(+new Date(deserialize(serialize(input)))); + }); + + it('should serialize and deserialize complex object types', () => { + const input = { + a: { + b: 100, + c: 'String test', + d: 'String test with critical characters " < > \' & &amp;', + e: { + f: 'String test' + } + } + }; + + expect(input).toEqual(deserialize(serialize(input))); + }); + + it('should serialize and deserialize null, undefined and NaN', () => { + expect(null).toEqual(deserialize(serialize(null))); + expect(undefined).toEqual(deserialize(serialize(undefined))); + expect(deserialize(serialize(NaN))).toBeNaN(); + }); + }); + }); +}); diff --git a/src/core/data/serialize.ts b/src/core/data/serialize.ts new file mode 100644 index 00000000..ac27d44a --- /dev/null +++ b/src/core/data/serialize.ts @@ -0,0 +1,68 @@ +import { escapingMap } from '../constants'; + +/** + * This function serializes arbitrary data to a string. In case of data that can't be easily converted to a string, this function will create a wrapper object and serialize the data using JSON.stringify. The outcoming string will always be escaped using Chartist.escapingMap. + * If called with null or undefined the function will return immediately with null or undefined. + */ +export function serialize(data: number | string | object): string; +export function serialize( + data: number | string | object | null | undefined | unknown +): string | null | undefined; +export function serialize( + data: number | string | object | null | undefined | unknown +) { + let serialized = ''; + + if (data === null || data === undefined) { + return data; + } else if (typeof data === 'number') { + serialized = '' + data; + } else if (typeof data === 'object') { + serialized = JSON.stringify({ data: data }); + } else { + serialized = String(data); + } + + return Object.keys(escapingMap).reduce( + (result, key) => result.replaceAll(key, escapingMap[key]), + serialized + ); +} + +/** + * This function de-serializes a string previously serialized with Chartist.serialize. The string will always be unescaped using Chartist.escapingMap before it's returned. Based on the input value the return type can be Number, String or Object. JSON.parse is used with try / catch to see if the unescaped string can be parsed into an Object and this Object will be returned on success. + */ +export function deserialize<T extends object | number | string = object>( + data: string +): T; +export function deserialize<T extends object | number | string = object>( + data: string | null | undefined +): T | null | undefined; +export function deserialize(data: unknown) { + if (typeof data !== 'string') { + return data; + } + + if (data === 'NaN') { + return NaN; + } + + data = Object.keys(escapingMap).reduce( + (result, key) => result.replaceAll(escapingMap[key], key), + data + ); + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + let parsedData: any = data; + + if (typeof data === 'string') { + try { + parsedData = JSON.parse(data); + parsedData = parsedData.data !== undefined ? parsedData.data : parsedData; + } catch (e) { + /* Ingore */ + } + } + + return parsedData; +} diff --git a/src/core/index.ts b/src/core/index.ts new file mode 100644 index 00000000..17cbb96f --- /dev/null +++ b/src/core/index.ts @@ -0,0 +1,7 @@ +export * from './constants'; +export * from './lang'; +export * from './math'; +export * from './data'; +export * from './creation'; +export * from './optionsProvider'; +export * from './types'; diff --git a/src/core/lang.js b/src/core/lang.js deleted file mode 100644 index 520db6d3..00000000 --- a/src/core/lang.js +++ /dev/null @@ -1,119 +0,0 @@ -/** - * Replaces all occurrences of subStr in str with newSubStr and returns a new string. - * - * @param {String} str - * @param {String} subStr - * @param {String} newSubStr - * @return {String} - */ -export function replaceAll(str, subStr, newSubStr) { - return str.replace(new RegExp(subStr, 'g'), newSubStr); -} - -/** - * This is a wrapper around document.querySelector that will return the query if it's already of type Node - * - * @memberof Chartist.Core - * @param {String|Node} query The query to use for selecting a Node or a DOM node that will be returned directly - * @return {Node} - */ -export function querySelector(query) { - return query instanceof Node ? query : document.querySelector(query); -} - -/** - * This function safely checks if an objects has an owned property. - * - * @param {Object} object The object where to check for a property - * @param {string} property The property name - * @returns {boolean} Returns true if the object owns the specified property - */ -export function safeHasProperty(object, property) { - return ( - object !== null && - typeof object === 'object' && - Reflect.has(object, property) - ); -} - -/** - * Checks if a value can be safely coerced to a number. This includes all values except null which result in finite numbers when coerced. This excludes NaN, since it's not finite. - * - * @memberof Chartist.Core - * @param value - * @returns {Boolean} - */ -export function isNumeric(value) { - return value === null ? false : isFinite(value); -} - -/** - * Returns true on all falsey values except the numeric value 0. - * - * @memberof Chartist.Core - * @param value - * @returns {boolean} - */ -export function isFalseyButZero(value) { - return !value && value !== 0; -} - -/** - * Returns a number if the passed parameter is a valid number or the function will return undefined. On all other values than a valid number, this function will return undefined. - * - * @memberof Chartist.Core - * @param value - * @returns {*} - */ -export function getNumberOrUndefined(value) { - return isNumeric(value) ? +value : undefined; -} - -/** - * Converts a number to a string with a unit. If a string is passed then this will be returned unmodified. - * - * @memberof Chartist.Core - * @param {Number} value - * @param {String} unit - * @return {String} Returns the passed number value with unit. - */ -export function ensureUnit(value, unit) { - if (typeof value === 'number') { - value = value + unit; - } - - return value; -} - -/** - * Converts a number or string to a quantity object. - * - * @memberof Chartist.Core - * @param {String|Number} input - * @return {Object} Returns an object containing the value as number and the unit as string. - */ -export function quantity(input) { - if (typeof input === 'string') { - const match = /^(\d+)\s*(.*)$/g.exec(input); - return { - value: +match[1], - unit: match[2] || undefined - }; - } - - return { - value: input - }; -} - -/** - * Generates a-z from a number 0 to 26 - * - * @memberof Chartist.Core - * @param {Number} n A number from 0 to 26 that will result in a letter a-z - * @return {String} A character from a-z based on the input number n - */ -export function alphaNumerate(n) { - // Limit to a-z - return String.fromCharCode(97 + (n % 26)); -} diff --git a/src/core/lang.spec.js b/src/core/lang.spec.ts similarity index 87% rename from src/core/lang.spec.js rename to src/core/lang.spec.ts index 14f6fd82..92c8708f 100644 --- a/src/core/lang.spec.js +++ b/src/core/lang.spec.ts @@ -7,8 +7,8 @@ describe('Core', () => { expect(quantity(100)).toEqual({ value: 100 }); expect(quantity(0)).toEqual({ value: 0 }); expect(quantity(NaN)).toEqual({ value: NaN }); - expect(quantity(null)).toEqual({ value: null }); - expect(quantity(undefined)).toEqual({ value: undefined }); + expect(quantity(null)).toEqual({ value: 0 }); + expect(quantity(undefined)).toEqual({ value: NaN }); }); it('should return value without unit from string', () => { diff --git a/src/core/lang.ts b/src/core/lang.ts new file mode 100644 index 00000000..311876a4 --- /dev/null +++ b/src/core/lang.ts @@ -0,0 +1,39 @@ +/** + * Converts a number to a string with a unit. If a string is passed then this will be returned unmodified. + * @return Returns the passed number value with unit. + */ +export function ensureUnit<T>(value: T, unit: string) { + if (typeof value === 'number') { + return value + unit; + } + + return value; +} + +/** + * Converts a number or string to a quantity object. + * @return Returns an object containing the value as number and the unit as string. + */ +export function quantity<T>(input: T) { + if (typeof input === 'string') { + const match = /^(\d+)\s*(.*)$/g.exec(input); + return { + value: match ? +match[1] : 0, + unit: match?.[2] || undefined + }; + } + + return { + value: Number(input) + }; +} + +/** + * Generates a-z from a number 0 to 26 + * @param n A number from 0 to 26 that will result in a letter a-z + * @return A character from a-z based on the input number n + */ +export function alphaNumerate(n: number) { + // Limit to a-z + return String.fromCharCode(97 + (n % 26)); +} diff --git a/src/core/math.js b/src/core/math.js deleted file mode 100644 index 917bf9ef..00000000 --- a/src/core/math.js +++ /dev/null @@ -1,99 +0,0 @@ -import { precision as globalPrecision } from './globals'; - -export const EPSILON = 2.221e-16; - -/** - * Calculate the order of magnitude for the chart scale - * - * @memberof Chartist.Core - * @param {Number} value The value Range of the chart - * @return {Number} The order of magnitude - */ -export function orderOfMagnitude(value) { - return Math.floor(Math.log(Math.abs(value)) / Math.LN10); -} - -/** - * Project a data length into screen coordinates (pixels) - * - * @memberof Chartist.Core - * @param {Object} axisLength The svg element for the chart - * @param {Number} length Single data value from a series array - * @param {Object} bounds All the values to set the bounds of the chart - * @return {Number} The projected data length in pixels - */ -export function projectLength(axisLength, length, bounds) { - return (length / bounds.range) * axisLength; -} - -/** - * This helper function can be used to round values with certain precision level after decimal. This is used to prevent rounding errors near float point precision limit. - * - * @memberof Chartist.Core - * @param {Number} value The value that should be rounded with precision - * @param {Number} [digits] The number of digits after decimal used to do the rounding - * @returns {number} Rounded value - */ -export function roundWithPrecision(value, digits) { - const precision = Math.pow(10, digits || globalPrecision); - return Math.round(value * precision) / precision; -} - -/** - * Pollard Rho Algorithm to find smallest factor of an integer value. There are more efficient algorithms for factorization, but this one is quite efficient and not so complex. - * - * @memberof Chartist.Core - * @param {Number} num An integer number where the smallest factor should be searched for - * @returns {Number} The smallest integer factor of the parameter num. - */ -export function rho(num) { - if (num === 1) { - return num; - } - - function gcd(p, q) { - if (p % q === 0) { - return q; - } else { - return gcd(q, p % q); - } - } - - function f(x) { - return x * x + 1; - } - - let x1 = 2; - let x2 = 2; - let divisor; - if (num % 2 === 0) { - return 2; - } - - do { - x1 = f(x1) % num; - x2 = f(f(x2)) % num; - divisor = gcd(Math.abs(x1 - x2), num); - } while (divisor === 1); - - return divisor; -} - -/** - * Calculate cartesian coordinates of polar coordinates - * - * @memberof Chartist.Core - * @param {Number} centerX X-axis coordinates of center point of circle segment - * @param {Number} centerY X-axis coordinates of center point of circle segment - * @param {Number} radius Radius of circle segment - * @param {Number} angleInDegrees Angle of circle segment in degrees - * @return {{x:Number, y:Number}} Coordinates of point on circumference - */ -export function polarToCartesian(centerX, centerY, radius, angleInDegrees) { - const angleInRadians = ((angleInDegrees - 90) * Math.PI) / 180.0; - - return { - x: centerX + radius * Math.cos(angleInRadians), - y: centerY + radius * Math.sin(angleInRadians) - }; -} diff --git a/src/core/math.ts b/src/core/math.ts new file mode 100644 index 00000000..66797ab3 --- /dev/null +++ b/src/core/math.ts @@ -0,0 +1,100 @@ +import type { Bounds } from './types'; +import { precision as globalPrecision } from './constants'; + +export const EPSILON = 2.221e-16; + +/** + * Calculate the order of magnitude for the chart scale + * @param value The value Range of the chart + * @return The order of magnitude + */ +export function orderOfMagnitude(value: number) { + return Math.floor(Math.log(Math.abs(value)) / Math.LN10); +} + +/** + * Project a data length into screen coordinates (pixels) + * @param axisLength The svg element for the chart + * @param length Single data value from a series array + * @param bounds All the values to set the bounds of the chart + * @return The projected data length in pixels + */ +export function projectLength( + axisLength: number, + length: number, + bounds: Bounds +) { + return (length / bounds.range) * axisLength; +} + +/** + * This helper function can be used to round values with certain precision level after decimal. This is used to prevent rounding errors near float point precision limit. + * @param value The value that should be rounded with precision + * @param [digits] The number of digits after decimal used to do the rounding + * @returns Rounded value + */ +export function roundWithPrecision(value: number, digits?: number) { + const precision = Math.pow(10, digits || globalPrecision); + return Math.round(value * precision) / precision; +} + +/** + * Pollard Rho Algorithm to find smallest factor of an integer value. There are more efficient algorithms for factorization, but this one is quite efficient and not so complex. + * @param num An integer number where the smallest factor should be searched for + * @returns The smallest integer factor of the parameter num. + */ +export function rho(num: number) { + if (num === 1) { + return num; + } + + function gcd(p: number, q: number): number { + if (p % q === 0) { + return q; + } else { + return gcd(q, p % q); + } + } + + function f(x: number) { + return x * x + 1; + } + + let x1 = 2; + let x2 = 2; + let divisor: number; + + if (num % 2 === 0) { + return 2; + } + + do { + x1 = f(x1) % num; + x2 = f(f(x2)) % num; + divisor = gcd(Math.abs(x1 - x2), num); + } while (divisor === 1); + + return divisor; +} + +/** + * Calculate cartesian coordinates of polar coordinates + * @param centerX X-axis coordinates of center point of circle segment + * @param centerY X-axis coordinates of center point of circle segment + * @param radius Radius of circle segment + * @param angleInDegrees Angle of circle segment in degrees + * @return Coordinates of point on circumference + */ +export function polarToCartesian( + centerX: number, + centerY: number, + radius: number, + angleInDegrees: number +) { + const angleInRadians = ((angleInDegrees - 90) * Math.PI) / 180.0; + + return { + x: centerX + radius * Math.cos(angleInRadians), + y: centerY + radius * Math.sin(angleInRadians) + }; +} diff --git a/src/core/options-provider.js b/src/core/optionsProvider.ts similarity index 57% rename from src/core/options-provider.js rename to src/core/optionsProvider.ts index e9f4c0e6..007f8017 100644 --- a/src/core/options-provider.js +++ b/src/core/optionsProvider.ts @@ -1,20 +1,28 @@ -import { extend } from './extend'; +import type { EventEmitter } from '../event'; +import { extend } from '../utils'; + +export interface OptionsProvider<T = unknown> { + removeMediaQueryListeners(): void; + getCurrentOptions(): T; +} /** * Provides options handling functionality with callback for options changes triggered by responsive options and media query matches - * - * @memberof Chartist.Core - * @param {Object} options Options set by user - * @param {Array} responsiveOptions Optional functions to add responsive behavior to chart - * @param {Object} eventEmitter The event emitter that will be used to emit the options changed events - * @return {Object} The consolidated options object from the defaults, base and matching responsive options + * @param options Options set by user + * @param responsiveOptions Optional functions to add responsive behavior to chart + * @param eventEmitter The event emitter that will be used to emit the options changed events + * @return The consolidated options object from the defaults, base and matching responsive options */ -export function optionsProvider(options, responsiveOptions, eventEmitter) { +export function optionsProvider<T = unknown>( + options: T, + responsiveOptions: [string, T][] | undefined, + eventEmitter: EventEmitter +): OptionsProvider<T> { const baseOptions = extend({}, options); - let currentOptions; - const mediaQueryListeners = []; + let currentOptions: T; + const mediaQueryListeners: MediaQueryList[] = []; - function updateCurrentOptions(mediaEvent) { + function updateCurrentOptions(mediaEvent?: Event) { const previousOptions = currentOptions; currentOptions = extend({}, baseOptions); @@ -37,7 +45,7 @@ export function optionsProvider(options, responsiveOptions, eventEmitter) { function removeMediaQueryListeners() { mediaQueryListeners.forEach(mql => - mql.removeListener(updateCurrentOptions) + mql.removeEventListener('change', updateCurrentOptions) ); } @@ -48,7 +56,7 @@ export function optionsProvider(options, responsiveOptions, eventEmitter) { } else if (responsiveOptions) { responsiveOptions.forEach(responsiveOption => { const mql = window.matchMedia(responsiveOption[0]); - mql.addListener(updateCurrentOptions); + mql.addEventListener('change', updateCurrentOptions); mediaQueryListeners.push(mql); }); } @@ -58,7 +66,7 @@ export function optionsProvider(options, responsiveOptions, eventEmitter) { return { removeMediaQueryListeners, getCurrentOptions() { - return extend({}, currentOptions); + return extend({}, currentOptions) as T; } }; } diff --git a/src/core/types.ts b/src/core/types.ts new file mode 100644 index 00000000..74dc3f47 --- /dev/null +++ b/src/core/types.ts @@ -0,0 +1,252 @@ +import type { RequiredKeys } from '../utils'; +import type { Axis, AxisType } from '../axes'; +import type { Svg } from '../svg'; + +export interface ChartPadding { + top: number; + right: number; + bottom: number; + left: number; +} + +export interface ChartRect { + x1: number; + x2: number; + y1: number; + y2: number; + padding: ChartPadding; + width(): number; + height(): number; +} + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export type Plugin = (chart: any, options?: any) => void; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export type Meta = any; + +export interface Options< + TXAxisOptions = AxisOptions, + TYAxisOptions = TXAxisOptions +> { + width?: number | string; + height?: number | string; + low?: number; + high?: number; + referenceValue?: number; + chartPadding?: number | Partial<ChartPadding>; + axisX?: TXAxisOptions; + axisY?: TYAxisOptions; + classNames?: Record<string, string>; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + plugins?: (Plugin | [Plugin, any])[]; +} + +export interface AxisOptions { + type?: AxisType; + low?: number; + high?: number; + referenceValue?: number; + offset?: number; + position?: 'start' | 'end'; + labelOffset?: { + x: number; + y: number; + }; + showLabel?: boolean; + showGrid?: boolean; + labelInterpolationFnc?(value: Label, index: number): Label | null | undefined; + scaleMinSpace?: number; + onlyInteger?: boolean; + ticks?: Label[]; + stretch?: boolean; + divisor?: number; + highLow?: { + high: number; + low: number; + }; +} + +export type OptionsWithDefaults = RequiredKeys< + Options< + RequiredKeys< + AxisOptions, + 'offset' | 'labelOffset' | 'labelInterpolationFnc' + >, + RequiredKeys< + AxisOptions, + 'offset' | 'labelOffset' | 'labelInterpolationFnc' + > + >, + 'axisX' | 'axisY' | 'classNames' +>; + +export interface Bounds { + high: number; + low: number; + valueRange: number; + oom: number; + step: number; + min: number; + max: number; + range: number; + numberOfSteps: number; + values: number[]; +} + +export interface Segment { + pathCoordinates: number[]; + valueData: SegmentData[]; +} + +export interface SegmentData { + value: NormalizedSeriesValue; + valueIndex: number; + meta?: Meta; +} + +export type AxisName = 'x' | 'y'; + +export type Multi = + | { + x: number | string | null; + y: number | string | null; + } + | { + x: number | string | null; + } + | { + y: number | string | null; + }; + +export type NormalizedMulti = + | { + x: number; + y: number; + } + | { + x: number; + } + | { + y: number; + }; + +/** + * Data + */ + +export type Label = string | number | Date; + +export type AllSeriesTypes = FlatSeries | (Series | SeriesObject)[]; + +export interface Data<T extends AllSeriesTypes = AllSeriesTypes> { + labels?: Label[] | undefined; + series: T; +} + +/** + * Series + */ + +export type Series<T = SeriesPrimitiveValue> = SeriesValue<T>[]; + +export interface SeriesObject<T = SeriesPrimitiveValue> { + name?: string; + className?: string; + meta?: Meta; + data: SeriesValue<T>[]; +} + +export type SeriesValue<T = SeriesPrimitiveValue> = SeriesObjectValue<T> | T; + +export type SeriesPrimitiveValue = + | number + | string + | boolean + | Date + | Multi + | null + | undefined; + +export interface SeriesObjectValue<T = SeriesPrimitiveValue> { + meta?: Meta; + value: T; +} + +/** + * Flat Series + */ + +export type FlatSeries<T = FlatSeriesPrimitiveValue> = FlatSeriesValue<T>[]; + +export type FlatSeriesValue<T = FlatSeriesPrimitiveValue> = + | SeriesValue<T> + | FlatSeriesObjectValue<T>; + +export type FlatSeriesPrimitiveValue = number | string | null | undefined; + +export interface FlatSeriesObjectValue<T = FlatSeriesPrimitiveValue> { + name?: string; + className?: string; + meta?: Meta; + value: T; +} + +/** + * Normalized Data + */ + +export type AllNormalizedSeriesTypes = + | NormalizedFlatSeries + | NormalizedSeries[]; + +export interface NormalizedData< + T extends AllNormalizedSeriesTypes = AllNormalizedSeriesTypes +> extends Data { + labels: Label[]; + series: T; +} + +/** + * Normalized Series + */ + +export type NormalizedSeries = NormalizedSeriesValue[]; + +export type NormalizedSeriesValue = NormalizedSeriesPrimitiveValue; + +export type NormalizedSeriesPrimitiveValue = + | number + | NormalizedMulti + | undefined; + +/** + * Normalized Flat Series + */ + +export type NormalizedFlatSeries = number[]; + +/** + * Events + */ + +export interface CreatedEvent<TOptions = Options> { + chartRect: ChartRect; + axisX: Axis; + axisY: Axis; + svg: Svg; + options: TOptions; +} + +export interface DrawEvent { + type: string; + element: Svg; + group: Svg; + chartRect: ChartRect; + axisX: Axis; + axisY: Axis; + meta: Meta; + index: number; + series: FlatSeriesValue | Series | SeriesObject; + seriesIndex: number; +} diff --git a/src/event/EventEmitter.ts b/src/event/EventEmitter.ts new file mode 100644 index 00000000..f9f11929 --- /dev/null +++ b/src/event/EventEmitter.ts @@ -0,0 +1,87 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +export type EventListener<T = any> = (data: T) => void; + +export type AllEventsListener<T = any> = (event: string, data: T) => void; + +export class EventEmitter { + private readonly listeners = new Map<string, Set<EventListener>>(); + private readonly allListeners = new Set<AllEventsListener>(); + + /** + * Add an event handler for a specific event + * @todo Rename to `on`. Replace `'*'` with single argument. + * @param event The event name + * @param listener A event handler function + */ + addEventHandler(event: '*', listener: AllEventsListener): void; + addEventHandler(event: string, listener: EventListener): void; + addEventHandler(event: string, listener: EventListener | AllEventsListener) { + const { allListeners, listeners } = this; + + if (event === '*') { + allListeners.add(listener); + } else { + if (!listeners.has(event)) { + listeners.set(event, new Set()); + } + + (listeners.get(event) as Set<EventListener>).add( + listener as EventListener + ); + } + } + + /** + * Remove an event handler of a specific event name or remove all event handlers for a specific event. + * @todo Rename to `off`. Replace `'*'` with single argument. + * @param event The event name where a specific or all handlers should be removed + * @param [listener] An optional event handler function. If specified only this specific handler will be removed and otherwise all handlers are removed. + */ + removeEventHandler(event: '*', listener?: AllEventsListener): void; + removeEventHandler(event: string, listener?: EventListener): void; + removeEventHandler( + event: string, + listener?: EventListener | AllEventsListener + ) { + const { allListeners, listeners } = this; + + if (event === '*') { + if (listener) { + allListeners.delete(listener); + } else { + allListeners.clear(); + } + } else if (listeners.has(event)) { + const eventListeners = listeners.get(event) as Set<EventListener>; + + if (listener) { + eventListeners.delete(listener as EventListener); + } else { + eventListeners.clear(); + } + + if (!eventListeners.size) { + listeners.delete(event); + } + } + } + + /** + * Use this function to emit an event. All handlers that are listening for this event will be triggered with the data parameter. + * @param event The event name that should be triggered + * @param data Arbitrary data that will be passed to the event handler callback functions + */ + emit<T = any>(event: string, data: T) { + const { allListeners, listeners } = this; + + // Only do something if there are event handlers with this name existing + if (listeners.has(event)) { + (listeners.get(event) as Set<EventListener>).forEach(listener => + listener(data) + ); + } + + // Emit event to star event handlers + allListeners.forEach(listener => listener(event, data)); + } +} diff --git a/src/event/event-emitter.js b/src/event/event-emitter.js deleted file mode 100644 index 2ab62345..00000000 --- a/src/event/event-emitter.js +++ /dev/null @@ -1,59 +0,0 @@ -export class EventEmitter { - constructor() { - this.handlers = []; - } - - /** - * Add an event handler for a specific event - * - * @memberof Chartist.Event - * @param {String} event The event name - * @param {Function} handler A event handler function - */ - addEventHandler(event, handler) { - this.handlers[event] = this.handlers[event] || []; - this.handlers[event].push(handler); - } - - /** - * Remove an event handler of a specific event name or remove all event handlers for a specific event. - * - * @memberof Chartist.Event - * @param {String} event The event name where a specific or all handlers should be removed - * @param {Function} [handler] An optional event handler function. If specified only this specific handler will be removed and otherwise all handlers are removed. - */ - removeEventHandler(event, handler) { - // Only do something if there are event handlers with this name existing - if (this.handlers[event]) { - // If handler is set we will look for a specific handler and only remove this - if (handler) { - this.handlers[event].splice(this.handlers[event].indexOf(handler), 1); - if (this.handlers[event].length === 0) { - delete this.handlers[event]; - } - } else { - // If no handler is specified we remove all handlers for this event - delete this.handlers[event]; - } - } - } - - /** - * Use this function to emit an event. All handlers that are listening for this event will be triggered with the data parameter. - * - * @memberof Chartist.Event - * @param {String} event The event name that should be triggered - * @param {*} data Arbitrary data that will be passed to the event handler callback functions - */ - emit(event, data) { - // Only do something if there are event handlers with this name existing - if (this.handlers[event]) { - this.handlers[event].forEach(handler => handler(data)); - } - - // Emit event to star event handlers - if (this.handlers['*']) { - this.handlers['*'].forEach(starHandler => starHandler(event, data)); - } - } -} diff --git a/src/event/index.ts b/src/event/index.ts new file mode 100644 index 00000000..1a0d4570 --- /dev/null +++ b/src/event/index.ts @@ -0,0 +1 @@ +export * from './EventEmitter'; diff --git a/src/index.js b/src/index.js deleted file mode 100644 index 72759cf6..00000000 --- a/src/index.js +++ /dev/null @@ -1,9 +0,0 @@ -export * from './core/core'; -export { EventEmitter } from './event/event-emitter'; -export * from './charts/charts'; -export * from './axes/axes'; -import * as Interpolation from './interpolation/interpolation'; -export { Interpolation }; -export * from './svg/svg'; -export * from './svg/svg-list'; -export * from './svg/svg-path'; diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 00000000..bd4d49f4 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,6 @@ +export * from './core'; +export * from './event'; +export * from './charts'; +export * from './axes'; +export * as Interpolation from './interpolation'; +export * from './svg'; diff --git a/src/interpolation/cardinal.js b/src/interpolation/cardinal.ts similarity index 82% rename from src/interpolation/cardinal.js rename to src/interpolation/cardinal.ts index 6fe2664c..97a8fd7f 100644 --- a/src/interpolation/cardinal.js +++ b/src/interpolation/cardinal.ts @@ -1,7 +1,13 @@ -import { extend, splitIntoSegments } from '../core/core'; -import { SvgPath } from '../svg/svg-path'; +import type { SegmentData } from '../core'; +import { splitIntoSegments } from '../core'; +import { SvgPath } from '../svg'; import { none } from './none'; +export interface CardinalInterpolationOptions { + tension?: number; + fillHoles?: boolean; +} + /** * Cardinal / Catmull-Rome spline interpolation is the default smoothing function in Chartist. It produces nice results where the splines will always meet the points. It produces some artifacts though when data values are increased or decreased rapidly. The line may not follow a very accurate path and if the line should be accurate this smoothing function does not produce the best results. * @@ -10,41 +16,41 @@ import { none } from './none'; * All smoothing functions within Chartist are factory functions that accept an options parameter. The cardinal interpolation function accepts one configuration parameter `tension`, between 0 and 1, which controls the smoothing intensity. * * @example - * var chart = new Chartist.Line('.ct-chart', { + * const chart = new LineChart('.ct-chart', { * labels: [1, 2, 3, 4, 5], * series: [[1, 2, 8, 1, 7]] * }, { - * lineSmooth: Chartist.Interpolation.cardinal({ + * lineSmooth: Interpolation.cardinal({ * tension: 1, * fillHoles: false * }) * }); * - * @memberof Chartist.Interpolation - * @param {Object} options The options of the cardinal factory function. - * @return {Function} + * @param options The options of the cardinal factory function. */ -export function cardinal(options) { - const defaultOptions = { +export function cardinal(options?: CardinalInterpolationOptions) { + const finalOptions = { tension: 1, - fillHoles: false + fillHoles: false, + ...options }; - options = extend({}, defaultOptions, options); - - const t = Math.min(1, Math.max(0, options.tension)); + const t = Math.min(1, Math.max(0, finalOptions.tension)); const c = 1 - t; - return function cardinalInterpolation(pathCoordinates, valueData) { + return function cardinalInterpolation( + pathCoordinates: number[], + valueData: SegmentData[] + ): SvgPath { // First we try to split the coordinates into segments // This is necessary to treat "holes" in line charts const segments = splitIntoSegments(pathCoordinates, valueData, { - fillHoles: options.fillHoles + fillHoles: finalOptions.fillHoles }); if (!segments.length) { // If there were no segments return 'none' interpolation - return none()([]); + return none()([], []); } else if (segments.length > 1) { // If the split resulted in more that one segment we need to interpolate each segment individually and join them // afterwards together into a single path. @@ -72,11 +78,11 @@ export function cardinal(options) { false, valueData[0] ); - let z; + const z = false; for ( let i = 0, iLen = pathCoordinates.length; - iLen - 2 * !z > i; + iLen - 2 * Number(!z) > i; i += 2 ) { const p = [ diff --git a/src/interpolation/index.ts b/src/interpolation/index.ts new file mode 100644 index 00000000..5ed6a30c --- /dev/null +++ b/src/interpolation/index.ts @@ -0,0 +1,5 @@ +export * from './none'; +export * from './simple'; +export * from './step'; +export * from './cardinal'; +export * from './monotoneCubic'; diff --git a/src/interpolation/interpolation.js b/src/interpolation/interpolation.js deleted file mode 100644 index e6df59d9..00000000 --- a/src/interpolation/interpolation.js +++ /dev/null @@ -1,5 +0,0 @@ -export { none } from './none'; -export { simple } from './simple'; -export { step } from './step'; -export { cardinal } from './cardinal'; -export { monotoneCubic } from './monotone-cubic'; diff --git a/src/interpolation/monotone-cubic.js b/src/interpolation/monotoneCubic.ts similarity index 84% rename from src/interpolation/monotone-cubic.js rename to src/interpolation/monotoneCubic.ts index 9519fc8f..5e804e9c 100644 --- a/src/interpolation/monotone-cubic.js +++ b/src/interpolation/monotoneCubic.ts @@ -1,7 +1,12 @@ -import { extend, splitIntoSegments } from '../core/core'; -import { SvgPath } from '../svg/svg-path'; +import type { SegmentData } from '../core'; +import { splitIntoSegments } from '../core'; +import { SvgPath } from '../svg'; import { none } from './none'; +export interface MonotoneCubicInterpolationOptions { + fillHoles?: boolean; +} + /** * Monotone Cubic spline interpolation produces a smooth curve which preserves monotonicity. Unlike cardinal splines, the curve will not extend beyond the range of y-values of the original data points. * @@ -12,37 +17,37 @@ import { none } from './none'; * All smoothing functions within Chartist are factory functions that accept an options parameter. * * @example - * var chart = new Chartist.Line('.ct-chart', { + * const chart = new LineChart('.ct-chart', { * labels: [1, 2, 3, 4, 5], * series: [[1, 2, 8, 1, 7]] * }, { - * lineSmooth: Chartist.Interpolation.monotoneCubic({ + * lineSmooth: Interpolation.monotoneCubic({ * fillHoles: false * }) * }); * - * @memberof Chartist.Interpolation - * @param {Object} [options] The options of the monotoneCubic factory function. - * @return {Function} + * @param options The options of the monotoneCubic factory function. */ -export function monotoneCubic(options) { - const defaultOptions = { - fillHoles: false +export function monotoneCubic(options?: MonotoneCubicInterpolationOptions) { + const finalOptions = { + fillHoles: false, + ...options }; - options = extend({}, defaultOptions, options); - - return function monotoneCubicInterpolation(pathCoordinates, valueData) { + return function monotoneCubicInterpolation( + pathCoordinates: number[], + valueData: SegmentData[] + ): SvgPath { // First we try to split the coordinates into segments // This is necessary to treat "holes" in line charts const segments = splitIntoSegments(pathCoordinates, valueData, { - fillHoles: options.fillHoles, + fillHoles: finalOptions.fillHoles, increasingX: true }); if (!segments.length) { // If there were no segments return 'Chartist.Interpolation.none' - return none()([]); + return none()([], []); } else if (segments.length > 1) { // If the split resulted in more that one segment we need to interpolate each segment individually and join them // afterwards together into a single path. diff --git a/src/interpolation/none.js b/src/interpolation/none.ts similarity index 59% rename from src/interpolation/none.js rename to src/interpolation/none.ts index 2077ff84..b81ced7b 100644 --- a/src/interpolation/none.js +++ b/src/interpolation/none.ts @@ -1,31 +1,34 @@ -import { extend, getMultiValue } from '../core/core'; -import { SvgPath } from '../svg/svg-path'; +import type { SegmentData } from '../core'; +import { getMultiValue } from '../core'; +import { SvgPath } from '../svg'; + +export interface NoneInterpolationOptions { + fillHoles?: boolean; +} /** * This interpolation function does not smooth the path and the result is only containing lines and no curves. * * @example - * var chart = new Chartist.Line('.ct-chart', { + * const chart = new LineChart('.ct-chart', { * labels: [1, 2, 3, 4, 5], * series: [[1, 2, 8, 1, 7]] * }, { - * lineSmooth: Chartist.Interpolation.none({ + * lineSmooth: Interpolation.none({ * fillHoles: false * }) * }); - * - * - * @memberof Chartist.Interpolation - * @return {Function} */ -export function none(options) { - const defaultOptions = { - fillHoles: false +export function none(options?: NoneInterpolationOptions) { + const finalOptions = { + fillHoles: false, + ...options }; - options = extend({}, defaultOptions, options); - - return function noneInterpolation(pathCoordinates, valueData) { + return function noneInterpolation( + pathCoordinates: number[], + valueData: SegmentData[] + ) { const path = new SvgPath(); let hole = true; @@ -42,7 +45,7 @@ export function none(options) { } hole = false; - } else if (!options.fillHoles) { + } else if (!finalOptions.fillHoles) { hole = true; } } diff --git a/src/interpolation/simple.js b/src/interpolation/simple.ts similarity index 68% rename from src/interpolation/simple.js rename to src/interpolation/simple.ts index 20e4576f..5708a38b 100644 --- a/src/interpolation/simple.js +++ b/src/interpolation/simple.ts @@ -1,5 +1,10 @@ -import { extend } from '../core/core'; -import { SvgPath } from '../svg/svg-path'; +import type { SegmentData } from '../core/types'; +import { SvgPath } from '../svg'; + +export interface SimpleInteractionOptions { + divisor?: number; + fillHoles?: boolean; +} /** * Simple smoothing creates horizontal handles that are positioned with a fraction of the length between two data points. You can use the divisor option to specify the amount of smoothing. @@ -9,35 +14,34 @@ import { SvgPath } from '../svg/svg-path'; * All smoothing functions within Chartist are factory functions that accept an options parameter. The simple interpolation function accepts one configuration parameter `divisor`, between 1 and ∞, which controls the smoothing characteristics. * * @example - * var chart = new Chartist.Line('.ct-chart', { + * const chart = new LineChart('.ct-chart', { * labels: [1, 2, 3, 4, 5], * series: [[1, 2, 8, 1, 7]] * }, { - * lineSmooth: Chartist.Interpolation.simple({ + * lineSmooth: Interpolation.simple({ * divisor: 2, * fillHoles: false * }) * }); * - * - * @memberof Chartist.Interpolation - * @param {Object} options The options of the simple interpolation factory function. - * @return {Function} + * @param options The options of the simple interpolation factory function. */ -export function simple(options) { - const defaultOptions = { +export function simple(options?: SimpleInteractionOptions) { + const finalOptions = { divisor: 2, - fillHoles: false + fillHoles: false, + ...options }; - options = extend({}, defaultOptions, options); - - const d = 1 / Math.max(1, options.divisor); + const d = 1 / Math.max(1, finalOptions.divisor); - return function simpleInterpolation(pathCoordinates, valueData) { + return function simpleInterpolation( + pathCoordinates: number[], + valueData: SegmentData[] + ) { const path = new SvgPath(); - let prevX; - let prevY; + let prevX = 0; + let prevY = 0; let prevData; for (let i = 0; i < pathCoordinates.length; i += 2) { @@ -65,8 +69,9 @@ export function simple(options) { prevX = currX; prevY = currY; prevData = currData; - } else if (!options.fillHoles) { - prevX = prevY = prevData = undefined; + } else if (!finalOptions.fillHoles) { + prevX = prevY = 0; + prevData = undefined; } } diff --git a/src/interpolation/step.js b/src/interpolation/step.ts similarity index 76% rename from src/interpolation/step.js rename to src/interpolation/step.ts index 1eafeb01..cbe92a7e 100644 --- a/src/interpolation/step.js +++ b/src/interpolation/step.ts @@ -1,5 +1,10 @@ -import { extend } from '../core/core'; -import { SvgPath } from '../svg/svg-path'; +import type { SegmentData } from '../core'; +import { SvgPath } from '../svg'; + +export interface StepInterpolationOptions { + postpone?: boolean; + fillHoles?: boolean; +} /** * Step interpolation will cause the line chart to move in steps rather than diagonal or smoothed lines. This interpolation will create additional points that will also be drawn when the `showPoint` option is enabled. @@ -11,29 +16,27 @@ import { SvgPath } from '../svg/svg-path'; * labels: [1, 2, 3, 4, 5], * series: [[1, 2, 8, 1, 7]] * }, { - * lineSmooth: Chartist.Interpolation.step({ + * lineSmooth: Interpolation.step({ * postpone: true, * fillHoles: false * }) * }); - * - * @memberof Chartist.Interpolation - * @param options - * @returns {Function} */ -export function step(options) { - const defaultOptions = { +export function step(options?: StepInterpolationOptions) { + const finalOptions = { postpone: true, - fillHoles: false + fillHoles: false, + ...options }; - options = extend({}, defaultOptions, options); - - return function stepInterpolation(pathCoordinates, valueData) { + return function stepInterpolation( + pathCoordinates: number[], + valueData: SegmentData[] + ) { const path = new SvgPath(); - let prevX; - let prevY; + let prevX = 0; + let prevY = 0; let prevData; for (let i = 0; i < pathCoordinates.length; i += 2) { @@ -46,7 +49,7 @@ export function step(options) { if (prevData === undefined) { path.move(currX, currY, false, currData); } else { - if (options.postpone) { + if (finalOptions.postpone) { // If postponed we should draw the step line with the value of the previous value path.line(currX, prevY, false, prevData); } else { @@ -60,8 +63,9 @@ export function step(options) { prevX = currX; prevY = currY; prevData = currData; - } else if (!options.fillHoles) { - prevX = prevY = prevData = undefined; + } else if (!finalOptions.fillHoles) { + prevX = prevY = 0; + prevData = undefined; } } diff --git a/src/svg/Svg.spec.ts b/src/svg/Svg.spec.ts new file mode 100644 index 00000000..a58bd6c1 --- /dev/null +++ b/src/svg/Svg.spec.ts @@ -0,0 +1,219 @@ +import { Svg } from './Svg'; +import { namespaces } from '../core'; + +describe('Svg', () => { + it('should create a valid svg dom element', () => { + const svg = new Svg('svg'); + + expect(svg).toBeDefined(); + expect(svg.getNode()).toBeDefined(); + expect(svg.getNode().nodeName.toLowerCase()).toBe('svg'); + }); + + it('should create a valid svg dom element with attributes', () => { + const svg = new Svg('svg', { + width: '100%', + height: '100%' + }); + + expect(svg).toBeDefined(); + expect(svg.getNode()).toBeDefined(); + expect(svg.getNode().nodeName.toLowerCase()).toBe('svg'); + expect(svg.getNode()).toHaveAttribute('width', '100%'); + expect(svg.getNode()).toHaveAttribute('height', '100%'); + }); + + it('should create nested objects with attributes', () => { + const svg = new Svg('svg'); + svg.elem('g').elem('g').elem('circle', { + cx: 100, + cy: 100, + r: 10 + }); + + expect(svg.getNode()).toBeDefined(); + expect( + svg.getNode().firstElementChild?.firstElementChild?.firstElementChild + ).toBeDefined(); + expect( + svg + .getNode() + .firstElementChild?.firstElementChild?.firstElementChild?.getAttribute( + 'cx' + ) + ).toBe('100'); + expect( + svg + .getNode() + .firstElementChild?.firstElementChild?.firstElementChild?.getAttribute( + 'cy' + ) + ).toBe('100'); + expect( + svg + .getNode() + .firstElementChild?.firstElementChild?.firstElementChild?.getAttribute( + 'r' + ) + ).toBe('10'); + }); + + it('should allow to set attributes manually', () => { + const svg = new Svg('svg'); + svg.elem('circle').attr({ + cx: 100, + cy: 100, + r: 10 + }); + + expect(svg.getNode()).toBeDefined(); + expect(svg.getNode().firstElementChild).toBeDefined(); + expect(svg.getNode().firstElementChild?.getAttribute('cx')).toBe('100'); + expect(svg.getNode().firstElementChild?.getAttribute('cy')).toBe('100'); + expect(svg.getNode().firstElementChild?.getAttribute('r')).toBe('10'); + }); + + it('should allow to set namespaced attributes', () => { + const svg = new Svg('image'); + svg.elem('image').attr({ + x: 100, + y: 100, + height: 100, + width: 100, + 'xlink:href': 'image.jpg' + }); + + expect(svg.getNode()).toBeDefined(); + expect(svg.getNode().firstElementChild).toBeDefined(); + expect(svg.getNode().firstElementChild).toHaveAttribute('x', '100'); + expect(svg.getNode().firstElementChild).toHaveAttribute('y', '100'); + expect(svg.getNode().firstElementChild).toHaveAttribute('width', '100'); + expect(svg.getNode().firstElementChild).toHaveAttribute('height', '100'); + expect( + svg.getNode().firstElementChild?.getAttributeNS(namespaces.xlink, 'href') + ).toBe('image.jpg'); + }); + + it('should clear on each nesting level', () => { + const svg = new Svg('svg'); + const group = svg.elem('g'); + group.elem('circle'); + group.elem('circle'); + group.elem('circle'); + + expect(svg.getNode()).toBeDefined(); + expect(svg.getNode().firstElementChild?.childNodes.length).toBe(3); + + group.empty(); + expect(svg.getNode().firstElementChild?.childNodes.length).toBe(0); + + svg.empty(); + expect(svg.getNode()).toBeEmptyDOMElement(); + }); + + it('should allow to remove a certain element', () => { + const svg = new Svg('svg'); + const text = svg.elem('text'); + + expect(svg.getNode()).toBeDefined(); + expect(svg.getNode().childNodes.length).toBe(1); + expect(svg.getNode().firstElementChild?.nodeName.toLowerCase()).toBe( + 'text' + ); + + text.remove(); + expect(svg.getNode().childNodes.length).toBe(0); + }); + + it('should allow to write text content into elements', () => { + const svg = new Svg('svg'); + svg.elem('text').text('Hello World'); + + expect(svg.getNode()).toBeDefined(); + expect(svg.getNode().childNodes.length).toBe(1); + expect(svg.getNode().firstElementChild?.nodeName.toLowerCase()).toBe( + 'text' + ); + expect(svg.getNode().firstElementChild?.firstChild?.nodeType).toBe(3); + expect(svg.getNode().firstElementChild?.firstChild).toHaveTextContent( + 'Hello World' + ); + }); + + it('should allow to add and remove classes on elements', () => { + const svg = new Svg('svg') + .addClass('test-class-1') + .addClass('test-class-2') + // Should not allow duplicates + .addClass('test-class-2') + // Should allow multiple classes with white spaces + .addClass('test-class-3 test-class-4'); + + expect(svg.getNode()).toBeDefined(); + expect(svg.getNode().getAttribute('class')?.split(' ')).toEqual([ + 'test-class-1', + 'test-class-2', + 'test-class-3', + 'test-class-4' + ]); + + svg.removeClass('test-class-1'); + // Should allow multiple classes with whitespaces + svg.removeClass('test-class-2 test-class-3'); + + expect(svg.getNode()).toHaveAttribute('class', 'test-class-4'); + }); + + it('should allow to travers up in the fluent API chain and set attributes on the way', () => { + const svg = new Svg('svg'); + svg + .elem('g') + .elem('g') + .elem('g') + .elem('circle') + .parent() + ?.attr({ + transform: 'rotate(10 10 10)' + }) + .parent() + ?.attr({ + transform: 'rotate(20 20 20)' + }) + .parent() + ?.attr({ + transform: 'rotate(30 30 30)' + }) + .parent() + ?.attr({ + width: '100%', + height: '100%' + }); + + expect(svg.getNode()).toBeDefined(); + expect(svg.getNode()).toHaveAttribute('width', '100%'); + expect(svg.getNode()).toHaveAttribute('height', '100%'); + + expect(svg.getNode().firstElementChild).toBeDefined(); + expect(svg.getNode().firstElementChild?.getAttribute('transform')).toBe( + 'rotate(30 30 30)' + ); + + expect(svg.getNode().firstElementChild?.firstElementChild).toBeDefined(); + expect( + svg + .getNode() + .firstElementChild?.firstElementChild?.getAttribute('transform') + ).toBe('rotate(20 20 20)'); + + expect( + svg.getNode().firstElementChild?.firstElementChild?.firstElementChild + ).toBeDefined(); + expect( + svg + .getNode() + .firstElementChild?.firstElementChild?.firstElementChild?.getAttribute( + 'transform' + ) + ).toBe('rotate(10 10 10)'); + }); +}); diff --git a/src/svg/Svg.ts b/src/svg/Svg.ts new file mode 100644 index 00000000..a24b4174 --- /dev/null +++ b/src/svg/Svg.ts @@ -0,0 +1,426 @@ +import type { EventEmitter } from '../event'; +import { namespaces } from '../core/constants'; +import type { Attributes, AnimationDefinition } from './types'; +import { SvgList } from './SvgList'; +import { createAnimation } from './animation'; + +/** + * Svg creates a new SVG object wrapper with a starting element. You can use the wrapper to fluently create sub-elements and modify them. + */ +export class Svg { + private _node: Element; + + /** + * @param name The name of the SVG element to create or an SVG dom element which should be wrapped into Svg + * @param attributes An object with properties that will be added as attributes to the SVG element that is created. Attributes with undefined values will not be added. + * @param className This class or class list will be added to the SVG element + * @param parent The parent SVG wrapper object where this newly created wrapper and it's element will be attached to as child + * @param insertFirst If this param is set to true in conjunction with a parent element the newly created element will be added as first child element in the parent element + */ + constructor( + name: string | Element, + attributes?: Attributes, + className?: string, + parent?: Svg, + insertFirst = false + ) { + // If Svg is getting called with an SVG element we just return the wrapper + if (name instanceof Element) { + this._node = name; + } else { + this._node = document.createElementNS(namespaces.svg, name); + + // If this is an SVG element created then custom namespace + if (name === 'svg') { + this.attr({ + 'xmlns:ct': namespaces.ct + }); + } + } + + if (attributes) { + this.attr(attributes); + } + + if (className) { + this.addClass(className); + } + + if (parent) { + if (insertFirst && parent._node.firstChild) { + parent._node.insertBefore(this._node, parent._node.firstChild); + } else { + parent._node.appendChild(this._node); + } + } + } + + /** + * Set attributes on the current SVG element of the wrapper you're currently working on. + * @param attributes An object with properties that will be added as attributes to the SVG element that is created. Attributes with undefined values will not be added. If this parameter is a String then the function is used as a getter and will return the attribute value. + * @param ns If specified, the attribute will be obtained using getAttributeNs. In order to write namepsaced attributes you can use the namespace:attribute notation within the attributes object. + * @return The current wrapper object will be returned so it can be used for chaining or the attribute value if used as getter function. + */ + attr(attributes: string, ns?: string): string | null; + attr(attributes: Attributes): this; + attr(attributes: string | Attributes, ns?: string) { + if (typeof attributes === 'string') { + if (ns) { + return this._node.getAttributeNS(ns, attributes); + } else { + return this._node.getAttribute(attributes); + } + } + + Object.keys(attributes).forEach(key => { + // If the attribute value is undefined we can skip this one + if (attributes[key] === undefined) { + return; + } + + if (key.indexOf(':') !== -1) { + const namespacedAttribute = key.split(':'); + this._node.setAttributeNS( + namespaces[namespacedAttribute[0]], + key, + String(attributes[key]) + ); + } else { + this._node.setAttribute(key, String(attributes[key])); + } + }); + + return this; + } + + /** + * Create a new SVG element whose wrapper object will be selected for further operations. This way you can also create nested groups easily. + * @param name The name of the SVG element that should be created as child element of the currently selected element wrapper + * @param attributes An object with properties that will be added as attributes to the SVG element that is created. Attributes with undefined values will not be added. + * @param className This class or class list will be added to the SVG element + * @param insertFirst If this param is set to true in conjunction with a parent element the newly created element will be added as first child element in the parent element + * @return Returns a Svg wrapper object that can be used to modify the containing SVG data + */ + elem( + name: string, + attributes?: Attributes, + className?: string, + insertFirst = false + ) { + return new Svg(name, attributes, className, this, insertFirst); + } + + /** + * Returns the parent Chartist.SVG wrapper object + * @return Returns a Svg wrapper around the parent node of the current node. If the parent node is not existing or it's not an SVG node then this function will return null. + */ + parent() { + return this._node.parentNode instanceof SVGElement + ? new Svg(this._node.parentNode) + : null; + } + + /** + * This method returns a Svg wrapper around the root SVG element of the current tree. + * @return The root SVG element wrapped in a Svg element + */ + root() { + let node = this._node; + + while (node.nodeName !== 'svg') { + if (node.parentElement) { + node = node.parentElement; + } else { + break; + } + } + + return new Svg(node); + } + + /** + * Find the first child SVG element of the current element that matches a CSS selector. The returned object is a Svg wrapper. + * @param selector A CSS selector that is used to query for child SVG elements + * @return The SVG wrapper for the element found or null if no element was found + */ + querySelector(selector: string) { + const foundNode = this._node.querySelector(selector); + return foundNode ? new Svg(foundNode) : null; + } + + /** + * Find the all child SVG elements of the current element that match a CSS selector. The returned object is a Svg.List wrapper. + * @param selector A CSS selector that is used to query for child SVG elements + * @return The SVG wrapper list for the element found or null if no element was found + */ + querySelectorAll(selector: string) { + const foundNodes = this._node.querySelectorAll(selector); + return new SvgList(foundNodes); + } + + /** + * Returns the underlying SVG node for the current element. + */ + getNode() { + return this._node; + } + + /** + * This method creates a foreignObject (see https://developer.mozilla.org/en-US/docs/Web/SVG/Element/foreignObject) that allows to embed HTML content into a SVG graphic. With the help of foreignObjects you can enable the usage of regular HTML elements inside of SVG where they are subject for SVG positioning and transformation but the Browser will use the HTML rendering capabilities for the containing DOM. + * @param content The DOM Node, or HTML string that will be converted to a DOM Node, that is then placed into and wrapped by the foreignObject + * @param attributes An object with properties that will be added as attributes to the foreignObject element that is created. Attributes with undefined values will not be added. + * @param className This class or class list will be added to the SVG element + * @param insertFirst Specifies if the foreignObject should be inserted as first child + * @return New wrapper object that wraps the foreignObject element + */ + foreignObject( + content: string | Node, + attributes?: Attributes, + className?: string, + insertFirst = false + ) { + let contentNode: Node; + // If content is string then we convert it to DOM + // TODO: Handle case where content is not a string nor a DOM Node + if (typeof content === 'string') { + const container = document.createElement('div'); + container.innerHTML = content; + contentNode = container.firstChild as Node; + } else { + contentNode = content; + } + + if (contentNode instanceof Element) { + // Adding namespace to content element + contentNode.setAttribute('xmlns', namespaces.xmlns); + } + + // Creating the foreignObject without required extension attribute (as described here + // http://www.w3.org/TR/SVG/extend.html#ForeignObjectElement) + const fnObj = this.elem( + 'foreignObject', + attributes, + className, + insertFirst + ); + + // Add content to foreignObjectElement + fnObj._node.appendChild(contentNode); + + return fnObj; + } + + /** + * This method adds a new text element to the current Svg wrapper. + * @param t The text that should be added to the text element that is created + * @return The same wrapper object that was used to add the newly created element + */ + text(t: string) { + this._node.appendChild(document.createTextNode(t)); + return this; + } + + /** + * This method will clear all child nodes of the current wrapper object. + * @return The same wrapper object that got emptied + */ + empty() { + while (this._node.firstChild) { + this._node.removeChild(this._node.firstChild); + } + + return this; + } + + /** + * This method will cause the current wrapper to remove itself from its parent wrapper. Use this method if you'd like to get rid of an element in a given DOM structure. + * @return The parent wrapper object of the element that got removed + */ + remove() { + this._node.parentNode?.removeChild(this._node); + return this.parent(); + } + + /** + * This method will replace the element with a new element that can be created outside of the current DOM. + * @param newElement The new Svg object that will be used to replace the current wrapper object + * @return The wrapper of the new element + */ + replace(newElement: Svg) { + this._node.parentNode?.replaceChild(newElement._node, this._node); + return newElement; + } + + /** + * This method will append an element to the current element as a child. + * @param element The Svg element that should be added as a child + * @param insertFirst Specifies if the element should be inserted as first child + * @return The wrapper of the appended object + */ + append(element: Svg, insertFirst = false) { + if (insertFirst && this._node.firstChild) { + this._node.insertBefore(element._node, this._node.firstChild); + } else { + this._node.appendChild(element._node); + } + + return this; + } + + /** + * Returns an array of class names that are attached to the current wrapper element. This method can not be chained further. + * @return A list of classes or an empty array if there are no classes on the current element + */ + classes() { + const classNames = this._node.getAttribute('class'); + + return classNames ? classNames.trim().split(/\s+/) : []; + } + + /** + * Adds one or a space separated list of classes to the current element and ensures the classes are only existing once. + * @param names A white space separated list of class names + * @return The wrapper of the current element + */ + addClass(names: string) { + this._node.setAttribute( + 'class', + this.classes() + .concat(names.trim().split(/\s+/)) + .filter(function (elem, pos, self) { + return self.indexOf(elem) === pos; + }) + .join(' ') + ); + + return this; + } + + /** + * Removes one or a space separated list of classes from the current element. + * @param names A white space separated list of class names + * @return The wrapper of the current element + */ + removeClass(names: string) { + const removedClasses = names.trim().split(/\s+/); + + this._node.setAttribute( + 'class', + this.classes() + .filter(name => removedClasses.indexOf(name) === -1) + .join(' ') + ); + + return this; + } + + /** + * Removes all classes from the current element. + * @return The wrapper of the current element + */ + removeAllClasses() { + this._node.setAttribute('class', ''); + return this; + } + + /** + * Get element height using `getBoundingClientRect` + * @return The elements height in pixels + */ + height() { + return this._node.getBoundingClientRect().height; + } + + /** + * Get element width using `getBoundingClientRect` + * @return The elements width in pixels + */ + width() { + return this._node.getBoundingClientRect().width; + } + + /** + * The animate function lets you animate the current element with SMIL animations. You can add animations for multiple attributes at the same time by using an animation definition object. This object should contain SMIL animation attributes. Please refer to http://www.w3.org/TR/SVG/animate.html for a detailed specification about the available animation attributes. Additionally an easing property can be passed in the animation definition object. This can be a string with a name of an easing function in `Svg.Easing` or an array with four numbers specifying a cubic Bézier curve. + * **An animations object could look like this:** + * ```javascript + * element.animate({ + * opacity: { + * dur: 1000, + * from: 0, + * to: 1 + * }, + * x1: { + * dur: '1000ms', + * from: 100, + * to: 200, + * easing: 'easeOutQuart' + * }, + * y1: { + * dur: '2s', + * from: 0, + * to: 100 + * } + * }); + * ``` + * **Automatic unit conversion** + * For the `dur` and the `begin` animate attribute you can also omit a unit by passing a number. The number will automatically be converted to milli seconds. + * **Guided mode** + * The default behavior of SMIL animations with offset using the `begin` attribute is that the attribute will keep it's original value until the animation starts. Mostly this behavior is not desired as you'd like to have your element attributes already initialized with the animation `from` value even before the animation starts. Also if you don't specify `fill="freeze"` on an animate element or if you delete the animation after it's done (which is done in guided mode) the attribute will switch back to the initial value. This behavior is also not desired when performing simple one-time animations. For one-time animations you'd want to trigger animations immediately instead of relative to the document begin time. That's why in guided mode Svg will also use the `begin` property to schedule a timeout and manually start the animation after the timeout. If you're using multiple SMIL definition objects for an attribute (in an array), guided mode will be disabled for this attribute, even if you explicitly enabled it. + * If guided mode is enabled the following behavior is added: + * - Before the animation starts (even when delayed with `begin`) the animated attribute will be set already to the `from` value of the animation + * - `begin` is explicitly set to `indefinite` so it can be started manually without relying on document begin time (creation) + * - The animate element will be forced to use `fill="freeze"` + * - The animation will be triggered with `beginElement()` in a timeout where `begin` of the definition object is interpreted in milli seconds. If no `begin` was specified the timeout is triggered immediately. + * - After the animation the element attribute value will be set to the `to` value of the animation + * - The animate element is deleted from the DOM + * @param animations An animations object where the property keys are the attributes you'd like to animate. The properties should be objects again that contain the SMIL animation attributes (usually begin, dur, from, and to). The property begin and dur is auto converted (see Automatic unit conversion). You can also schedule multiple animations for the same attribute by passing an Array of SMIL definition objects. Attributes that contain an array of SMIL definition objects will not be executed in guided mode. + * @param guided Specify if guided mode should be activated for this animation (see Guided mode). If not otherwise specified, guided mode will be activated. + * @param eventEmitter If specified, this event emitter will be notified when an animation starts or ends. + * @return The current element where the animation was added + */ + animate( + animations: Record<string, AnimationDefinition | AnimationDefinition[]>, + guided = true, + eventEmitter?: EventEmitter + ) { + Object.keys(animations).forEach(attribute => { + const attributeAnimation = animations[attribute]; + + // If current attribute is an array of definition objects we create an animate for each and disable guided mode + if (Array.isArray(attributeAnimation)) { + attributeAnimation.forEach(animationDefinition => + createAnimation( + this, + attribute, + animationDefinition, + false, + eventEmitter + ) + ); + } else { + createAnimation( + this, + attribute, + attributeAnimation, + guided, + eventEmitter + ); + } + }); + + return this; + } +} + +/** + * This method checks for support of a given SVG feature like Extensibility, SVG-animation or the like. Check http://www.w3.org/TR/SVG11/feature for a detailed list. + * @todo Drop. + * @param feature The SVG 1.1 feature that should be checked for support. + * @return True of false if the feature is supported or not + */ +export function isSupported(feature: string) { + return document.implementation.hasFeature( + 'http://www.w3.org/TR/SVG11/feature#' + feature, + '1.1' + ); +} diff --git a/src/svg/SvgList.ts b/src/svg/SvgList.ts new file mode 100644 index 00000000..e0d56261 --- /dev/null +++ b/src/svg/SvgList.ts @@ -0,0 +1,90 @@ +import { Svg } from './Svg'; + +type SvgMethods = Exclude< + keyof Svg, + | 'constructor' + | 'parent' + | 'querySelector' + | 'querySelectorAll' + | 'replace' + | 'append' + | 'classes' + | 'height' + | 'width' +>; + +type SvgListMethods = { + [method in SvgMethods]: (...args: Parameters<Svg[method]>) => SvgList; +}; + +/** + * This helper class is to wrap multiple `Svg` elements into a list where you can call the `Svg` functions on all elements in the list with one call. This is helpful when you'd like to perform calls with `Svg` on multiple elements. + * An instance of this class is also returned by `Svg.querySelectorAll`. + */ +export class SvgList implements SvgListMethods { + private svgElements: Svg[] = []; + + /** + * @param nodeList An Array of SVG DOM nodes or a SVG DOM NodeList (as returned by document.querySelectorAll) + */ + constructor(nodeList: ArrayLike<Element>) { + for (let i = 0; i < nodeList.length; i++) { + this.svgElements.push(new Svg(nodeList[i])); + } + } + + private call<T extends SvgMethods>(method: T, args: Parameters<Svg[T]>) { + this.svgElements.forEach(element => + Reflect.apply(element[method], element, args) + ); + return this; + } + + attr(...args: Parameters<Svg['attr']>) { + return this.call('attr', args); + } + + elem(...args: Parameters<Svg['elem']>) { + return this.call('elem', args); + } + + root(...args: Parameters<Svg['root']>) { + return this.call('root', args); + } + + getNode(...args: Parameters<Svg['getNode']>) { + return this.call('getNode', args); + } + + foreignObject(...args: Parameters<Svg['foreignObject']>) { + return this.call('foreignObject', args); + } + + text(...args: Parameters<Svg['text']>) { + return this.call('text', args); + } + + empty(...args: Parameters<Svg['empty']>) { + return this.call('empty', args); + } + + remove(...args: Parameters<Svg['remove']>) { + return this.call('remove', args); + } + + addClass(...args: Parameters<Svg['addClass']>) { + return this.call('addClass', args); + } + + removeClass(...args: Parameters<Svg['removeClass']>) { + return this.call('removeClass', args); + } + + removeAllClasses(...args: Parameters<Svg['removeAllClasses']>) { + return this.call('removeAllClasses', args); + } + + animate(...args: Parameters<Svg['animate']>) { + return this.call('animate', args); + } +} diff --git a/src/svg/svg-path.spec.js b/src/svg/SvgPath.spec.ts similarity index 96% rename from src/svg/svg-path.spec.js rename to src/svg/SvgPath.spec.ts index 292dbf65..7285e96f 100644 --- a/src/svg/svg-path.spec.js +++ b/src/svg/SvgPath.spec.ts @@ -1,9 +1,9 @@ -import { SvgPath } from './svg-path'; +import { SvgPath } from './SvgPath'; describe('Svg', () => { describe('SvgPath', () => { it('should handle position updates correctly', () => { - const path = new SvgPath(); + const path: any = new SvgPath(); expect(path.position()).toBe(0); expect(path.position(100).position()).toBe(0); expect(path.position(-1).position()).toBe(0); @@ -13,7 +13,7 @@ describe('Svg', () => { }); it('should add absolute and relative path elements correctly', () => { - const path = new SvgPath() + const path: any = new SvgPath() .move(1, 2) .move(3, 4, true) .line(5, 6) @@ -33,7 +33,7 @@ describe('Svg', () => { }); it('should insert new elements at correct position', () => { - const path = new SvgPath() + const path: any = new SvgPath() .move(1, 2) .move(7, 8) .move(9, 10) @@ -101,7 +101,7 @@ describe('Svg', () => { it('should parse complex path correctly', () => { const path = new SvgPath(false, { - accuracy: false + accuracy: 0 }).parse( 'M7.566371681415929,313.5870318472049L15.132743362831858,322.1479887268699L22.699115044247787,292.49058976570063L30.265486725663717,284.9469379116152L37.83185840707964,277.62070141556273L45.39823008849557,285.4043086222666L52.9646017699115,295.16905806058617L60.530973451327434,288.5395967440654L68.09734513274336,282.3023155078293L75.66371681415929,276.9420221519757L83.23008849557522,271.31296300227655L90.79646017699115,273.1827546735411L98.36283185840708,282.72148250847295L105.929203539823,276.55760703185683L113.49557522123892,278.16318930715545L121.06194690265487,279.67913384762466L128.6283185840708,296.53529757775897L136.1946902654867,324.4003397770142L143.76106194690263,317.1376004332516L151.32743362831857,323.3390406432677L158.89380530973452,328.5597479599146L166.46017699115043,329.67851354926904L174.02654867256635,327.71837583373326L181.5929203539823,335.05972598190976L189.15929203539824,334.29372633331286L196.72566371681415,332.68724934321176L204.29203539823007,330.6752327006325L211.858407079646,325.971917329413L219.42477876106196,328.13057177790404L226.99115044247785,309.6546479835954L234.5575221238938,310.6637826993739L242.12389380530973,310.65221523366176L249.69026548672568,318.40285733188773L257.2566371681416,298.18154267575227L264.8230088495575,307.4788389000347L272.3893805309734,304.189264255087L279.95575221238937,289.0288876874009L287.52212389380526,300.20654714775424L295.0884955752212,298.0164127652739L302.65486725663715,287.69192345832175L310.2212389380531,293.1860711045035L317.78761061946904,300.4760502113585L325.3539823008849,297.94852206276937L332.92035398230087,305.6594311405378L340.4867256637168,306.7859423144216L348.0530973451327,275.68998851331963L355.61946902654864,286.5550640745874L363.1858407079646,288.4952543187362L370.75221238938053,290.1896066608983L378.3185840707965,277.8447927515142L385.88495575221236,282.46018876596827L393.4513274336283,261.617847596371L401.01769911504425,265.06101027918726L408.58407079646014,264.60492966286677L416.1504424778761,252.35288845280365L423.716814159292,239.29220756750195L431.283185840708,229.73170018586225L438.8495575221239,224.1580859168795L446.41592920353986,217.20551113129414L453.9823008849557,212.63435660265037L461.54867256637164,210.4425212857057L469.1150442477876,201.0077146146342L476.6814159292035,182.3934004122068L484.24778761061947,176.98732946386616L491.8141592920354,175.3660655079267L499.38053097345136,181.1589144624976L506.9469026548673,172.81581557677976L514.5132743362832,177.82343674256106L522.079646017699,183.5573714672562L529.646017699115,184.4980688436067L537.2123893805309,201.60789339862924L544.7787610619469,193.42268767053048L552.3451327433628,209.9219909677575L559.9115044247787,221.1318944868172L567.4778761061947,222.47350026973174L575.0442477876105,229.94061399967882L582.6106194690265,213.57676800697396L590.1769911504424,232.97280246785252L597.7433628318583,232.8915724787845L605.3097345132743,231.486089735319L612.8761061946902,234.26534000120475L620.4424778761062,219.90951817170736L628.0088495575221,214.36149678900725L635.5752212389381,204.7245641444236L643.1415929203539,205.04759319834227L650.7079646017698,178.61624621480792L658.2743362831858,174.30656351022486L665.8407079646017,194.06864637030463L673.4070796460177,191.38404795482728L680.9734513274336,188.88380371217903L688.5398230088496,182.47430260433697L696.1061946902654,192.70175438596493L703.6725663716813,182.37945067166908L711.2389380530973,163.80499447227572L718.8053097345132,157.4839718811134L726.3716814159292,149.57403342725343L733.9380530973451,142.6076734278762L741.5044247787611,144.9954413314636L749.070796460177,152.29112878815386L756.637168141593,150.02544379977235L764.2035398230088,139.40203164917125L771.7699115044247,149.22935357717972L779.3362831858407,155.78116263659354L786.9026548672566,145.09966219897575L794.4690265486726,157.52407467202426L802.0353982300885,147.01645902195105L809.6017699115044,141.8658056183404L817.1681415929203,134.36135158737966L824.7345132743362,127.49269525433283L832.3008849557522,120.25886939571154L839.8672566371681,118.26230310074709L847.433628318584,98.76959064327474' ); @@ -111,7 +111,7 @@ describe('Svg', () => { }); it('should scale path along both axes', () => { - const path = new SvgPath() + const path: any = new SvgPath() .move(1, 2) .line(3, 4) .curve(5, 6, 7, 8, 9, 10) @@ -125,7 +125,7 @@ describe('Svg', () => { }); it('should translate path along both axes', () => { - const path = new SvgPath() + const path: any = new SvgPath() .move(1, 2) .line(3, 4) .curve(5, 6, 7, 8, 9, 10) @@ -139,16 +139,18 @@ describe('Svg', () => { }); it('should transform path correctly with custom function', () => { - const path = new SvgPath() + const path: any = new SvgPath() .move(1, 2) .line(3, 4) .curve(5, 6, 7, 8, 9, 10) - .transform((element, paramName, elementIndex, paramIndex) => { + .transform((_element, paramName, _elementIndex, paramIndex) => { if (paramIndex > 3) { return 0; - } else if (paramName[0] === 'y') { + } else if (String(paramName)[0] === 'y') { return 100; } + + return undefined; }); expect(path.pathElements).toEqual([ @@ -159,7 +161,7 @@ describe('Svg', () => { }); it('should split correctly by move command', () => { - const paths = new SvgPath() + const paths: any = new SvgPath() .parse('M0,0L0,0L0,0L0,0M0,0L0,0L0,0L0,0') .splitByCommand('M'); expect(paths.length).toBe(2); @@ -170,7 +172,7 @@ describe('Svg', () => { }); it('should split correctly by move command and tailing move element', () => { - const paths = new SvgPath() + const paths: any = new SvgPath() .parse('M0,0L0,0L0,0L0,0M0,0L0,0L0,0L0,0M0,0') .splitByCommand('M'); expect(paths.length).toBe(3); @@ -178,7 +180,7 @@ describe('Svg', () => { }); it('should split correctly by move command and leading other commands', () => { - const paths = new SvgPath() + const paths: any = new SvgPath() .parse('L0,0C0,0,0,0,0,0M0,0L0,0L0,0L0,0M0,0L0,0L0,0L0,0') .splitByCommand('M'); expect(paths.length).toBe(3); diff --git a/src/svg/svg-path.js b/src/svg/SvgPath.ts similarity index 52% rename from src/svg/svg-path.js rename to src/svg/SvgPath.ts index 14bbc970..b71c02d8 100644 --- a/src/svg/svg-path.js +++ b/src/svg/SvgPath.ts @@ -1,12 +1,11 @@ -import { extend } from '../core/core'; +import { extend } from '../utils'; +import type { SegmentData } from '../core'; +import type { SvgPathOptions, PathCommand, PathParams } from './types'; /** * Contains the descriptors of supported element types in a SVG path. Currently only move, line and curve are supported. - * - * @memberof SvgPath - * @type {Object} */ -const elementDescriptions = { +const elementDescriptions: Record<string, string[]> = { m: ['x', 'y'], l: ['x', 'y'], c: ['x1', 'y1', 'x2', 'y2', 'x', 'y'], @@ -15,17 +14,21 @@ const elementDescriptions = { /** * Default options for newly created SVG path objects. - * - * @memberof SvgPath - * @type {Object} */ const defaultOptions = { // The accuracy in digit count after the decimal point. This will be used to round numbers in the SVG path. If this option is set to false then no rounding will be performed. accuracy: 3 }; -function element(command, params, pathElements, pos, relative, data) { - const pathElement = extend( +function element( + command: string, + params: PathParams, + pathElements: PathCommand[], + pos: number, + relative: boolean, + data?: SegmentData +) { + const pathElement: PathCommand = extend( { command: relative ? command.toLowerCase() : command.toUpperCase() }, @@ -36,35 +39,39 @@ function element(command, params, pathElements, pos, relative, data) { pathElements.splice(pos, 0, pathElement); } -function forEachParam(pathElements, cb) { +function forEachParam<T extends PathParams = PathParams>( + pathElements: PathCommand<T>[], + cb: ( + cmd: PathCommand<T>, + param: keyof T, + cmdIndex: number, + paramIndex: number, + cmds: PathCommand<T>[] + ) => void +) { pathElements.forEach((pathElement, pathElementIndex) => { elementDescriptions[pathElement.command.toLowerCase()].forEach( (paramName, paramIndex) => { - cb(pathElement, paramName, pathElementIndex, paramIndex, pathElements); + cb( + pathElement, + paramName as keyof PathParams, + pathElementIndex, + paramIndex, + pathElements + ); } ); }); } -/** - * Used to construct a new path object. - * - * @memberof SvgPath - * @param {Boolean} close If set to true then this path will be closed when stringified (with a Z at the end) - * @param {Object} options Options object that overrides the default objects. See default options for more details. - * @constructor - */ export class SvgPath { /** * This static function on `SvgPath` is joining multiple paths together into one paths. - * - * @memberof SvgPath - * @param {Array<SvgPath>} paths A list of paths to be joined together. The order is important. - * @param {boolean} [close] If the newly created path should be a closed path - * @param {Object} [options] Path options for the newly created path. - * @return {SvgPath} + * @param paths A list of paths to be joined together. The order is important. + * @param close If the newly created path should be a closed path + * @param options Path options for the newly created path. */ - static join(paths, close, options) { + static join(paths: SvgPath[], close = false, options?: SvgPathOptions) { const joinedPath = new SvgPath(close, options); for (let i = 0; i < paths.length; i++) { const path = paths[i]; @@ -75,21 +82,27 @@ export class SvgPath { return joinedPath; } - constructor(close, options) { - this.pathElements = []; - this.pos = 0; - this.close = close; + pathElements: PathCommand[] = []; + private pos = 0; + private options: Required<SvgPathOptions>; + + /** + * Used to construct a new path object. + * @param close If set to true then this path will be closed when stringified (with a Z at the end) + * @param options Options object that overrides the default objects. See default options for more details. + */ + constructor(private readonly close = false, options?: SvgPathOptions) { this.options = extend({}, defaultOptions, options); } /** * Gets or sets the current position (cursor) inside of the path. You can move around the cursor freely but limited to 0 or the count of existing elements. All modifications with element functions will insert new elements at the position of this cursor. - * - * @memberof SvgPath - * @param {Number} [pos] If a number is passed then the cursor is set to this position in the path element array. - * @return {SvgPath|Number} If the position parameter was passed then the return value will be the path object for easy call chaining. If no position parameter was passed then the current position is returned. + * @param pos If a number is passed then the cursor is set to this position in the path element array. + * @return If the position parameter was passed then the return value will be the path object for easy call chaining. If no position parameter was passed then the current position is returned. */ - position(pos) { + position(pos: number): this; + position(): number; + position(pos?: number) { if (pos !== undefined) { this.pos = Math.max(0, Math.min(this.pathElements.length, pos)); return this; @@ -100,27 +113,23 @@ export class SvgPath { /** * Removes elements from the path starting at the current position. - * - * @memberof SvgPath - * @param {Number} count Number of path elements that should be removed from the current position. - * @return {SvgPath} The current path object for easy call chaining. + * @param count Number of path elements that should be removed from the current position. + * @return The current path object for easy call chaining. */ - remove(count) { + remove(count: number) { this.pathElements.splice(this.pos, count); return this; } /** * Use this function to add a new move SVG path element. - * - * @memberof SvgPath - * @param {Number} x The x coordinate for the move element. - * @param {Number} y The y coordinate for the move element. - * @param {Boolean} [relative] If set to true the move element will be created with relative coordinates (lowercase letter) - * @param {*} [data] Any data that should be stored with the element object that will be accessible in pathElement - * @return {SvgPath} The current path object for easy call chaining. + * @param x The x coordinate for the move element. + * @param y The y coordinate for the move element. + * @param relative If set to true the move element will be created with relative coordinates (lowercase letter) + * @param data Any data that should be stored with the element object that will be accessible in pathElement + * @return The current path object for easy call chaining. */ - move(x, y, relative, data) { + move(x: number, y: number, relative = false, data?: SegmentData) { element( 'M', { @@ -137,15 +146,13 @@ export class SvgPath { /** * Use this function to add a new line SVG path element. - * - * @memberof SvgPath - * @param {Number} x The x coordinate for the line element. - * @param {Number} y The y coordinate for the line element. - * @param {Boolean} [relative] If set to true the line element will be created with relative coordinates (lowercase letter) - * @param {*} [data] Any data that should be stored with the element object that will be accessible in pathElement - * @return {SvgPath} The current path object for easy call chaining. + * @param x The x coordinate for the line element. + * @param y The y coordinate for the line element. + * @param relative If set to true the line element will be created with relative coordinates (lowercase letter) + * @param data Any data that should be stored with the element object that will be accessible in pathElement + * @return The current path object for easy call chaining. */ - line(x, y, relative, data) { + line(x: number, y: number, relative = false, data?: SegmentData) { element( 'L', { @@ -162,19 +169,26 @@ export class SvgPath { /** * Use this function to add a new curve SVG path element. - * - * @memberof SvgPath - * @param {Number} x1 The x coordinate for the first control point of the bezier curve. - * @param {Number} y1 The y coordinate for the first control point of the bezier curve. - * @param {Number} x2 The x coordinate for the second control point of the bezier curve. - * @param {Number} y2 The y coordinate for the second control point of the bezier curve. - * @param {Number} x The x coordinate for the target point of the curve element. - * @param {Number} y The y coordinate for the target point of the curve element. - * @param {Boolean} [relative] If set to true the curve element will be created with relative coordinates (lowercase letter) - * @param {*} [data] Any data that should be stored with the element object that will be accessible in pathElement - * @return {SvgPath} The current path object for easy call chaining. + * @param x1 The x coordinate for the first control point of the bezier curve. + * @param y1 The y coordinate for the first control point of the bezier curve. + * @param x2 The x coordinate for the second control point of the bezier curve. + * @param y2 The y coordinate for the second control point of the bezier curve. + * @param x The x coordinate for the target point of the curve element. + * @param y The y coordinate for the target point of the curve element. + * @param relative If set to true the curve element will be created with relative coordinates (lowercase letter) + * @param data Any data that should be stored with the element object that will be accessible in pathElement + * @return The current path object for easy call chaining. */ - curve(x1, y1, x2, y2, x, y, relative, data) { + curve( + x1: number, + y1: number, + x2: number, + y2: number, + x: number, + y: number, + relative = false, + data?: SegmentData + ) { element( 'C', { @@ -195,30 +209,38 @@ export class SvgPath { /** * Use this function to add a new non-bezier curve SVG path element. - * - * @memberof SvgPath - * @param {Number} rx The radius to be used for the x-axis of the arc. - * @param {Number} ry The radius to be used for the y-axis of the arc. - * @param {Number} xAr Defines the orientation of the arc - * @param {Number} lAf Large arc flag - * @param {Number} sf Sweep flag - * @param {Number} x The x coordinate for the target point of the curve element. - * @param {Number} y The y coordinate for the target point of the curve element. - * @param {Boolean} [relative] If set to true the curve element will be created with relative coordinates (lowercase letter) - * @param {*} [data] Any data that should be stored with the element object that will be accessible in pathElement - * @return {SvgPath} The current path object for easy call chaining. + * @param rx The radius to be used for the x-axis of the arc. + * @param ry The radius to be used for the y-axis of the arc. + * @param xAr Defines the orientation of the arc + * @param lAf Large arc flag + * @param sf Sweep flag + * @param x The x coordinate for the target point of the curve element. + * @param y The y coordinate for the target point of the curve element. + * @param relative If set to true the curve element will be created with relative coordinates (lowercase letter) + * @param data Any data that should be stored with the element object that will be accessible in pathElement + * @return The current path object for easy call chaining. */ - arc(rx, ry, xAr, lAf, sf, x, y, relative, data) { + arc( + rx: number, + ry: number, + xAr: number, + lAf: number, + sf: number, + x: number, + y: number, + relative = false, + data?: SegmentData + ) { element( 'A', { - rx: +rx, - ry: +ry, - xAr: +xAr, - lAf: +lAf, - sf: +sf, - x: +x, - y: +y + rx, + ry, + xAr, + lAf, + sf, + x, + y }, this.pathElements, this.pos++, @@ -230,18 +252,16 @@ export class SvgPath { /** * Parses an SVG path seen in the d attribute of path elements, and inserts the parsed elements into the existing path object at the current cursor position. Any closing path indicators (Z at the end of the path) will be ignored by the parser as this is provided by the close option in the options of the path object. - * - * @memberof SvgPath - * @param {String} path Any SVG path that contains move (m), line (l) or curve (c) components. - * @return {SvgPath} The current path object for easy call chaining. + * @param path Any SVG path that contains move (m), line (l) or curve (c) components. + * @return The current path object for easy call chaining. */ - parse(path) { + parse(path: string) { // Parsing the SVG path string into an array of arrays [['M', '10', '10'], ['L', '100', '100']] const chunks = path .replace(/([A-Za-z])([0-9])/g, '$1 $2') .replace(/([0-9])([A-Za-z])/g, '$1 $2') .split(/[\s,]+/) - .reduce((result, pathElement) => { + .reduce<string[][]>((result, pathElement) => { if (pathElement.match(/[A-Za-z]/)) { result.push([]); } @@ -258,18 +278,21 @@ export class SvgPath { // Using svgPathElementDescriptions to map raw path arrays into objects that contain the command and the parameters // For example {command: 'M', x: '10', y: '10'} const elements = chunks.map(chunk => { - const command = chunk.shift(); + const command = chunk.shift() as string; const description = elementDescriptions[command.toLowerCase()]; return extend( { command: command }, - description.reduce((result, paramName, index) => { - result[paramName] = +chunk[index]; - return result; - }, {}) - ); + description.reduce<Record<string, number>>( + (result, paramName, index) => { + result[paramName] = +chunk[index]; + return result; + }, + {} + ) + ) as PathCommand; }); // Preparing a splice call with the elements array as var arg params and insert the parsed elements at the current position @@ -282,9 +305,6 @@ export class SvgPath { /** * This function renders to current SVG path object into a final SVG string that can be used in the d attribute of SVG path elements. It uses the accuracy option to round big decimals. If the close parameter was set in the constructor of this path object then a path closing Z will be appended to the output string. - * - * @memberof SvgPath - * @return {String} */ stringify() { const accuracyMultiplier = Math.pow(10, this.options.accuracy); @@ -293,12 +313,13 @@ export class SvgPath { this.pathElements.reduce((path, pathElement) => { const params = elementDescriptions[ pathElement.command.toLowerCase() - ].map(paramName => - this.options.accuracy - ? Math.round(pathElement[paramName] * accuracyMultiplier) / - accuracyMultiplier - : pathElement[paramName] - ); + ].map(paramName => { + const value = pathElement[paramName as keyof PathCommand] as number; + + return this.options.accuracy + ? Math.round(value * accuracyMultiplier) / accuracyMultiplier + : value; + }); return path + pathElement.command + params.join(','); }, '') + (this.close ? 'Z' : '') @@ -307,35 +328,27 @@ export class SvgPath { /** * Scales all elements in the current SVG path object. There is an individual parameter for each coordinate. Scaling will also be done for control points of curves, affecting the given coordinate. - * - * @memberof SvgPath - * @param {Number} x The number which will be used to scale the x, x1 and x2 of all path elements. - * @param {Number} y The number which will be used to scale the y, y1 and y2 of all path elements. - * @return {SvgPath} The current path object for easy call chaining. + * @param x The number which will be used to scale the x, x1 and x2 of all path elements. + * @param y The number which will be used to scale the y, y1 and y2 of all path elements. + * @return The current path object for easy call chaining. */ - scale(x, y) { - forEachParam( - this.pathElements, - (pathElement, paramName) => - (pathElement[paramName] *= paramName[0] === 'x' ? x : y) - ); + scale(x: number, y: number) { + forEachParam(this.pathElements, (pathElement, paramName) => { + pathElement[paramName] *= paramName[0] === 'x' ? x : y; + }); return this; } /** * Translates all elements in the current SVG path object. The translation is relative and there is an individual parameter for each coordinate. Translation will also be done for control points of curves, affecting the given coordinate. - * - * @memberof SvgPath - * @param {Number} x The number which will be used to translate the x, x1 and x2 of all path elements. - * @param {Number} y The number which will be used to translate the y, y1 and y2 of all path elements. - * @return {SvgPath} The current path object for easy call chaining. + * @param x The number which will be used to translate the x, x1 and x2 of all path elements. + * @param y The number which will be used to translate the y, y1 and y2 of all path elements. + * @return The current path object for easy call chaining. */ - translate(x, y) { - forEachParam( - this.pathElements, - (pathElement, paramName) => - (pathElement[paramName] += paramName[0] === 'x' ? x : y) - ); + translate(x: number, y: number) { + forEachParam(this.pathElements, (pathElement, paramName) => { + pathElement[paramName] += paramName[0] === 'x' ? x : y; + }); return this; } @@ -346,12 +359,18 @@ export class SvgPath { * function(pathElement, paramName, pathElementIndex, paramIndex, pathElements) * ``` * If something else than undefined is returned by the callback function, this value will be used to replace the old value. This allows you to build custom transformations of path objects that can't be achieved using the basic transformation functions scale and translate. - * - * @memberof SvgPath - * @param {Function} transformFnc The callback function for the transformation. Check the signature in the function description. - * @return {SvgPath} The current path object for easy call chaining. + * @param transformFnc The callback function for the transformation. Check the signature in the function description. + * @return The current path object for easy call chaining. */ - transform(transformFnc) { + transform( + transformFnc: <T extends PathParams = PathParams>( + cmd: PathCommand<T>, + param: keyof T, + cmdIndex: number, + paramIndex: number, + cmds: PathCommand<T>[] + ) => number | void + ) { forEachParam( this.pathElements, (pathElement, paramName, pathElementIndex, paramIndex, pathElements) => { @@ -372,12 +391,9 @@ export class SvgPath { /** * This function clones a whole path object with all its properties. This is a deep clone and path element objects will also be cloned. - * - * @memberof SvgPath - * @param {Boolean} [close] Optional option to set the new cloned path to closed. If not specified or false, the original path close option will be used. - * @return {SvgPath} + * @param close Optional option to set the new cloned path to closed. If not specified or false, the original path close option will be used. */ - clone(close) { + clone(close = false) { const clone = new SvgPath(close || this.close); clone.pos = this.pos; clone.pathElements = this.pathElements @@ -389,12 +405,9 @@ export class SvgPath { /** * Split a Svg.Path object by a specific command in the path chain. The path chain will be split and an array of newly created paths objects will be returned. This is useful if you'd like to split an SVG path by it's move commands, for example, in order to isolate chunks of drawings. - * - * @memberof SvgPath - * @param {String} command The command you'd like to use to split the path - * @return {Array<SvgPath>} + * @param command The command you'd like to use to split the path */ - splitByCommand(command) { + splitByCommand(command: string) { const split = [new SvgPath()]; this.pathElements.forEach(pathElement => { diff --git a/src/svg/animation.ts b/src/svg/animation.ts new file mode 100644 index 00000000..68ad8676 --- /dev/null +++ b/src/svg/animation.ts @@ -0,0 +1,142 @@ +import type { EventEmitter } from '../event'; +import { ensureUnit, quantity } from '../core/lang'; +import { extend } from '../utils'; +import type { Attributes, AnimationDefinition } from './types'; +import type { Svg } from './svg'; + +/** + * This Object contains some standard easing cubic bezier curves. + * Then can be used with their name in the `Svg.animate`. + * You can also extend the list and use your own name in the `animate` function. + * Click the show code button to see the available bezier functions. + */ +export const easings = { + easeInSine: [0.47, 0, 0.745, 0.715], + easeOutSine: [0.39, 0.575, 0.565, 1], + easeInOutSine: [0.445, 0.05, 0.55, 0.95], + easeInQuad: [0.55, 0.085, 0.68, 0.53], + easeOutQuad: [0.25, 0.46, 0.45, 0.94], + easeInOutQuad: [0.455, 0.03, 0.515, 0.955], + easeInCubic: [0.55, 0.055, 0.675, 0.19], + easeOutCubic: [0.215, 0.61, 0.355, 1], + easeInOutCubic: [0.645, 0.045, 0.355, 1], + easeInQuart: [0.895, 0.03, 0.685, 0.22], + easeOutQuart: [0.165, 0.84, 0.44, 1], + easeInOutQuart: [0.77, 0, 0.175, 1], + easeInQuint: [0.755, 0.05, 0.855, 0.06], + easeOutQuint: [0.23, 1, 0.32, 1], + easeInOutQuint: [0.86, 0, 0.07, 1], + easeInExpo: [0.95, 0.05, 0.795, 0.035], + easeOutExpo: [0.19, 1, 0.22, 1], + easeInOutExpo: [1, 0, 0, 1], + easeInCirc: [0.6, 0.04, 0.98, 0.335], + easeOutCirc: [0.075, 0.82, 0.165, 1], + easeInOutCirc: [0.785, 0.135, 0.15, 0.86], + easeInBack: [0.6, -0.28, 0.735, 0.045], + easeOutBack: [0.175, 0.885, 0.32, 1.275], + easeInOutBack: [0.68, -0.55, 0.265, 1.55] +}; + +export function createAnimation( + element: Svg, + attribute: string, + animationDefinition: AnimationDefinition, + createGuided = false, + eventEmitter?: EventEmitter +) { + const attributeProperties: Attributes = {}; + let animationEasing; + let timeout; + + // Check if an easing is specified in the definition object and delete it from the object as it will not + // be part of the animate element attributes. + if (animationDefinition.easing) { + // If already an easing Bézier curve array we take it or we lookup a easing array in the Easing object + animationEasing = Array.isArray(animationDefinition.easing) + ? animationDefinition.easing + : easings[animationDefinition.easing]; + delete animationDefinition.easing; + } + + // If numeric dur or begin was provided we assume milli seconds + animationDefinition.begin = ensureUnit(animationDefinition.begin, 'ms'); + animationDefinition.dur = ensureUnit(animationDefinition.dur, 'ms'); + + if (animationEasing) { + animationDefinition.calcMode = 'spline'; + animationDefinition.keySplines = animationEasing.join(' '); + animationDefinition.keyTimes = '0;1'; + } + + // Adding "fill: freeze" if we are in guided mode and set initial attribute values + if (createGuided) { + animationDefinition.fill = 'freeze'; + // Animated property on our element should already be set to the animation from value in guided mode + attributeProperties[attribute] = animationDefinition.from; + element.attr(attributeProperties); + + // In guided mode we also set begin to indefinite so we can trigger the start manually and put the begin + // which needs to be in ms aside + timeout = quantity(animationDefinition.begin || 0).value; + animationDefinition.begin = 'indefinite'; + } + + const animate = element.elem( + 'animate', + extend( + { + attributeName: attribute + }, + animationDefinition + ) + ); + + if (createGuided) { + // If guided we take the value that was put aside in timeout and trigger the animation manually with a timeout + setTimeout(() => { + // If beginElement fails we set the animated attribute to the end position and remove the animate element + // This happens if the SMIL ElementTimeControl interface is not supported or any other problems occurred in + // the browser. (Currently FF 34 does not support animate elements in foreignObjects) + try { + // @ts-expect-error Try legacy API. + animate._node.beginElement(); + } catch (err) { + // Set animated attribute to current animated value + attributeProperties[attribute] = animationDefinition.to; + element.attr(attributeProperties); + // Remove the animate element as it's no longer required + animate.remove(); + } + }, timeout); + } + + const animateNode = animate.getNode(); + + if (eventEmitter) { + animateNode.addEventListener('beginEvent', () => + eventEmitter.emit('animationBegin', { + element: element, + animate: animateNode, + params: animationDefinition + }) + ); + } + + animateNode.addEventListener('endEvent', () => { + if (eventEmitter) { + eventEmitter.emit('animationEnd', { + element: element, + animate: animateNode, + params: animationDefinition + }); + } + + if (createGuided) { + // Set animated attribute to current animated value + attributeProperties[attribute] = animationDefinition.to; + element.attr(attributeProperties); + // Remove the animate element as it's no longer required + animate.remove(); + } + }); +} diff --git a/src/svg/index.ts b/src/svg/index.ts new file mode 100644 index 00000000..b187ea5f --- /dev/null +++ b/src/svg/index.ts @@ -0,0 +1,4 @@ +export { easings } from './animation'; +export * from './Svg'; +export * from './SvgPath'; +export * from './SvgList'; diff --git a/src/svg/svg-list.js b/src/svg/svg-list.js deleted file mode 100644 index 458e1485..00000000 --- a/src/svg/svg-list.js +++ /dev/null @@ -1,46 +0,0 @@ -import { Svg } from './svg'; - -/** - * This helper class is to wrap multiple `Svg` elements into a list where you can call the `Svg` functions on all elements in the list with one call. This is helpful when you'd like to perform calls with `Svg` on multiple elements. - * An instance of this class is also returned by `Svg.querySelectorAll`. - * - * @memberof Svg - * @param {Array<Node>|NodeList} nodeList An Array of SVG DOM nodes or a SVG DOM NodeList (as returned by document.querySelectorAll) - * @constructor - */ -export class SvgList { - constructor(nodeList) { - const list = this; - - this.svgElements = []; - for (let i = 0; i < nodeList.length; i++) { - this.svgElements.push(new Svg(nodeList[i])); - } - - // Add delegation methods for Svg - Object.keys(Svg.prototype) - .filter( - prototypeProperty => - [ - 'constructor', - 'parent', - 'querySelector', - 'querySelectorAll', - 'replace', - 'append', - 'classes', - 'height', - 'width' - ].indexOf(prototypeProperty) === -1 - ) - .forEach(prototypeProperty => { - list[prototypeProperty] = () => { - const args = Array.from(arguments); - list.svgElements.forEach(element => - Svg.prototype[prototypeProperty].apply(element, args) - ); - return list; - }; - }); - } -} diff --git a/src/svg/svg.js b/src/svg/svg.js deleted file mode 100644 index d79bd932..00000000 --- a/src/svg/svg.js +++ /dev/null @@ -1,551 +0,0 @@ -import { namespaces, ensureUnit, quantity, extend } from '../core/core'; -import { SvgList } from './svg-list'; - -/** - * Svg creates a new SVG object wrapper with a starting element. You can use the wrapper to fluently create sub-elements and modify them. - * - * @memberof Svg - * @constructor - * @param {String|Element} name The name of the SVG element to create or an SVG dom element which should be wrapped into Svg - * @param {Object} attributes An object with properties that will be added as attributes to the SVG element that is created. Attributes with undefined values will not be added. - * @param {String} className This class or class list will be added to the SVG element - * @param {Object} parent The parent SVG wrapper object where this newly created wrapper and it's element will be attached to as child - * @param {Boolean} insertFirst If this param is set to true in conjunction with a parent element the newly created element will be added as first child element in the parent element - */ -export class Svg { - constructor(name, attributes, className, parent, insertFirst) { - // If Svg is getting called with an SVG element we just return the wrapper - if (name instanceof Element) { - this._node = name; - } else { - this._node = document.createElementNS(namespaces.svg, name); - - // If this is an SVG element created then custom namespace - if (name === 'svg') { - this.attr({ - 'xmlns:ct': namespaces.ct - }); - } - } - - if (attributes) { - this.attr(attributes); - } - - if (className) { - this.addClass(className); - } - - if (parent) { - if (insertFirst && parent._node.firstChild) { - parent._node.insertBefore(this._node, parent._node.firstChild); - } else { - parent._node.appendChild(this._node); - } - } - } - - /** - * Set attributes on the current SVG element of the wrapper you're currently working on. - * - * @memberof Svg - * @param {Object|String} attributes An object with properties that will be added as attributes to the SVG element that is created. Attributes with undefined values will not be added. If this parameter is a String then the function is used as a getter and will return the attribute value. - * @param {String} [ns] If specified, the attribute will be obtained using getAttributeNs. In order to write namepsaced attributes you can use the namespace:attribute notation within the attributes object. - * @return {Object|String} The current wrapper object will be returned so it can be used for chaining or the attribute value if used as getter function. - */ - attr(attributes, ns) { - if (typeof attributes === 'string') { - if (ns) { - return this._node.getAttributeNS(ns, attributes); - } else { - return this._node.getAttribute(attributes); - } - } - - Object.keys(attributes).forEach( - function (key) { - // If the attribute value is undefined we can skip this one - if (attributes[key] === undefined) { - return; - } - - if (key.indexOf(':') !== -1) { - const namespacedAttribute = key.split(':'); - this._node.setAttributeNS( - namespaces[namespacedAttribute[0]], - key, - attributes[key] - ); - } else { - this._node.setAttribute(key, attributes[key]); - } - }.bind(this) - ); - - return this; - } - - /** - * Create a new SVG element whose wrapper object will be selected for further operations. This way you can also create nested groups easily. - * - * @memberof Svg - * @param {String} name The name of the SVG element that should be created as child element of the currently selected element wrapper - * @param {Object} [attributes] An object with properties that will be added as attributes to the SVG element that is created. Attributes with undefined values will not be added. - * @param {String} [className] This class or class list will be added to the SVG element - * @param {Boolean} [insertFirst] If this param is set to true in conjunction with a parent element the newly created element will be added as first child element in the parent element - * @return {Svg} Returns a Svg wrapper object that can be used to modify the containing SVG data - */ - elem(name, attributes, className, insertFirst) { - return new Svg(name, attributes, className, this, insertFirst); - } - - /** - * Returns the parent Chartist.SVG wrapper object - * - * @memberof Svg - * @return {Svg} Returns a Svg wrapper around the parent node of the current node. If the parent node is not existing or it's not an SVG node then this function will return null. - */ - parent() { - return this._node.parentNode instanceof SVGElement - ? new Svg(this._node.parentNode) - : null; - } - - /** - * This method returns a Svg wrapper around the root SVG element of the current tree. - * - * @memberof Svg - * @return {Svg} The root SVG element wrapped in a Svg element - */ - root() { - let node = this._node; - while (node.nodeName !== 'svg') { - node = node.parentNode; - } - return new Svg(node); - } - - /** - * Find the first child SVG element of the current element that matches a CSS selector. The returned object is a Svg wrapper. - * - * @memberof Svg - * @param {String} selector A CSS selector that is used to query for child SVG elements - * @return {Svg} The SVG wrapper for the element found or null if no element was found - */ - querySelector(selector) { - const foundNode = this._node.querySelector(selector); - return foundNode ? new Svg(foundNode) : null; - } - - /** - * Find the all child SVG elements of the current element that match a CSS selector. The returned object is a Svg.List wrapper. - * - * @memberof Svg - * @param {String} selector A CSS selector that is used to query for child SVG elements - * @return {SvgList} The SVG wrapper list for the element found or null if no element was found - */ - querySelectorAll(selector) { - const foundNodes = this._node.querySelectorAll(selector); - return foundNodes.length ? new SvgList(foundNodes) : null; - } - - /** - * Returns the underlying SVG node for the current element. - * - * @memberof Svg - * @returns {Node} - */ - getNode() { - return this._node; - } - - /** - * This method creates a foreignObject (see https://developer.mozilla.org/en-US/docs/Web/SVG/Element/foreignObject) that allows to embed HTML content into a SVG graphic. With the help of foreignObjects you can enable the usage of regular HTML elements inside of SVG where they are subject for SVG positioning and transformation but the Browser will use the HTML rendering capabilities for the containing DOM. - * - * @memberof Svg - * @param {Node|String} content The DOM Node, or HTML string that will be converted to a DOM Node, that is then placed into and wrapped by the foreignObject - * @param {String} [attributes] An object with properties that will be added as attributes to the foreignObject element that is created. Attributes with undefined values will not be added. - * @param {String} [className] This class or class list will be added to the SVG element - * @param {Boolean} [insertFirst] Specifies if the foreignObject should be inserted as first child - * @return {Svg} New wrapper object that wraps the foreignObject element - */ - foreignObject(content, attributes, className, insertFirst) { - // If content is string then we convert it to DOM - // TODO: Handle case where content is not a string nor a DOM Node - if (typeof content === 'string') { - const container = document.createElement('div'); - container.innerHTML = content; - content = container.firstChild; - } - - // Adding namespace to content element - content.setAttribute('xmlns', namespaces.xmlns); - - // Creating the foreignObject without required extension attribute (as described here - // http://www.w3.org/TR/SVG/extend.html#ForeignObjectElement) - const fnObj = this.elem( - 'foreignObject', - attributes, - className, - insertFirst - ); - - // Add content to foreignObjectElement - fnObj._node.appendChild(content); - - return fnObj; - } - - /** - * This method adds a new text element to the current Svg wrapper. - * - * @memberof Svg - * @param {String} t The text that should be added to the text element that is created - * @return {Svg} The same wrapper object that was used to add the newly created element - */ - text(t) { - this._node.appendChild(document.createTextNode(t)); - return this; - } - - /** - * This method will clear all child nodes of the current wrapper object. - * - * @memberof Svg - * @return {Svg} The same wrapper object that got emptied - */ - empty() { - while (this._node.firstChild) { - this._node.removeChild(this._node.firstChild); - } - - return this; - } - - /** - * This method will cause the current wrapper to remove itself from its parent wrapper. Use this method if you'd like to get rid of an element in a given DOM structure. - * - * @memberof Svg - * @return {Svg} The parent wrapper object of the element that got removed - */ - remove() { - this._node.parentNode.removeChild(this._node); - return this.parent(); - } - - /** - * This method will replace the element with a new element that can be created outside of the current DOM. - * - * @memberof Svg - * @param {Svg} newElement The new Svg object that will be used to replace the current wrapper object - * @return {Svg} The wrapper of the new element - */ - replace(newElement) { - this._node.parentNode.replaceChild(newElement._node, this._node); - return newElement; - } - - /** - * This method will append an element to the current element as a child. - * - * @memberof Svg - * @param {Svg} element The Svg element that should be added as a child - * @param {Boolean} [insertFirst] Specifies if the element should be inserted as first child - * @return {Svg} The wrapper of the appended object - */ - append(element, insertFirst) { - if (insertFirst && this._node.firstChild) { - this._node.insertBefore(element._node, this._node.firstChild); - } else { - this._node.appendChild(element._node); - } - - return this; - } - - /** - * Returns an array of class names that are attached to the current wrapper element. This method can not be chained further. - * - * @memberof Svg - * @return {Array} A list of classes or an empty array if there are no classes on the current element - */ - classes() { - return this._node.getAttribute('class') - ? this._node.getAttribute('class').trim().split(/\s+/) - : []; - } - - /** - * Adds one or a space separated list of classes to the current element and ensures the classes are only existing once. - * - * @memberof Svg - * @param {String} names A white space separated list of class names - * @return {Svg} The wrapper of the current element - */ - addClass(names) { - this._node.setAttribute( - 'class', - this.classes() - .concat(names.trim().split(/\s+/)) - .filter(function (elem, pos, self) { - return self.indexOf(elem) === pos; - }) - .join(' ') - ); - - return this; - } - - /** - * Removes one or a space separated list of classes from the current element. - * - * @memberof Svg - * @param {String} names A white space separated list of class names - * @return {Svg} The wrapper of the current element - */ - removeClass(names) { - const removedClasses = names.trim().split(/\s+/); - - this._node.setAttribute( - 'class', - this.classes() - .filter(name => removedClasses.indexOf(name) === -1) - .join(' ') - ); - - return this; - } - - /** - * Removes all classes from the current element. - * - * @memberof Svg - * @return {Svg} The wrapper of the current element - */ - removeAllClasses() { - this._node.setAttribute('class', ''); - return this; - } - - /** - * Get element height using `getBoundingClientRect` - * - * @memberof Svg - * @return {Number} The elements height in pixels - */ - height() { - return this._node.getBoundingClientRect().height; - } - - /** - * Get element width using `getBoundingClientRect` - * - * @memberof Chartist.Core - * @return {Number} The elements width in pixels - */ - width() { - return this._node.getBoundingClientRect().width; - } - - /** - * The animate function lets you animate the current element with SMIL animations. You can add animations for multiple attributes at the same time by using an animation definition object. This object should contain SMIL animation attributes. Please refer to http://www.w3.org/TR/SVG/animate.html for a detailed specification about the available animation attributes. Additionally an easing property can be passed in the animation definition object. This can be a string with a name of an easing function in `Svg.Easing` or an array with four numbers specifying a cubic Bézier curve. - * **An animations object could look like this:** - * ```javascript - * element.animate({ - * opacity: { - * dur: 1000, - * from: 0, - * to: 1 - * }, - * x1: { - * dur: '1000ms', - * from: 100, - * to: 200, - * easing: 'easeOutQuart' - * }, - * y1: { - * dur: '2s', - * from: 0, - * to: 100 - * } - * }); - * ``` - * **Automatic unit conversion** - * For the `dur` and the `begin` animate attribute you can also omit a unit by passing a number. The number will automatically be converted to milli seconds. - * **Guided mode** - * The default behavior of SMIL animations with offset using the `begin` attribute is that the attribute will keep it's original value until the animation starts. Mostly this behavior is not desired as you'd like to have your element attributes already initialized with the animation `from` value even before the animation starts. Also if you don't specify `fill="freeze"` on an animate element or if you delete the animation after it's done (which is done in guided mode) the attribute will switch back to the initial value. This behavior is also not desired when performing simple one-time animations. For one-time animations you'd want to trigger animations immediately instead of relative to the document begin time. That's why in guided mode Svg will also use the `begin` property to schedule a timeout and manually start the animation after the timeout. If you're using multiple SMIL definition objects for an attribute (in an array), guided mode will be disabled for this attribute, even if you explicitly enabled it. - * If guided mode is enabled the following behavior is added: - * - Before the animation starts (even when delayed with `begin`) the animated attribute will be set already to the `from` value of the animation - * - `begin` is explicitly set to `indefinite` so it can be started manually without relying on document begin time (creation) - * - The animate element will be forced to use `fill="freeze"` - * - The animation will be triggered with `beginElement()` in a timeout where `begin` of the definition object is interpreted in milli seconds. If no `begin` was specified the timeout is triggered immediately. - * - After the animation the element attribute value will be set to the `to` value of the animation - * - The animate element is deleted from the DOM - * - * @memberof Svg - * @param {Object} animations An animations object where the property keys are the attributes you'd like to animate. The properties should be objects again that contain the SMIL animation attributes (usually begin, dur, from, and to). The property begin and dur is auto converted (see Automatic unit conversion). You can also schedule multiple animations for the same attribute by passing an Array of SMIL definition objects. Attributes that contain an array of SMIL definition objects will not be executed in guided mode. - * @param {Boolean} guided Specify if guided mode should be activated for this animation (see Guided mode). If not otherwise specified, guided mode will be activated. - * @param {Object} eventEmitter If specified, this event emitter will be notified when an animation starts or ends. - * @return {Svg} The current element where the animation was added - */ - animate(animations, guided, eventEmitter) { - if (guided === undefined) { - guided = true; - } - - Object.keys(animations).forEach(attribute => { - const createAnimate = (animationDefinition, createGuided) => { - const attributeProperties = {}; - let animationEasing; - let timeout; - - // Check if an easing is specified in the definition object and delete it from the object as it will not - // be part of the animate element attributes. - if (animationDefinition.easing) { - // If already an easing Bézier curve array we take it or we lookup a easing array in the Easing object - animationEasing = - animationDefinition.easing instanceof Array - ? animationDefinition.easing - : easings[animationDefinition.easing]; - delete animationDefinition.easing; - } - - // If numeric dur or begin was provided we assume milli seconds - animationDefinition.begin = ensureUnit(animationDefinition.begin, 'ms'); - animationDefinition.dur = ensureUnit(animationDefinition.dur, 'ms'); - - if (animationEasing) { - animationDefinition.calcMode = 'spline'; - animationDefinition.keySplines = animationEasing.join(' '); - animationDefinition.keyTimes = '0;1'; - } - - // Adding "fill: freeze" if we are in guided mode and set initial attribute values - if (createGuided) { - animationDefinition.fill = 'freeze'; - // Animated property on our element should already be set to the animation from value in guided mode - attributeProperties[attribute] = animationDefinition.from; - this.attr(attributeProperties); - - // In guided mode we also set begin to indefinite so we can trigger the start manually and put the begin - // which needs to be in ms aside - timeout = quantity(animationDefinition.begin || 0).value; - animationDefinition.begin = 'indefinite'; - } - - const animate = this.elem( - 'animate', - extend( - { - attributeName: attribute - }, - animationDefinition - ) - ); - - if (createGuided) { - // If guided we take the value that was put aside in timeout and trigger the animation manually with a timeout - setTimeout(() => { - // If beginElement fails we set the animated attribute to the end position and remove the animate element - // This happens if the SMIL ElementTimeControl interface is not supported or any other problems occurred in - // the browser. (Currently FF 34 does not support animate elements in foreignObjects) - try { - animate._node.beginElement(); - } catch (err) { - // Set animated attribute to current animated value - attributeProperties[attribute] = animationDefinition.to; - this.attr(attributeProperties); - // Remove the animate element as it's no longer required - animate.remove(); - } - }, timeout); - } - - if (eventEmitter) { - animate._node.addEventListener('beginEvent', () => - eventEmitter.emit('animationBegin', { - element: this, - animate: animate._node, - params: animationDefinition - }) - ); - } - - animate._node.addEventListener('endEvent', () => { - if (eventEmitter) { - eventEmitter.emit('animationEnd', { - element: this, - animate: animate._node, - params: animationDefinition - }); - } - - if (createGuided) { - // Set animated attribute to current animated value - attributeProperties[attribute] = animationDefinition.to; - this.attr(attributeProperties); - // Remove the animate element as it's no longer required - animate.remove(); - } - }); - }; - - // If current attribute is an array of definition objects we create an animate for each and disable guided mode - if (animations[attribute] instanceof Array) { - animations[attribute].forEach(animationDefinition => - createAnimate(animationDefinition, false) - ); - } else { - createAnimate(animations[attribute], guided); - } - }); - - return this; - } -} - -/** - * This method checks for support of a given SVG feature like Extensibility, SVG-animation or the like. Check http://www.w3.org/TR/SVG11/feature for a detailed list. - * - * @memberof Svg - * @param {String} feature The SVG 1.1 feature that should be checked for support. - * @return {Boolean} True of false if the feature is supported or not - */ -export function isSupported(feature) { - return document.implementation.hasFeature( - 'http://www.w3.org/TR/SVG11/feature#' + feature, - '1.1' - ); -} - -/** - * This Object contains some standard easing cubic bezier curves. Then can be used with their name in the `Svg.animate`. You can also extend the list and use your own name in the `animate` function. Click the show code button to see the available bezier functions. - * - * @memberof Svg - */ -export const easings = { - easeInSine: [0.47, 0, 0.745, 0.715], - easeOutSine: [0.39, 0.575, 0.565, 1], - easeInOutSine: [0.445, 0.05, 0.55, 0.95], - easeInQuad: [0.55, 0.085, 0.68, 0.53], - easeOutQuad: [0.25, 0.46, 0.45, 0.94], - easeInOutQuad: [0.455, 0.03, 0.515, 0.955], - easeInCubic: [0.55, 0.055, 0.675, 0.19], - easeOutCubic: [0.215, 0.61, 0.355, 1], - easeInOutCubic: [0.645, 0.045, 0.355, 1], - easeInQuart: [0.895, 0.03, 0.685, 0.22], - easeOutQuart: [0.165, 0.84, 0.44, 1], - easeInOutQuart: [0.77, 0, 0.175, 1], - easeInQuint: [0.755, 0.05, 0.855, 0.06], - easeOutQuint: [0.23, 1, 0.32, 1], - easeInOutQuint: [0.86, 0, 0.07, 1], - easeInExpo: [0.95, 0.05, 0.795, 0.035], - easeOutExpo: [0.19, 1, 0.22, 1], - easeInOutExpo: [1, 0, 0, 1], - easeInCirc: [0.6, 0.04, 0.98, 0.335], - easeOutCirc: [0.075, 0.82, 0.165, 1], - easeInOutCirc: [0.785, 0.135, 0.15, 0.86], - easeInBack: [0.6, -0.28, 0.735, 0.045], - easeOutBack: [0.175, 0.885, 0.32, 1.275], - easeInOutBack: [0.68, -0.55, 0.265, 1.55] -}; diff --git a/src/svg/svg.spec.js b/src/svg/svg.spec.js deleted file mode 100644 index 61ba95fe..00000000 --- a/src/svg/svg.spec.js +++ /dev/null @@ -1,191 +0,0 @@ -import { Svg } from './svg'; -import { namespaces } from '../core/globals'; - -describe('Svg', () => { - it('should create a valid svg dom element', () => { - const svg = new Svg('svg'); - - expect(svg).toBeDefined(); - expect(svg._node).toBeDefined(); - expect(svg._node.nodeName.toLowerCase()).toBe('svg'); - }); - - it('should create a valid svg dom element with attributes', () => { - const svg = new Svg('svg', { - width: '100%', - height: '100%' - }); - - expect(svg).toBeDefined(); - expect(svg._node).toBeDefined(); - expect(svg._node.nodeName.toLowerCase()).toBe('svg'); - expect(svg._node.attributes.width).toHaveTextContent('100%'); - expect(svg._node.attributes.height).toHaveTextContent('100%'); - }); - - it('should create nested objects with attributes', () => { - const svg = new Svg('svg'); - svg.elem('g').elem('g').elem('circle', { - cx: 100, - cy: 100, - r: 10 - }); - - expect(svg._node).toBeDefined(); - expect(svg._node.firstChild.firstChild.firstChild).toBeDefined(); - expect( - svg._node.firstChild.firstChild.firstChild.attributes.cx - ).toHaveTextContent('100'); - expect( - svg._node.firstChild.firstChild.firstChild.attributes.cy - ).toHaveTextContent('100'); - expect( - svg._node.firstChild.firstChild.firstChild.attributes.r - ).toHaveTextContent('10'); - }); - - it('should allow to set attributes manually', () => { - const svg = new Svg('svg'); - svg.elem('circle').attr({ - cx: 100, - cy: 100, - r: 10 - }); - - expect(svg._node).toBeDefined(); - expect(svg._node.firstChild).toBeDefined(); - expect(svg._node.firstChild.attributes.cx).toHaveTextContent('100'); - expect(svg._node.firstChild.attributes.cy).toHaveTextContent('100'); - expect(svg._node.firstChild.attributes.r).toHaveTextContent('10'); - }); - - it('should allow to set namespaced attributes', () => { - const svg = new Svg('image'); - svg.elem('image').attr({ - x: 100, - y: 100, - height: 100, - width: 100, - 'xlink:href': 'image.jpg' - }); - - expect(svg._node).toBeDefined(); - expect(svg._node.firstChild).toBeDefined(); - expect(svg._node.firstChild).toHaveAttribute('x', '100'); - expect(svg._node.firstChild).toHaveAttribute('y', '100'); - expect(svg._node.firstChild).toHaveAttribute('width', '100'); - expect(svg._node.firstChild).toHaveAttribute('height', '100'); - expect(svg._node.firstChild.getAttributeNS(namespaces.xlink, 'href')).toBe( - 'image.jpg' - ); - }); - - it('should clear on each nesting level', () => { - const svg = new Svg('svg'); - const group = svg.elem('g'); - group.elem('circle'); - group.elem('circle'); - group.elem('circle'); - - expect(svg._node).toBeDefined(); - expect(svg._node.firstChild.childNodes.length).toBe(3); - - group.empty(); - expect(svg._node.firstChild.childNodes.length).toBe(0); - - svg.empty(); - expect(svg._node).toBeEmptyDOMElement(); - }); - - it('should allow to remove a certain element', () => { - const svg = new Svg('svg'); - const text = svg.elem('text'); - - expect(svg._node).toBeDefined(); - expect(svg._node.childNodes.length).toBe(1); - expect(svg._node.firstChild.nodeName.toLowerCase()).toBe('text'); - - text.remove(); - expect(svg._node.childNodes.length).toBe(0); - }); - - it('should allow to write text content into elements', () => { - const svg = new Svg('svg'); - svg.elem('text').text('Hello World'); - - expect(svg._node).toBeDefined(); - expect(svg._node.childNodes.length).toBe(1); - expect(svg._node.firstChild.nodeName.toLowerCase()).toBe('text'); - expect(svg._node.firstChild.firstChild.nodeType).toBe(3); - expect(svg._node.firstChild.firstChild).toHaveTextContent('Hello World'); - }); - - it('should allow to add and remove classes on elements', () => { - const svg = new Svg('svg') - .addClass('test-class-1') - .addClass('test-class-2') - // Should not allow duplicates - .addClass('test-class-2') - // Should allow multiple classes with white spaces - .addClass('test-class-3 test-class-4'); - - expect(svg._node).toBeDefined(); - expect(svg._node.getAttribute('class').split(' ')).toEqual([ - 'test-class-1', - 'test-class-2', - 'test-class-3', - 'test-class-4' - ]); - - svg.removeClass('test-class-1'); - // Should allow multiple classes with whitespaces - svg.removeClass('test-class-2 test-class-3'); - - expect(svg._node).toHaveAttribute('class', 'test-class-4'); - }); - - it('should allow to travers up in the fluent API chain and set attributes on the way', () => { - const svg = new Svg('svg'); - svg - .elem('g') - .elem('g') - .elem('g') - .elem('circle') - .parent() - .attr({ - transform: 'rotate(10 10 10)' - }) - .parent() - .attr({ - transform: 'rotate(20 20 20)' - }) - .parent() - .attr({ - transform: 'rotate(30 30 30)' - }) - .parent() - .attr({ - width: '100%', - height: '100%' - }); - - expect(svg._node).toBeDefined(); - expect(svg._node.attributes.width).toHaveTextContent('100%'); - expect(svg._node.attributes.height).toHaveTextContent('100%'); - - expect(svg._node.firstChild).toBeDefined(); - expect(svg._node.firstChild.attributes.transform).toHaveTextContent( - 'rotate(30 30 30)' - ); - - expect(svg._node.firstChild.firstChild).toBeDefined(); - expect( - svg._node.firstChild.firstChild.attributes.transform - ).toHaveTextContent('rotate(20 20 20)'); - - expect(svg._node.firstChild.firstChild.firstChild).toBeDefined(); - expect( - svg._node.firstChild.firstChild.firstChild.attributes.transform - ).toHaveTextContent('rotate(10 10 10)'); - }); -}); diff --git a/src/svg/types.ts b/src/svg/types.ts new file mode 100644 index 00000000..671e5bea --- /dev/null +++ b/src/svg/types.ts @@ -0,0 +1,57 @@ +import type { SegmentData } from '../core'; +import type { easings } from './animation'; + +export interface BasePathParams { + x: number; + y: number; +} + +export type MoveParams = BasePathParams; + +export type LineParams = BasePathParams; + +export interface CurveParams extends BasePathParams { + x1: number; + y1: number; + x2: number; + y2: number; +} + +export interface ArcParams extends BasePathParams { + rx: number; + ry: number; + xAr: number; + lAf: number; + sf: number; +} + +export type PathParams = MoveParams | LineParams | CurveParams | ArcParams; + +export type PathCommand<T extends PathParams = PathParams> = { + command: string; + data?: SegmentData; +} & T; + +export interface SvgPathOptions { + accuracy?: number; +} + +export type Attributes = Record<string, number | string | undefined | null>; + +export interface AnimationDefinition { + easing?: number[] | keyof typeof easings; + calcMode?: 'discrete' | 'linear' | 'paced' | 'spline'; + restart?: 'always' | 'whenNotActive' | 'never'; + repeatCount?: number | 'indefinite'; + repeatDur?: string | 'indefinite'; + keySplines?: string; + keyTimes?: string; + fill?: string; + min?: number | string; + max?: number | string; + begin?: number | string; + end?: number | string; + dur: number | string; + from: number | string; + to: number | string; +} diff --git a/src/core/extend.js b/src/utils/extend.ts similarity index 52% rename from src/core/extend.js rename to src/utils/extend.ts index 73ec008d..0825ea8c 100644 --- a/src/core/extend.js +++ b/src/utils/extend.ts @@ -1,17 +1,16 @@ /** * Simple recursive object extend - * - * @memberof Chartist.Core - * @param {Object} target Target object where the source will be merged into - * @param {Object...} sources This object (objects) will be merged into target and then target is returned - * @return {Object} An object that has the same reference as target but is extended and merged with the properties of source + * @todo Replace with Object.assign + * @param target Target object where the source will be merged into + * @param sources This object (objects) will be merged into target and then target is returned + * @return An object that has the same reference as target but is extended and merged with the properties of source */ -export function extend(target = {}, ...sources) { +export function extend(target: any = {}, ...sources: any[]) { target = target || {}; for (let i = 0; i < sources.length; i++) { const source = sources[i]; - for (let prop in source) { + for (const prop in source) { const sourceProp = source[prop]; if ( typeof sourceProp === 'object' && diff --git a/src/core/functional.js b/src/utils/functional.ts similarity index 51% rename from src/core/functional.js rename to src/utils/functional.ts index 2f32e2ea..000b20e2 100644 --- a/src/core/functional.js +++ b/src/utils/functional.ts @@ -1,30 +1,21 @@ /** * Helps to simplify functional style code - * - * @memberof Chartist.Core - * @param {*} n This exact value will be returned by the noop function - * @return {*} The same value that was provided to the n parameter + * @param n This exact value will be returned by the noop function + * @return The same value that was provided to the n parameter */ -export const noop = n => n; +export const noop = <T>(n: T) => n; /** * Functional style helper to produce array with given length initialized with undefined values - * - * @memberof Chartist.Core - * @param length - * @return {Array} */ -export const times = length => Array.from({ length }); +export const times = <T = unknown>(length: number): T[] => + Array.from({ length }); /** * Sum helper to be used in reduce functions - * - * @memberof Chartist.Core - * @param previous - * @param current - * @return {*} */ -export const sum = (previous, current) => previous + (current ? current : 0); +export const sum = (previous: number, current: number) => + previous + (current ? current : 0); /** * Map for multi dimensional arrays where their nested arrays will be mapped in serial. The output array will have the length of the largest nested array. The callback function is called with variable arguments where each argument is the nested array value (or undefined if there are no more values). @@ -39,13 +30,8 @@ export const sum = (previous, current) => previous + (current ? current : 0); * // 1. call arguments: (1, 3, undefined) * // 2. call arguments: (2, undefined, undefined) * ``` - * - * @memberof Chartist.Core - * @param array - * @param callback - * @return {Array} */ -export const serialMap = (array, callback) => - times(Math.max(...array.map(element => element.length))).map((inner, index) => - callback(...array.map(element => element[index])) +export const serialMap = <T, K>(array: T[][], callback: (...args: T[]) => K) => + times(Math.max(...array.map(element => element.length))).map( + (_inner, index) => callback(...array.map(element => element[index])) ); diff --git a/src/utils/index.ts b/src/utils/index.ts new file mode 100644 index 00000000..61e35e3b --- /dev/null +++ b/src/utils/index.ts @@ -0,0 +1,4 @@ +export * from './types'; +export * from './extend'; +export * from './functional'; +export * from './utils'; diff --git a/src/utils/types.ts b/src/utils/types.ts new file mode 100644 index 00000000..141dca17 --- /dev/null +++ b/src/utils/types.ts @@ -0,0 +1,8 @@ +export type FilterByKey<T, K extends string> = T extends Record<K, unknown> + ? T + : T extends Partial<Record<K, unknown>> + ? T & { [key in K]: T[K] } + : never; + +export type RequiredKeys<T, K extends keyof T, V extends keyof T = never> = T & + Required<Pick<T, K | V>> & { [key in V]: Required<T[V]> }; diff --git a/src/utils/utils.ts b/src/utils/utils.ts new file mode 100644 index 00000000..0f65aa7a --- /dev/null +++ b/src/utils/utils.ts @@ -0,0 +1,57 @@ +import type { FilterByKey } from './types'; + +/** + * This function safely checks if an objects has an owned property. + * @param target The object where to check for a property + * @param property The property name + * @returns Returns true if the object owns the specified property + */ +export function safeHasProperty<T, K extends string>( + target: T, + property: K +): target is FilterByKey<T, K>; +export function safeHasProperty(target: unknown, property: string) { + return ( + target !== null && + typeof target === 'object' && + Reflect.has(target, property) + ); +} + +/** + * Checks if a value can be safely coerced to a number. This includes all values except null which result in finite numbers when coerced. This excludes NaN, since it's not finite. + */ +export function isNumeric(value: number): true; +export function isNumeric(value: unknown): boolean; +export function isNumeric(value: unknown) { + return value !== null && isFinite(value as number); +} + +/** + * Returns true on all falsey values except the numeric value 0. + */ +export function isFalseyButZero( + value: unknown +): value is undefined | null | false | '' { + return !value && value !== 0; +} + +/** + * Returns a number if the passed parameter is a valid number or the function will return undefined. On all other values than a valid number, this function will return undefined. + */ +export function getNumberOrUndefined(value: number): number; +export function getNumberOrUndefined(value: unknown): number | undefined; +export function getNumberOrUndefined(value: unknown) { + return isNumeric(value) ? Number(value) : undefined; +} + +/** + * Checks if value is array of arrays or not. + */ +export function isArrayOfArrays(data: unknown): data is unknown[][] { + if (!Array.isArray(data)) { + return false; + } + + return data.every(Array.isArray); +} diff --git a/test/__image_snapshots__/PieChart__Solid-snap.png b/test/__image_snapshots__/PieChart__Solid-snap.png index 649dc34bd966cf173022004bfcc17167e12874d7..13f37558864a19eaaf86166c9a4a3dd38db5f0dc 100644 GIT binary patch literal 8664 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 Da4wJ0 literal 8725 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 Upv9*>6eoIy`eyJ7J(v6c3D3TeE&u=k diff --git a/test/mock/compat.js b/test/mock/compat.ts similarity index 100% rename from test/mock/compat.js rename to test/mock/compat.ts diff --git a/test/mock/dom.js b/test/mock/dom.ts similarity index 72% rename from test/mock/dom.js rename to test/mock/dom.ts index 6c5714f3..7670d4bc 100644 --- a/test/mock/dom.js +++ b/test/mock/dom.ts @@ -1,6 +1,8 @@ -export let container = null; +export type Fixture = ReturnType<typeof addMockWrapper>; -let getBoundingClientRect = SVGElement.prototype.getBoundingClientRect; +export let container: HTMLDivElement | null = null; + +const getBoundingClientRect = SVGElement.prototype.getBoundingClientRect; export function mockDom() { if (!container) { @@ -17,10 +19,10 @@ export function destroyMockDom() { } } -export function addMockWrapper(fixture) { +export function addMockWrapper(fixture: string) { const wrapper = document.createElement('div'); wrapper.innerHTML += fixture; - container.appendChild(wrapper); + container?.appendChild(wrapper); return { wrapper, container, @@ -29,6 +31,7 @@ export function addMockWrapper(fixture) { } export function mockDomRects() { + // @ts-expect-error Mock DOM API. SVGElement.prototype.getBoundingClientRect = () => ({ x: 0, y: 0, diff --git a/test/utils/storyshots/viewport.js b/test/utils/storyshots/viewport.ts similarity index 100% rename from test/utils/storyshots/viewport.js rename to test/utils/storyshots/viewport.ts diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..c2ce442d --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,39 @@ +{ + "compilerOptions": { + /* Type Checking */ + "strict": true, + "strictBindCallApply": true, + "noFallthroughCasesInSwitch": true, + "noImplicitOverride": true, + "noImplicitReturns": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + /* Modules */ + "baseUrl": ".", + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "paths": { + "chartist-dev": ["src"] + }, + /* Emit */ + "declaration": true, + "declarationMap": true, + "inlineSourceMap": true, + "outDir": "dist", + /* Interop Constraints */ + "allowSyntheticDefaultImports": true, + "isolatedModules": true, + /* Language and Environment */ + "lib": [ + "dom", + "esnext" + ], + "target": "esnext", + /* Completeness */ + "skipLibCheck": true + }, + "include": [ + "src" + ] +} From 3371a2b4f1ddb61f1912eab7fc82a5562063db52 Mon Sep 17 00:00:00 2001 From: Dan Onoshko <danon0404@gmail.com> Date: Sat, 9 Jul 2022 16:19:22 +0400 Subject: [PATCH 25/44] ci: size limit checks (#15) --- .github/workflows/checks.yml | 19 ++ .size-limit.json | 24 ++ package.json | 3 + pnpm-lock.yaml | 430 ++++++++++++++++++++++++++++++++++- src/svg/animation.ts | 2 +- 5 files changed, 470 insertions(+), 8 deletions(-) create mode 100644 .size-limit.json diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index b1264b41..7a258bde 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -5,6 +5,25 @@ on: - master - develop jobs: + size: + runs-on: ubuntu-latest + name: size-limit + steps: + - name: Checkout the repository + uses: actions/checkout@v2 + - name: Install pnpm + uses: pnpm/action-setup@v2.0.1 + with: + version: 6 + - name: Install Node.js + uses: actions/setup-node@v2 + with: + node-version: 16 + cache: 'pnpm' + - name: Check size + uses: andresz1/size-limit-action@master + with: + github_token: ${{ secrets.GITHUB_TOKEN }} storybook: runs-on: ubuntu-latest name: storybook diff --git a/.size-limit.json b/.size-limit.json new file mode 100644 index 00000000..51045984 --- /dev/null +++ b/.size-limit.json @@ -0,0 +1,24 @@ +[ + { + "path": "dist/index.cjs", + "limit": "36.45 kB", + "webpack": false, + "running": false + }, + { + "path": "dist/index.cjs", + "limit": "7.5 kB", + "import": "{ BarChart }" + }, + { + "path": "dist/index.js", + "limit": "36.2 kB", + "webpack": false, + "running": false + }, + { + "path": "dist/index.js", + "limit": "7.45 kB", + "import": "{ BarChart }" + } +] diff --git a/package.json b/package.json index 01aba18a..bb54556a 100644 --- a/package.json +++ b/package.json @@ -57,6 +57,7 @@ "start:storybook": "start-storybook -p 6006 --ci", "build:storybook": "del ./storybook-static; NODE_ENV=production build-storybook", "jest": "jest -c jest.config.json", + "test:size": "size-limit", "test:unit": "jest -c jest.config.json ./src", "test:storyshots": "jest -c jest.config.json ./test/storyshots.spec.js", "test": "pnpm lint && pnpm test:unit", @@ -72,6 +73,7 @@ "@commitlint/config-conventional": "^16.2.1", "@commitlint/cz-commitlint": "^16.2.3", "@rollup/plugin-node-resolve": "^13.2.0", + "@size-limit/preset-big-lib": "^7.0.8", "@storybook/addon-actions": "^6.4.22", "@storybook/addon-controls": "^6.4.22", "@storybook/addon-docs": "^6.4.22", @@ -115,6 +117,7 @@ "sass": "^1.50.1", "sass-loader": "^10.0.0", "simple-git-hooks": "^2.7.0", + "size-limit": "^7.0.8", "swc-loader": "^0.2.3", "tsd": "^0.20.0", "typescript": "^4.6.4" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 43ec2884..d8afa485 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,6 +7,7 @@ specifiers: '@commitlint/config-conventional': ^16.2.1 '@commitlint/cz-commitlint': ^16.2.3 '@rollup/plugin-node-resolve': ^13.2.0 + '@size-limit/preset-big-lib': ^7.0.8 '@storybook/addon-actions': ^6.4.22 '@storybook/addon-controls': ^6.4.22 '@storybook/addon-docs': ^6.4.22 @@ -50,6 +51,7 @@ specifiers: sass: ^1.50.1 sass-loader: ^10.0.0 simple-git-hooks: ^2.7.0 + size-limit: ^7.0.8 swc-loader: ^0.2.3 tsd: ^0.20.0 typescript: ^4.6.4 @@ -61,6 +63,7 @@ devDependencies: '@commitlint/config-conventional': 16.2.1 '@commitlint/cz-commitlint': 16.2.3_d728995458426a93696f083845656c00 '@rollup/plugin-node-resolve': 13.2.0_rollup@2.70.1 + '@size-limit/preset-big-lib': 7.0.8_0345a5c925bba9874623e0a9cd869c6b '@storybook/addon-actions': 6.4.22 '@storybook/addon-controls': 6.4.22_eslint@8.15.0+typescript@4.6.4 '@storybook/addon-docs': 6.4.22_5d666fb5b9c479b3d907ef7c497df350 @@ -104,6 +107,7 @@ devDependencies: sass: 1.50.1 sass-loader: 10.2.1_sass@1.50.1 simple-git-hooks: 2.7.0 + size-limit: 7.0.8 swc-loader: 0.2.3_@swc+core@1.2.165 tsd: 0.20.0 typescript: 4.6.4 @@ -2243,6 +2247,13 @@ packages: resolution: {integrity: sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==} dev: true + /@jridgewell/trace-mapping/0.3.14: + resolution: {integrity: sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==} + dependencies: + '@jridgewell/resolve-uri': 3.0.5 + '@jridgewell/sourcemap-codec': 1.4.11 + dev: true + /@jridgewell/trace-mapping/0.3.4: resolution: {integrity: sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ==} dependencies: @@ -2397,6 +2408,78 @@ packages: '@sinonjs/commons': 1.8.3 dev: true + /@sitespeed.io/tracium/0.3.3: + resolution: {integrity: sha512-dNZafjM93Y+F+sfwTO5gTpsGXlnc/0Q+c2+62ViqP3gkMWvHEMSKkaEHgVJLcLg3i/g19GSIPziiKpgyne07Bw==} + engines: {node: '>=8'} + dependencies: + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@size-limit/file/7.0.8_size-limit@7.0.8: + resolution: {integrity: sha512-1KeFQuMXIXAH/iELqIX7x+YNYDFvzIvmxcp9PrdwEoSNL0dXdaDIo9WE/yz8xvOmUcKaLfqbWkL75DM0k91WHQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + peerDependencies: + size-limit: 7.0.8 + dependencies: + semver: 7.3.5 + size-limit: 7.0.8 + dev: true + + /@size-limit/preset-big-lib/7.0.8_0345a5c925bba9874623e0a9cd869c6b: + resolution: {integrity: sha512-m9C+FPPmETg9vg3V3Aq4hTflX1GVRpjYO94C4gqrl26I5YqB+BlKf8WKHmna3IbmJyePf7M8qvya/ougzMVHkQ==} + peerDependencies: + size-limit: 7.0.8 + dependencies: + '@size-limit/file': 7.0.8_size-limit@7.0.8 + '@size-limit/time': 7.0.8_size-limit@7.0.8 + '@size-limit/webpack': 7.0.8_0345a5c925bba9874623e0a9cd869c6b + size-limit: 7.0.8 + transitivePeerDependencies: + - '@swc/core' + - bufferutil + - encoding + - esbuild + - supports-color + - uglify-js + - utf-8-validate + - webpack-cli + dev: true + + /@size-limit/time/7.0.8_size-limit@7.0.8: + resolution: {integrity: sha512-CS3pHTxeQXgrrMbhlqYfSR+b4QGp1rjEcYYkByIP+X/Go88R44yp19tyBFmmCQzs2Te2BAxfq3jv8FG+54oBew==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + peerDependencies: + size-limit: 7.0.8 + dependencies: + estimo: 2.3.6 + react: 17.0.2 + size-limit: 7.0.8 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: true + + /@size-limit/webpack/7.0.8_0345a5c925bba9874623e0a9cd869c6b: + resolution: {integrity: sha512-69YuY0o4geRNJDb55Vri+bNPs9+WZlK0pzcziip1p4uajCFMFQE0K8pKj3vsIOUADdTcimfypHciriCY/qrnJQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + peerDependencies: + size-limit: 7.0.8 + dependencies: + escape-string-regexp: 4.0.0 + nanoid: 3.3.2 + size-limit: 7.0.8 + webpack: 5.73.0_@swc+core@1.2.165 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + - webpack-cli + dev: true + /@storybook/addon-actions/6.4.22: resolution: {integrity: sha512-t2w3iLXFul+R/1ekYxIEzUOZZmvEa7EzUAVAuCHP4i6x0jBnTTZ7sAIUVRaxVREPguH5IqI/2OklYhKanty2Yw==} peerDependencies: @@ -4386,6 +4469,13 @@ packages: resolution: {integrity: sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==} dev: true + /@types/eslint-scope/3.7.4: + resolution: {integrity: sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==} + dependencies: + '@types/eslint': 7.29.0 + '@types/estree': 0.0.51 + dev: true + /@types/eslint/7.29.0: resolution: {integrity: sha512-VNcvioYDH8/FxaeTKkM4/TiTwt6pBV9E3OfGmvaw8tPl0rrHCJ4Ll15HRT+pMiFAf/MLQvAzC+6RzUMEL9Ceng==} dependencies: @@ -4397,6 +4487,10 @@ packages: resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} dev: true + /@types/estree/0.0.51: + resolution: {integrity: sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==} + dev: true + /@types/faker/5.5.9: resolution: {integrity: sha512-uCx6mP3UY5SIO14XlspxsGjgaemrxpssJI0Ol+GfhxtcKpv9pgRZYsS4eeKeHVLje6Qtc8lGszuBI461+gVZBA==} dev: true @@ -4836,6 +4930,13 @@ packages: eslint-visitor-keys: 3.3.0 dev: true + /@webassemblyjs/ast/1.11.1: + resolution: {integrity: sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==} + dependencies: + '@webassemblyjs/helper-numbers': 1.11.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.1 + dev: true + /@webassemblyjs/ast/1.9.0: resolution: {integrity: sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==} dependencies: @@ -4844,14 +4945,26 @@ packages: '@webassemblyjs/wast-parser': 1.9.0 dev: true + /@webassemblyjs/floating-point-hex-parser/1.11.1: + resolution: {integrity: sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==} + dev: true + /@webassemblyjs/floating-point-hex-parser/1.9.0: resolution: {integrity: sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==} dev: true + /@webassemblyjs/helper-api-error/1.11.1: + resolution: {integrity: sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==} + dev: true + /@webassemblyjs/helper-api-error/1.9.0: resolution: {integrity: sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==} dev: true + /@webassemblyjs/helper-buffer/1.11.1: + resolution: {integrity: sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==} + dev: true + /@webassemblyjs/helper-buffer/1.9.0: resolution: {integrity: sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==} dev: true @@ -4872,10 +4985,31 @@ packages: '@webassemblyjs/ast': 1.9.0 dev: true + /@webassemblyjs/helper-numbers/1.11.1: + resolution: {integrity: sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==} + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.11.1 + '@webassemblyjs/helper-api-error': 1.11.1 + '@xtuc/long': 4.2.2 + dev: true + + /@webassemblyjs/helper-wasm-bytecode/1.11.1: + resolution: {integrity: sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==} + dev: true + /@webassemblyjs/helper-wasm-bytecode/1.9.0: resolution: {integrity: sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==} dev: true + /@webassemblyjs/helper-wasm-section/1.11.1: + resolution: {integrity: sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==} + dependencies: + '@webassemblyjs/ast': 1.11.1 + '@webassemblyjs/helper-buffer': 1.11.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.1 + '@webassemblyjs/wasm-gen': 1.11.1 + dev: true + /@webassemblyjs/helper-wasm-section/1.9.0: resolution: {integrity: sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==} dependencies: @@ -4885,22 +5019,51 @@ packages: '@webassemblyjs/wasm-gen': 1.9.0 dev: true + /@webassemblyjs/ieee754/1.11.1: + resolution: {integrity: sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==} + dependencies: + '@xtuc/ieee754': 1.2.0 + dev: true + /@webassemblyjs/ieee754/1.9.0: resolution: {integrity: sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==} dependencies: '@xtuc/ieee754': 1.2.0 dev: true + /@webassemblyjs/leb128/1.11.1: + resolution: {integrity: sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==} + dependencies: + '@xtuc/long': 4.2.2 + dev: true + /@webassemblyjs/leb128/1.9.0: resolution: {integrity: sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==} dependencies: '@xtuc/long': 4.2.2 dev: true + /@webassemblyjs/utf8/1.11.1: + resolution: {integrity: sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==} + dev: true + /@webassemblyjs/utf8/1.9.0: resolution: {integrity: sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==} dev: true + /@webassemblyjs/wasm-edit/1.11.1: + resolution: {integrity: sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==} + dependencies: + '@webassemblyjs/ast': 1.11.1 + '@webassemblyjs/helper-buffer': 1.11.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.1 + '@webassemblyjs/helper-wasm-section': 1.11.1 + '@webassemblyjs/wasm-gen': 1.11.1 + '@webassemblyjs/wasm-opt': 1.11.1 + '@webassemblyjs/wasm-parser': 1.11.1 + '@webassemblyjs/wast-printer': 1.11.1 + dev: true + /@webassemblyjs/wasm-edit/1.9.0: resolution: {integrity: sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==} dependencies: @@ -4914,6 +5077,16 @@ packages: '@webassemblyjs/wast-printer': 1.9.0 dev: true + /@webassemblyjs/wasm-gen/1.11.1: + resolution: {integrity: sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==} + dependencies: + '@webassemblyjs/ast': 1.11.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.1 + '@webassemblyjs/ieee754': 1.11.1 + '@webassemblyjs/leb128': 1.11.1 + '@webassemblyjs/utf8': 1.11.1 + dev: true + /@webassemblyjs/wasm-gen/1.9.0: resolution: {integrity: sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==} dependencies: @@ -4924,6 +5097,15 @@ packages: '@webassemblyjs/utf8': 1.9.0 dev: true + /@webassemblyjs/wasm-opt/1.11.1: + resolution: {integrity: sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==} + dependencies: + '@webassemblyjs/ast': 1.11.1 + '@webassemblyjs/helper-buffer': 1.11.1 + '@webassemblyjs/wasm-gen': 1.11.1 + '@webassemblyjs/wasm-parser': 1.11.1 + dev: true + /@webassemblyjs/wasm-opt/1.9.0: resolution: {integrity: sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==} dependencies: @@ -4933,6 +5115,17 @@ packages: '@webassemblyjs/wasm-parser': 1.9.0 dev: true + /@webassemblyjs/wasm-parser/1.11.1: + resolution: {integrity: sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==} + dependencies: + '@webassemblyjs/ast': 1.11.1 + '@webassemblyjs/helper-api-error': 1.11.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.1 + '@webassemblyjs/ieee754': 1.11.1 + '@webassemblyjs/leb128': 1.11.1 + '@webassemblyjs/utf8': 1.11.1 + dev: true + /@webassemblyjs/wasm-parser/1.9.0: resolution: {integrity: sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==} dependencies: @@ -4955,6 +5148,13 @@ packages: '@xtuc/long': 4.2.2 dev: true + /@webassemblyjs/wast-printer/1.11.1: + resolution: {integrity: sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==} + dependencies: + '@webassemblyjs/ast': 1.11.1 + '@xtuc/long': 4.2.2 + dev: true + /@webassemblyjs/wast-printer/1.9.0: resolution: {integrity: sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==} dependencies: @@ -4998,6 +5198,14 @@ packages: acorn-walk: 7.2.0 dev: true + /acorn-import-assertions/1.8.0_acorn@8.7.1: + resolution: {integrity: sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==} + peerDependencies: + acorn: ^8 + dependencies: + acorn: 8.7.1 + dev: true + /acorn-jsx/5.3.2_acorn@7.4.1: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -5872,6 +6080,11 @@ packages: resolution: {integrity: sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=} dev: true + /bytes-iec/3.1.1: + resolution: {integrity: sha512-fey6+4jDK7TFtFg/klGSvNKJctyU7n2aQdnM+CO0ruLPbqqMOM8Tio0Pc+deqUeVKX1tL5DQep1zQ7+37aTAsA==} + engines: {node: '>= 0.8'} + dev: true + /bytes/3.0.0: resolution: {integrity: sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=} engines: {node: '>= 0.8'} @@ -6179,6 +6392,10 @@ packages: resolution: {integrity: sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==} dev: true + /ci-job-number/1.2.2: + resolution: {integrity: sha512-CLOGsVDrVamzv8sXJGaILUVI6dsuAkouJP/n6t+OxLPeeA4DDby7zn9SB6EUpa1H7oIKoE+rMmkW80zYsFfUjA==} + dev: true + /cipher-base/1.0.4: resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==} dependencies: @@ -6376,6 +6593,11 @@ packages: engines: {node: '>= 6'} dev: true + /commander/9.3.0: + resolution: {integrity: sha512-hv95iU5uXPbK83mjrJKuZyFM/LBAoCV/XhVGkS5Je6tl7sxr6A0ITMw5WoRV46/UaJ46Nllm3Xt7IaJhXTIkzw==} + engines: {node: ^12.20.0 || >=14} + dev: true + /commitizen/4.2.4_@swc+core@1.2.165: resolution: {integrity: sha512-LlZChbDzg3Ir3O2S7jSo/cgWp5/QwylQVr59K4xayVq8S4/RdKzSyJkghAiZZHfhh5t4pxunUoyeg0ml1q/7aw==} engines: {node: '>= 10'} @@ -7190,6 +7412,10 @@ packages: debug: 2.6.9 dev: true + /devtools-protocol/0.0.981744: + resolution: {integrity: sha512-0cuGS8+jhR67Fy7qG3i3Pc7Aw494sb9yG9QgpG97SFVWwolgYjlhJg7n+UaHxOQT30d1TYu/EYe9k01ivLErIg==} + dev: true + /devtools-protocol/0.0.982423: resolution: {integrity: sha512-FnVW2nDbjGNw1uD/JRC+9U5768W7e1TfUwqbDTcSsAu1jXFjITSX8w3rkW5FEpHRMPPGpvNSmO1pOpqByiWscA==} dev: true @@ -7458,6 +7684,14 @@ packages: tapable: 1.1.3 dev: true + /enhanced-resolve/5.10.0: + resolution: {integrity: sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==} + engines: {node: '>=10.13.0'} + dependencies: + graceful-fs: 4.2.10 + tapable: 2.2.1 + dev: true + /entities/2.2.0: resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} dev: true @@ -7518,6 +7752,10 @@ packages: isarray: 2.0.5 dev: true + /es-module-lexer/0.9.3: + resolution: {integrity: sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==} + dev: true + /es-shim-unscopables/1.0.0: resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} dependencies: @@ -7787,6 +8025,23 @@ packages: estraverse: 5.3.0 dev: true + /estimo/2.3.6: + resolution: {integrity: sha512-aPd3VTQAL1TyDyhFfn6fqBTJ9WvbRZVN4Z29Buk6+P6xsI0DuF5Mh3dGv6kYCUxWnZkB4Jt3aYglUxOtuwtxoA==} + engines: {node: '>=12'} + hasBin: true + dependencies: + '@sitespeed.io/tracium': 0.3.3 + commander: 9.3.0 + find-chrome-bin: 0.1.0 + nanoid: 3.3.2 + puppeteer-core: 13.7.0 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: true + /estraverse/4.3.0: resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} engines: {node: '>=4.0'} @@ -8119,7 +8374,7 @@ packages: optional: true /fill-range/4.0.0: - resolution: {integrity: sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=} + resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==} engines: {node: '>=0.10.0'} dependencies: extend-shallow: 2.0.1 @@ -8166,6 +8421,11 @@ packages: pkg-dir: 4.2.0 dev: true + /find-chrome-bin/0.1.0: + resolution: {integrity: sha512-XoFZwaEn1R3pE6zNG8kH64l2e093hgB9+78eEKPmJK0o1EXEou+25cEWdtu2qq4DBQPDSe90VJAWVI2Sz9pX6Q==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + /find-node-modules/2.1.3: resolution: {integrity: sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg==} dependencies: @@ -8537,7 +8797,7 @@ packages: dev: true /glob-parent/3.1.0: - resolution: {integrity: sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=} + resolution: {integrity: sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==} dependencies: is-glob: 3.1.0 path-dirname: 1.0.2 @@ -9343,7 +9603,7 @@ packages: dev: true /is-binary-path/1.0.1: - resolution: {integrity: sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=} + resolution: {integrity: sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==} engines: {node: '>=0.10.0'} dependencies: binary-extensions: 1.13.1 @@ -9501,7 +9761,7 @@ packages: dev: true /is-glob/3.1.0: - resolution: {integrity: sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=} + resolution: {integrity: sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==} engines: {node: '>=0.10.0'} dependencies: is-extglob: 2.1.1 @@ -9544,7 +9804,7 @@ packages: dev: true /is-number/3.0.0: - resolution: {integrity: sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=} + resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==} engines: {node: '>=0.10.0'} dependencies: kind-of: 3.2.2 @@ -10631,6 +10891,11 @@ packages: type-check: 0.4.0 dev: true + /lilconfig/2.0.5: + resolution: {integrity: sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==} + engines: {node: '>=10'} + dev: true + /lines-and-columns/1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} dev: true @@ -10640,6 +10905,11 @@ packages: engines: {node: '>=4.3.0 <5.0.0 || >=5.10'} dev: true + /loader-runner/4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} + dev: true + /loader-utils/1.4.0: resolution: {integrity: sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==} engines: {node: '>=4.0.0'} @@ -11255,6 +11525,12 @@ packages: to-regex: 3.0.2 dev: true + /nanospinner/1.1.0: + resolution: {integrity: sha512-yFvNYMig4AthKYfHFl1sLj7B2nkHL4lzdig4osvl9/LdGbXwrdFRoqBS98gsEsOakr0yH+r5NZ/1Y9gdVB8trA==} + dependencies: + picocolors: 1.0.0 + dev: true + /natural-compare/1.4.0: resolution: {integrity: sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=} dev: true @@ -11351,7 +11627,7 @@ packages: dev: true /normalize-path/2.1.1: - resolution: {integrity: sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=} + resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==} engines: {node: '>=0.10.0'} dependencies: remove-trailing-separator: 1.1.0 @@ -12762,6 +13038,29 @@ packages: engines: {node: '>=6'} dev: true + /puppeteer-core/13.7.0: + resolution: {integrity: sha512-rXja4vcnAzFAP1OVLq/5dWNfwBGuzcOARJ6qGV7oAZhnLmVRU8G5MsdeQEAOy332ZhkIOnn9jp15R89LKHyp2Q==} + engines: {node: '>=10.18.1'} + dependencies: + cross-fetch: 3.1.5 + debug: 4.3.4 + devtools-protocol: 0.0.981744 + extract-zip: 2.0.1 + https-proxy-agent: 5.0.1 + pkg-dir: 4.2.0 + progress: 2.0.3 + proxy-from-env: 1.1.0 + rimraf: 3.0.2 + tar-fs: 2.1.1 + unbzip2-stream: 1.4.3 + ws: 8.5.0 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: true + /puppeteer/14.0.0: resolution: {integrity: sha512-Aj/cySGBMWpUYEWV0YOcwyhq5lOxuuiGScgdj/OvslAm/ydoywiI8OzAIXT4HzKmNTmzm/fKKHHtcsQa/fFgdw==} engines: {node: '>=14.1.0'} @@ -13165,6 +13464,14 @@ packages: prop-types: 15.8.1 dev: true + /react/17.0.2: + resolution: {integrity: sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==} + engines: {node: '>=0.10.0'} + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + dev: true + /read-pkg-up/7.0.1: resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} engines: {node: '>=8'} @@ -13802,6 +14109,12 @@ packages: randombytes: 2.1.0 dev: true + /serialize-javascript/6.0.0: + resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} + dependencies: + randombytes: 2.1.0 + dev: true + /serve-favicon/2.5.0: resolution: {integrity: sha1-k10kDN/g9YBTB/3+ln2IlCosvPA=} engines: {node: '>= 0.8.0'} @@ -13916,6 +14229,21 @@ packages: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} dev: true + /size-limit/7.0.8: + resolution: {integrity: sha512-3h76c9E0e/nNhYLSR7IBI/bSoXICeo7EYkYjlyVqNIsu7KvN/PQmMbIXeyd2QKIF8iZKhaiZQoXLkGWbyPDtvQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + hasBin: true + dependencies: + bytes-iec: 3.1.1 + chokidar: 3.5.3 + ci-job-number: 1.2.2 + globby: 11.1.0 + lilconfig: 2.0.5 + mkdirp: 1.0.4 + nanospinner: 1.1.0 + picocolors: 1.0.0 + dev: true + /slash/2.0.0: resolution: {integrity: sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==} engines: {node: '>=6'} @@ -14398,6 +14726,11 @@ packages: engines: {node: '>=6'} dev: true + /tapable/2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + dev: true + /tar-fs/2.1.1: resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} dependencies: @@ -14487,6 +14820,31 @@ packages: webpack-sources: 1.4.3 dev: true + /terser-webpack-plugin/5.3.3_@swc+core@1.2.165+webpack@5.73.0: + resolution: {integrity: sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + dependencies: + '@jridgewell/trace-mapping': 0.3.14 + '@swc/core': 1.2.165 + jest-worker: 27.5.1 + schema-utils: 3.1.1 + serialize-javascript: 6.0.0 + terser: 5.12.1 + webpack: 5.73.0_@swc+core@1.2.165 + dev: true + /terser/4.8.0: resolution: {integrity: sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==} engines: {node: '>=6.0.0'} @@ -14591,7 +14949,7 @@ packages: dev: true /to-regex-range/2.1.1: - resolution: {integrity: sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=} + resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==} engines: {node: '>=0.10.0'} dependencies: is-number: 3.0.0 @@ -15337,6 +15695,11 @@ packages: source-map: 0.6.1 dev: true + /webpack-sources/3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + dev: true + /webpack-virtual-modules/0.2.2: resolution: {integrity: sha512-kDUmfm3BZrei0y+1NTHJInejzxfhtU8eDj2M7OKb2IWrPFAeO1SOH2KuQ68MSZu9IGEHcxbkKKR1v18FrUSOmA==} dependencies: @@ -15381,6 +15744,46 @@ packages: webpack-sources: 1.4.3 dev: true + /webpack/5.73.0_@swc+core@1.2.165: + resolution: {integrity: sha512-svjudQRPPa0YiOYa2lM/Gacw0r6PvxptHj4FuEKQ2kX05ZLkjbVc5MnPs6its5j7IZljnIqSVo/OsY2X0IpHGA==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + dependencies: + '@types/eslint-scope': 3.7.4 + '@types/estree': 0.0.51 + '@webassemblyjs/ast': 1.11.1 + '@webassemblyjs/wasm-edit': 1.11.1 + '@webassemblyjs/wasm-parser': 1.11.1 + acorn: 8.7.1 + acorn-import-assertions: 1.8.0_acorn@8.7.1 + browserslist: 4.20.2 + chrome-trace-event: 1.0.3 + enhanced-resolve: 5.10.0 + es-module-lexer: 0.9.3 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.10 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.1.1 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.3_@swc+core@1.2.165+webpack@5.73.0 + watchpack: 2.3.1 + webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + dev: true + /whatwg-encoding/1.0.5: resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==} dependencies: @@ -15508,6 +15911,19 @@ packages: optional: true dev: true + /ws/8.5.0: + resolution: {integrity: sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: true + /ws/8.6.0: resolution: {integrity: sha512-AzmM3aH3gk0aX7/rZLYvjdvZooofDu3fFOzGqcSnQ1tOcTWwhM/o+q++E8mAyVVIyUdajrkzWUGftaVSDLn1bw==} engines: {node: '>=10.0.0'} diff --git a/src/svg/animation.ts b/src/svg/animation.ts index 68ad8676..74218e12 100644 --- a/src/svg/animation.ts +++ b/src/svg/animation.ts @@ -2,7 +2,7 @@ import type { EventEmitter } from '../event'; import { ensureUnit, quantity } from '../core/lang'; import { extend } from '../utils'; import type { Attributes, AnimationDefinition } from './types'; -import type { Svg } from './svg'; +import type { Svg } from './Svg'; /** * This Object contains some standard easing cubic bezier curves. From c7da330700f1165947f6991422e27dafb7b09191 Mon Sep 17 00:00:00 2001 From: Dan Onoshko <danon0404@gmail.com> Date: Sun, 10 Jul 2022 03:41:12 +0400 Subject: [PATCH 26/44] refactor: replace extend util with Object.assign where it possible (#16) --- src/charts/BarChart/BarChart.ts | 20 +++-------- src/charts/LineChart/LineChart.ts | 28 ++++++--------- src/charts/PieChart/PieChart.ts | 2 +- src/core/creation.ts | 58 +++++++++++-------------------- src/core/data/highLow.ts | 11 +++--- src/core/optionsProvider.ts | 5 ++- src/svg/SvgPath.ts | 29 +++++++--------- src/svg/animation.ts | 23 ++++-------- src/utils/extend.ts | 6 ++-- 9 files changed, 66 insertions(+), 116 deletions(-) diff --git a/src/charts/BarChart/BarChart.ts b/src/charts/BarChart/BarChart.ts index 1ff329e1..bf4b55fa 100644 --- a/src/charts/BarChart/BarChart.ts +++ b/src/charts/BarChart/BarChart.ts @@ -279,10 +279,7 @@ export class BarChart extends BaseChart { axisUnits.x, normalizedData.series, chartRect, - extend({}, options.axisX, { - highLow: highLow, - referenceValue: 0 - }) + { ...options.axisX, highLow: highLow, referenceValue: 0 } ); } else { // eslint-disable-next-line new-cap @@ -290,10 +287,7 @@ export class BarChart extends BaseChart { axisUnits.x, normalizedData.series, chartRect, - extend({}, options.axisX, { - highLow: highLow, - referenceValue: 0 - }) + { ...options.axisX, highLow: highLow, referenceValue: 0 } ); } @@ -340,10 +334,7 @@ export class BarChart extends BaseChart { axisUnits.y, normalizedData.series, chartRect, - extend({}, options.axisY, { - highLow: highLow, - referenceValue: 0 - }) + { ...options.axisY, highLow: highLow, referenceValue: 0 } ); } else { // eslint-disable-next-line new-cap @@ -351,10 +342,7 @@ export class BarChart extends BaseChart { axisUnits.y, normalizedData.series, chartRect, - extend({}, options.axisY, { - highLow: highLow, - referenceValue: 0 - }) + { ...options.axisY, highLow: highLow, referenceValue: 0 } ); } } diff --git a/src/charts/LineChart/LineChart.ts b/src/charts/LineChart/LineChart.ts index 222db2ec..de9fc4d5 100644 --- a/src/charts/LineChart/LineChart.ts +++ b/src/charts/LineChart/LineChart.ts @@ -286,15 +286,11 @@ export class LineChart extends BaseChart { let axisY: Axis; if (options.axisX.type === undefined) { - axisX = new StepAxis( - axisUnits.x, - normalizedData.series, - chartRect, - extend({}, options.axisX, { - ticks: normalizedData.labels, - stretch: options.fullWidth - }) - ); + axisX = new StepAxis(axisUnits.x, normalizedData.series, chartRect, { + ...options.axisX, + ticks: normalizedData.labels, + stretch: options.fullWidth + }); } else { // eslint-disable-next-line new-cap axisX = new options.axisX.type( @@ -306,15 +302,11 @@ export class LineChart extends BaseChart { } if (options.axisY.type === undefined) { - axisY = new AutoScaleAxis( - axisUnits.y, - normalizedData.series, - chartRect, - extend({}, options.axisY, { - high: isNumeric(options.high) ? options.high : options.axisY.high, - low: isNumeric(options.low) ? options.low : options.axisY.low - }) - ); + axisY = new AutoScaleAxis(axisUnits.y, normalizedData.series, chartRect, { + ...options.axisY, + high: isNumeric(options.high) ? options.high : options.axisY.high, + low: isNumeric(options.low) ? options.low : options.axisY.low + }); } else { // eslint-disable-next-line new-cap axisY = new options.axisY.type( diff --git a/src/charts/PieChart/PieChart.ts b/src/charts/PieChart/PieChart.ts index e889a350..ab6d5d86 100644 --- a/src/charts/PieChart/PieChart.ts +++ b/src/charts/PieChart/PieChart.ts @@ -33,7 +33,7 @@ import { BaseChart } from '../BaseChart'; /** * Default options in line charts. Expand the code view to see a detailed list of options with comments. */ -const defaultOptions: PieChartOptions = { +const defaultOptions = { // Specify a fixed width for the chart as a string (i.e. '100px' or '50%') width: undefined, // Specify a fixed height for the chart as a string (i.e. '100px' or '50%') diff --git a/src/core/creation.ts b/src/core/creation.ts index cb8ebc49..4d36d3e9 100644 --- a/src/core/creation.ts +++ b/src/core/creation.ts @@ -4,7 +4,6 @@ import type { Axis } from '../axes'; import { namespaces } from './constants'; import { Svg } from '../svg/Svg'; import { quantity } from './lang'; -import { extend } from '../utils'; /** * Create or reinitialize the SVG element for the chart @@ -189,19 +188,14 @@ export function createGrid( const gridElement = group.elem('line', positionalData, classes.join(' ')); // Event for grid draw - eventEmitter.emit( - 'draw', - extend( - { - type: 'grid', - axis, - index, - group, - element: gridElement - }, - positionalData - ) - ); + eventEmitter.emit('draw', { + type: 'grid', + axis, + index, + group, + element: gridElement, + ...positionalData + }); } /** @@ -271,33 +265,23 @@ export function createLabel( </span> `.trim(); - labelElement = group.foreignObject( - content, - extend( - { - style: 'overflow: visible;' - }, - positionalData - ) - ); + labelElement = group.foreignObject(content, { + style: 'overflow: visible;', + ...positionalData + }); } else { labelElement = group .elem('text', positionalData, classes.join(' ')) .text(String(label)); } - eventEmitter.emit( - 'draw', - extend( - { - type: 'label', - axis, - index, - group, - element: labelElement, - text: label - }, - positionalData - ) - ); + eventEmitter.emit('draw', { + type: 'label', + axis, + index, + group, + element: labelElement, + text: label, + ...positionalData + }); } diff --git a/src/core/data/highLow.ts b/src/core/data/highLow.ts index d18ca74e..a1edbdd9 100644 --- a/src/core/data/highLow.ts +++ b/src/core/data/highLow.ts @@ -4,7 +4,7 @@ import type { NormalizedSeries, NormalizedSeriesValue } from '../types'; -import { extend, safeHasProperty } from '../../utils'; +import { safeHasProperty } from '../../utils'; import { isDataHoleValue } from './data'; /** @@ -20,11 +20,10 @@ export function getHighLow( dimension?: AxisName ) { // TODO: Remove workaround for deprecated global high / low config. Axis high / low configuration is preferred - options = extend( - {}, - options, - dimension ? (dimension === 'x' ? options.axisX : options.axisY) : {} - ); + options = { + ...options, + ...(dimension ? (dimension === 'x' ? options.axisX : options.axisY) : {}) + }; const highLow = { high: options.high === undefined ? -Number.MAX_VALUE : +options.high, diff --git a/src/core/optionsProvider.ts b/src/core/optionsProvider.ts index 007f8017..25f5272f 100644 --- a/src/core/optionsProvider.ts +++ b/src/core/optionsProvider.ts @@ -18,13 +18,12 @@ export function optionsProvider<T = unknown>( responsiveOptions: [string, T][] | undefined, eventEmitter: EventEmitter ): OptionsProvider<T> { - const baseOptions = extend({}, options); let currentOptions: T; const mediaQueryListeners: MediaQueryList[] = []; function updateCurrentOptions(mediaEvent?: Event) { const previousOptions = currentOptions; - currentOptions = extend({}, baseOptions); + currentOptions = extend({}, options); if (responsiveOptions) { responsiveOptions.forEach(responsiveOption => { @@ -66,7 +65,7 @@ export function optionsProvider<T = unknown>( return { removeMediaQueryListeners, getCurrentOptions() { - return extend({}, currentOptions) as T; + return currentOptions; } }; } diff --git a/src/svg/SvgPath.ts b/src/svg/SvgPath.ts index b71c02d8..04a300f1 100644 --- a/src/svg/SvgPath.ts +++ b/src/svg/SvgPath.ts @@ -1,4 +1,3 @@ -import { extend } from '../utils'; import type { SegmentData } from '../core'; import type { SvgPathOptions, PathCommand, PathParams } from './types'; @@ -28,13 +27,11 @@ function element( relative: boolean, data?: SegmentData ) { - const pathElement: PathCommand = extend( - { - command: relative ? command.toLowerCase() : command.toUpperCase() - }, - params, - data ? { data: data } : {} - ); + const pathElement: PathCommand = { + command: relative ? command.toLowerCase() : command.toUpperCase(), + ...params, + ...(data ? { data } : {}) + }; pathElements.splice(pos, 0, pathElement); } @@ -92,7 +89,7 @@ export class SvgPath { * @param options Options object that overrides the default objects. See default options for more details. */ constructor(private readonly close = false, options?: SvgPathOptions) { - this.options = extend({}, defaultOptions, options); + this.options = { ...defaultOptions, ...options }; } /** @@ -281,18 +278,16 @@ export class SvgPath { const command = chunk.shift() as string; const description = elementDescriptions[command.toLowerCase()]; - return extend( - { - command: command - }, - description.reduce<Record<string, number>>( + return { + command, + ...description.reduce<Record<string, number>>( (result, paramName, index) => { result[paramName] = +chunk[index]; return result; }, {} ) - ) as PathCommand; + } as PathCommand; }); // Preparing a splice call with the elements array as var arg params and insert the parsed elements at the current position @@ -398,8 +393,8 @@ export class SvgPath { clone.pos = this.pos; clone.pathElements = this.pathElements .slice() - .map(pathElement => extend({}, pathElement)); - clone.options = extend({}, this.options); + .map(pathElement => ({ ...pathElement })); + clone.options = { ...this.options }; return clone; } diff --git a/src/svg/animation.ts b/src/svg/animation.ts index 74218e12..c3d355bb 100644 --- a/src/svg/animation.ts +++ b/src/svg/animation.ts @@ -1,6 +1,5 @@ import type { EventEmitter } from '../event'; import { ensureUnit, quantity } from '../core/lang'; -import { extend } from '../utils'; import type { Attributes, AnimationDefinition } from './types'; import type { Svg } from './Svg'; @@ -40,7 +39,7 @@ export const easings = { export function createAnimation( element: Svg, attribute: string, - animationDefinition: AnimationDefinition, + { easing, ...animationDefinition }: AnimationDefinition, createGuided = false, eventEmitter?: EventEmitter ) { @@ -50,12 +49,9 @@ export function createAnimation( // Check if an easing is specified in the definition object and delete it from the object as it will not // be part of the animate element attributes. - if (animationDefinition.easing) { + if (easing) { // If already an easing Bézier curve array we take it or we lookup a easing array in the Easing object - animationEasing = Array.isArray(animationDefinition.easing) - ? animationDefinition.easing - : easings[animationDefinition.easing]; - delete animationDefinition.easing; + animationEasing = Array.isArray(easing) ? easing : easings[easing]; } // If numeric dur or begin was provided we assume milli seconds @@ -81,15 +77,10 @@ export function createAnimation( animationDefinition.begin = 'indefinite'; } - const animate = element.elem( - 'animate', - extend( - { - attributeName: attribute - }, - animationDefinition - ) - ); + const animate = element.elem('animate', { + attributeName: attribute, + ...animationDefinition + }); if (createGuided) { // If guided we take the value that was put aside in timeout and trigger the animation manually with a timeout diff --git a/src/utils/extend.ts b/src/utils/extend.ts index 0825ea8c..805cb635 100644 --- a/src/utils/extend.ts +++ b/src/utils/extend.ts @@ -5,9 +5,11 @@ * @param sources This object (objects) will be merged into target and then target is returned * @return An object that has the same reference as target but is extended and merged with the properties of source */ +export function extend<T>(target: T): T; +export function extend<T, A>(target: T, a: A): T & A; +export function extend<T, A, B>(target: T, a: A, b: B): T & A & B; +// eslint-disable-next-line @typescript-eslint/no-explicit-any export function extend(target: any = {}, ...sources: any[]) { - target = target || {}; - for (let i = 0; i < sources.length; i++) { const source = sources[i]; for (const prop in source) { From 73e1c44dc1abab4938dc623a3dc22caad92af6a8 Mon Sep 17 00:00:00 2001 From: Dan Onoshko <danon0404@gmail.com> Date: Sun, 10 Jul 2022 14:09:34 +0400 Subject: [PATCH 27/44] refactor: rename methods in EventEmitter (#17) addEventHandler -> on, removeEventHandler -> off BREAKING CHANGE: methods in EventEmitter were renamed --- src/charts/BaseChart.ts | 6 +++--- src/core/creation.spec.ts | 4 ++-- src/event/EventEmitter.ts | 17 ++++++----------- src/utils/extend.ts | 1 - 4 files changed, 11 insertions(+), 17 deletions(-) diff --git a/src/charts/BaseChart.ts b/src/charts/BaseChart.ts index 065789a5..1abcd774 100644 --- a/src/charts/BaseChart.ts +++ b/src/charts/BaseChart.ts @@ -130,7 +130,7 @@ export abstract class BaseChart { on(event: string, listener: EventListener): this; // eslint-disable-next-line @typescript-eslint/no-explicit-any on(event: string, listener: any) { - this.eventEmitter.addEventHandler(event, listener); + this.eventEmitter.on(event, listener); return this; } @@ -143,7 +143,7 @@ export abstract class BaseChart { off(event: string, listener?: EventListener): this; // eslint-disable-next-line @typescript-eslint/no-explicit-any off(event: string, listener?: any) { - this.eventEmitter.removeEventHandler(event, listener); + this.eventEmitter.off(event, listener); return this; } @@ -159,7 +159,7 @@ export abstract class BaseChart { this.eventEmitter ); // Register options change listener that will trigger a chart update - this.eventEmitter.addEventHandler('optionsChanged', () => this.update()); + this.eventEmitter.on('optionsChanged', () => this.update()); // Before the first chart creation we need to register us with all plugins that are configured // Initialize all relevant plugins with our chart object and the plugin options specified in the config diff --git a/src/core/creation.spec.ts b/src/core/creation.spec.ts index 93e33524..3d3121c9 100644 --- a/src/core/creation.spec.ts +++ b/src/core/creation.spec.ts @@ -82,7 +82,7 @@ describe('Core', () => { }); function onCreated(fn: any, done: any) { - eventEmitter.addEventHandler('draw', grid => { + eventEmitter.on('draw', grid => { fn(grid); done(); }); @@ -154,7 +154,7 @@ describe('Core', () => { }); function onCreated(fn: any, done: any) { - eventEmitter.addEventHandler('draw', (data: any) => { + eventEmitter.on('draw', (data: any) => { fn(data); done(); }); diff --git a/src/event/EventEmitter.ts b/src/event/EventEmitter.ts index f9f11929..923aca87 100644 --- a/src/event/EventEmitter.ts +++ b/src/event/EventEmitter.ts @@ -9,13 +9,12 @@ export class EventEmitter { /** * Add an event handler for a specific event - * @todo Rename to `on`. Replace `'*'` with single argument. * @param event The event name * @param listener A event handler function */ - addEventHandler(event: '*', listener: AllEventsListener): void; - addEventHandler(event: string, listener: EventListener): void; - addEventHandler(event: string, listener: EventListener | AllEventsListener) { + on(event: '*', listener: AllEventsListener): void; + on(event: string, listener: EventListener): void; + on(event: string, listener: EventListener | AllEventsListener) { const { allListeners, listeners } = this; if (event === '*') { @@ -33,16 +32,12 @@ export class EventEmitter { /** * Remove an event handler of a specific event name or remove all event handlers for a specific event. - * @todo Rename to `off`. Replace `'*'` with single argument. * @param event The event name where a specific or all handlers should be removed * @param [listener] An optional event handler function. If specified only this specific handler will be removed and otherwise all handlers are removed. */ - removeEventHandler(event: '*', listener?: AllEventsListener): void; - removeEventHandler(event: string, listener?: EventListener): void; - removeEventHandler( - event: string, - listener?: EventListener | AllEventsListener - ) { + off(event: '*', listener?: AllEventsListener): void; + off(event: string, listener?: EventListener): void; + off(event: string, listener?: EventListener | AllEventsListener) { const { allListeners, listeners } = this; if (event === '*') { diff --git a/src/utils/extend.ts b/src/utils/extend.ts index 805cb635..99ea3b28 100644 --- a/src/utils/extend.ts +++ b/src/utils/extend.ts @@ -1,6 +1,5 @@ /** * Simple recursive object extend - * @todo Replace with Object.assign * @param target Target object where the source will be merged into * @param sources This object (objects) will be merged into target and then target is returned * @return An object that has the same reference as target but is extended and merged with the properties of source From 5f076e14270f0e50368846371115d500889dbda3 Mon Sep 17 00:00:00 2001 From: Dan Onoshko <danon0404@gmail.com> Date: Sun, 10 Jul 2022 14:38:26 +0400 Subject: [PATCH 28/44] refactor: remove isSupported util (#18) it always returns true --- src/axes/Axis.spec.ts | 3 --- src/axes/Axis.ts | 19 +++++------------- src/charts/BarChart/BarChart.ts | 4 +--- src/charts/BaseChart.ts | 4 ---- src/charts/LineChart/LineChart.ts | 4 +--- src/core/creation.ts | 32 +++++++++++-------------------- src/svg/Svg.ts | 13 ------------- 7 files changed, 18 insertions(+), 61 deletions(-) diff --git a/src/axes/Axis.spec.ts b/src/axes/Axis.spec.ts index 5cb5165c..8b95eea5 100644 --- a/src/axes/Axis.spec.ts +++ b/src/axes/Axis.spec.ts @@ -77,7 +77,6 @@ describe('Axes', () => { axis.createGridAndLabels( gridGroup, labelGroup, - true, chartOptions, eventEmitter ); @@ -100,7 +99,6 @@ describe('Axes', () => { axis.createGridAndLabels( gridGroup, labelGroup, - true, chartOptions, eventEmitter ); @@ -123,7 +121,6 @@ describe('Axes', () => { axis.createGridAndLabels( gridGroup, labelGroup, - true, chartOptions, eventEmitter ); diff --git a/src/axes/Axis.ts b/src/axes/Axis.ts index 27456892..ad58cd64 100644 --- a/src/axes/Axis.ts +++ b/src/axes/Axis.ts @@ -64,7 +64,6 @@ export abstract class Axis { createGridAndLabels( gridGroup: Svg, labelGroup: Svg, - useForeignObject: boolean, chartOptions: OptionsWithDefaults, eventEmitter: EventEmitter ) { @@ -110,27 +109,20 @@ export abstract class Axis { // different offset as for positioned with end (bottom) if (chartOptions.axisX.position === 'start') { labelOffset.y = - this.chartRect.padding.top + - chartOptions.axisX.labelOffset.y + - (useForeignObject ? 5 : 20); + this.chartRect.padding.top + chartOptions.axisX.labelOffset.y + 5; } else { labelOffset.y = - this.chartRect.y1 + - chartOptions.axisX.labelOffset.y + - (useForeignObject ? 5 : 20); + this.chartRect.y1 + chartOptions.axisX.labelOffset.y + 5; } } else { projectedValue = this.chartRect.y1 - projectedValue; - labelOffset.y = - chartOptions.axisY.labelOffset.y - - (useForeignObject ? labelLength : 0); + labelOffset.y = chartOptions.axisY.labelOffset.y - labelLength; // If the labels should be positioned in start position (left side for horizontal axis) we need to set a // different offset as for positioned with end (right side) if (chartOptions.axisY.position === 'start') { - labelOffset.x = useForeignObject - ? this.chartRect.padding.left + chartOptions.axisY.labelOffset.x - : this.chartRect.x1 - 10; + labelOffset.x = + this.chartRect.padding.left + chartOptions.axisY.labelOffset.x; } else { labelOffset.x = this.chartRect.x2 + chartOptions.axisY.labelOffset.x + 10; @@ -170,7 +162,6 @@ export abstract class Axis { ? chartOptions.classNames[axisOptions.position] : chartOptions.classNames.end ], - useForeignObject, eventEmitter ); } diff --git a/src/charts/BarChart/BarChart.ts b/src/charts/BarChart/BarChart.ts index bf4b55fa..d9e588d7 100644 --- a/src/charts/BarChart/BarChart.ts +++ b/src/charts/BarChart/BarChart.ts @@ -26,7 +26,7 @@ import { createGridBackground } from '../../core'; import { AutoScaleAxis, StepAxis, axisUnits } from '../../axes'; -import { BaseChart, supportsForeignObject } from '../BaseChart'; +import { BaseChart } from '../BaseChart'; function getSerialSums(series: NormalizedSeries[]) { return serialMap(series, (...args) => @@ -357,14 +357,12 @@ export class BarChart extends BaseChart { labelAxis.createGridAndLabels( gridGroup, labelGroup, - supportsForeignObject, options, this.eventEmitter ); valueAxis.createGridAndLabels( gridGroup, labelGroup, - supportsForeignObject, options, this.eventEmitter ); diff --git a/src/charts/BaseChart.ts b/src/charts/BaseChart.ts index 1abcd774..ae10ab58 100644 --- a/src/charts/BaseChart.ts +++ b/src/charts/BaseChart.ts @@ -3,10 +3,6 @@ import type { Svg } from '../svg'; import { OptionsProvider, optionsProvider } from '../core'; import { extend } from '../utils'; import { EventListener, AllEventsListener, EventEmitter } from '../event'; -import { isSupported } from '../svg'; - -export const supportsForeignObject = isSupported('Extensibility'); -export const supportsAnimations = isSupported('AnimationEventsAttribute'); const instances = new WeakMap<Element, BaseChart>(); diff --git a/src/charts/LineChart/LineChart.ts b/src/charts/LineChart/LineChart.ts index de9fc4d5..04990a8d 100644 --- a/src/charts/LineChart/LineChart.ts +++ b/src/charts/LineChart/LineChart.ts @@ -22,7 +22,7 @@ import { import { isNumeric, noop, extend, safeHasProperty } from '../../utils'; import { StepAxis, AutoScaleAxis, axisUnits } from '../../axes'; import { monotoneCubic, none } from '../../interpolation'; -import { BaseChart, supportsForeignObject } from './../BaseChart'; +import { BaseChart } from './../BaseChart'; export function getSeriesOption< T extends keyof Omit<LineChartOptionsWithDefaults, 'series'> @@ -320,14 +320,12 @@ export class LineChart extends BaseChart { axisX.createGridAndLabels( gridGroup, labelGroup, - supportsForeignObject, options, this.eventEmitter ); axisY.createGridAndLabels( gridGroup, labelGroup, - supportsForeignObject, options, this.eventEmitter ); diff --git a/src/core/creation.ts b/src/core/creation.ts index 4d36d3e9..66662869 100644 --- a/src/core/creation.ts +++ b/src/core/creation.ts @@ -240,40 +240,30 @@ export function createLabel( labelOffset: { x: number; y: number }, group: Svg, classes: string[], - useForeignObject: boolean, eventEmitter: EventEmitter ) { - let labelElement; const positionalData = { [axis.units.pos]: position + labelOffset[axis.units.pos], [axis.counterUnits.pos]: labelOffset[axis.counterUnits.pos], [axis.units.len]: length, [axis.counterUnits.len]: Math.max(0, axisOffset - 10) }; - - if (useForeignObject) { - // We need to set width and height explicitly to px as span will not expand with width and height being - // 100% in all browsers - const stepLength = Math.round(positionalData[axis.units.len]); - const stepCounterLength = Math.round(positionalData[axis.counterUnits.len]); - const content = ` + // We need to set width and height explicitly to px as span will not expand with width and height being + // 100% in all browsers + const stepLength = Math.round(positionalData[axis.units.len]); + const stepCounterLength = Math.round(positionalData[axis.counterUnits.len]); + const content = ` <span class="${classes.join(' ')}" style="${axis.units.len}: ${stepLength}px; ${ - axis.counterUnits.len - }: ${stepCounterLength}px"> + axis.counterUnits.len + }: ${stepCounterLength}px"> ${label} </span> `.trim(); - - labelElement = group.foreignObject(content, { - style: 'overflow: visible;', - ...positionalData - }); - } else { - labelElement = group - .elem('text', positionalData, classes.join(' ')) - .text(String(label)); - } + const labelElement = group.foreignObject(content, { + style: 'overflow: visible;', + ...positionalData + }); eventEmitter.emit('draw', { type: 'label', diff --git a/src/svg/Svg.ts b/src/svg/Svg.ts index a24b4174..0c211bea 100644 --- a/src/svg/Svg.ts +++ b/src/svg/Svg.ts @@ -411,16 +411,3 @@ export class Svg { return this; } } - -/** - * This method checks for support of a given SVG feature like Extensibility, SVG-animation or the like. Check http://www.w3.org/TR/SVG11/feature for a detailed list. - * @todo Drop. - * @param feature The SVG 1.1 feature that should be checked for support. - * @return True of false if the feature is supported or not - */ -export function isSupported(feature: string) { - return document.implementation.hasFeature( - 'http://www.w3.org/TR/SVG11/feature#' + feature, - '1.1' - ); -} From d629a56a94a7589ff3517f6ed14f01ac2a6424c1 Mon Sep 17 00:00:00 2001 From: Dan Onoshko <danon0404@gmail.com> Date: Sun, 10 Jul 2022 16:51:12 +0400 Subject: [PATCH 29/44] refactor: cleanup createChartRect method (#19) --- src/charts/BarChart/BarChart.ts | 7 +---- src/charts/LineChart/LineChart.ts | 10 +------ src/charts/PieChart/PieChart.ts | 8 +----- src/core/creation.spec.ts | 45 ------------------------------- src/core/creation.ts | 27 ++++++------------- 5 files changed, 11 insertions(+), 86 deletions(-) diff --git a/src/charts/BarChart/BarChart.ts b/src/charts/BarChart/BarChart.ts index d9e588d7..9f0da36c 100644 --- a/src/charts/BarChart/BarChart.ts +++ b/src/charts/BarChart/BarChart.ts @@ -252,12 +252,7 @@ export class BarChart extends BaseChart { highLow.low = options.low; } - const chartRect = createChartRect( - svg, - options - // @todo Fix padding. - // defaultOptions.padding - ); + const chartRect = createChartRect(svg, options); let valueAxis: Axis; const labelAxisTicks = // We need to set step count based on some options combinations options.distributeSeries && options.stackBars diff --git a/src/charts/LineChart/LineChart.ts b/src/charts/LineChart/LineChart.ts index 04990a8d..05daeab2 100644 --- a/src/charts/LineChart/LineChart.ts +++ b/src/charts/LineChart/LineChart.ts @@ -276,12 +276,7 @@ export class LineChart extends BaseChart { const seriesGroup = svg.elem('g'); const labelGroup = svg.elem('g').addClass(options.classNames.labelGroup); - const chartRect = createChartRect( - svg, - options - // @todo Fix padding. - // defaultOptions.padding - ); + const chartRect = createChartRect(svg, options); let axisX: Axis; let axisY: Axis; @@ -508,7 +503,6 @@ export class LineChart extends BaseChart { ); // We project the areaBase value into screen coordinates - // @todo Check with StepAxis const areaBaseProjected = chartRect.y1 - axisY.projectValue(areaBase); // In order to form the area we'll first split the path by move commands so we can chunk it up into segments @@ -570,8 +564,6 @@ export class LineChart extends BaseChart { }); this.eventEmitter.emit<LineChartCreatedEvent>('created', { - // @todo Remove redundant - // bounds: axisY.bounds, chartRect, axisX, axisY, diff --git a/src/charts/PieChart/PieChart.ts b/src/charts/PieChart/PieChart.ts index ab6d5d86..6e2268c1 100644 --- a/src/charts/PieChart/PieChart.ts +++ b/src/charts/PieChart/PieChart.ts @@ -221,12 +221,7 @@ export class PieChart extends BaseChart { this.svg = svg; // Calculate charting rect - const chartRect = createChartRect( - svg, - options - // @todo Fix padding. - // defaultOptions.padding - ); + const chartRect = createChartRect(svg, options); // Get biggest circle radius possible within chartRect let radius = Math.min(chartRect.width() / 2, chartRect.height() / 2); // Calculate total of all series to get reference value or use total reference from optional options @@ -289,7 +284,6 @@ export class PieChart extends BaseChart { const seriesName = safeHasProperty(series, 'name') && series.name; const seriesClassName = safeHasProperty(series, 'className') && series.className; - // @todo getMetaData const seriesMeta = safeHasProperty(series, 'meta') ? series.meta : undefined; diff --git a/src/core/creation.spec.ts b/src/core/creation.spec.ts index 3d3121c9..acd85e61 100644 --- a/src/core/creation.spec.ts +++ b/src/core/creation.spec.ts @@ -211,51 +211,6 @@ describe('Core', () => { left: 0 }); }); - - it('should normalize empty padding object with specified fallback', () => { - expect(normalizePadding({}, 10)).toEqual({ - top: 10, - right: 10, - bottom: 10, - left: 10 - }); - }); - - it('should normalize partial padding object with specified fallback', () => { - expect( - normalizePadding( - { - top: 5, - left: 5 - }, - 10 - ) - ).toEqual({ - top: 5, - right: 10, - bottom: 10, - left: 5 - }); - }); - - it('should not modify complete padding object', () => { - expect( - normalizePadding( - { - top: 5, - right: 5, - bottom: 5, - left: 5 - }, - 10 - ) - ).toEqual({ - top: 5, - right: 5, - bottom: 5, - left: 5 - }); - }); }); }); }); diff --git a/src/core/creation.ts b/src/core/creation.ts index 66662869..09e17ce7 100644 --- a/src/core/creation.ts +++ b/src/core/creation.ts @@ -53,8 +53,7 @@ export function createSvg( * @returns Returns a padding object containing top, right, bottom, left properties filled with the padding number passed in as argument. If the argument is something else than a number (presumably already a correct padding object) then this argument is directly returned. */ export function normalizePadding( - padding: number | Partial<ChartPadding> | undefined, - fallback = 0 + padding: number | Partial<ChartPadding> | undefined ) { return typeof padding === 'number' ? { @@ -64,12 +63,12 @@ export function normalizePadding( left: padding } : padding === undefined - ? { top: fallback, right: fallback, bottom: fallback, left: fallback } + ? { top: 0, right: 0, bottom: 0, left: 0 } : { - top: typeof padding.top === 'number' ? padding.top : fallback, - right: typeof padding.right === 'number' ? padding.right : fallback, - bottom: typeof padding.bottom === 'number' ? padding.bottom : fallback, - left: typeof padding.left === 'number' ? padding.left : fallback + top: typeof padding.top === 'number' ? padding.top : 0, + right: typeof padding.right === 'number' ? padding.right : 0, + bottom: typeof padding.bottom === 'number' ? padding.bottom : 0, + left: typeof padding.left === 'number' ? padding.left : 0 }; } @@ -77,14 +76,9 @@ export function normalizePadding( * Initialize chart drawing rectangle (area where chart is drawn) x1,y1 = bottom left / x2,y2 = top right * @param svg The svg element for the chart * @param options The Object that contains all the optional values for the chart - * @param fallbackPadding The fallback padding if partial padding objects are used * @return The chart rectangles coordinates inside the svg element plus the rectangles measurements */ -export function createChartRect( - svg: Svg, - options: Options, - fallbackPadding?: number -) { +export function createChartRect(svg: Svg, options: Options) { const hasAxis = Boolean(options.axisX || options.axisY); const yAxisOffset = options.axisY?.offset || 0; const xAxisOffset = options.axisX?.offset || 0; @@ -93,10 +87,7 @@ export function createChartRect( // If width or height results in invalid value (including 0) we fallback to the unitless settings or even 0 let width = svg.width() || quantity(options.width).value || 0; let height = svg.height() || quantity(options.height).value || 0; - const normalizedPadding = normalizePadding( - options.chartPadding, - fallbackPadding - ); + const normalizedPadding = normalizePadding(options.chartPadding); // If settings were to small to cope with offset (legacy) and padding, we'll adjust width = Math.max( @@ -114,11 +105,9 @@ export function createChartRect( y1: 0, y2: 0, padding: normalizedPadding, - /** @todo Is it even used?? */ width() { return this.x2 - this.x1; }, - /** @todo Is it even used?? */ height() { return this.y1 - this.y2; } From c8fd5f7eef7a5fc008e4809b23a2d145fb010866 Mon Sep 17 00:00:00 2001 From: Dan Onoshko <danon0404@gmail.com> Date: Mon, 11 Jul 2022 21:44:13 +0400 Subject: [PATCH 30/44] ci: publish scripts (#20) --- .clean-publish | 4 + .storybook/package.json | 3 + package.json | 11 + pnpm-lock.yaml | 600 +++++++++++++++++++++++- postcss.config.js => postcss.config.cjs | 0 5 files changed, 607 insertions(+), 11 deletions(-) create mode 100644 .clean-publish create mode 100644 .storybook/package.json rename postcss.config.js => postcss.config.cjs (100%) diff --git a/.clean-publish b/.clean-publish new file mode 100644 index 00000000..711387ff --- /dev/null +++ b/.clean-publish @@ -0,0 +1,4 @@ +{ + "withoutPublish": true, + "tempDir": "package" +} diff --git a/.storybook/package.json b/.storybook/package.json new file mode 100644 index 00000000..5bbefffb --- /dev/null +++ b/.storybook/package.json @@ -0,0 +1,3 @@ +{ + "type": "commonjs" +} diff --git a/package.json b/package.json index bb54556a..ae7902ab 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,6 @@ { "name": "chartist", + "type": "module", "version": "1.0.0", "description": "Simple, responsive charts", "author": "Gion Kunz", @@ -51,6 +52,10 @@ "LICENSE-MIT" ], "scripts": { + "clear:package": "del ./package", + "clear": "del ./package ./dist ./coverage", + "prepublishOnly": "pnpm test && pnpm build && pnpm clear:package && clean-publish", + "postpublish": "pnpm clear:package", "emitDeclarations": "tsc --emitDeclarationOnly", "build:styles": "./scripts/styles.js", "build": "rollup -c & pnpm build:styles & pnpm emitDeclarations", @@ -64,6 +69,9 @@ "lint": "eslint './*.{js,ts}' 'test/**/*.{js,ts}' 'src/**/*.{js,ts}' '.storybook/**/*.{js,ts}' 'scripts/**/*.{js,ts}'", "format": "prettier --write './*.{js,ts}' 'test/**/*.{js,ts}' 'src/**/*.{js,ts}' '.storybook/**/*.{js,ts}' 'scripts/**/*.{js,ts}'", "commit": "cz", + "bumpVersion": "standard-version", + "createGithubRelease": "simple-github-release", + "release": "pnpm bumpVersion && git push origin master --tags && pnpm createGithubRelease", "updateGitHooks": "simple-git-hooks" }, "devDependencies": { @@ -92,6 +100,7 @@ "@typescript-eslint/parser": "^5.25.0", "browserslist": "^4.20.2", "chartist": "^0.11.4", + "clean-publish": "^4.0.1", "commitizen": "^4.2.4", "cssnano": "^4.1.11", "del": "^6.0.0", @@ -117,7 +126,9 @@ "sass": "^1.50.1", "sass-loader": "^10.0.0", "simple-git-hooks": "^2.7.0", + "simple-github-release": "^1.0.0", "size-limit": "^7.0.8", + "standard-version": "^9.5.0", "swc-loader": "^0.2.3", "tsd": "^0.20.0", "typescript": "^4.6.4" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d8afa485..001dfa0a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -26,6 +26,7 @@ specifiers: '@typescript-eslint/parser': ^5.25.0 browserslist: ^4.20.2 chartist: ^0.11.4 + clean-publish: ^4.0.1 commitizen: ^4.2.4 cssnano: ^4.1.11 del: ^6.0.0 @@ -51,7 +52,9 @@ specifiers: sass: ^1.50.1 sass-loader: ^10.0.0 simple-git-hooks: ^2.7.0 + simple-github-release: ^1.0.0 size-limit: ^7.0.8 + standard-version: ^9.5.0 swc-loader: ^0.2.3 tsd: ^0.20.0 typescript: ^4.6.4 @@ -82,6 +85,7 @@ devDependencies: '@typescript-eslint/parser': 5.25.0_eslint@8.15.0+typescript@4.6.4 browserslist: 4.20.2 chartist: 0.11.4 + clean-publish: 4.0.1 commitizen: 4.2.4_@swc+core@1.2.165 cssnano: 4.1.11 del: 6.0.0 @@ -107,7 +111,9 @@ devDependencies: sass: 1.50.1 sass-loader: 10.2.1_sass@1.50.1 simple-git-hooks: 2.7.0 + simple-github-release: 1.0.0 size-limit: 7.0.8 + standard-version: 9.5.0 swc-loader: 0.2.3_@swc+core@1.2.165 tsd: 0.20.0 typescript: 4.6.4 @@ -1990,6 +1996,11 @@ packages: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} dev: true + /@hutson/parse-repository-url/3.0.2: + resolution: {integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==} + engines: {node: '>=6.9.0'} + dev: true + /@istanbuljs/load-nyc-config/1.1.0: resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} engines: {node: '>=8'} @@ -2357,6 +2368,113 @@ packages: rimraf: 3.0.2 dev: true + /@octokit/auth-token/2.5.0: + resolution: {integrity: sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==} + dependencies: + '@octokit/types': 6.39.0 + dev: true + + /@octokit/core/3.6.0: + resolution: {integrity: sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==} + dependencies: + '@octokit/auth-token': 2.5.0 + '@octokit/graphql': 4.8.0 + '@octokit/request': 5.6.3 + '@octokit/request-error': 2.1.0 + '@octokit/types': 6.39.0 + before-after-hook: 2.2.2 + universal-user-agent: 6.0.0 + transitivePeerDependencies: + - encoding + dev: true + + /@octokit/endpoint/6.0.12: + resolution: {integrity: sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==} + dependencies: + '@octokit/types': 6.39.0 + is-plain-object: 5.0.0 + universal-user-agent: 6.0.0 + dev: true + + /@octokit/graphql/4.8.0: + resolution: {integrity: sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==} + dependencies: + '@octokit/request': 5.6.3 + '@octokit/types': 6.39.0 + universal-user-agent: 6.0.0 + transitivePeerDependencies: + - encoding + dev: true + + /@octokit/openapi-types/12.8.0: + resolution: {integrity: sha512-ydcKLs2KKcxlhpdWLzJxEBDEk/U5MUeqtqkXlrtAUXXFPs6vLl1PEGghFC/BbpleosB7iXs0Z4P2DGe7ZT5ZNg==} + dev: true + + /@octokit/plugin-paginate-rest/2.21.2_@octokit+core@3.6.0: + resolution: {integrity: sha512-S24H0a6bBVreJtoTaRHT/gnVASbOHVTRMOVIqd9zrJBP3JozsxJB56TDuTUmd1xLI4/rAE2HNmThvVKtIdLLEw==} + peerDependencies: + '@octokit/core': '>=4' + dependencies: + '@octokit/core': 3.6.0 + '@octokit/types': 6.39.0 + dev: true + + /@octokit/plugin-request-log/1.0.4_@octokit+core@3.6.0: + resolution: {integrity: sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==} + peerDependencies: + '@octokit/core': '>=3' + dependencies: + '@octokit/core': 3.6.0 + dev: true + + /@octokit/plugin-rest-endpoint-methods/5.16.2_@octokit+core@3.6.0: + resolution: {integrity: sha512-8QFz29Fg5jDuTPXVtey05BLm7OB+M8fnvE64RNegzX7U+5NUXcOcnpTIK0YfSHBg8gYd0oxIq3IZTe9SfPZiRw==} + peerDependencies: + '@octokit/core': '>=3' + dependencies: + '@octokit/core': 3.6.0 + '@octokit/types': 6.39.0 + deprecation: 2.3.1 + dev: true + + /@octokit/request-error/2.1.0: + resolution: {integrity: sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==} + dependencies: + '@octokit/types': 6.39.0 + deprecation: 2.3.1 + once: 1.4.0 + dev: true + + /@octokit/request/5.6.3: + resolution: {integrity: sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==} + dependencies: + '@octokit/endpoint': 6.0.12 + '@octokit/request-error': 2.1.0 + '@octokit/types': 6.39.0 + is-plain-object: 5.0.0 + node-fetch: 2.6.7 + universal-user-agent: 6.0.0 + transitivePeerDependencies: + - encoding + dev: true + + /@octokit/rest/18.12.0: + resolution: {integrity: sha512-gDPiOHlyGavxr72y0guQEhLsemgVjwRePayJ+FcKc2SJqKUbxbkvf5kAZEWA/MKvsfYlQAMVzNJE3ezQcxMJ2Q==} + dependencies: + '@octokit/core': 3.6.0 + '@octokit/plugin-paginate-rest': 2.21.2_@octokit+core@3.6.0 + '@octokit/plugin-request-log': 1.0.4_@octokit+core@3.6.0 + '@octokit/plugin-rest-endpoint-methods': 5.16.2_@octokit+core@3.6.0 + transitivePeerDependencies: + - encoding + dev: true + + /@octokit/types/6.39.0: + resolution: {integrity: sha512-Mq4N9sOAYCitTsBtDdRVrBE80lIrMBhL9Jbrw0d+j96BAzlq4V+GLHFJbHokEsVvO/9tQupQdoFdgVYhD2C8UQ==} + dependencies: + '@octokit/openapi-types': 12.8.0 + dev: true + /@popperjs/core/2.11.5: resolution: {integrity: sha512-9X2obfABZuDVLCgPK9aX0a/x4jaOEweTTWE2+9sr0Qqqevj2Uv5XorvusThmc9XGYpS9yI+fhh8RTafBtGposw==} dev: true @@ -4495,6 +4613,10 @@ packages: resolution: {integrity: sha512-uCx6mP3UY5SIO14XlspxsGjgaemrxpssJI0Ol+GfhxtcKpv9pgRZYsS4eeKeHVLje6Qtc8lGszuBI461+gVZBA==} dev: true + /@types/git-url-parse/9.0.1: + resolution: {integrity: sha512-Zf9mY4Mz7N3Nyi341nUkOtgVUQn4j6NS4ndqEha/lOgEbTkHzpD7wZuRagYKzrXNtvawWfsrojoC1nhsQexvNA==} + dev: true + /@types/glob/7.2.0: resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} dependencies: @@ -5250,6 +5372,10 @@ packages: hasBin: true dev: true + /add-stream/1.0.0: + resolution: {integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==} + dev: true + /address/1.1.2: resolution: {integrity: sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==} engines: {node: '>= 0.12.0'} @@ -5453,6 +5579,11 @@ packages: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} dev: true + /argue-cli/2.0.0: + resolution: {integrity: sha512-t0Nn8sxf7dPtQRDZyyzrjnfPYw7/yYC46mVqGgy4oCa0wwWgB7wooqVLTUPZ1z5Kk1FUc8LZFTXhegU1oy1xXw==} + engines: {node: '>=14.0.0'} + dev: true + /aria-query/5.0.0: resolution: {integrity: sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg==} engines: {node: '>=6.0'} @@ -5478,7 +5609,7 @@ packages: dev: true /array-ify/1.0.0: - resolution: {integrity: sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=} + resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} dev: true /array-includes/3.1.4: @@ -5850,6 +5981,10 @@ packages: resolution: {integrity: sha1-dclcMrdI4IUNEMKxaPa9vpiRrOg=} dev: true + /before-after-hook/2.2.2: + resolution: {integrity: sha512-3pZEU3NT5BFUo/AD5ERPWOgQOCZITni6iavr5AUw5AUwQjMlI0kzu5btnyD39AF0gUEsDPwJT+oY1ORBJijPjQ==} + dev: true + /better-opn/2.1.1: resolution: {integrity: sha512-kIPXZS5qwyKiX/HcRvDYfmBQUa8XP17I0mYZZ0y4UhpYOSvtsLHDYqmomS+Mj20aDvD3knEiQ0ecQy2nhio3yA==} engines: {node: '>8.0.0'} @@ -6424,6 +6559,17 @@ packages: source-map: 0.6.1 dev: true + /clean-publish/4.0.1: + resolution: {integrity: sha512-6v0bh5kQD5FDlxBgXDVNNc6KmAB7iIP/GHD91q9xsGVZT5XB9Y8TNqB7dL5u9PTZlBeLpBw+A1AseRlEEJLSWA==} + engines: {node: '>= 16.0.0'} + hasBin: true + dependencies: + cross-spawn: 7.0.3 + fast-glob: 3.2.11 + lilconfig: 2.0.5 + micromatch: 4.0.5 + dev: true + /clean-stack/2.2.0: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} @@ -6675,6 +6821,16 @@ packages: typedarray: 0.0.6 dev: true + /concat-stream/2.0.0: + resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} + engines: {'0': node >= 6.0} + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 3.6.0 + typedarray: 0.0.6 + dev: true + /console-browserify/1.2.0: resolution: {integrity: sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==} dev: true @@ -6707,6 +6863,24 @@ packages: q: 1.5.1 dev: true + /conventional-changelog-atom/2.0.8: + resolution: {integrity: sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw==} + engines: {node: '>=10'} + dependencies: + q: 1.5.1 + dev: true + + /conventional-changelog-codemirror/2.0.8: + resolution: {integrity: sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw==} + engines: {node: '>=10'} + dependencies: + q: 1.5.1 + dev: true + + /conventional-changelog-config-spec/2.1.0: + resolution: {integrity: sha512-IpVePh16EbbB02V+UA+HQnnPIohgXvJRxHcS5+Uwk4AT5LjzCZJm5sp/yqs5C6KZJ1jMsV4paEV13BN1pvDuxQ==} + dev: true + /conventional-changelog-conventionalcommits/4.6.3: resolution: {integrity: sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==} engines: {node: '>=10'} @@ -6716,10 +6890,112 @@ packages: q: 1.5.1 dev: true + /conventional-changelog-core/4.2.4: + resolution: {integrity: sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==} + engines: {node: '>=10'} + dependencies: + add-stream: 1.0.0 + conventional-changelog-writer: 5.0.1 + conventional-commits-parser: 3.2.4 + dateformat: 3.0.3 + get-pkg-repo: 4.2.1 + git-raw-commits: 2.0.11 + git-remote-origin-url: 2.0.0 + git-semver-tags: 4.1.1 + lodash: 4.17.21 + normalize-package-data: 3.0.3 + q: 1.5.1 + read-pkg: 3.0.0 + read-pkg-up: 3.0.0 + through2: 4.0.2 + dev: true + + /conventional-changelog-ember/2.0.9: + resolution: {integrity: sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==} + engines: {node: '>=10'} + dependencies: + q: 1.5.1 + dev: true + + /conventional-changelog-eslint/3.0.9: + resolution: {integrity: sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==} + engines: {node: '>=10'} + dependencies: + q: 1.5.1 + dev: true + + /conventional-changelog-express/2.0.6: + resolution: {integrity: sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==} + engines: {node: '>=10'} + dependencies: + q: 1.5.1 + dev: true + + /conventional-changelog-jquery/3.0.11: + resolution: {integrity: sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==} + engines: {node: '>=10'} + dependencies: + q: 1.5.1 + dev: true + + /conventional-changelog-jshint/2.0.9: + resolution: {integrity: sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==} + engines: {node: '>=10'} + dependencies: + compare-func: 2.0.0 + q: 1.5.1 + dev: true + + /conventional-changelog-preset-loader/2.3.4: + resolution: {integrity: sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==} + engines: {node: '>=10'} + dev: true + + /conventional-changelog-writer/5.0.1: + resolution: {integrity: sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==} + engines: {node: '>=10'} + hasBin: true + dependencies: + conventional-commits-filter: 2.0.7 + dateformat: 3.0.3 + handlebars: 4.7.7 + json-stringify-safe: 5.0.1 + lodash: 4.17.21 + meow: 8.1.2 + semver: 6.3.0 + split: 1.0.1 + through2: 4.0.2 + dev: true + + /conventional-changelog/3.1.25: + resolution: {integrity: sha512-ryhi3fd1mKf3fSjbLXOfK2D06YwKNic1nC9mWqybBHdObPd8KJ2vjaXZfYj1U23t+V8T8n0d7gwnc9XbIdFbyQ==} + engines: {node: '>=10'} + dependencies: + conventional-changelog-angular: 5.0.13 + conventional-changelog-atom: 2.0.8 + conventional-changelog-codemirror: 2.0.8 + conventional-changelog-conventionalcommits: 4.6.3 + conventional-changelog-core: 4.2.4 + conventional-changelog-ember: 2.0.9 + conventional-changelog-eslint: 3.0.9 + conventional-changelog-express: 2.0.6 + conventional-changelog-jquery: 3.0.11 + conventional-changelog-jshint: 2.0.9 + conventional-changelog-preset-loader: 2.3.4 + dev: true + /conventional-commit-types/3.0.0: resolution: {integrity: sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg==} dev: true + /conventional-commits-filter/2.0.7: + resolution: {integrity: sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==} + engines: {node: '>=10'} + dependencies: + lodash.ismatch: 4.4.0 + modify-values: 1.0.1 + dev: true + /conventional-commits-parser/3.2.4: resolution: {integrity: sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==} engines: {node: '>=10'} @@ -6733,6 +7009,21 @@ packages: through2: 4.0.2 dev: true + /conventional-recommended-bump/6.1.0: + resolution: {integrity: sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + concat-stream: 2.0.0 + conventional-changelog-preset-loader: 2.3.4 + conventional-commits-filter: 2.0.7 + conventional-commits-parser: 3.2.4 + git-raw-commits: 2.0.11 + git-semver-tags: 4.1.1 + meow: 8.1.2 + q: 1.5.1 + dev: true + /convert-source-map/1.8.0: resolution: {integrity: sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==} dependencies: @@ -7231,6 +7522,10 @@ packages: whatwg-url: 8.7.0 dev: true + /dateformat/3.0.3: + resolution: {integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==} + dev: true + /debug/2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} dependencies: @@ -7305,6 +7600,11 @@ packages: clone: 1.0.4 dev: true + /define-lazy-prop/2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + dev: true + /define-properties/1.1.3: resolution: {integrity: sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==} engines: {node: '>= 0.4'} @@ -7371,6 +7671,10 @@ packages: engines: {node: '>= 0.6'} dev: true + /deprecation/2.3.1: + resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} + dev: true + /des.js/1.0.1: resolution: {integrity: sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==} dependencies: @@ -7565,6 +7869,14 @@ packages: engines: {node: '>=10'} dev: true + /dotgitignore/2.1.0: + resolution: {integrity: sha512-sCm11ak2oY6DglEPpCB8TixLjWAxd3kJTs6UIcSasNYxXdFPV+YKlye92c8H4kKFqV5qYMIh7d+cYecEg0dIkA==} + engines: {node: '>=6'} + dependencies: + find-up: 3.0.0 + minimatch: 3.1.2 + dev: true + /downshift/6.1.7: resolution: {integrity: sha512-cVprZg/9Lvj/uhYRxELzlu1aezRcgPWBjTvspiGTVEU64gF5pRdSRKFVLcxqsZC637cLAGMbL40JavEfWnqgNg==} peerDependencies: @@ -8390,6 +8702,11 @@ packages: to-regex-range: 5.0.1 dev: true + /filter-obj/1.1.0: + resolution: {integrity: sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==} + engines: {node: '>=0.10.0'} + dev: true + /finalhandler/1.1.2: resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==} engines: {node: '>= 0.8'} @@ -8437,6 +8754,13 @@ packages: resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} dev: true + /find-up/2.1.0: + resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} + engines: {node: '>=4'} + dependencies: + locate-path: 2.0.0 + dev: true + /find-up/3.0.0: resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} engines: {node: '>=6'} @@ -8743,6 +9067,17 @@ packages: engines: {node: '>=8.0.0'} dev: true + /get-pkg-repo/4.2.1: + resolution: {integrity: sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==} + engines: {node: '>=6.9.0'} + hasBin: true + dependencies: + '@hutson/parse-repository-url': 3.0.2 + hosted-git-info: 4.1.0 + through2: 2.0.5 + yargs: 16.2.0 + dev: true + /get-stdin/5.0.1: resolution: {integrity: sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=} engines: {node: '>=0.12.0'} @@ -8792,6 +9127,42 @@ packages: through2: 4.0.2 dev: true + /git-remote-origin-url/2.0.0: + resolution: {integrity: sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==} + engines: {node: '>=4'} + dependencies: + gitconfiglocal: 1.0.0 + pify: 2.3.0 + dev: true + + /git-semver-tags/4.1.1: + resolution: {integrity: sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + meow: 8.1.2 + semver: 6.3.0 + dev: true + + /git-up/4.0.5: + resolution: {integrity: sha512-YUvVDg/vX3d0syBsk/CKUTib0srcQME0JyHkL5BaYdwLsiCslPWmDSi8PUMo9pXYjrryMcmsCoCgsTpSCJEQaA==} + dependencies: + is-ssh: 1.4.0 + parse-url: 6.0.2 + dev: true + + /git-url-parse/11.6.0: + resolution: {integrity: sha512-WWUxvJs5HsyHL6L08wOusa/IXYtMuCAhrMmnTjQPpBU0TTHyDhnOATNH3xNQz7YOQUsqIIPTGr4xiVti1Hsk5g==} + dependencies: + git-up: 4.0.5 + dev: true + + /gitconfiglocal/1.0.0: + resolution: {integrity: sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==} + dependencies: + ini: 1.3.8 + dev: true + /github-slugger/1.4.0: resolution: {integrity: sha512-w0dzqw/nt51xMVmlaV1+JRzN+oCa1KfcgGEWhxUG16wbdA+Xnt/yoFO8Z8x/V82ZcZ0wy6ln9QDup5avbhiDhQ==} dev: true @@ -8974,7 +9345,7 @@ packages: dev: true /has-flag/3.0.0: - resolution: {integrity: sha1-tdRU3CGZriJWmfNGfloH87lVuv0=} + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} dev: true @@ -9453,7 +9824,7 @@ packages: dev: true /inherits/2.0.1: - resolution: {integrity: sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=} + resolution: {integrity: sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==} dev: true /inherits/2.0.3: @@ -9882,6 +10253,12 @@ packages: call-bind: 1.0.2 dev: true + /is-ssh/1.4.0: + resolution: {integrity: sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==} + dependencies: + protocols: 2.0.1 + dev: true + /is-stream/1.1.0: resolution: {integrity: sha1-EtSj3U5o4Lec6428hBc66A2RykQ=} engines: {node: '>=0.10.0'} @@ -9970,7 +10347,7 @@ packages: dev: true /isexe/2.0.0: - resolution: {integrity: sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=} + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} dev: true /isobject/2.1.0: @@ -10776,6 +11153,10 @@ packages: resolution: {integrity: sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=} dev: true + /json-stringify-safe/5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + dev: true + /json5/1.0.1: resolution: {integrity: sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==} hasBin: true @@ -10900,6 +11281,16 @@ packages: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} dev: true + /load-json-file/4.0.0: + resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} + engines: {node: '>=4'} + dependencies: + graceful-fs: 4.2.10 + parse-json: 4.0.0 + pify: 3.0.0 + strip-bom: 3.0.0 + dev: true + /loader-runner/2.4.0: resolution: {integrity: sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==} engines: {node: '>=4.3.0 <5.0.0 || >=5.10'} @@ -10937,6 +11328,14 @@ packages: json5: 2.2.1 dev: true + /locate-path/2.0.0: + resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} + engines: {node: '>=4'} + dependencies: + p-locate: 2.0.0 + path-exists: 3.0.0 + dev: true + /locate-path/3.0.0: resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} engines: {node: '>=6'} @@ -10963,6 +11362,10 @@ packages: resolution: {integrity: sha1-gteb/zCmfEAF/9XiUVMArZyk168=} dev: true + /lodash.ismatch/4.4.0: + resolution: {integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==} + dev: true + /lodash.map/4.6.0: resolution: {integrity: sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=} dev: true @@ -11454,6 +11857,11 @@ packages: hasBin: true dev: true + /modify-values/1.0.1: + resolution: {integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==} + engines: {node: '>=0.10.0'} + dev: true + /move-concurrently/1.0.1: resolution: {integrity: sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=} dependencies: @@ -11548,6 +11956,13 @@ packages: resolution: {integrity: sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw==} dev: true + /new-github-release-url/2.0.0: + resolution: {integrity: sha512-NHDDGYudnvRutt/VhKFlX26IotXe1w0cmkDm6JGquh5bz/bDTw0LufSmH/GxTjEdpHEO+bVKFTwdrcGa/9XlKQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + type-fest: 2.16.0 + dev: true + /nice-try/1.0.5: resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} dev: true @@ -11648,6 +12063,11 @@ packages: engines: {node: '>=6'} dev: true + /normalize-url/6.1.0: + resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} + engines: {node: '>=10'} + dev: true + /npm-run-path/2.0.2: resolution: {integrity: sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=} engines: {node: '>=4'} @@ -11814,6 +12234,15 @@ packages: is-wsl: 2.2.0 dev: true + /open/8.4.0: + resolution: {integrity: sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==} + engines: {node: '>=12'} + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + dev: true + /opener/1.5.2: resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} hasBin: true @@ -11897,6 +12326,13 @@ packages: engines: {node: '>=4'} dev: true + /p-limit/1.3.0: + resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} + engines: {node: '>=4'} + dependencies: + p-try: 1.0.0 + dev: true + /p-limit/2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -11911,6 +12347,13 @@ packages: yocto-queue: 0.1.0 dev: true + /p-locate/2.0.0: + resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} + engines: {node: '>=4'} + dependencies: + p-limit: 1.3.0 + dev: true + /p-locate/3.0.0: resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} engines: {node: '>=6'} @@ -11958,6 +12401,11 @@ packages: p-finally: 1.0.0 dev: true + /p-try/1.0.0: + resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} + engines: {node: '>=4'} + dev: true + /p-try/2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} @@ -12033,6 +12481,24 @@ packages: engines: {node: '>=0.10.0'} dev: true + /parse-path/4.0.4: + resolution: {integrity: sha512-Z2lWUis7jlmXC1jeOG9giRO2+FsuyNipeQ43HAjqAZjwSe3SEf+q/84FGPHoso3kyntbxa4c4i77t3m6fGf8cw==} + dependencies: + is-ssh: 1.4.0 + protocols: 1.4.8 + qs: 6.10.3 + query-string: 6.14.1 + dev: true + + /parse-url/6.0.2: + resolution: {integrity: sha512-uCSjOvD3T+6B/sPWhR+QowAZcU/o4bjPrVBQBGFxcDF6J6FraCGIaDBsdoQawiaaAVdHvtqBe3w3vKlfBKySOQ==} + dependencies: + is-ssh: 1.4.0 + normalize-url: 6.1.0 + parse-path: 4.0.4 + protocols: 1.4.8 + dev: true + /parse5/6.0.1: resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} dev: true @@ -12063,7 +12529,7 @@ packages: dev: true /path-exists/3.0.0: - resolution: {integrity: sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=} + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} engines: {node: '>=4'} dev: true @@ -12078,7 +12544,7 @@ packages: dev: true /path-key/2.0.1: - resolution: {integrity: sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=} + resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} engines: {node: '>=4'} dev: true @@ -12135,8 +12601,13 @@ packages: engines: {node: '>=8.6'} dev: true + /pify/2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + dev: true + /pify/3.0.0: - resolution: {integrity: sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=} + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} engines: {node: '>=4'} dev: true @@ -12972,6 +13443,14 @@ packages: xtend: 4.0.2 dev: true + /protocols/1.4.8: + resolution: {integrity: sha512-IgjKyaUSjsROSO8/D49Ab7hP8mJgTYcqApOqdPhLoPxAplXmkp+zRvsrSQjFn5by0rhm4VH0GAUELIPpx7B1yg==} + dev: true + + /protocols/2.0.1: + resolution: {integrity: sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==} + dev: true + /proxy-addr/2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} @@ -13086,7 +13565,7 @@ packages: dev: true /q/1.5.1: - resolution: {integrity: sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=} + resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} engines: {node: '>=0.6.0', teleport: '>=0.2.0'} dev: true @@ -13102,6 +13581,16 @@ packages: engines: {node: '>=0.6'} dev: true + /query-string/6.14.1: + resolution: {integrity: sha512-XDxAeVmpfu1/6IjyT/gXHOl+S0vQ9owggJ30hhWKdHAsNPOcasn5o9BW0eejZqL2e4vMjhAxoW3jVHcD6mbcYw==} + engines: {node: '>=6'} + dependencies: + decode-uri-component: 0.2.0 + filter-obj: 1.1.0 + split-on-first: 1.1.0 + strict-uri-encode: 2.0.0 + dev: true + /querystring-es3/0.2.1: resolution: {integrity: sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=} engines: {node: '>=0.4.x'} @@ -13472,6 +13961,14 @@ packages: object-assign: 4.1.1 dev: true + /read-pkg-up/3.0.0: + resolution: {integrity: sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==} + engines: {node: '>=4'} + dependencies: + find-up: 2.1.0 + read-pkg: 3.0.0 + dev: true + /read-pkg-up/7.0.1: resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} engines: {node: '>=8'} @@ -13490,6 +13987,15 @@ packages: type-fest: 1.4.0 dev: true + /read-pkg/3.0.0: + resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} + engines: {node: '>=4'} + dependencies: + load-json-file: 4.0.0 + normalize-package-data: 2.5.0 + path-type: 3.0.0 + dev: true + /read-pkg/5.2.0: resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} engines: {node: '>=8'} @@ -14178,7 +14684,7 @@ packages: dev: true /shebang-command/1.2.0: - resolution: {integrity: sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=} + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} engines: {node: '>=0.10.0'} dependencies: shebang-regex: 1.0.0 @@ -14192,7 +14698,7 @@ packages: dev: true /shebang-regex/1.0.0: - resolution: {integrity: sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=} + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} engines: {node: '>=0.10.0'} dev: true @@ -14219,6 +14725,23 @@ packages: requiresBuild: true dev: true + /simple-github-release/1.0.0: + resolution: {integrity: sha512-Hf55EbQfNdah15ECPL1v+8VxTqszvG3Sy8CV72lInZsd0kbB/jnSfxXh32hN22OTYLMdpQKfEoiA/WLN52w/gA==} + engines: {node: '>=14'} + hasBin: true + dependencies: + '@octokit/rest': 18.12.0 + '@types/git-url-parse': 9.0.1 + argue-cli: 2.0.0 + git-url-parse: 11.6.0 + lilconfig: 2.0.5 + new-github-release-url: 2.0.0 + open: 8.4.0 + picocolors: 1.0.0 + transitivePeerDependencies: + - encoding + dev: true + /simple-swizzle/0.2.2: resolution: {integrity: sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=} dependencies: @@ -14365,6 +14888,11 @@ packages: resolution: {integrity: sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==} dev: true + /split-on-first/1.1.0: + resolution: {integrity: sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==} + engines: {node: '>=6'} + dev: true + /split-string/3.1.0: resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} engines: {node: '>=0.10.0'} @@ -14372,6 +14900,12 @@ packages: extend-shallow: 3.0.2 dev: true + /split/1.0.1: + resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} + dependencies: + through: 2.3.8 + dev: true + /split2/3.2.2: resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} dependencies: @@ -14410,6 +14944,27 @@ packages: escape-string-regexp: 2.0.0 dev: true + /standard-version/9.5.0: + resolution: {integrity: sha512-3zWJ/mmZQsOaO+fOlsa0+QK90pwhNd042qEcw6hKFNoLFs7peGyvPffpEBbK/DSGPbyOvli0mUIFv5A4qTjh2Q==} + engines: {node: '>=10'} + hasBin: true + dependencies: + chalk: 2.4.2 + conventional-changelog: 3.1.25 + conventional-changelog-config-spec: 2.1.0 + conventional-changelog-conventionalcommits: 4.6.3 + conventional-recommended-bump: 6.1.0 + detect-indent: 6.0.0 + detect-newline: 3.1.0 + dotgitignore: 2.1.0 + figures: 3.2.0 + find-up: 5.0.0 + git-semver-tags: 4.1.1 + semver: 7.3.7 + stringify-package: 1.0.1 + yargs: 16.2.0 + dev: true + /state-toggle/1.0.3: resolution: {integrity: sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==} dev: true @@ -14459,6 +15014,11 @@ packages: resolution: {integrity: sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==} dev: true + /strict-uri-encode/2.0.0: + resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} + engines: {node: '>=4'} + dev: true + /string-length/4.0.2: resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} engines: {node: '>=10'} @@ -14541,6 +15101,10 @@ packages: safe-buffer: 5.2.1 dev: true + /stringify-package/1.0.1: + resolution: {integrity: sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg==} + dev: true + /strip-ansi/3.0.1: resolution: {integrity: sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=} engines: {node: '>=0.10.0'} @@ -14569,6 +15133,11 @@ packages: ansi-regex: 5.0.1 dev: true + /strip-bom/3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: true + /strip-bom/4.0.0: resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} engines: {node: '>=8'} @@ -15157,6 +15726,11 @@ packages: engines: {node: '>=10'} dev: true + /type-fest/2.16.0: + resolution: {integrity: sha512-qpaThT2HQkFb83gMOrdKVsfCN7LKxP26Yq+smPzY1FqoHRjqmjqHXA7n5Gkxi8efirtbeEUxzfEdePthQWCuHw==} + engines: {node: '>=12.20'} + dev: true + /type-is/1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} @@ -15172,7 +15746,7 @@ packages: dev: true /typedarray/0.0.6: - resolution: {integrity: sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=} + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} dev: true /typescript/4.6.4: @@ -15336,6 +15910,10 @@ packages: unist-util-visit-parents: 3.1.1 dev: true + /universal-user-agent/6.0.0: + resolution: {integrity: sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==} + dev: true + /universalify/0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} diff --git a/postcss.config.js b/postcss.config.cjs similarity index 100% rename from postcss.config.js rename to postcss.config.cjs From 3bd4ebae0981366943ae0bb6a7ec05a7f3d78b16 Mon Sep 17 00:00:00 2001 From: Dan Onoshko <danon0404@gmail.com> Date: Tue, 12 Jul 2022 00:15:31 +0400 Subject: [PATCH 31/44] feat: fully typed events (#21) --- package.json | 2 +- scripts/{styles.js => styles.cjs} | 2 +- src/charts/BarChart/BarChart.ts | 30 +++++----------- src/charts/BarChart/BarChart.types.ts | 9 ++++- src/charts/BaseChart.ts | 19 +++++++--- src/charts/LineChart/LineChart.ts | 21 ++--------- src/charts/LineChart/LineChart.types.ts | 9 ++++- src/charts/PieChart/PieChart.ts | 28 ++++----------- src/charts/PieChart/PieChart.types.ts | 8 ++++- src/charts/index.ts | 1 + src/charts/types.ts | 19 ++++++++++ src/core/creation.ts | 20 +++++++---- src/core/optionsProvider.ts | 3 +- src/core/types.ts | 48 +++++++++++++++++++++++++ src/svg/animation.ts | 33 ++++++++--------- src/svg/index.ts | 1 + src/svg/types.ts | 7 ++++ 17 files changed, 165 insertions(+), 95 deletions(-) rename scripts/{styles.js => styles.cjs} (94%) create mode 100644 src/charts/types.ts diff --git a/package.json b/package.json index ae7902ab..004d13d3 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ "prepublishOnly": "pnpm test && pnpm build && pnpm clear:package && clean-publish", "postpublish": "pnpm clear:package", "emitDeclarations": "tsc --emitDeclarationOnly", - "build:styles": "./scripts/styles.js", + "build:styles": "./scripts/styles.cjs", "build": "rollup -c & pnpm build:styles & pnpm emitDeclarations", "start:storybook": "start-storybook -p 6006 --ci", "build:storybook": "del ./storybook-static; NODE_ENV=production build-storybook", diff --git a/scripts/styles.js b/scripts/styles.cjs similarity index 94% rename from scripts/styles.js rename to scripts/styles.cjs index d1c86a20..738e17de 100755 --- a/scripts/styles.js +++ b/scripts/styles.cjs @@ -5,7 +5,7 @@ const path = require('path'); const sass = require('sass'); const postcss = require('postcss'); -const { plugins } = require('../postcss.config'); +const { plugins } = require('../postcss.config.cjs'); const pkg = require('../package.json'); const cwd = process.cwd(); diff --git a/src/charts/BarChart/BarChart.ts b/src/charts/BarChart/BarChart.ts index 9f0da36c..a56438f4 100644 --- a/src/charts/BarChart/BarChart.ts +++ b/src/charts/BarChart/BarChart.ts @@ -4,10 +4,10 @@ import type { BarChartOptions, BarChartOptionsWithDefaults, BarChartCreatedEvent, - BarDrawEvent + BarDrawEvent, + BarChartEventsTypes } from './BarChart.types'; import type { NormalizedSeries } from '../../core'; -import type { EventListener, AllEventsListener } from '../../event'; import { isNumeric, noop, @@ -140,7 +140,7 @@ const defaultOptions = { } }; -export class BarChart extends BaseChart { +export class BarChart extends BaseChart<BarChartEventsTypes> { /** * This method creates a new bar chart and returns API object that you can use for later changes. * @param query A selector query string or directly a DOM element @@ -191,18 +191,6 @@ export class BarChart extends BaseChart { ); } - override on( - event: 'created', - listener: EventListener<BarChartCreatedEvent> - ): this; - override on(event: 'draw', listener: EventListener<BarDrawEvent>): this; - override on(event: '*', listener: AllEventsListener): this; - override on(event: string, listener: EventListener): this; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - override on(event: string, listener: any) { - return super.on(event, listener); - } - /** * Creates a new chart */ @@ -508,9 +496,10 @@ export class BarChart extends BaseChart { return; } - const positions: Record<string, number> = {}; - positions[`${labelAxis.units.pos}1`] = projected[labelAxis.units.pos]; - positions[`${labelAxis.units.pos}2`] = projected[labelAxis.units.pos]; + const positions = { + [`${labelAxis.units.pos}1`]: projected[labelAxis.units.pos], + [`${labelAxis.units.pos}2`]: projected[labelAxis.units.pos] + } as Record<'x1' | 'y1' | 'x2' | 'y2', number>; if ( options.stackBars && @@ -576,10 +565,7 @@ export class BarChart extends BaseChart { chartRect, group: seriesElement, element: bar, - x1: positions.x1, - y1: positions.y1, - x2: positions.x2, - y2: positions.y2 + ...positions }); }); }); diff --git a/src/charts/BarChart/BarChart.types.ts b/src/charts/BarChart/BarChart.types.ts index b3cc7880..c487bfb5 100644 --- a/src/charts/BarChart/BarChart.types.ts +++ b/src/charts/BarChart/BarChart.types.ts @@ -4,9 +4,11 @@ import type { Data, CreatedEvent, DrawEvent, - NormalizedMulti + NormalizedMulti, + AxesDrawEvent } from '../../core'; import type { RequiredKeys } from '../../utils'; +import type { BaseChartEventsTypes } from '../types'; export type BarChartData = Data; @@ -80,3 +82,8 @@ export interface BarDrawEvent extends DrawEvent { x2: number; y2: number; } + +export type BarChartEventsTypes = BaseChartEventsTypes< + BarChartCreatedEvent, + AxesDrawEvent | BarDrawEvent +>; diff --git a/src/charts/BaseChart.ts b/src/charts/BaseChart.ts index ae10ab58..95f782e3 100644 --- a/src/charts/BaseChart.ts +++ b/src/charts/BaseChart.ts @@ -1,12 +1,13 @@ -import type { Data, Options } from '../core'; +import type { Data, Options, DataEvent } from '../core'; import type { Svg } from '../svg'; +import type { BaseChartEventsTypes } from './types'; import { OptionsProvider, optionsProvider } from '../core'; import { extend } from '../utils'; import { EventListener, AllEventsListener, EventEmitter } from '../event'; -const instances = new WeakMap<Element, BaseChart>(); +const instances = new WeakMap<Element, BaseChart<unknown>>(); -export abstract class BaseChart { +export abstract class BaseChart<TEventsTypes = BaseChartEventsTypes> { protected svg?: Svg; protected readonly container: Element; protected readonly eventEmitter = new EventEmitter(); @@ -65,7 +66,7 @@ export abstract class BaseChart { this.data.labels = this.data.labels || []; this.data.series = this.data.series || []; // Event for data transformation that allows to manipulate the data before it gets rendered in the charts - this.eventEmitter.emit('data', { + this.eventEmitter.emit<DataEvent>('data', { type: 'update', data: this.data }); @@ -122,6 +123,10 @@ export abstract class BaseChart { * @param event Name of the event. Check the examples for supported events. * @param listener The handler function that will be called when an event with the given name was emitted. This function will receive a data argument which contains event data. See the example for more details. */ + on<T extends keyof TEventsTypes>( + event: T, + listener: EventListener<TEventsTypes[T]> + ): this; on(event: '*', listener: AllEventsListener): this; on(event: string, listener: EventListener): this; // eslint-disable-next-line @typescript-eslint/no-explicit-any @@ -135,6 +140,10 @@ export abstract class BaseChart { * @param event Name of the event for which a handler should be removed * @param listener The handler function that that was previously used to register a new event handler. This handler will be removed from the event handler list. If this parameter is omitted then all event handlers for the given event are removed from the list. */ + off<T extends keyof TEventsTypes>( + event: T, + listener?: EventListener<TEventsTypes[T]> + ): this; off(event: '*', listener?: AllEventsListener): this; off(event: string, listener?: EventListener): this; // eslint-disable-next-line @typescript-eslint/no-explicit-any @@ -170,7 +179,7 @@ export abstract class BaseChart { } // Event for data transformation that allows to manipulate the data before it gets rendered in the charts - this.eventEmitter.emit('data', { + this.eventEmitter.emit<DataEvent>('data', { type: 'initial', data: this.data }); diff --git a/src/charts/LineChart/LineChart.ts b/src/charts/LineChart/LineChart.ts index 05daeab2..ef8d4301 100644 --- a/src/charts/LineChart/LineChart.ts +++ b/src/charts/LineChart/LineChart.ts @@ -6,10 +6,10 @@ import type { LineChartCreatedEvent, PointDrawEvent, LineDrawEvent, - AreaDrawEvent + AreaDrawEvent, + LineChartEventsTypes } from './LineChart.types'; import type { SegmentData, Series, SeriesObject } from '../../core'; -import type { EventListener, AllEventsListener } from '../../event'; import { alphaNumerate, normalizeData, @@ -144,7 +144,7 @@ const defaultOptions = { } }; -export class LineChart extends BaseChart { +export class LineChart extends BaseChart<LineChartEventsTypes> { /** * This method creates a new line chart. * @param query A selector query string or directly a DOM element @@ -239,21 +239,6 @@ export class LineChart extends BaseChart { ); } - override on( - event: 'created', - listener: EventListener<LineChartCreatedEvent> - ): this; - override on( - event: 'draw', - listener: EventListener<PointDrawEvent | LineDrawEvent | AreaDrawEvent> - ): this; - override on(event: '*', listener: AllEventsListener): this; - override on(event: string, listener: EventListener): this; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - override on(event: string, listener: any) { - return super.on(event, listener); - } - /** * Creates a new chart */ diff --git a/src/charts/LineChart/LineChart.types.ts b/src/charts/LineChart/LineChart.types.ts index f7ff63fe..a3eccf44 100644 --- a/src/charts/LineChart/LineChart.types.ts +++ b/src/charts/LineChart/LineChart.types.ts @@ -8,10 +8,12 @@ import type { CreatedEvent, DrawEvent, NormalizedSeriesValue, - NormalizedSeries + NormalizedSeries, + AxesDrawEvent } from '../../core'; import type { SvgPath } from '../../svg'; import type { RequiredKeys } from '../../utils'; +import type { BaseChartEventsTypes } from '../types'; export type LineInterpolation = ( pathCoordinates: number[], @@ -106,3 +108,8 @@ export interface AreaDrawEvent extends DrawEvent { values: NormalizedSeries; path: SvgPath; } + +export type LineChartEventsTypes = BaseChartEventsTypes< + LineChartCreatedEvent, + AxesDrawEvent | PointDrawEvent | LineDrawEvent | AreaDrawEvent +>; diff --git a/src/charts/PieChart/PieChart.ts b/src/charts/PieChart/PieChart.ts index 6e2268c1..ecc57cbb 100644 --- a/src/charts/PieChart/PieChart.ts +++ b/src/charts/PieChart/PieChart.ts @@ -7,10 +7,10 @@ import type { PieChartOptionsWithDefaults, PieChartCreatedEvent, SliceDrawEvent, - LabelDrawEvent + SliceLabelDrawEvent, + PieChartEventsTypes } from './PieChart.types'; import type { Svg } from '../../svg'; -import type { EventListener, AllEventsListener } from '../../event'; import { alphaNumerate, quantity, @@ -99,7 +99,7 @@ export function determineAnchorPosition( } } -export class PieChart extends BaseChart { +export class PieChart extends BaseChart<PieChartEventsTypes> { /** * This method creates a new pie chart and returns an object that can be used to redraw the chart. * @param query A selector query string or directly a DOM element @@ -180,21 +180,6 @@ export class PieChart extends BaseChart { ); } - override on( - event: 'created', - listener: EventListener<PieChartCreatedEvent> - ): this; - override on( - event: 'draw', - listener: EventListener<SliceDrawEvent | LabelDrawEvent> - ): this; - override on(event: '*', listener: AllEventsListener): this; - override on(event: string, listener: EventListener): this; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - override on(event: string, listener: any) { - return super.on(event, listener); - } - /** * Creates the pie chart * @@ -444,17 +429,16 @@ export class PieChart extends BaseChart { .text(String(interpolatedValue)); // Fire off draw event - this.eventEmitter.emit<LabelDrawEvent>('draw', { + this.eventEmitter.emit<SliceLabelDrawEvent>('draw', { type: 'label', index, group: labelsGroup, element: labelElement, text: '' + interpolatedValue, - x: labelPosition.x, - y: labelPosition.y, chartRect, series, - meta: seriesMeta + meta: seriesMeta, + ...labelPosition }); } } diff --git a/src/charts/PieChart/PieChart.types.ts b/src/charts/PieChart/PieChart.types.ts index 0659c726..576b084c 100644 --- a/src/charts/PieChart/PieChart.types.ts +++ b/src/charts/PieChart/PieChart.types.ts @@ -9,6 +9,7 @@ import type { } from '../../core'; import type { RequiredKeys } from '../../utils'; import type { SvgPath } from '../../svg'; +import type { BaseChartEventsTypes } from '../types'; export type PieChartData = Data<FlatSeries>; @@ -75,10 +76,15 @@ export interface SliceDrawEvent endAngle: number; } -export interface LabelDrawEvent +export interface SliceLabelDrawEvent extends Omit<DrawEvent, 'axisX' | 'axisY' | 'seriesIndex'> { type: 'label'; text: string; x: number; y: number; } + +export type PieChartEventsTypes = BaseChartEventsTypes< + PieChartCreatedEvent, + SliceDrawEvent | SliceLabelDrawEvent +>; diff --git a/src/charts/index.ts b/src/charts/index.ts index 7313e5ba..a4ec210b 100644 --- a/src/charts/index.ts +++ b/src/charts/index.ts @@ -2,3 +2,4 @@ export * from './BaseChart'; export * from './LineChart'; export * from './BarChart'; export * from './PieChart'; +export * from './types'; diff --git a/src/charts/types.ts b/src/charts/types.ts new file mode 100644 index 00000000..b76059f7 --- /dev/null +++ b/src/charts/types.ts @@ -0,0 +1,19 @@ +import type { + DataEvent, + OptionsChangedEvent, + DrawEvent, + CreatedEvent +} from '../core'; +import type { AnimationEvent } from '../svg'; + +export interface BaseChartEventsTypes< + TCreateEvent = CreatedEvent, + TDrawEvents = DrawEvent +> { + data: DataEvent; + options: OptionsChangedEvent; + animationBegin: AnimationEvent; + animationEnd: AnimationEvent; + created: TCreateEvent; + draw: TDrawEvents; +} diff --git a/src/core/creation.ts b/src/core/creation.ts index 09e17ce7..660421be 100644 --- a/src/core/creation.ts +++ b/src/core/creation.ts @@ -1,4 +1,12 @@ -import type { ChartPadding, ChartRect, Options, Label } from './types'; +import type { + ChartPadding, + ChartRect, + Options, + Label, + GridDrawEvent, + GridBackgroundDrawEvent, + LabelDrawEvent +} from './types'; import type { EventEmitter } from '../event'; import type { Axis } from '../axes'; import { namespaces } from './constants'; @@ -172,12 +180,12 @@ export function createGrid( [`${axis.units.pos}2`]: position, [`${axis.counterUnits.pos}1`]: offset, [`${axis.counterUnits.pos}2`]: offset + length - }; + } as Record<'x1' | 'y1' | 'x2' | 'y2', number>; const gridElement = group.elem('line', positionalData, classes.join(' ')); // Event for grid draw - eventEmitter.emit('draw', { + eventEmitter.emit<GridDrawEvent>('draw', { type: 'grid', axis, index, @@ -209,7 +217,7 @@ export function createGridBackground( ); // Event for grid background draw - eventEmitter.emit('draw', { + eventEmitter.emit<GridBackgroundDrawEvent>('draw', { type: 'gridBackground', group: gridGroup, element: gridBackground @@ -236,7 +244,7 @@ export function createLabel( [axis.counterUnits.pos]: labelOffset[axis.counterUnits.pos], [axis.units.len]: length, [axis.counterUnits.len]: Math.max(0, axisOffset - 10) - }; + } as Record<'x' | 'y' | 'width' | 'height', number>; // We need to set width and height explicitly to px as span will not expand with width and height being // 100% in all browsers const stepLength = Math.round(positionalData[axis.units.len]); @@ -254,7 +262,7 @@ export function createLabel( ...positionalData }); - eventEmitter.emit('draw', { + eventEmitter.emit<LabelDrawEvent>('draw', { type: 'label', axis, index, diff --git a/src/core/optionsProvider.ts b/src/core/optionsProvider.ts index 25f5272f..bfc1060a 100644 --- a/src/core/optionsProvider.ts +++ b/src/core/optionsProvider.ts @@ -1,4 +1,5 @@ import type { EventEmitter } from '../event'; +import type { OptionsChangedEvent } from './types'; import { extend } from '../utils'; export interface OptionsProvider<T = unknown> { @@ -35,7 +36,7 @@ export function optionsProvider<T = unknown>( } if (eventEmitter && mediaEvent) { - eventEmitter.emit('optionsChanged', { + eventEmitter.emit<OptionsChangedEvent<T>>('optionsChanged', { previousOptions, currentOptions }); diff --git a/src/core/types.ts b/src/core/types.ts index 74dc3f47..ff67081e 100644 --- a/src/core/types.ts +++ b/src/core/types.ts @@ -250,3 +250,51 @@ export interface DrawEvent { series: FlatSeriesValue | Series | SeriesObject; seriesIndex: number; } + +export interface DataEvent { + type: 'initial' | 'update'; + data: Data; +} + +export interface OptionsChangedEvent<T = Options> { + previousOptions: T; + currentOptions: T; +} + +export interface GridDrawEvent + extends Omit< + DrawEvent, + 'chartRect' | 'axisX' | 'axisY' | 'meta' | 'series' | 'seriesIndex' + > { + type: 'grid'; + axis: Axis; + x1: number; + y1: number; + x2: number; + y2: number; +} + +export interface GridBackgroundDrawEvent { + type: 'gridBackground'; + group: Svg; + element: Svg; +} + +export interface LabelDrawEvent + extends Omit< + DrawEvent, + 'chartRect' | 'axisX' | 'axisY' | 'meta' | 'series' | 'seriesIndex' + > { + type: 'label'; + axis: Axis; + text: Label; + x: number; + y: number; + width: number; + height: number; +} + +export type AxesDrawEvent = + | GridDrawEvent + | GridBackgroundDrawEvent + | LabelDrawEvent; diff --git a/src/svg/animation.ts b/src/svg/animation.ts index c3d355bb..c7a1c78a 100644 --- a/src/svg/animation.ts +++ b/src/svg/animation.ts @@ -1,6 +1,6 @@ import type { EventEmitter } from '../event'; import { ensureUnit, quantity } from '../core/lang'; -import type { Attributes, AnimationDefinition } from './types'; +import type { Attributes, AnimationDefinition, AnimationEvent } from './types'; import type { Svg } from './Svg'; /** @@ -39,10 +39,11 @@ export const easings = { export function createAnimation( element: Svg, attribute: string, - { easing, ...animationDefinition }: AnimationDefinition, + animationDefinition: AnimationDefinition, createGuided = false, eventEmitter?: EventEmitter ) { + const { easing, ...def } = animationDefinition; const attributeProperties: Attributes = {}; let animationEasing; let timeout; @@ -55,31 +56,31 @@ export function createAnimation( } // If numeric dur or begin was provided we assume milli seconds - animationDefinition.begin = ensureUnit(animationDefinition.begin, 'ms'); - animationDefinition.dur = ensureUnit(animationDefinition.dur, 'ms'); + def.begin = ensureUnit(def.begin, 'ms'); + def.dur = ensureUnit(def.dur, 'ms'); if (animationEasing) { - animationDefinition.calcMode = 'spline'; - animationDefinition.keySplines = animationEasing.join(' '); - animationDefinition.keyTimes = '0;1'; + def.calcMode = 'spline'; + def.keySplines = animationEasing.join(' '); + def.keyTimes = '0;1'; } // Adding "fill: freeze" if we are in guided mode and set initial attribute values if (createGuided) { - animationDefinition.fill = 'freeze'; + def.fill = 'freeze'; // Animated property on our element should already be set to the animation from value in guided mode - attributeProperties[attribute] = animationDefinition.from; + attributeProperties[attribute] = def.from; element.attr(attributeProperties); // In guided mode we also set begin to indefinite so we can trigger the start manually and put the begin // which needs to be in ms aside - timeout = quantity(animationDefinition.begin || 0).value; - animationDefinition.begin = 'indefinite'; + timeout = quantity(def.begin || 0).value; + def.begin = 'indefinite'; } const animate = element.elem('animate', { attributeName: attribute, - ...animationDefinition + ...def }); if (createGuided) { @@ -93,7 +94,7 @@ export function createAnimation( animate._node.beginElement(); } catch (err) { // Set animated attribute to current animated value - attributeProperties[attribute] = animationDefinition.to; + attributeProperties[attribute] = def.to; element.attr(attributeProperties); // Remove the animate element as it's no longer required animate.remove(); @@ -105,7 +106,7 @@ export function createAnimation( if (eventEmitter) { animateNode.addEventListener('beginEvent', () => - eventEmitter.emit('animationBegin', { + eventEmitter.emit<AnimationEvent>('animationBegin', { element: element, animate: animateNode, params: animationDefinition @@ -115,7 +116,7 @@ export function createAnimation( animateNode.addEventListener('endEvent', () => { if (eventEmitter) { - eventEmitter.emit('animationEnd', { + eventEmitter.emit<AnimationEvent>('animationEnd', { element: element, animate: animateNode, params: animationDefinition @@ -124,7 +125,7 @@ export function createAnimation( if (createGuided) { // Set animated attribute to current animated value - attributeProperties[attribute] = animationDefinition.to; + attributeProperties[attribute] = def.to; element.attr(attributeProperties); // Remove the animate element as it's no longer required animate.remove(); diff --git a/src/svg/index.ts b/src/svg/index.ts index b187ea5f..e49993cf 100644 --- a/src/svg/index.ts +++ b/src/svg/index.ts @@ -2,3 +2,4 @@ export { easings } from './animation'; export * from './Svg'; export * from './SvgPath'; export * from './SvgList'; +export * from './types'; diff --git a/src/svg/types.ts b/src/svg/types.ts index 671e5bea..e795ef04 100644 --- a/src/svg/types.ts +++ b/src/svg/types.ts @@ -1,5 +1,6 @@ import type { SegmentData } from '../core'; import type { easings } from './animation'; +import type { Svg } from './Svg'; export interface BasePathParams { x: number; @@ -55,3 +56,9 @@ export interface AnimationDefinition { from: number | string; to: number | string; } + +export interface AnimationEvent { + element: Svg; + animate: Element; + params: AnimationDefinition; +} From 6b82597e98ea1a0b5d512e12b6a8925bfb0da7c5 Mon Sep 17 00:00:00 2001 From: Dan Onoshko <danon0404@gmail.com> Date: Tue, 12 Jul 2022 17:47:45 +0400 Subject: [PATCH 32/44] build: fix tsconfig (#22) --- .nano-staged.json | 2 +- package.json | 1 - pnpm-lock.yaml | 68 ----------------------------------------------- tsconfig.json | 4 +++ 4 files changed, 5 insertions(+), 70 deletions(-) diff --git a/.nano-staged.json b/.nano-staged.json index 1730308c..f9993ff4 100644 --- a/.nano-staged.json +++ b/.nano-staged.json @@ -1,3 +1,3 @@ { - "**/*.js": ["prettier --write", "eslint"] + "**/*.{js,ts}": ["prettier --write", "eslint"] } diff --git a/package.json b/package.json index 004d13d3..b8bb7d67 100644 --- a/package.json +++ b/package.json @@ -130,7 +130,6 @@ "size-limit": "^7.0.8", "standard-version": "^9.5.0", "swc-loader": "^0.2.3", - "tsd": "^0.20.0", "typescript": "^4.6.4" }, "readme": "" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 001dfa0a..dd42bbf1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -56,7 +56,6 @@ specifiers: size-limit: ^7.0.8 standard-version: ^9.5.0 swc-loader: ^0.2.3 - tsd: ^0.20.0 typescript: ^4.6.4 devDependencies: @@ -115,7 +114,6 @@ devDependencies: size-limit: 7.0.8 standard-version: 9.5.0 swc-loader: 0.2.3_@swc+core@1.2.165 - tsd: 0.20.0 typescript: 4.6.4 packages: @@ -4539,11 +4537,6 @@ packages: resolution: {integrity: sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==} dev: true - /@tsd/typescript/4.6.4: - resolution: {integrity: sha512-+9o716aWbcjKLbV4bCrGlJKJbS0UZNogfVk9U7ffooYSf/9GOJ6wwahTSrRjW7mWQdywQ/sIg9xxbuPLnkmhwg==} - hasBin: true - dev: true - /@types/aria-query/4.2.2: resolution: {integrity: sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig==} dev: true @@ -8138,20 +8131,6 @@ packages: eslint: 8.15.0 dev: true - /eslint-formatter-pretty/4.1.0: - resolution: {integrity: sha512-IsUTtGxF1hrH6lMWiSl1WbGaiP01eT6kzywdY1U+zLc0MP+nwEnUiS9UI8IaOTUhTeQJLlCEWIbXINBH4YJbBQ==} - engines: {node: '>=10'} - dependencies: - '@types/eslint': 7.29.0 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - eslint-rule-docs: 1.1.231 - log-symbols: 4.1.0 - plur: 4.0.0 - string-width: 4.2.3 - supports-hyperlinks: 2.2.0 - dev: true - /eslint-plugin-jest-dom/4.0.1_eslint@8.15.0: resolution: {integrity: sha512-9aUaX4AtlFBziLqKSjc7DKHQ/y1T32qNapG3uSeLDMJYKswASoQLJWOfLIE+zEHKvCNzNIz8T7282tQkuu0TKQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6', yarn: '>=1'} @@ -8216,10 +8195,6 @@ packages: - typescript dev: true - /eslint-rule-docs/1.1.231: - resolution: {integrity: sha512-egHz9A1WG7b8CS0x1P6P/Rj5FqZOjray/VjpJa14tMZalfRKvpE2ONJ3plCM7+PcinmU4tcmbPLv0VtwzSdLVA==} - dev: true - /eslint-scope/4.0.3: resolution: {integrity: sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==} engines: {node: '>=4.0.0'} @@ -9911,11 +9886,6 @@ packages: engines: {node: '>= 0.10'} dev: true - /irregular-plurals/3.3.0: - resolution: {integrity: sha512-MVBLKUTangM3EfRPFROhmWQQKRDsrgI83J8GS3jXy+OwYqiR2/aoWndYQ5416jLE3uaGgLH7ncme3X9y09gZ3g==} - engines: {node: '>=8'} - dev: true - /is-absolute-url/2.1.0: resolution: {integrity: sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=} engines: {node: '>=0.10.0'} @@ -11625,24 +11595,6 @@ packages: yargs-parser: 20.2.9 dev: true - /meow/9.0.0: - resolution: {integrity: sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==} - engines: {node: '>=10'} - dependencies: - '@types/minimist': 1.2.2 - camelcase-keys: 6.2.2 - decamelize: 1.2.0 - decamelize-keys: 1.1.0 - hard-rejection: 2.1.0 - minimist-options: 4.1.0 - normalize-package-data: 3.0.3 - read-pkg-up: 7.0.1 - redent: 3.0.0 - trim-newlines: 3.0.1 - type-fest: 0.18.1 - yargs-parser: 20.2.9 - dev: true - /merge-descriptors/1.0.1: resolution: {integrity: sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=} dev: true @@ -12649,13 +12601,6 @@ packages: find-up: 5.0.0 dev: true - /plur/4.0.0: - resolution: {integrity: sha512-4UGewrYgqDFw9vV6zNV+ADmPAUAfJPKtGvb/VdpQAx25X5f3xXdGdyOEVFwkl8Hl/tl7+xbeHqSEM+D5/TirUg==} - engines: {node: '>=10'} - dependencies: - irregular-plurals: 3.3.0 - dev: true - /pngjs/3.4.0: resolution: {integrity: sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==} engines: {node: '>=4.0.0'} @@ -15642,19 +15587,6 @@ packages: typescript: 4.6.4 dev: true - /tsd/0.20.0: - resolution: {integrity: sha512-iba/JlyT3qtnA9t8VrX2Fipu3L31U48oRIf1PNs+lIwQ7n63GTkt9eQlB5bLtfb7nYfy9t8oZzs+K4QEoEIS8Q==} - engines: {node: '>=12'} - hasBin: true - dependencies: - '@tsd/typescript': 4.6.4 - eslint-formatter-pretty: 4.1.0 - globby: 11.1.0 - meow: 9.0.0 - path-exists: 4.0.0 - read-pkg-up: 7.0.1 - dev: true - /tslib/1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} dev: true diff --git a/tsconfig.json b/tsconfig.json index c2ce442d..81ea58c9 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -35,5 +35,9 @@ }, "include": [ "src" + ], + "exclude": [ + "**/*.stories.ts", + "**/*.spec.ts" ] } From 8c1f64cf842391d5fe5ba9cfd18150b0e679498d Mon Sep 17 00:00:00 2001 From: dangreen <danon0404@gmail.com> Date: Thu, 14 Jul 2022 17:13:31 +0400 Subject: [PATCH 33/44] chore: issue templates --- .github/ISSUE_TEMPLATE/bug-report.yml | 44 ++++++++++++++++++++++ .github/ISSUE_TEMPLATE/config.yml | 5 +++ .github/ISSUE_TEMPLATE/feature-request.yml | 40 ++++++++++++++++++++ package.json | 2 +- 4 files changed, 90 insertions(+), 1 deletion(-) create mode 100644 .github/ISSUE_TEMPLATE/bug-report.yml create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/ISSUE_TEMPLATE/feature-request.yml diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml new file mode 100644 index 00000000..24617de4 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug-report.yml @@ -0,0 +1,44 @@ +name: "🐛 Bug Report" +description: "If something isn't working as expected." +title: "[Bug]: " +labels: ["bug"] +body: + - type: markdown + attributes: + value: Thanks for taking the time to file a bug report! Please fill out this form as completely as possible. + + - type: checkboxes + id: input1 + attributes: + label: Would you like to work on a fix? + options: + - label: Check this if you would like to implement a PR, we are more than happy to help you go through the process. + + - type: textarea + attributes: + label: Current and expected behavior + description: A clear and concise description of what the library is doing and what you would expect. + validations: + required: true + + - type: input + attributes: + label: Reproduction + description: | + Please provide issue reproduction. + You can give a link to a repository with the reproduction or make a [sandbox](https://codesandbox.io/) and reproduce the issue there. + validations: + required: true + + - type: input + attributes: + label: Chartist version + description: Which version of Chartist are you using? + placeholder: v0.0.0 + validations: + required: true + + - type: textarea + attributes: + label: Possible solution + description: If you have suggestions on a fix for the bug. diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 00000000..d735f21b --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,5 @@ +blank_issues_enabled: false +contact_links: + - name: 🤔 Have a Question? + url: https://stackoverflow.com/questions/tagged/chartist.js + about: Feel free to ask questions on Stack Overflow. diff --git a/.github/ISSUE_TEMPLATE/feature-request.yml b/.github/ISSUE_TEMPLATE/feature-request.yml new file mode 100644 index 00000000..6d9a4820 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature-request.yml @@ -0,0 +1,40 @@ +name: "🚀 Feature Request" +description: "I have a specific suggestion!" +labels: ["enhancement"] +body: + - type: markdown + attributes: + value: Thanks for taking the time to suggest a new feature! Please fill out this form as completely as possible. + + - type: checkboxes + id: input1 + attributes: + label: Would you like to work on this feature? + options: + - label: Check this if you would like to implement a PR, we are more than happy to help you go through the process. + + - type: textarea + attributes: + label: What problem are you trying to solve? + description: | + A concise description of what the problem is. + placeholder: | + I have an issue when [...] + validations: + required: true + + - type: textarea + attributes: + label: Describe the solution you'd like + validations: + required: true + + - type: textarea + attributes: + label: Describe alternatives you've considered + + - type: textarea + attributes: + label: Documentation, Adoption, Migration Strategy + description: | + If you can, explain how users will be able to use this and how it might be documented. Maybe a mock-up? diff --git a/package.json b/package.json index b8bb7d67..af7a9bf1 100644 --- a/package.json +++ b/package.json @@ -66,7 +66,7 @@ "test:unit": "jest -c jest.config.json ./src", "test:storyshots": "jest -c jest.config.json ./test/storyshots.spec.js", "test": "pnpm lint && pnpm test:unit", - "lint": "eslint './*.{js,ts}' 'test/**/*.{js,ts}' 'src/**/*.{js,ts}' '.storybook/**/*.{js,ts}' 'scripts/**/*.{js,ts}'", + "lint": "eslint './*.{js,ts,cjs}' 'test/**/*.{js,ts}' 'src/**/*.{js,ts}' '.storybook/**/*.{js,ts}' 'scripts/**/*.{js,ts,cjs}'", "format": "prettier --write './*.{js,ts}' 'test/**/*.{js,ts}' 'src/**/*.{js,ts}' '.storybook/**/*.{js,ts}' 'scripts/**/*.{js,ts}'", "commit": "cz", "bumpVersion": "standard-version", From faa7ff5a0a932ab7beab7057607dbb4b8728aa0b Mon Sep 17 00:00:00 2001 From: Dan Onoshko <danon0404@gmail.com> Date: Thu, 14 Jul 2022 18:30:16 +0400 Subject: [PATCH 34/44] chore: port changes from main repo (#23) --- src/charts/BarChart/BarChart.ts | 4 +++- src/core/creation.ts | 15 +++++++-------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/charts/BarChart/BarChart.ts b/src/charts/BarChart/BarChart.ts index a56438f4..927d79bb 100644 --- a/src/charts/BarChart/BarChart.ts +++ b/src/charts/BarChart/BarChart.ts @@ -211,7 +211,9 @@ export class BarChart extends BaseChart<BarChartEventsTypes> { (options.horizontalBars ? ' ' + options.classNames.horizontalBars : '') ); const highLow = - options.stackBars && normalizedData.series.length + options.stackBars && + options.stackMode !== true && + normalizedData.series.length ? // If stacked bars we need to calculate the high low from stacked values from each series getHighLow( [getSerialSums(normalizedData.series)], diff --git a/src/core/creation.ts b/src/core/creation.ts index 660421be..2ebfdb55 100644 --- a/src/core/creation.ts +++ b/src/core/creation.ts @@ -249,14 +249,13 @@ export function createLabel( // 100% in all browsers const stepLength = Math.round(positionalData[axis.units.len]); const stepCounterLength = Math.round(positionalData[axis.counterUnits.len]); - const content = ` - <span class="${classes.join(' ')}" - style="${axis.units.len}: ${stepLength}px; ${ - axis.counterUnits.len - }: ${stepCounterLength}px"> - ${label} - </span> - `.trim(); + const content = document.createElement('span'); + + content.className = classes.join(' '); + content.style[axis.units.len] = stepLength + 'px'; + content.style[axis.counterUnits.len] = stepCounterLength + 'px'; + content.textContent = String(label); + const labelElement = group.foreignObject(content, { style: 'overflow: visible;', ...positionalData From 25d5ab9ebcd4d50271481c3511138f3c1e9046db Mon Sep 17 00:00:00 2001 From: Dan Onoshko <danon0404@gmail.com> Date: Thu, 14 Jul 2022 18:57:55 +0400 Subject: [PATCH 35/44] ci: add styles check to size limit (#24) --- .size-limit.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.size-limit.json b/.size-limit.json index 51045984..5f3e3e0b 100644 --- a/.size-limit.json +++ b/.size-limit.json @@ -20,5 +20,11 @@ "path": "dist/index.js", "limit": "7.45 kB", "import": "{ BarChart }" + }, + { + "path": "dist/index.css", + "limit": "1.3 kB", + "webpack": false, + "running": false } ] From bb9c672094f544257d3df9bf91697885de567451 Mon Sep 17 00:00:00 2001 From: dangreen <danon0404@gmail.com> Date: Fri, 15 Jul 2022 18:58:58 +0400 Subject: [PATCH 36/44] docs: updated readme --- .doclets.yml | 1 - CONTRIBUTING.md | 5 +- README.md | 176 +++++++++++++++++++++++++++++++++++++----------- 3 files changed, 137 insertions(+), 45 deletions(-) delete mode 100644 .doclets.yml diff --git a/.doclets.yml b/.doclets.yml deleted file mode 100644 index ea7c2ac6..00000000 --- a/.doclets.yml +++ /dev/null @@ -1 +0,0 @@ -dir: src diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 69d2dabe..f131704f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,4 +1,4 @@ -# Contributing to chartist-js +# Contributing to Chartist - [Issues and Bugs](#issue) - [Submission Guidelines](#submit) @@ -17,12 +17,11 @@ You will need the following to run a local development enviroment. - pnpm (`npm install -g pnpm`) - Text editor of your choice - ## How to Run a Local Distribution 1. `cd` into your local copy of the repository. 2. Run `pnpm i` to install dependencies located in `package.json`. -5. Run `pnpm start` to start the watch task, and the web server should automatically open. Congrats, you should now be able to see your local copy of the Chartist testbed. +5. Run `pnpm start:storybook` to start Storybook, or run `pnpm jest --watch` to run tests in watch mode. Congrats, you should now be able to see your local copy of the Chartist testbed. ## <a name="submit"></a> Submission Guidelines diff --git a/README.md b/README.md index 71fac4d3..a65db839 100644 --- a/README.md +++ b/README.md @@ -1,45 +1,94 @@ # Big welcome by the Chartist Guy -Note: This is the readme of chartist 1 and should be rewritten for version 2 which is currently under development within this repository. +[![NPM version][npm]][npm-url] +[![Downloads][downloads]][downloads-url] +[![Build status][build]][build-url] +[![Coverage status][coverage]][coverage-url] +[![Bundle size][size]][size-url] +[![Join the chat at https://gitter.im/gionkunz/chartist-js][chat]][chat-url] -## Developer information Version 2 WIP +[npm]: https://img.shields.io/npm/v/chartist.svg +[npm-url]: https://www.npmjs.com/package/chartist -``` -pnpm i -pnpm jspm i -pnpm build -OR -pnpm start -``` +[downloads]: https://img.shields.io/npm/dm/chartist.svg +[downloads-url]: https://www.npmjs.com/package/chartist -[![Join the chat at https://gitter.im/gionkunz/chartist-js](https://badges.gitter.im/gionkunz/chartist-js.svg)](https://gitter.im/gionkunz/chartist-js?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) -[![npm version](http://img.shields.io/npm/v/chartist.svg)](https://npmjs.org/package/chartist) [![build status](http://img.shields.io/travis/gionkunz/chartist-js.svg)](https://travis-ci.org/gionkunz/chartist-js) [![Inline docs](http://inch-ci.org/github/gionkunz/chartist-js.svg?branch=develop)](http://inch-ci.org/github/gionkunz/chartist-js) +[build]: https://img.shields.io/github/workflow/status/chartist-js/chartist/CI.svg +[build-url]: https://github.com/chartist-js/chartist/actions -![The Chartist Guy](https://raw.github.com/gionkunz/chartist-js/develop/site/images/chartist-guy.gif "The Chartist Guy") +[coverage]: https://img.shields.io/codecov/c/github/chartist-js/chartist.svg +[coverage-url]: https://app.codecov.io/gh/chartist-js/chartist -*Checkout the documentation site at http://gionkunz.github.io/chartist-js/* +[size]: https://img.shields.io/bundlephobia/minzip/chartist +[size-url]: https://bundlephobia.com/package/chartist -*Checkout this lightning talk that gives you an overview of Chartist in 5 minutes https://www.youtube.com/watch?v=WdYzPhOB_c8* +[chat]: https://badges.gitter.im/gionkunz/chartist-js.svg +[chat-url]: https://gitter.im/gionkunz/chartist-js?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge -*Guest talk of the Chartist.js Guy at the Treehouse Show https://www.youtube.com/watch?v=h9oH0iDaZDQ&t=2m40s* +<p align="center"> + <img width="400" alt="The Chartist Guy" src="https://raw.github.com/gionkunz/chartist-js/develop/site/images/chartist-guy.gif"> +</p> -Chartist.js is a simple responsive charting library built with SVG. There are hundreds of nice charting libraries already +Chartist is a simple responsive charting library built with SVG. There are hundreds of nice charting libraries already out there, but they are either: -* not responsive -* use the wrong technologies for illustration (canvas) -* are not flexible enough while keeping the configuration simple -* are not friendly to your own code -* are not friendly to designers -* have unnecessary dependencies to monolithic libraries -* more annoying things +- use the wrong technologies for illustration (canvas) +- weighs hundreds of kilobytes +- are not flexible enough while keeping the configuration simple +- are not friendly to designers +- more annoying things + +That's why we started Chartist and our goal is to solve all of the above issues. + +<hr /> +<a href="#quickstart">Quickstart</a> +<span>&nbsp;&nbsp;•&nbsp;&nbsp;</span> +<a href="#what-is-it-made-for">What is it made for?</a> +<span>&nbsp;&nbsp;•&nbsp;&nbsp;</span> +<a href="#whats-new-in-v1">What's new in v1?</a> +<span>&nbsp;&nbsp;•&nbsp;&nbsp;</span> +<a href="#contribution">Contribution</a> +<hr /> + +## Quickstart + +Install this library using your favorite package manager: + +```sh +pnpm add chartist +# or +yarn add chartist +# or +npm i chartist +``` -That's why we started Chartist.js and our goal is to solve all of the above issues. +Then, just import chart you want and use it: + +```js +import { BarChart } from 'chartist'; + +new BarChart('#chart', { + labels: ['W1', 'W2', 'W3', 'W4', 'W5', 'W6', 'W7', 'W8', 'W9', 'W10'], + series: [ + [1, 2, 4, 8, 6, -2, -1, -4, -6, -2] + ] +}, { + high: 10, + low: -10, + axisX: { + labelInterpolationFnc: (value, index) => (index % 2 === 0 ? value : null) + } +}); +``` + +<br /> + +[![supported by Cube](https://user-images.githubusercontent.com/986756/154330861-d79ab8ec-aacb-4af8-9e17-1b28f1eccb01.svg)](https://cube.dev/?ref=eco-chartist) ## What is it made for? Chartist's goal is to provide a simple, lightweight and unintrusive library to responsively craft charts on your website. -It's important to understand that one of the main intentions of Chartist.js is to rely on standards rather than providing +It's important to understand that one of the main intentions of Chartist is to rely on standards rather than providing it's own solution to a problem which is already solved by those standards. We need to leverage the power of browsers today and say good bye to the idea of solving all problems ourselves. @@ -48,29 +97,70 @@ also means that Chartist does not provide it's own event handling, labels, behav done with plain HTML, JavaScript and CSS. The single and only responsibility of Chartist is to help you drawing "Simple responsive Charts" using inline-SVG in the DOM, CSS to style and JavaScript to provide an API for configuring your charts. -## Example site +## What's new in v1? -You can visit this Site http://gionkunz.github.io/chartist-js/ which is in fact a build of the current project. -We are still developing and constantly add features but you can already use Chartist.js in your projects as we have -reached a stable and reliable state already. +### ESM -## Version notes +Now Chartist is truly an ES module and exposes its API through the exports, thus making Chartist [tree-shakable](https://developer.mozilla.org/en-US/docs/Glossary/Tree_shaking). -We are currently still heavily developing in order to make Chartist.js better. Your help is needed! Please contribute -to the project if you like the idea and the concept and help us to bring nice looking responsive open-source charts -to the masses. +<details> + <summary>Migration from v0.11</summary> + +- Each property of Chartist object now is named export. +- Chart classes were renamed. +- Easing object now is named export. + +```js +const Chartist = require('chartist') -### Important missing stuff +new Chartist.Bar(/* ... */); +new Chartist.Line(/* ... */); +new Chartist.Pie(/* ... */); +new Chartist.Svg(/* ... */); +Chartist.Svg.Easing +// ... -1. Jasmine Tests! -2. Documentation: JSDoc, Getting started documentation and landing page -3. Better accessibility using ARIA and other optimizations -4. Better interfaces to the library (i.e. jQuery with data-* attributes for configuration), Angular.js directive etc. -5. Richer Sass / CSS framework -6. Other charts types (spider etc.) +// -> + +import { BarChart, LineChart, PieChart, Svg, easings } from 'chartist' + +new BarChart(/* ... */) +new LineChart(/* ... */) +new PieChart(/* ... */) +new Svg(/* ... */) +easings +// ... +``` + +</details> + +### TypeScript + +Chartist was rewritten and fully typed with TypeScript. + +<details> + <summary>Some of exposed types</summary> + +```ts +import type { + BarChartData, + BarChartOptions, + LineChartData, + LineChartOptions, + PieChartData, + PieChartOptions +} from 'chartist' +``` + +</details> ## Plugins +Coming soon. + +<details> + <summary>For v0.11</summary> + Some features aren't right for the core product but there is a great set of plugins available which add features like: @@ -83,10 +173,14 @@ and more. See all the plugins [here](https://gionkunz.github.io/chartist-js/plugins.html). +</details> + ## Contribution We are looking for people who share the idea of having a simple, flexible charting library that is responsive and uses modern and future-proof technologies. The goal of this project is to create a responsive charting library where developers -have their joy in using it and designers love it because of the designing flexibility they have. +have their joy in using it and designers love it because of the designing flexibility they have. Please contribute +to the project if you like the idea and the concept and help us to bring nice looking responsive open-source charts +to the masses. Contribute if you like the Chartist Guy! From d1125959f77ccc401c957fc21cbc7893e75980c8 Mon Sep 17 00:00:00 2001 From: Gion Kunz <gion@syncrea.ch> Date: Tue, 19 Jul 2022 12:10:07 +0200 Subject: [PATCH 37/44] refactor: add easing functions as namespace to SVG for compatibility (#26) --- src/svg/Svg.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/svg/Svg.ts b/src/svg/Svg.ts index 0c211bea..d9b9c1c2 100644 --- a/src/svg/Svg.ts +++ b/src/svg/Svg.ts @@ -2,12 +2,18 @@ import type { EventEmitter } from '../event'; import { namespaces } from '../core/constants'; import type { Attributes, AnimationDefinition } from './types'; import { SvgList } from './SvgList'; -import { createAnimation } from './animation'; +import { createAnimation, easings } from './animation'; /** * Svg creates a new SVG object wrapper with a starting element. You can use the wrapper to fluently create sub-elements and modify them. */ export class Svg { + /** + * @todo Only there for chartist <1 compatibility. Remove after deprecation warining. + * @deprecated Use the animation module export `easings` directly. + */ + static readonly Easing = easings; + private _node: Element; /** From 9fcab3cb6ec703ebb0ee1842cefdefa87ba977df Mon Sep 17 00:00:00 2001 From: Dan Onoshko <danon0404@gmail.com> Date: Tue, 19 Jul 2022 14:57:15 +0400 Subject: [PATCH 38/44] refactor: add utils exports (#27) --- src/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/index.ts b/src/index.ts index bd4d49f4..0564dee9 100644 --- a/src/index.ts +++ b/src/index.ts @@ -4,3 +4,4 @@ export * from './charts'; export * from './axes'; export * as Interpolation from './interpolation'; export * from './svg'; +export * from './utils'; From 5d9fe91e1b23f2024b5025781df30cf48f809a7e Mon Sep 17 00:00:00 2001 From: Dan Onoshko <danon0404@gmail.com> Date: Tue, 19 Jul 2022 15:44:30 +0400 Subject: [PATCH 39/44] build: tweak emit declarations (#28) --- package.json | 2 +- tsconfig.build.json | 7 +++++++ tsconfig.json | 4 ---- 3 files changed, 8 insertions(+), 5 deletions(-) create mode 100644 tsconfig.build.json diff --git a/package.json b/package.json index af7a9bf1..d9651c33 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ "clear": "del ./package ./dist ./coverage", "prepublishOnly": "pnpm test && pnpm build && pnpm clear:package && clean-publish", "postpublish": "pnpm clear:package", - "emitDeclarations": "tsc --emitDeclarationOnly", + "emitDeclarations": "tsc --project ./tsconfig.build.json --emitDeclarationOnly", "build:styles": "./scripts/styles.cjs", "build": "rollup -c & pnpm build:styles & pnpm emitDeclarations", "start:storybook": "start-storybook -p 6006 --ci", diff --git a/tsconfig.build.json b/tsconfig.build.json new file mode 100644 index 00000000..60ecc2f2 --- /dev/null +++ b/tsconfig.build.json @@ -0,0 +1,7 @@ +{ + "extends": "./tsconfig.json", + "exclude": [ + "**/*.stories.ts", + "**/*.spec.ts" + ] +} diff --git a/tsconfig.json b/tsconfig.json index 81ea58c9..c2ce442d 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -35,9 +35,5 @@ }, "include": [ "src" - ], - "exclude": [ - "**/*.stories.ts", - "**/*.spec.ts" ] } From 0b9b3c1fad40db0565bbd966db98da5677b85577 Mon Sep 17 00:00:00 2001 From: Dan Onoshko <danon0404@gmail.com> Date: Tue, 19 Jul 2022 16:37:54 +0400 Subject: [PATCH 40/44] ci: upgrade pnpm to v7 (#29) --- .github/workflows/checks.yml | 4 +- .github/workflows/ci.yml | 2 +- .github/workflows/release.yml | 2 +- .github/workflows/update-storyshots.yml | 4 +- pnpm-lock.yaml | 547 ++++++++++++++---------- 5 files changed, 333 insertions(+), 226 deletions(-) diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index 7a258bde..5bcd9bd2 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -14,7 +14,7 @@ jobs: - name: Install pnpm uses: pnpm/action-setup@v2.0.1 with: - version: 6 + version: 7 - name: Install Node.js uses: actions/setup-node@v2 with: @@ -33,7 +33,7 @@ jobs: - name: Install pnpm uses: pnpm/action-setup@v2.0.1 with: - version: 6 + version: 7 - name: Install Node.js uses: actions/setup-node@v2 with: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0bd57db0..0d6f204e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,7 +21,7 @@ jobs: - name: Install pnpm uses: pnpm/action-setup@v2.2.1 with: - version: 6 + version: 7 - name: Install Node.js uses: actions/setup-node@v3 with: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 74c90ead..b72adabf 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -12,7 +12,7 @@ jobs: - name: Install pnpm uses: pnpm/action-setup@v2.0.1 with: - version: 6 + version: 7 - name: Install Node.js uses: actions/setup-node@v2 with: diff --git a/.github/workflows/update-storyshots.yml b/.github/workflows/update-storyshots.yml index 411c7b01..017f5f84 100644 --- a/.github/workflows/update-storyshots.yml +++ b/.github/workflows/update-storyshots.yml @@ -10,7 +10,7 @@ jobs: - name: Install pnpm uses: pnpm/action-setup@v2.2.1 with: - version: 6 + version: 7 - name: Install Node.js uses: actions/setup-node@v3 with: @@ -35,7 +35,7 @@ jobs: - name: Install pnpm uses: pnpm/action-setup@v2.2.1 with: - version: 6 + version: 7 - name: Install Node.js uses: actions/setup-node@v3 with: diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index dd42bbf1..5a037c47 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,4 +1,4 @@ -lockfileVersion: 5.3 +lockfileVersion: 5.4 specifiers: '@babel/core': ^7.17.9 @@ -60,19 +60,19 @@ specifiers: devDependencies: '@babel/core': 7.17.9 - '@babel/eslint-parser': 7.17.0_@babel+core@7.17.9+eslint@8.15.0 + '@babel/eslint-parser': 7.17.0_c77tlxfiivugycutqmowoj57sm '@commitlint/cli': 16.2.3_@swc+core@1.2.165 '@commitlint/config-conventional': 16.2.1 - '@commitlint/cz-commitlint': 16.2.3_d728995458426a93696f083845656c00 + '@commitlint/cz-commitlint': 16.2.3_24ujsvcyijvjg2lpba4ekzlmaa '@rollup/plugin-node-resolve': 13.2.0_rollup@2.70.1 - '@size-limit/preset-big-lib': 7.0.8_0345a5c925bba9874623e0a9cd869c6b + '@size-limit/preset-big-lib': 7.0.8_anc2lsjfxouyorrd4cu43bu4nm '@storybook/addon-actions': 6.4.22 - '@storybook/addon-controls': 6.4.22_eslint@8.15.0+typescript@4.6.4 - '@storybook/addon-docs': 6.4.22_5d666fb5b9c479b3d907ef7c497df350 - '@storybook/addon-storyshots': 6.4.22_18f88eb32f74f372eb2564942362dd40 - '@storybook/addon-storyshots-puppeteer': 6.4.22_ee73af2950fdda0cdee7b156fb6cc3b7 + '@storybook/addon-controls': 6.4.22_hcfsmds2fshutdssjqluwm76uu + '@storybook/addon-docs': 6.4.22_lvtg7nnzyr43hwih556es7ptka + '@storybook/addon-storyshots': 6.4.22_dd4i5mzpotzxf2zfmskcgyw5ia + '@storybook/addon-storyshots-puppeteer': 6.4.22_5zz26kkq7xnazxxhwflpw3gdw4 '@storybook/addon-viewport': 6.4.22 - '@storybook/html': 6.4.22_99ab00defb472bd59e7c8ea756614640 + '@storybook/html': 6.4.22_tgvqbxx3i4v5lht4r2tvmykgia '@swc/core': 1.2.165 '@swc/helpers': 0.3.8 '@swc/jest': 0.2.20_@swc+core@1.2.165 @@ -80,8 +80,8 @@ devDependencies: '@types/faker': 5.5.9 '@types/jest': 27.5.1 '@types/node': 17.0.34 - '@typescript-eslint/eslint-plugin': 5.25.0_83b4734ba99fefa06dfff9f51a4c4301 - '@typescript-eslint/parser': 5.25.0_eslint@8.15.0+typescript@4.6.4 + '@typescript-eslint/eslint-plugin': 5.25.0_qo2hgs5jt7x2a3p77h2rutcdae + '@typescript-eslint/parser': 5.25.0_hcfsmds2fshutdssjqluwm76uu browserslist: 4.20.2 chartist: 0.11.4 clean-publish: 4.0.1 @@ -91,10 +91,10 @@ devDependencies: del-cli: 4.0.1 eslint: 8.15.0 eslint-config-prettier: 8.5.0_eslint@8.15.0 - eslint-plugin-jest: 26.2.2_93a18a14fb19656958628faf0a8b5863 + eslint-plugin-jest: 26.2.2_soqyufh3dfswswdcr6xqvc2ymm eslint-plugin-jest-dom: 4.0.1_eslint@8.15.0 - eslint-plugin-prettier: 4.0.0_440b30a60bbe5bb6e3ad0057150b2782 - eslint-plugin-testing-library: 5.5.0_eslint@8.15.0+typescript@4.6.4 + eslint-plugin-prettier: 4.0.0_iqftbjqlxzn3ny5nablrkczhqi + eslint-plugin-testing-library: 5.5.0_hcfsmds2fshutdssjqluwm76uu faker: 5.5.3 http-server: 14.1.0 inquirer: 8.2.2 @@ -106,7 +106,7 @@ devDependencies: prettier: 2.6.2 puppeteer: 14.0.0 rollup: 2.70.1 - rollup-plugin-swc: 0.2.1_@swc+core@1.2.165+rollup@2.70.1 + rollup-plugin-swc: 0.2.1_se5dfsysqsuwchop2hfe5dxcvm sass: 1.50.1 sass-loader: 10.2.1_sass@1.50.1 simple-git-hooks: 2.7.0 @@ -194,7 +194,7 @@ packages: - supports-color dev: true - /@babel/eslint-parser/7.17.0_@babel+core@7.17.9+eslint@8.15.0: + /@babel/eslint-parser/7.17.0_c77tlxfiivugycutqmowoj57sm: resolution: {integrity: sha512-PUEJ7ZBXbRkbq3qqM/jZ2nIuakUBqCYc7Qf52Lj7dlZ6zERnqisdHioL0l4wwQZnmskMeasqUNzLBFKs3nylXA==} engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} peerDependencies: @@ -476,6 +476,8 @@ packages: resolution: {integrity: sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg==} engines: {node: '>=6.0.0'} hasBin: true + dependencies: + '@babel/types': 7.17.0 dev: true /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.16.7_@babel+core@7.17.9: @@ -1559,6 +1561,7 @@ packages: /@colors/colors/1.5.0: resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} engines: {node: '>=0.1.90'} + requiresBuild: true dev: true optional: true @@ -1605,7 +1608,7 @@ packages: dev: true optional: true - /@commitlint/cz-commitlint/16.2.3_d728995458426a93696f083845656c00: + /@commitlint/cz-commitlint/16.2.3_24ujsvcyijvjg2lpba4ekzlmaa: resolution: {integrity: sha512-G9rRnBJ/5te7RiOzp7EdqII9rQYvtsfsqwMxcoK4B7l0Rc57nFCOlf0e4Bn70E4aOsLeMzNe+PvVVrEsPStEHg==} engines: {node: '>=v12'} peerDependencies: @@ -1681,7 +1684,7 @@ packages: '@types/node': 17.0.34 chalk: 4.1.2 cosmiconfig: 7.0.1 - cosmiconfig-typescript-loader: 1.0.9_8ffbbd0e65bf654299df3e9f6b2219d7 + cosmiconfig-typescript-loader: 1.0.9_r7532dtfx5sufgo7h2pwwiqz24 lodash: 4.17.21 resolve-from: 5.0.0 typescript: 4.6.4 @@ -1693,6 +1696,7 @@ packages: /@commitlint/load/17.0.0_@swc+core@1.2.165: resolution: {integrity: sha512-XaiHF4yWQOPAI0O6wXvk+NYLtJn/Xb7jgZEeKd4C1ZWd7vR7u8z5h0PkWxSr0uLZGQsElGxv3fiZ32C5+q6M8w==} engines: {node: '>=v14'} + requiresBuild: true dependencies: '@commitlint/config-validator': 17.0.0 '@commitlint/execute-rule': 17.0.0 @@ -1701,7 +1705,7 @@ packages: '@types/node': 17.0.34 chalk: 4.1.2 cosmiconfig: 7.0.1 - cosmiconfig-typescript-loader: 2.0.0_8ffbbd0e65bf654299df3e9f6b2219d7 + cosmiconfig-typescript-loader: 2.0.0_r7532dtfx5sufgo7h2pwwiqz24 lodash: 4.17.21 resolve-from: 5.0.0 typescript: 4.6.4 @@ -1892,54 +1896,54 @@ packages: resolution: {integrity: sha512-zM9PFmgVSqBw4zL101Q0HrBVTGmpAxFZH/pYx/cjJT5advXguvcgjHFTCaIO3enL/xr89vK2bh0Mfyj9aa0ANA==} dev: true - /@emotion/styled-base/10.3.0_864809d686fef2043b51d8d752270dc1: + /@emotion/styled-base/10.3.0_@emotion+core@10.3.1: resolution: {integrity: sha512-PBRqsVKR7QRNkmfH78hTSSwHWcwDpecH9W6heujWAcyp2wdz/64PP73s7fWS1dIPm8/Exc8JAzYS8dEWXjv60w==} peerDependencies: '@emotion/core': ^10.0.28 react: '>=16.3.0' dependencies: '@babel/runtime': 7.17.9 - '@emotion/core': 10.3.1_react@16.14.0 + '@emotion/core': 10.3.1 '@emotion/is-prop-valid': 0.8.8 '@emotion/serialize': 0.11.16 '@emotion/utils': 0.11.3 - react: 16.14.0 dev: true - /@emotion/styled-base/10.3.0_@emotion+core@10.3.1: + /@emotion/styled-base/10.3.0_qzeatvug73zaio2r3dlvejynye: resolution: {integrity: sha512-PBRqsVKR7QRNkmfH78hTSSwHWcwDpecH9W6heujWAcyp2wdz/64PP73s7fWS1dIPm8/Exc8JAzYS8dEWXjv60w==} peerDependencies: '@emotion/core': ^10.0.28 react: '>=16.3.0' dependencies: '@babel/runtime': 7.17.9 - '@emotion/core': 10.3.1 + '@emotion/core': 10.3.1_react@16.14.0 '@emotion/is-prop-valid': 0.8.8 '@emotion/serialize': 0.11.16 '@emotion/utils': 0.11.3 + react: 16.14.0 dev: true - /@emotion/styled/10.3.0_864809d686fef2043b51d8d752270dc1: + /@emotion/styled/10.3.0_@emotion+core@10.3.1: resolution: {integrity: sha512-GgcUpXBBEU5ido+/p/mCT2/Xx+Oqmp9JzQRuC+a4lYM4i4LBBn/dWvc0rQ19N9ObA8/T4NWMrPNe79kMBDJqoQ==} peerDependencies: '@emotion/core': ^10.0.27 react: '>=16.3.0' dependencies: - '@emotion/core': 10.3.1_react@16.14.0 - '@emotion/styled-base': 10.3.0_864809d686fef2043b51d8d752270dc1 + '@emotion/core': 10.3.1 + '@emotion/styled-base': 10.3.0_@emotion+core@10.3.1 babel-plugin-emotion: 10.2.2 - react: 16.14.0 dev: true - /@emotion/styled/10.3.0_@emotion+core@10.3.1: + /@emotion/styled/10.3.0_qzeatvug73zaio2r3dlvejynye: resolution: {integrity: sha512-GgcUpXBBEU5ido+/p/mCT2/Xx+Oqmp9JzQRuC+a4lYM4i4LBBn/dWvc0rQ19N9ObA8/T4NWMrPNe79kMBDJqoQ==} peerDependencies: '@emotion/core': ^10.0.27 react: '>=16.3.0' dependencies: - '@emotion/core': 10.3.1 - '@emotion/styled-base': 10.3.0_@emotion+core@10.3.1 + '@emotion/core': 10.3.1_react@16.14.0 + '@emotion/styled-base': 10.3.0_qzeatvug73zaio2r3dlvejynye babel-plugin-emotion: 10.2.2 + react: 16.14.0 dev: true /@emotion/stylis/0.8.5: @@ -2543,14 +2547,14 @@ packages: size-limit: 7.0.8 dev: true - /@size-limit/preset-big-lib/7.0.8_0345a5c925bba9874623e0a9cd869c6b: + /@size-limit/preset-big-lib/7.0.8_anc2lsjfxouyorrd4cu43bu4nm: resolution: {integrity: sha512-m9C+FPPmETg9vg3V3Aq4hTflX1GVRpjYO94C4gqrl26I5YqB+BlKf8WKHmna3IbmJyePf7M8qvya/ougzMVHkQ==} peerDependencies: size-limit: 7.0.8 dependencies: '@size-limit/file': 7.0.8_size-limit@7.0.8 '@size-limit/time': 7.0.8_size-limit@7.0.8 - '@size-limit/webpack': 7.0.8_0345a5c925bba9874623e0a9cd869c6b + '@size-limit/webpack': 7.0.8_anc2lsjfxouyorrd4cu43bu4nm size-limit: 7.0.8 transitivePeerDependencies: - '@swc/core' @@ -2579,7 +2583,7 @@ packages: - utf-8-validate dev: true - /@size-limit/webpack/7.0.8_0345a5c925bba9874623e0a9cd869c6b: + /@size-limit/webpack/7.0.8_anc2lsjfxouyorrd4cu43bu4nm: resolution: {integrity: sha512-69YuY0o4geRNJDb55Vri+bNPs9+WZlK0pzcziip1p4uajCFMFQE0K8pKj3vsIOUADdTcimfypHciriCY/qrnJQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} peerDependencies: @@ -2629,7 +2633,7 @@ packages: - '@types/react' dev: true - /@storybook/addon-controls/6.4.22_eslint@8.15.0+typescript@4.6.4: + /@storybook/addon-controls/6.4.22_hcfsmds2fshutdssjqluwm76uu: resolution: {integrity: sha512-f/M/W+7UTEUnr/L6scBMvksq+ZA8GTfh3bomE5FtWyOyaFppq9k8daKAvdYNlzXAOrUUsoZVJDgpb20Z2VBiSQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 @@ -2644,7 +2648,7 @@ packages: '@storybook/api': 6.4.22 '@storybook/client-logger': 6.4.22 '@storybook/components': 6.4.22 - '@storybook/core-common': 6.4.22_eslint@8.15.0+typescript@4.6.4 + '@storybook/core-common': 6.4.22_hcfsmds2fshutdssjqluwm76uu '@storybook/csf': 0.0.2--canary.87bc651.0 '@storybook/node-logger': 6.4.22 '@storybook/store': 6.4.22 @@ -2662,7 +2666,7 @@ packages: - webpack-command dev: true - /@storybook/addon-docs/6.4.22_5d666fb5b9c479b3d907ef7c497df350: + /@storybook/addon-docs/6.4.22_lvtg7nnzyr43hwih556es7ptka: resolution: {integrity: sha512-9j+i+W+BGHJuRe4jUrqk6ubCzP4fc1xgFS2o8pakRiZgPn5kUQPdkticmsyh1XeEJifwhqjKJvkEDrcsleytDA==} peerDependencies: '@storybook/angular': 6.4.22 @@ -2720,14 +2724,14 @@ packages: '@mdx-js/react': 1.6.22 '@storybook/addons': 6.4.22 '@storybook/api': 6.4.22 - '@storybook/builder-webpack4': 6.4.22_eslint@8.15.0+typescript@4.6.4 + '@storybook/builder-webpack4': 6.4.22_hcfsmds2fshutdssjqluwm76uu '@storybook/client-logger': 6.4.22 '@storybook/components': 6.4.22 - '@storybook/core': 6.4.22_eslint@8.15.0+typescript@4.6.4 + '@storybook/core': 6.4.22_hcfsmds2fshutdssjqluwm76uu '@storybook/core-events': 6.4.22 '@storybook/csf': 0.0.2--canary.87bc651.0 '@storybook/csf-tools': 6.4.22 - '@storybook/html': 6.4.22_99ab00defb472bd59e7c8ea756614640 + '@storybook/html': 6.4.22_tgvqbxx3i4v5lht4r2tvmykgia '@storybook/node-logger': 6.4.22 '@storybook/postinstall': 6.4.22 '@storybook/preview-web': 6.4.22 @@ -2760,6 +2764,7 @@ packages: - '@storybook/builder-webpack5' - '@storybook/manager-webpack5' - '@types/react' + - bluebird - bufferutil - encoding - eslint @@ -2771,7 +2776,7 @@ packages: - webpack-command dev: true - /@storybook/addon-storyshots-puppeteer/6.4.22_ee73af2950fdda0cdee7b156fb6cc3b7: + /@storybook/addon-storyshots-puppeteer/6.4.22_5zz26kkq7xnazxxhwflpw3gdw4: resolution: {integrity: sha512-vmi0slsy8jo+NZL+KSDSvm71vKPv4EKH4xZvZgCAQ6Pm47KgmQxce1tVchmEtP4cBCmhTx7VHjDEe+QgtBvtDw==} peerDependencies: '@storybook/addon-storyshots': 6.4.22 @@ -2781,7 +2786,7 @@ packages: optional: true dependencies: '@axe-core/puppeteer': 4.4.2_puppeteer@14.0.0 - '@storybook/addon-storyshots': 6.4.22_18f88eb32f74f372eb2564942362dd40 + '@storybook/addon-storyshots': 6.4.22_dd4i5mzpotzxf2zfmskcgyw5ia '@storybook/csf': 0.0.2--canary.87bc651.0 '@storybook/node-logger': 6.4.22 '@types/jest-image-snapshot': 4.3.1 @@ -2793,7 +2798,7 @@ packages: - jest dev: true - /@storybook/addon-storyshots/6.4.22_18f88eb32f74f372eb2564942362dd40: + /@storybook/addon-storyshots/6.4.22_dd4i5mzpotzxf2zfmskcgyw5ia: resolution: {integrity: sha512-9u+uigHH4khxHB18z1TOau+RKpLo/8tdhvKVqgjy6pr3FSsgp+JyoI+ubDtgWAWFHQ0Zhh5MBWNDmPOo5pwBdA==} peerDependencies: '@angular/core': '>=6.0.0' @@ -2848,9 +2853,9 @@ packages: '@storybook/addons': 6.4.22 '@storybook/babel-plugin-require-context-hook': 1.0.1 '@storybook/client-api': 6.4.22 - '@storybook/core': 6.4.22_eslint@8.15.0+typescript@4.6.4 + '@storybook/core': 6.4.22_hcfsmds2fshutdssjqluwm76uu '@storybook/core-client': 6.4.22_typescript@4.6.4 - '@storybook/core-common': 6.4.22_eslint@8.15.0+typescript@4.6.4 + '@storybook/core-common': 6.4.22_hcfsmds2fshutdssjqluwm76uu '@storybook/csf': 0.0.2--canary.87bc651.0 '@types/glob': 7.2.0 '@types/jest': 26.0.24 @@ -2870,6 +2875,7 @@ packages: - '@storybook/builder-webpack5' - '@storybook/manager-webpack5' - '@types/react' + - bluebird - bufferutil - encoding - eslint @@ -2927,19 +2933,19 @@ packages: regenerator-runtime: 0.13.9 dev: true - /@storybook/addons/6.4.22_react-dom@16.14.0+react@16.14.0: + /@storybook/addons/6.4.22_wcqkhtmu7mswc6yz4uyexck3ty: resolution: {integrity: sha512-P/R+Jsxh7pawKLYo8MtE3QU/ilRFKbtCewV/T1o5U/gm8v7hKQdFz3YdRMAra4QuCY8bQIp7MKd2HrB5aH5a1A==} peerDependencies: react: ^16.8.0 || ^17.0.0 react-dom: ^16.8.0 || ^17.0.0 dependencies: - '@storybook/api': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@storybook/api': 6.4.22_wcqkhtmu7mswc6yz4uyexck3ty '@storybook/channels': 6.4.22 '@storybook/client-logger': 6.4.22 '@storybook/core-events': 6.4.22 '@storybook/csf': 0.0.2--canary.87bc651.0 - '@storybook/router': 6.4.22_react-dom@16.14.0+react@16.14.0 - '@storybook/theming': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@storybook/router': 6.4.22_wcqkhtmu7mswc6yz4uyexck3ty + '@storybook/theming': 6.4.22_wcqkhtmu7mswc6yz4uyexck3ty '@types/webpack-env': 1.16.3 core-js: 3.21.1 global: 4.4.0 @@ -2973,7 +2979,7 @@ packages: util-deprecate: 1.0.2 dev: true - /@storybook/api/6.4.22_react-dom@16.14.0+react@16.14.0: + /@storybook/api/6.4.22_wcqkhtmu7mswc6yz4uyexck3ty: resolution: {integrity: sha512-lAVI3o2hKupYHXFTt+1nqFct942up5dHH6YD7SZZJGyW21dwKC3HK1IzCsTawq3fZAKkgWFgmOO649hKk60yKg==} peerDependencies: react: ^16.8.0 || ^17.0.0 @@ -2983,9 +2989,9 @@ packages: '@storybook/client-logger': 6.4.22 '@storybook/core-events': 6.4.22 '@storybook/csf': 0.0.2--canary.87bc651.0 - '@storybook/router': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@storybook/router': 6.4.22_wcqkhtmu7mswc6yz4uyexck3ty '@storybook/semver': 7.3.2 - '@storybook/theming': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@storybook/theming': 6.4.22_wcqkhtmu7mswc6yz4uyexck3ty core-js: 3.21.1 fast-deep-equal: 3.1.3 global: 4.4.0 @@ -3004,7 +3010,7 @@ packages: resolution: {integrity: sha512-WM4vjgSVi8epvGiYfru7BtC3f0tGwNs7QK3Uc4xQn4t5hHQvISnCqbNrHdDYmNW56Do+bBztE8SwP6NGUvd7ww==} dev: true - /@storybook/builder-webpack4/6.4.22_68167c448effea8d9d4b4729bd410c99: + /@storybook/builder-webpack4/6.4.22_hcfsmds2fshutdssjqluwm76uu: resolution: {integrity: sha512-A+GgGtKGnBneRFSFkDarUIgUTI8pYFdLmUVKEAGdh2hL+vLXAz9A46sEY7C8LQ85XWa8TKy3OTDxqR4+4iWj3A==} peerDependencies: react: ^16.8.0 || ^17.0.0 @@ -3035,26 +3041,26 @@ packages: '@babel/preset-env': 7.16.11_@babel+core@7.17.9 '@babel/preset-react': 7.16.7_@babel+core@7.17.9 '@babel/preset-typescript': 7.16.7_@babel+core@7.17.9 - '@storybook/addons': 6.4.22_react-dom@16.14.0+react@16.14.0 - '@storybook/api': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@storybook/addons': 6.4.22 + '@storybook/api': 6.4.22 '@storybook/channel-postmessage': 6.4.22 '@storybook/channels': 6.4.22 - '@storybook/client-api': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@storybook/client-api': 6.4.22 '@storybook/client-logger': 6.4.22 - '@storybook/components': 6.4.22_react-dom@16.14.0+react@16.14.0 - '@storybook/core-common': 6.4.22_68167c448effea8d9d4b4729bd410c99 + '@storybook/components': 6.4.22 + '@storybook/core-common': 6.4.22_hcfsmds2fshutdssjqluwm76uu '@storybook/core-events': 6.4.22 '@storybook/node-logger': 6.4.22 - '@storybook/preview-web': 6.4.22_react-dom@16.14.0+react@16.14.0 - '@storybook/router': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@storybook/preview-web': 6.4.22 + '@storybook/router': 6.4.22 '@storybook/semver': 7.3.2 - '@storybook/store': 6.4.22_react-dom@16.14.0+react@16.14.0 - '@storybook/theming': 6.4.22_react-dom@16.14.0+react@16.14.0 - '@storybook/ui': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@storybook/store': 6.4.22 + '@storybook/theming': 6.4.22 + '@storybook/ui': 6.4.22 '@types/node': 14.18.13 '@types/webpack': 4.41.32 autoprefixer: 9.8.8 - babel-loader: 8.2.4_598a497cebab8e15ee8f9e5632178e63 + babel-loader: 8.2.4_lgfes7hlvohbl3uptzldef4omm babel-plugin-macros: 2.8.0 babel-plugin-polyfill-corejs3: 0.1.7_@babel+core@7.17.9 case-sensitive-paths-webpack-plugin: 2.4.0 @@ -3062,7 +3068,7 @@ packages: css-loader: 3.6.0_webpack@4.46.0 file-loader: 6.2.0_webpack@4.46.0 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 4.1.6 + fork-ts-checker-webpack-plugin: 4.1.6_7wnmsrtcnse6htziqnucw6w67m glob: 7.2.0 glob-promise: 3.4.0_glob@7.2.0 global: 4.4.0 @@ -3070,16 +3076,14 @@ packages: pnp-webpack-plugin: 1.6.4_typescript@4.6.4 postcss: 7.0.39 postcss-flexbugs-fixes: 4.2.1 - postcss-loader: 4.3.0_postcss@7.0.39+webpack@4.46.0 + postcss-loader: 4.3.0_gzaxsinx64nntyd3vmdqwl7coe raw-loader: 4.0.2_webpack@4.46.0 - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 stable: 0.1.8 style-loader: 1.3.0_webpack@4.46.0 terser-webpack-plugin: 4.2.3_webpack@4.46.0 ts-dedent: 2.2.0 typescript: 4.6.4 - url-loader: 4.1.1_file-loader@6.2.0+webpack@4.46.0 + url-loader: 4.1.1_lit45vopotvaqup7lrvlnvtxwy util-deprecate: 1.0.2 webpack: 4.46.0 webpack-dev-middleware: 3.7.3_webpack@4.46.0 @@ -3088,6 +3092,7 @@ packages: webpack-virtual-modules: 0.2.2 transitivePeerDependencies: - '@types/react' + - bluebird - eslint - supports-color - vue-template-compiler @@ -3095,7 +3100,7 @@ packages: - webpack-command dev: true - /@storybook/builder-webpack4/6.4.22_eslint@8.15.0+typescript@4.6.4: + /@storybook/builder-webpack4/6.4.22_nalhyreo77vi3hkli4u32qimte: resolution: {integrity: sha512-A+GgGtKGnBneRFSFkDarUIgUTI8pYFdLmUVKEAGdh2hL+vLXAz9A46sEY7C8LQ85XWa8TKy3OTDxqR4+4iWj3A==} peerDependencies: react: ^16.8.0 || ^17.0.0 @@ -3126,26 +3131,26 @@ packages: '@babel/preset-env': 7.16.11_@babel+core@7.17.9 '@babel/preset-react': 7.16.7_@babel+core@7.17.9 '@babel/preset-typescript': 7.16.7_@babel+core@7.17.9 - '@storybook/addons': 6.4.22 - '@storybook/api': 6.4.22 + '@storybook/addons': 6.4.22_wcqkhtmu7mswc6yz4uyexck3ty + '@storybook/api': 6.4.22_wcqkhtmu7mswc6yz4uyexck3ty '@storybook/channel-postmessage': 6.4.22 '@storybook/channels': 6.4.22 - '@storybook/client-api': 6.4.22 + '@storybook/client-api': 6.4.22_wcqkhtmu7mswc6yz4uyexck3ty '@storybook/client-logger': 6.4.22 - '@storybook/components': 6.4.22 - '@storybook/core-common': 6.4.22_eslint@8.15.0+typescript@4.6.4 + '@storybook/components': 6.4.22_wcqkhtmu7mswc6yz4uyexck3ty + '@storybook/core-common': 6.4.22_nalhyreo77vi3hkli4u32qimte '@storybook/core-events': 6.4.22 '@storybook/node-logger': 6.4.22 - '@storybook/preview-web': 6.4.22 - '@storybook/router': 6.4.22 + '@storybook/preview-web': 6.4.22_wcqkhtmu7mswc6yz4uyexck3ty + '@storybook/router': 6.4.22_wcqkhtmu7mswc6yz4uyexck3ty '@storybook/semver': 7.3.2 - '@storybook/store': 6.4.22 - '@storybook/theming': 6.4.22 - '@storybook/ui': 6.4.22 + '@storybook/store': 6.4.22_wcqkhtmu7mswc6yz4uyexck3ty + '@storybook/theming': 6.4.22_wcqkhtmu7mswc6yz4uyexck3ty + '@storybook/ui': 6.4.22_wcqkhtmu7mswc6yz4uyexck3ty '@types/node': 14.18.13 '@types/webpack': 4.41.32 autoprefixer: 9.8.8 - babel-loader: 8.2.4_598a497cebab8e15ee8f9e5632178e63 + babel-loader: 8.2.4_lgfes7hlvohbl3uptzldef4omm babel-plugin-macros: 2.8.0 babel-plugin-polyfill-corejs3: 0.1.7_@babel+core@7.17.9 case-sensitive-paths-webpack-plugin: 2.4.0 @@ -3153,7 +3158,7 @@ packages: css-loader: 3.6.0_webpack@4.46.0 file-loader: 6.2.0_webpack@4.46.0 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 4.1.6 + fork-ts-checker-webpack-plugin: 4.1.6_7wnmsrtcnse6htziqnucw6w67m glob: 7.2.0 glob-promise: 3.4.0_glob@7.2.0 global: 4.4.0 @@ -3161,14 +3166,16 @@ packages: pnp-webpack-plugin: 1.6.4_typescript@4.6.4 postcss: 7.0.39 postcss-flexbugs-fixes: 4.2.1 - postcss-loader: 4.3.0_postcss@7.0.39+webpack@4.46.0 + postcss-loader: 4.3.0_gzaxsinx64nntyd3vmdqwl7coe raw-loader: 4.0.2_webpack@4.46.0 + react: 16.14.0 + react-dom: 16.14.0_react@16.14.0 stable: 0.1.8 style-loader: 1.3.0_webpack@4.46.0 terser-webpack-plugin: 4.2.3_webpack@4.46.0 ts-dedent: 2.2.0 typescript: 4.6.4 - url-loader: 4.1.1_file-loader@6.2.0+webpack@4.46.0 + url-loader: 4.1.1_lit45vopotvaqup7lrvlnvtxwy util-deprecate: 1.0.2 webpack: 4.46.0 webpack-dev-middleware: 3.7.3_webpack@4.46.0 @@ -3177,6 +3184,7 @@ packages: webpack-virtual-modules: 0.2.2 transitivePeerDependencies: - '@types/react' + - bluebird - eslint - supports-color - vue-template-compiler @@ -3242,19 +3250,19 @@ packages: util-deprecate: 1.0.2 dev: true - /@storybook/client-api/6.4.22_react-dom@16.14.0+react@16.14.0: + /@storybook/client-api/6.4.22_wcqkhtmu7mswc6yz4uyexck3ty: resolution: {integrity: sha512-sO6HJNtrrdit7dNXQcZMdlmmZG1k6TswH3gAyP/DoYajycrTwSJ6ovkarzkO+0QcJ+etgra4TEdTIXiGHBMe/A==} peerDependencies: react: ^16.8.0 || ^17.0.0 react-dom: ^16.8.0 || ^17.0.0 dependencies: - '@storybook/addons': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@storybook/addons': 6.4.22_wcqkhtmu7mswc6yz4uyexck3ty '@storybook/channel-postmessage': 6.4.22 '@storybook/channels': 6.4.22 '@storybook/client-logger': 6.4.22 '@storybook/core-events': 6.4.22 '@storybook/csf': 0.0.2--canary.87bc651.0 - '@storybook/store': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@storybook/store': 6.4.22_wcqkhtmu7mswc6yz4uyexck3ty '@types/qs': 6.9.7 '@types/webpack-env': 1.16.3 core-js: 3.21.1 @@ -3313,7 +3321,7 @@ packages: - '@types/react' dev: true - /@storybook/components/6.4.22_react-dom@16.14.0+react@16.14.0: + /@storybook/components/6.4.22_wcqkhtmu7mswc6yz4uyexck3ty: resolution: {integrity: sha512-dCbXIJF9orMvH72VtAfCQsYbe57OP7fAADtR6YTwfCw9Sm1jFuZr8JbblQ1HcrXEoJG21nOyad3Hm5EYVb/sBw==} peerDependencies: react: ^16.8.0 || ^17.0.0 @@ -3322,7 +3330,7 @@ packages: '@popperjs/core': 2.11.5 '@storybook/client-logger': 6.4.22 '@storybook/csf': 0.0.2--canary.87bc651.0 - '@storybook/theming': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@storybook/theming': 6.4.22_wcqkhtmu7mswc6yz4uyexck3ty '@types/color-convert': 2.0.0 '@types/overlayscrollbars': 1.12.1 '@types/react-syntax-highlighter': 11.0.5 @@ -3337,9 +3345,9 @@ packages: polished: 4.2.2 prop-types: 15.8.1 react: 16.14.0 - react-colorful: 5.5.1_react-dom@16.14.0+react@16.14.0 + react-colorful: 5.5.1_wcqkhtmu7mswc6yz4uyexck3ty react-dom: 16.14.0_react@16.14.0 - react-popper-tooltip: 3.1.1_react-dom@16.14.0+react@16.14.0 + react-popper-tooltip: 3.1.1_wcqkhtmu7mswc6yz4uyexck3ty react-syntax-highlighter: 13.5.3_react@16.14.0 react-textarea-autosize: 8.3.3_react@16.14.0 regenerator-runtime: 0.13.9 @@ -3349,7 +3357,7 @@ packages: - '@types/react' dev: true - /@storybook/core-client/6.4.22_1596ec9896079968c237ec0328822914: + /@storybook/core-client/6.4.22_cwlozgewa6mwrqrx5qbsrarjcq: resolution: {integrity: sha512-uHg4yfCBeM6eASSVxStWRVTZrAnb4FT6X6v/xDqr4uXCpCttZLlBzrSDwPBLNNLtCa7ntRicHM8eGKIOD5lMYQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 @@ -3360,16 +3368,16 @@ packages: typescript: optional: true dependencies: - '@storybook/addons': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@storybook/addons': 6.4.22_wcqkhtmu7mswc6yz4uyexck3ty '@storybook/channel-postmessage': 6.4.22 '@storybook/channel-websocket': 6.4.22 - '@storybook/client-api': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@storybook/client-api': 6.4.22_wcqkhtmu7mswc6yz4uyexck3ty '@storybook/client-logger': 6.4.22 '@storybook/core-events': 6.4.22 '@storybook/csf': 0.0.2--canary.87bc651.0 - '@storybook/preview-web': 6.4.22_react-dom@16.14.0+react@16.14.0 - '@storybook/store': 6.4.22_react-dom@16.14.0+react@16.14.0 - '@storybook/ui': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@storybook/preview-web': 6.4.22_wcqkhtmu7mswc6yz4uyexck3ty + '@storybook/store': 6.4.22_wcqkhtmu7mswc6yz4uyexck3ty + '@storybook/ui': 6.4.22_wcqkhtmu7mswc6yz4uyexck3ty airbnb-js-shims: 2.2.1 ansi-to-html: 0.6.15 core-js: 3.21.1 @@ -3387,7 +3395,7 @@ packages: - '@types/react' dev: true - /@storybook/core-client/6.4.22_1f8af36a8b5954de0d5333310cffb8de: + /@storybook/core-client/6.4.22_d6fpg2ullfkn4dktgmyqz75y3y: resolution: {integrity: sha512-uHg4yfCBeM6eASSVxStWRVTZrAnb4FT6X6v/xDqr4uXCpCttZLlBzrSDwPBLNNLtCa7ntRicHM8eGKIOD5lMYQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 @@ -3398,16 +3406,16 @@ packages: typescript: optional: true dependencies: - '@storybook/addons': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@storybook/addons': 6.4.22_wcqkhtmu7mswc6yz4uyexck3ty '@storybook/channel-postmessage': 6.4.22 '@storybook/channel-websocket': 6.4.22 - '@storybook/client-api': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@storybook/client-api': 6.4.22_wcqkhtmu7mswc6yz4uyexck3ty '@storybook/client-logger': 6.4.22 '@storybook/core-events': 6.4.22 '@storybook/csf': 0.0.2--canary.87bc651.0 - '@storybook/preview-web': 6.4.22_react-dom@16.14.0+react@16.14.0 - '@storybook/store': 6.4.22_react-dom@16.14.0+react@16.14.0 - '@storybook/ui': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@storybook/preview-web': 6.4.22_wcqkhtmu7mswc6yz4uyexck3ty + '@storybook/store': 6.4.22_wcqkhtmu7mswc6yz4uyexck3ty + '@storybook/ui': 6.4.22_wcqkhtmu7mswc6yz4uyexck3ty airbnb-js-shims: 2.2.1 ansi-to-html: 0.6.15 core-js: 3.21.1 @@ -3462,7 +3470,7 @@ packages: - '@types/react' dev: true - /@storybook/core-client/6.4.22_typescript@4.6.4+webpack@4.46.0: + /@storybook/core-client/6.4.22_u7kjabuvawcog7hjctusduehvm: resolution: {integrity: sha512-uHg4yfCBeM6eASSVxStWRVTZrAnb4FT6X6v/xDqr4uXCpCttZLlBzrSDwPBLNNLtCa7ntRicHM8eGKIOD5lMYQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 @@ -3499,7 +3507,7 @@ packages: - '@types/react' dev: true - /@storybook/core-common/6.4.22_68167c448effea8d9d4b4729bd410c99: + /@storybook/core-common/6.4.22_hcfsmds2fshutdssjqluwm76uu: resolution: {integrity: sha512-PD3N/FJXPNRHeQS2zdgzYFtqPLdi3MLwAicbnw+U3SokcsspfsAuyYHZOYZgwO8IAEKy6iCc7TpBdiSJZ/vAKQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 @@ -3534,7 +3542,7 @@ packages: '@storybook/semver': 7.3.2 '@types/node': 14.18.13 '@types/pretty-hrtime': 1.0.1 - babel-loader: 8.2.4_598a497cebab8e15ee8f9e5632178e63 + babel-loader: 8.2.4_lgfes7hlvohbl3uptzldef4omm babel-plugin-macros: 3.1.0 babel-plugin-polyfill-corejs3: 0.1.7_@babel+core@7.17.9 chalk: 4.1.2 @@ -3542,7 +3550,7 @@ packages: express: 4.17.3 file-system-cache: 1.0.5 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.1_fd9ac946626c89e3cf2883682b7adefb + fork-ts-checker-webpack-plugin: 6.5.1_7wnmsrtcnse6htziqnucw6w67m fs-extra: 9.1.0 glob: 7.2.0 handlebars: 4.7.7 @@ -3552,8 +3560,6 @@ packages: picomatch: 2.3.1 pkg-dir: 5.0.0 pretty-hrtime: 1.0.3 - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 resolve-from: 5.0.0 slash: 3.0.0 telejson: 5.3.3 @@ -3569,7 +3575,7 @@ packages: - webpack-command dev: true - /@storybook/core-common/6.4.22_eslint@8.15.0+typescript@4.6.4: + /@storybook/core-common/6.4.22_nalhyreo77vi3hkli4u32qimte: resolution: {integrity: sha512-PD3N/FJXPNRHeQS2zdgzYFtqPLdi3MLwAicbnw+U3SokcsspfsAuyYHZOYZgwO8IAEKy6iCc7TpBdiSJZ/vAKQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 @@ -3604,7 +3610,7 @@ packages: '@storybook/semver': 7.3.2 '@types/node': 14.18.13 '@types/pretty-hrtime': 1.0.1 - babel-loader: 8.2.4_598a497cebab8e15ee8f9e5632178e63 + babel-loader: 8.2.4_lgfes7hlvohbl3uptzldef4omm babel-plugin-macros: 3.1.0 babel-plugin-polyfill-corejs3: 0.1.7_@babel+core@7.17.9 chalk: 4.1.2 @@ -3612,7 +3618,7 @@ packages: express: 4.17.3 file-system-cache: 1.0.5 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.1_fd9ac946626c89e3cf2883682b7adefb + fork-ts-checker-webpack-plugin: 6.5.1_7wnmsrtcnse6htziqnucw6w67m fs-extra: 9.1.0 glob: 7.2.0 handlebars: 4.7.7 @@ -3622,6 +3628,8 @@ packages: picomatch: 2.3.1 pkg-dir: 5.0.0 pretty-hrtime: 1.0.3 + react: 16.14.0 + react-dom: 16.14.0_react@16.14.0 resolve-from: 5.0.0 slash: 3.0.0 telejson: 5.3.3 @@ -3643,7 +3651,7 @@ packages: core-js: 3.21.1 dev: true - /@storybook/core-server/6.4.22_68167c448effea8d9d4b4729bd410c99: + /@storybook/core-server/6.4.22_hcfsmds2fshutdssjqluwm76uu: resolution: {integrity: sha512-wFh3e2fa0un1d4+BJP+nd3FVWUO7uHTqv3OGBfOmzQMKp4NU1zaBNdSQG7Hz6mw0fYPBPZgBjPfsJRwIYLLZyw==} peerDependencies: '@storybook/builder-webpack5': 6.4.22 @@ -3660,16 +3668,16 @@ packages: optional: true dependencies: '@discoveryjs/json-ext': 0.5.7 - '@storybook/builder-webpack4': 6.4.22_68167c448effea8d9d4b4729bd410c99 - '@storybook/core-client': 6.4.22_1f8af36a8b5954de0d5333310cffb8de - '@storybook/core-common': 6.4.22_68167c448effea8d9d4b4729bd410c99 + '@storybook/builder-webpack4': 6.4.22_hcfsmds2fshutdssjqluwm76uu + '@storybook/core-client': 6.4.22_u7kjabuvawcog7hjctusduehvm + '@storybook/core-common': 6.4.22_hcfsmds2fshutdssjqluwm76uu '@storybook/core-events': 6.4.22 '@storybook/csf': 0.0.2--canary.87bc651.0 '@storybook/csf-tools': 6.4.22 - '@storybook/manager-webpack4': 6.4.22_68167c448effea8d9d4b4729bd410c99 + '@storybook/manager-webpack4': 6.4.22_hcfsmds2fshutdssjqluwm76uu '@storybook/node-logger': 6.4.22 '@storybook/semver': 7.3.2 - '@storybook/store': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@storybook/store': 6.4.22 '@types/node': 14.18.13 '@types/node-fetch': 2.6.1 '@types/pretty-hrtime': 1.0.1 @@ -3692,8 +3700,6 @@ packages: node-fetch: 2.6.7 pretty-hrtime: 1.0.3 prompts: 2.4.2 - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 regenerator-runtime: 0.13.9 serve-favicon: 2.5.0 slash: 3.0.0 @@ -3706,6 +3712,7 @@ packages: ws: 8.6.0 transitivePeerDependencies: - '@types/react' + - bluebird - bufferutil - encoding - eslint @@ -3716,7 +3723,7 @@ packages: - webpack-command dev: true - /@storybook/core-server/6.4.22_eslint@8.15.0+typescript@4.6.4: + /@storybook/core-server/6.4.22_nalhyreo77vi3hkli4u32qimte: resolution: {integrity: sha512-wFh3e2fa0un1d4+BJP+nd3FVWUO7uHTqv3OGBfOmzQMKp4NU1zaBNdSQG7Hz6mw0fYPBPZgBjPfsJRwIYLLZyw==} peerDependencies: '@storybook/builder-webpack5': 6.4.22 @@ -3733,16 +3740,16 @@ packages: optional: true dependencies: '@discoveryjs/json-ext': 0.5.7 - '@storybook/builder-webpack4': 6.4.22_eslint@8.15.0+typescript@4.6.4 - '@storybook/core-client': 6.4.22_typescript@4.6.4+webpack@4.46.0 - '@storybook/core-common': 6.4.22_eslint@8.15.0+typescript@4.6.4 + '@storybook/builder-webpack4': 6.4.22_nalhyreo77vi3hkli4u32qimte + '@storybook/core-client': 6.4.22_d6fpg2ullfkn4dktgmyqz75y3y + '@storybook/core-common': 6.4.22_nalhyreo77vi3hkli4u32qimte '@storybook/core-events': 6.4.22 '@storybook/csf': 0.0.2--canary.87bc651.0 '@storybook/csf-tools': 6.4.22 - '@storybook/manager-webpack4': 6.4.22_eslint@8.15.0+typescript@4.6.4 + '@storybook/manager-webpack4': 6.4.22_nalhyreo77vi3hkli4u32qimte '@storybook/node-logger': 6.4.22 '@storybook/semver': 7.3.2 - '@storybook/store': 6.4.22 + '@storybook/store': 6.4.22_wcqkhtmu7mswc6yz4uyexck3ty '@types/node': 14.18.13 '@types/node-fetch': 2.6.1 '@types/pretty-hrtime': 1.0.1 @@ -3765,6 +3772,8 @@ packages: node-fetch: 2.6.7 pretty-hrtime: 1.0.3 prompts: 2.4.2 + react: 16.14.0 + react-dom: 16.14.0_react@16.14.0 regenerator-runtime: 0.13.9 serve-favicon: 2.5.0 slash: 3.0.0 @@ -3777,6 +3786,7 @@ packages: ws: 8.6.0 transitivePeerDependencies: - '@types/react' + - bluebird - bufferutil - encoding - eslint @@ -3787,7 +3797,7 @@ packages: - webpack-command dev: true - /@storybook/core/6.4.22_68167c448effea8d9d4b4729bd410c99: + /@storybook/core/6.4.22_hcfsmds2fshutdssjqluwm76uu: resolution: {integrity: sha512-KZYJt7GM5NgKFXbPRZZZPEONZ5u/tE/cRbMdkn/zWN3He8+VP+65/tz8hbriI/6m91AWVWkBKrODSkeq59NgRA==} peerDependencies: '@storybook/builder-webpack5': 6.4.22 @@ -3801,14 +3811,13 @@ packages: typescript: optional: true dependencies: - '@storybook/core-client': 6.4.22_1596ec9896079968c237ec0328822914 - '@storybook/core-server': 6.4.22_68167c448effea8d9d4b4729bd410c99 - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 + '@storybook/core-client': 6.4.22_typescript@4.6.4 + '@storybook/core-server': 6.4.22_hcfsmds2fshutdssjqluwm76uu typescript: 4.6.4 transitivePeerDependencies: - '@storybook/manager-webpack5' - '@types/react' + - bluebird - bufferutil - encoding - eslint @@ -3819,7 +3828,7 @@ packages: - webpack-command dev: true - /@storybook/core/6.4.22_eslint@8.15.0+typescript@4.6.4: + /@storybook/core/6.4.22_nalhyreo77vi3hkli4u32qimte: resolution: {integrity: sha512-KZYJt7GM5NgKFXbPRZZZPEONZ5u/tE/cRbMdkn/zWN3He8+VP+65/tz8hbriI/6m91AWVWkBKrODSkeq59NgRA==} peerDependencies: '@storybook/builder-webpack5': 6.4.22 @@ -3833,12 +3842,15 @@ packages: typescript: optional: true dependencies: - '@storybook/core-client': 6.4.22_typescript@4.6.4 - '@storybook/core-server': 6.4.22_eslint@8.15.0+typescript@4.6.4 + '@storybook/core-client': 6.4.22_cwlozgewa6mwrqrx5qbsrarjcq + '@storybook/core-server': 6.4.22_nalhyreo77vi3hkli4u32qimte + react: 16.14.0 + react-dom: 16.14.0_react@16.14.0 typescript: 4.6.4 transitivePeerDependencies: - '@storybook/manager-webpack5' - '@types/react' + - bluebird - bufferutil - encoding - eslint @@ -3879,7 +3891,7 @@ packages: lodash: 4.17.21 dev: true - /@storybook/html/6.4.22_99ab00defb472bd59e7c8ea756614640: + /@storybook/html/6.4.22_tgvqbxx3i4v5lht4r2tvmykgia: resolution: {integrity: sha512-qOULn4db1bJlN6IuGCfH2g88utO+0h9aFityfRpmM0KntYx+tezLDD2/2yzdRy69Mh3KsIoqmDtX0hdsaFxH6w==} engines: {node: '>=10.13.0'} hasBin: true @@ -3887,13 +3899,13 @@ packages: '@babel/core': '*' dependencies: '@babel/core': 7.17.9 - '@storybook/addons': 6.4.22_react-dom@16.14.0+react@16.14.0 - '@storybook/client-api': 6.4.22_react-dom@16.14.0+react@16.14.0 - '@storybook/core': 6.4.22_68167c448effea8d9d4b4729bd410c99 - '@storybook/core-common': 6.4.22_68167c448effea8d9d4b4729bd410c99 + '@storybook/addons': 6.4.22_wcqkhtmu7mswc6yz4uyexck3ty + '@storybook/client-api': 6.4.22_wcqkhtmu7mswc6yz4uyexck3ty + '@storybook/core': 6.4.22_nalhyreo77vi3hkli4u32qimte + '@storybook/core-common': 6.4.22_nalhyreo77vi3hkli4u32qimte '@storybook/csf': 0.0.2--canary.87bc651.0 - '@storybook/preview-web': 6.4.22_react-dom@16.14.0+react@16.14.0 - '@storybook/store': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@storybook/preview-web': 6.4.22_wcqkhtmu7mswc6yz4uyexck3ty + '@storybook/store': 6.4.22_wcqkhtmu7mswc6yz4uyexck3ty '@types/webpack-env': 1.16.3 core-js: 3.21.1 global: 4.4.0 @@ -3907,6 +3919,7 @@ packages: - '@storybook/builder-webpack5' - '@storybook/manager-webpack5' - '@types/react' + - bluebird - bufferutil - encoding - eslint @@ -3919,7 +3932,7 @@ packages: - webpack-command dev: true - /@storybook/manager-webpack4/6.4.22_68167c448effea8d9d4b4729bd410c99: + /@storybook/manager-webpack4/6.4.22_hcfsmds2fshutdssjqluwm76uu: resolution: {integrity: sha512-nzhDMJYg0vXdcG0ctwE6YFZBX71+5NYaTGkxg3xT7gbgnP1YFXn9gVODvgq3tPb3gcRapjyOIxUa20rV+r8edA==} peerDependencies: react: ^16.8.0 || ^17.0.0 @@ -3932,15 +3945,15 @@ packages: '@babel/core': 7.17.9 '@babel/plugin-transform-template-literals': 7.16.7_@babel+core@7.17.9 '@babel/preset-react': 7.16.7_@babel+core@7.17.9 - '@storybook/addons': 6.4.22_react-dom@16.14.0+react@16.14.0 - '@storybook/core-client': 6.4.22_1f8af36a8b5954de0d5333310cffb8de - '@storybook/core-common': 6.4.22_68167c448effea8d9d4b4729bd410c99 + '@storybook/addons': 6.4.22 + '@storybook/core-client': 6.4.22_u7kjabuvawcog7hjctusduehvm + '@storybook/core-common': 6.4.22_hcfsmds2fshutdssjqluwm76uu '@storybook/node-logger': 6.4.22 - '@storybook/theming': 6.4.22_react-dom@16.14.0+react@16.14.0 - '@storybook/ui': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@storybook/theming': 6.4.22 + '@storybook/ui': 6.4.22 '@types/node': 14.18.13 '@types/webpack': 4.41.32 - babel-loader: 8.2.4_598a497cebab8e15ee8f9e5632178e63 + babel-loader: 8.2.4_lgfes7hlvohbl3uptzldef4omm case-sensitive-paths-webpack-plugin: 2.4.0 chalk: 4.1.2 core-js: 3.21.1 @@ -3953,8 +3966,6 @@ packages: html-webpack-plugin: 4.5.2_webpack@4.46.0 node-fetch: 2.6.7 pnp-webpack-plugin: 1.6.4_typescript@4.6.4 - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 read-pkg-up: 7.0.1 regenerator-runtime: 0.13.9 resolve-from: 5.0.0 @@ -3963,13 +3974,14 @@ packages: terser-webpack-plugin: 4.2.3_webpack@4.46.0 ts-dedent: 2.2.0 typescript: 4.6.4 - url-loader: 4.1.1_file-loader@6.2.0+webpack@4.46.0 + url-loader: 4.1.1_lit45vopotvaqup7lrvlnvtxwy util-deprecate: 1.0.2 webpack: 4.46.0 webpack-dev-middleware: 3.7.3_webpack@4.46.0 webpack-virtual-modules: 0.2.2 transitivePeerDependencies: - '@types/react' + - bluebird - encoding - eslint - supports-color @@ -3978,7 +3990,7 @@ packages: - webpack-command dev: true - /@storybook/manager-webpack4/6.4.22_eslint@8.15.0+typescript@4.6.4: + /@storybook/manager-webpack4/6.4.22_nalhyreo77vi3hkli4u32qimte: resolution: {integrity: sha512-nzhDMJYg0vXdcG0ctwE6YFZBX71+5NYaTGkxg3xT7gbgnP1YFXn9gVODvgq3tPb3gcRapjyOIxUa20rV+r8edA==} peerDependencies: react: ^16.8.0 || ^17.0.0 @@ -3991,15 +4003,15 @@ packages: '@babel/core': 7.17.9 '@babel/plugin-transform-template-literals': 7.16.7_@babel+core@7.17.9 '@babel/preset-react': 7.16.7_@babel+core@7.17.9 - '@storybook/addons': 6.4.22 - '@storybook/core-client': 6.4.22_typescript@4.6.4+webpack@4.46.0 - '@storybook/core-common': 6.4.22_eslint@8.15.0+typescript@4.6.4 + '@storybook/addons': 6.4.22_wcqkhtmu7mswc6yz4uyexck3ty + '@storybook/core-client': 6.4.22_d6fpg2ullfkn4dktgmyqz75y3y + '@storybook/core-common': 6.4.22_nalhyreo77vi3hkli4u32qimte '@storybook/node-logger': 6.4.22 - '@storybook/theming': 6.4.22 - '@storybook/ui': 6.4.22 + '@storybook/theming': 6.4.22_wcqkhtmu7mswc6yz4uyexck3ty + '@storybook/ui': 6.4.22_wcqkhtmu7mswc6yz4uyexck3ty '@types/node': 14.18.13 '@types/webpack': 4.41.32 - babel-loader: 8.2.4_598a497cebab8e15ee8f9e5632178e63 + babel-loader: 8.2.4_lgfes7hlvohbl3uptzldef4omm case-sensitive-paths-webpack-plugin: 2.4.0 chalk: 4.1.2 core-js: 3.21.1 @@ -4012,6 +4024,8 @@ packages: html-webpack-plugin: 4.5.2_webpack@4.46.0 node-fetch: 2.6.7 pnp-webpack-plugin: 1.6.4_typescript@4.6.4 + react: 16.14.0 + react-dom: 16.14.0_react@16.14.0 read-pkg-up: 7.0.1 regenerator-runtime: 0.13.9 resolve-from: 5.0.0 @@ -4020,13 +4034,14 @@ packages: terser-webpack-plugin: 4.2.3_webpack@4.46.0 ts-dedent: 2.2.0 typescript: 4.6.4 - url-loader: 4.1.1_file-loader@6.2.0+webpack@4.46.0 + url-loader: 4.1.1_lit45vopotvaqup7lrvlnvtxwy util-deprecate: 1.0.2 webpack: 4.46.0 webpack-dev-middleware: 3.7.3_webpack@4.46.0 webpack-virtual-modules: 0.2.2 transitivePeerDependencies: - '@types/react' + - bluebird - encoding - eslint - supports-color @@ -4075,18 +4090,18 @@ packages: util-deprecate: 1.0.2 dev: true - /@storybook/preview-web/6.4.22_react-dom@16.14.0+react@16.14.0: + /@storybook/preview-web/6.4.22_wcqkhtmu7mswc6yz4uyexck3ty: resolution: {integrity: sha512-sWS+sgvwSvcNY83hDtWUUL75O2l2LY/GTAS0Zp2dh3WkObhtuJ/UehftzPZlZmmv7PCwhb4Q3+tZDKzMlFxnKQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 react-dom: ^16.8.0 || ^17.0.0 dependencies: - '@storybook/addons': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@storybook/addons': 6.4.22_wcqkhtmu7mswc6yz4uyexck3ty '@storybook/channel-postmessage': 6.4.22 '@storybook/client-logger': 6.4.22 '@storybook/core-events': 6.4.22 '@storybook/csf': 0.0.2--canary.87bc651.0 - '@storybook/store': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@storybook/store': 6.4.22_wcqkhtmu7mswc6yz4uyexck3ty ansi-to-html: 0.6.15 core-js: 3.21.1 global: 4.4.0 @@ -4120,7 +4135,7 @@ packages: ts-dedent: 2.2.0 dev: true - /@storybook/router/6.4.22_react-dom@16.14.0+react@16.14.0: + /@storybook/router/6.4.22_wcqkhtmu7mswc6yz4uyexck3ty: resolution: {integrity: sha512-zeuE8ZgFhNerQX8sICQYNYL65QEi3okyzw7ynF58Ud6nRw4fMxSOHcj2T+nZCIU5ufozRL4QWD/Rg9P2s/HtLw==} peerDependencies: react: ^16.8.0 || ^17.0.0 @@ -4137,7 +4152,7 @@ packages: react: 16.14.0 react-dom: 16.14.0_react@16.14.0 react-router: 6.3.0_react@16.14.0 - react-router-dom: 6.3.0_react-dom@16.14.0+react@16.14.0 + react-router-dom: 6.3.0_wcqkhtmu7mswc6yz4uyexck3ty ts-dedent: 2.2.0 dev: true @@ -4191,13 +4206,13 @@ packages: util-deprecate: 1.0.2 dev: true - /@storybook/store/6.4.22_react-dom@16.14.0+react@16.14.0: + /@storybook/store/6.4.22_wcqkhtmu7mswc6yz4uyexck3ty: resolution: {integrity: sha512-lrmcZtYJLc2emO+1l6AG4Txm9445K6Pyv9cGAuhOJ9Kks0aYe0YtvMkZVVry0RNNAIv6Ypz72zyKc/QK+tZLAQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 react-dom: ^16.8.0 || ^17.0.0 dependencies: - '@storybook/addons': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@storybook/addons': 6.4.22_wcqkhtmu7mswc6yz4uyexck3ty '@storybook/client-logger': 6.4.22 '@storybook/core-events': 6.4.22 '@storybook/csf': 0.0.2--canary.87bc651.0 @@ -4236,7 +4251,7 @@ packages: ts-dedent: 2.2.0 dev: true - /@storybook/theming/6.4.22_react-dom@16.14.0+react@16.14.0: + /@storybook/theming/6.4.22_wcqkhtmu7mswc6yz4uyexck3ty: resolution: {integrity: sha512-NVMKH/jxSPtnMTO4VCN1k47uztq+u9fWv4GSnzq/eezxdGg9ceGL4/lCrNGoNajht9xbrsZ4QvsJ/V2sVGM8wA==} peerDependencies: react: ^16.8.0 || ^17.0.0 @@ -4244,11 +4259,11 @@ packages: dependencies: '@emotion/core': 10.3.1_react@16.14.0 '@emotion/is-prop-valid': 0.8.8 - '@emotion/styled': 10.3.0_864809d686fef2043b51d8d752270dc1 + '@emotion/styled': 10.3.0_qzeatvug73zaio2r3dlvejynye '@storybook/client-logger': 6.4.22 core-js: 3.21.1 deep-object-diff: 1.1.7 - emotion-theming: 10.3.0_864809d686fef2043b51d8d752270dc1 + emotion-theming: 10.3.0_qzeatvug73zaio2r3dlvejynye global: 4.4.0 memoizerific: 1.11.3 polished: 4.2.2 @@ -4296,27 +4311,27 @@ packages: - '@types/react' dev: true - /@storybook/ui/6.4.22_react-dom@16.14.0+react@16.14.0: + /@storybook/ui/6.4.22_wcqkhtmu7mswc6yz4uyexck3ty: resolution: {integrity: sha512-UVjMoyVsqPr+mkS1L7m30O/xrdIEgZ5SCWsvqhmyMUok3F3tRB+6M+OA5Yy+cIVfvObpA7MhxirUT1elCGXsWQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 react-dom: ^16.8.0 || ^17.0.0 dependencies: '@emotion/core': 10.3.1_react@16.14.0 - '@storybook/addons': 6.4.22_react-dom@16.14.0+react@16.14.0 - '@storybook/api': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@storybook/addons': 6.4.22_wcqkhtmu7mswc6yz4uyexck3ty + '@storybook/api': 6.4.22_wcqkhtmu7mswc6yz4uyexck3ty '@storybook/channels': 6.4.22 '@storybook/client-logger': 6.4.22 - '@storybook/components': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@storybook/components': 6.4.22_wcqkhtmu7mswc6yz4uyexck3ty '@storybook/core-events': 6.4.22 - '@storybook/router': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@storybook/router': 6.4.22_wcqkhtmu7mswc6yz4uyexck3ty '@storybook/semver': 7.3.2 - '@storybook/theming': 6.4.22_react-dom@16.14.0+react@16.14.0 + '@storybook/theming': 6.4.22_wcqkhtmu7mswc6yz4uyexck3ty copy-to-clipboard: 3.3.1 core-js: 3.21.1 core-js-pure: 3.21.1 downshift: 6.1.7_react@16.14.0 - emotion-theming: 10.3.0_864809d686fef2043b51d8d752270dc1 + emotion-theming: 10.3.0_qzeatvug73zaio2r3dlvejynye fuse.js: 3.6.1 global: 4.4.0 lodash: 4.17.21 @@ -4326,8 +4341,8 @@ packages: qs: 6.10.3 react: 16.14.0 react-dom: 16.14.0_react@16.14.0 - react-draggable: 4.4.4_react-dom@16.14.0+react@16.14.0 - react-helmet-async: 1.3.0_react-dom@16.14.0+react@16.14.0 + react-draggable: 4.4.4_wcqkhtmu7mswc6yz4uyexck3ty + react-helmet-async: 1.3.0_wcqkhtmu7mswc6yz4uyexck3ty react-sizeme: 3.0.2 regenerator-runtime: 0.13.9 resolve-from: 5.0.0 @@ -4859,7 +4874,7 @@ packages: dev: true optional: true - /@typescript-eslint/eslint-plugin/5.25.0_83b4734ba99fefa06dfff9f51a4c4301: + /@typescript-eslint/eslint-plugin/5.25.0_qo2hgs5jt7x2a3p77h2rutcdae: resolution: {integrity: sha512-icYrFnUzvm+LhW0QeJNKkezBu6tJs9p/53dpPLFH8zoM9w1tfaKzVurkPotEpAqQ8Vf8uaFyL5jHd0Vs6Z0ZQg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -4870,10 +4885,10 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/parser': 5.25.0_eslint@8.15.0+typescript@4.6.4 + '@typescript-eslint/parser': 5.25.0_hcfsmds2fshutdssjqluwm76uu '@typescript-eslint/scope-manager': 5.25.0 - '@typescript-eslint/type-utils': 5.25.0_eslint@8.15.0+typescript@4.6.4 - '@typescript-eslint/utils': 5.25.0_eslint@8.15.0+typescript@4.6.4 + '@typescript-eslint/type-utils': 5.25.0_hcfsmds2fshutdssjqluwm76uu + '@typescript-eslint/utils': 5.25.0_hcfsmds2fshutdssjqluwm76uu debug: 4.3.4 eslint: 8.15.0 functional-red-black-tree: 1.0.1 @@ -4886,7 +4901,7 @@ packages: - supports-color dev: true - /@typescript-eslint/parser/5.25.0_eslint@8.15.0+typescript@4.6.4: + /@typescript-eslint/parser/5.25.0_hcfsmds2fshutdssjqluwm76uu: resolution: {integrity: sha512-r3hwrOWYbNKP1nTcIw/aZoH+8bBnh/Lh1iDHoFpyG4DnCpvEdctrSl6LOo19fZbzypjQMHdajolxs6VpYoChgA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -4922,7 +4937,7 @@ packages: '@typescript-eslint/visitor-keys': 5.25.0 dev: true - /@typescript-eslint/type-utils/5.25.0_eslint@8.15.0+typescript@4.6.4: + /@typescript-eslint/type-utils/5.25.0_hcfsmds2fshutdssjqluwm76uu: resolution: {integrity: sha512-B6nb3GK3Gv1Rsb2pqalebe/RyQoyG/WDy9yhj8EE0Ikds4Xa8RR28nHz+wlt4tMZk5bnAr0f3oC8TuDAd5CPrw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -4932,7 +4947,7 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/utils': 5.25.0_eslint@8.15.0+typescript@4.6.4 + '@typescript-eslint/utils': 5.25.0_hcfsmds2fshutdssjqluwm76uu debug: 4.3.4 eslint: 8.15.0 tsutils: 3.21.0_typescript@4.6.4 @@ -4993,7 +5008,7 @@ packages: - supports-color dev: true - /@typescript-eslint/utils/5.24.0_eslint@8.15.0+typescript@4.6.4: + /@typescript-eslint/utils/5.24.0_hcfsmds2fshutdssjqluwm76uu: resolution: {integrity: sha512-K05sbWoeCBJH8KXu6hetBJ+ukG0k2u2KlgD3bN+v+oBKm8adJqVHpSSLHNzqyuv0Lh4GVSAUgZ5lB4icmPmWLw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -5011,7 +5026,7 @@ packages: - typescript dev: true - /@typescript-eslint/utils/5.25.0_eslint@8.15.0+typescript@4.6.4: + /@typescript-eslint/utils/5.25.0_hcfsmds2fshutdssjqluwm76uu: resolution: {integrity: sha512-qNC9bhnz/n9Kba3yI6HQgQdBLuxDoMgdjzdhSInZh6NaDnFpTUlwNGxplUFWfY260Ya0TRPvkg9dd57qxrJI9g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -5528,6 +5543,8 @@ packages: dependencies: micromatch: 3.1.10 normalize-path: 2.1.1 + transitivePeerDependencies: + - supports-color dev: true /anymatch/3.1.2: @@ -5763,7 +5780,7 @@ packages: - supports-color dev: true - /babel-loader/8.2.4_598a497cebab8e15ee8f9e5632178e63: + /babel-loader/8.2.4_lgfes7hlvohbl3uptzldef4omm: resolution: {integrity: sha512-8dytA3gcvPPPv4Grjhnt8b5IIiTcq/zeXOPk4iTYI0SVXcsmuGg7JtBRDp8S9X+gJfhQ8ektjXZlDu1Bb33U8A==} engines: {node: '>= 8.9'} peerDependencies: @@ -6041,6 +6058,8 @@ packages: qs: 6.9.7 raw-body: 2.4.3 type-is: 1.6.18 + transitivePeerDependencies: + - supports-color dev: true /boolbase/1.0.0: @@ -6082,6 +6101,8 @@ packages: snapdragon-node: 2.1.1 split-string: 3.1.0 to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color dev: true /braces/3.0.2: @@ -6265,6 +6286,8 @@ packages: ssri: 8.0.1 tar: 6.1.11 unique-filename: 1.1.1 + transitivePeerDependencies: + - bluebird dev: true /cache-base/1.0.1: @@ -6480,6 +6503,8 @@ packages: upath: 1.2.0 optionalDependencies: fsevents: 1.2.13 + transitivePeerDependencies: + - supports-color dev: true optional: true @@ -6794,6 +6819,8 @@ packages: on-headers: 1.0.2 safe-buffer: 5.1.2 vary: 1.1.2 + transitivePeerDependencies: + - supports-color dev: true /compute-scroll-into-view/1.0.17: @@ -7080,7 +7107,7 @@ packages: engines: {node: '>= 0.4.0'} dev: true - /cosmiconfig-typescript-loader/1.0.9_8ffbbd0e65bf654299df3e9f6b2219d7: + /cosmiconfig-typescript-loader/1.0.9_r7532dtfx5sufgo7h2pwwiqz24: resolution: {integrity: sha512-tRuMRhxN4m1Y8hP9SNYfz7jRwt8lZdWxdjg/ohg5esKmsndJIn4yT96oJVcf5x0eA11taXl+sIp+ielu529k6g==} engines: {node: '>=12', npm: '>=6'} peerDependencies: @@ -7089,14 +7116,14 @@ packages: dependencies: '@types/node': 17.0.34 cosmiconfig: 7.0.1 - ts-node: 10.7.0_8ffbbd0e65bf654299df3e9f6b2219d7 + ts-node: 10.7.0_r7532dtfx5sufgo7h2pwwiqz24 typescript: 4.6.4 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' dev: true - /cosmiconfig-typescript-loader/2.0.0_8ffbbd0e65bf654299df3e9f6b2219d7: + /cosmiconfig-typescript-loader/2.0.0_r7532dtfx5sufgo7h2pwwiqz24: resolution: {integrity: sha512-2NlGul/E3vTQEANqPziqkA01vfiuUU8vT0jZAuUIjEW8u3eCcnCQWLggapCjhbF76s7KQF0fM0kXSKmzaDaG1g==} engines: {node: '>=12', npm: '>=6'} peerDependencies: @@ -7105,7 +7132,7 @@ packages: dependencies: '@types/node': 17.0.34 cosmiconfig: 7.0.1 - ts-node: 10.7.0_8ffbbd0e65bf654299df3e9f6b2219d7 + ts-node: 10.7.0_r7532dtfx5sufgo7h2pwwiqz24 typescript: 4.6.4 transitivePeerDependencies: - '@swc/core' @@ -7168,6 +7195,8 @@ packages: p-all: 2.1.0 p-filter: 2.1.0 p-map: 3.0.0 + transitivePeerDependencies: + - supports-color dev: true /create-ecdh/4.0.4: @@ -7521,12 +7550,22 @@ packages: /debug/2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true dependencies: ms: 2.0.0 dev: true /debug/3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true dependencies: ms: 2.1.3 dev: true @@ -7707,6 +7746,8 @@ packages: dependencies: address: 1.1.2 debug: 2.6.9 + transitivePeerDependencies: + - supports-color dev: true /devtools-protocol/0.0.981744: @@ -7944,29 +7985,29 @@ packages: engines: {node: '>= 4'} dev: true - /emotion-theming/10.3.0_864809d686fef2043b51d8d752270dc1: + /emotion-theming/10.3.0_@emotion+core@10.3.1: resolution: {integrity: sha512-mXiD2Oj7N9b6+h/dC6oLf9hwxbtKHQjoIqtodEyL8CpkN4F3V4IK/BT4D0C7zSs4BBFOu4UlPJbvvBLa88SGEA==} peerDependencies: '@emotion/core': ^10.0.27 react: '>=16.3.0' dependencies: '@babel/runtime': 7.17.9 - '@emotion/core': 10.3.1_react@16.14.0 + '@emotion/core': 10.3.1 '@emotion/weak-memoize': 0.2.5 hoist-non-react-statics: 3.3.2 - react: 16.14.0 dev: true - /emotion-theming/10.3.0_@emotion+core@10.3.1: + /emotion-theming/10.3.0_qzeatvug73zaio2r3dlvejynye: resolution: {integrity: sha512-mXiD2Oj7N9b6+h/dC6oLf9hwxbtKHQjoIqtodEyL8CpkN4F3V4IK/BT4D0C7zSs4BBFOu4UlPJbvvBLa88SGEA==} peerDependencies: '@emotion/core': ^10.0.27 react: '>=16.3.0' dependencies: '@babel/runtime': 7.17.9 - '@emotion/core': 10.3.1 + '@emotion/core': 10.3.1_react@16.14.0 '@emotion/weak-memoize': 0.2.5 hoist-non-react-statics: 3.3.2 + react: 16.14.0 dev: true /encodeurl/1.0.2: @@ -8143,7 +8184,7 @@ packages: requireindex: 1.2.0 dev: true - /eslint-plugin-jest/26.2.2_93a18a14fb19656958628faf0a8b5863: + /eslint-plugin-jest/26.2.2_soqyufh3dfswswdcr6xqvc2ymm: resolution: {integrity: sha512-etSFZ8VIFX470aA6kTqDPhIq7YWe0tjBcboFNV3WeiC18PJ/AVonGhuTwlmuz2fBkH8FJHA7JQ4k7GsQIj1Gew==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -8156,8 +8197,8 @@ packages: jest: optional: true dependencies: - '@typescript-eslint/eslint-plugin': 5.25.0_83b4734ba99fefa06dfff9f51a4c4301 - '@typescript-eslint/utils': 5.24.0_eslint@8.15.0+typescript@4.6.4 + '@typescript-eslint/eslint-plugin': 5.25.0_qo2hgs5jt7x2a3p77h2rutcdae + '@typescript-eslint/utils': 5.24.0_hcfsmds2fshutdssjqluwm76uu eslint: 8.15.0 jest: 27.5.1 transitivePeerDependencies: @@ -8165,7 +8206,7 @@ packages: - typescript dev: true - /eslint-plugin-prettier/4.0.0_440b30a60bbe5bb6e3ad0057150b2782: + /eslint-plugin-prettier/4.0.0_iqftbjqlxzn3ny5nablrkczhqi: resolution: {integrity: sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==} engines: {node: '>=6.0.0'} peerDependencies: @@ -8182,13 +8223,13 @@ packages: prettier-linter-helpers: 1.0.0 dev: true - /eslint-plugin-testing-library/5.5.0_eslint@8.15.0+typescript@4.6.4: + /eslint-plugin-testing-library/5.5.0_hcfsmds2fshutdssjqluwm76uu: resolution: {integrity: sha512-eWQ19l6uWL7LW8oeMyQVSGjVYFnBqk7DMHjadm0yOHBvX3Xi9OBrsNuxoAMdX4r7wlQ5WWpW46d+CB6FWFL/PQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6'} peerDependencies: eslint: ^7.5.0 || ^8.0.0 dependencies: - '@typescript-eslint/utils': 5.24.0_eslint@8.15.0+typescript@4.6.4 + '@typescript-eslint/utils': 5.24.0_hcfsmds2fshutdssjqluwm76uu eslint: 8.15.0 transitivePeerDependencies: - supports-color @@ -8421,6 +8462,8 @@ packages: regex-not: 1.0.2 snapdragon: 0.8.2 to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color dev: true /expand-tilde/2.0.2: @@ -8486,6 +8529,8 @@ packages: type-is: 1.6.18 utils-merge: 1.0.1 vary: 1.1.2 + transitivePeerDependencies: + - supports-color dev: true /extend-shallow/2.0.1: @@ -8528,6 +8573,8 @@ packages: regex-not: 1.0.2 snapdragon: 0.8.2 to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color dev: true /extract-zip/2.0.1: @@ -8566,6 +8613,8 @@ packages: is-glob: 4.0.3 merge2: 1.4.1 micromatch: 3.1.10 + transitivePeerDependencies: + - supports-color dev: true /fast-glob/3.2.11: @@ -8693,6 +8742,8 @@ packages: parseurl: 1.3.3 statuses: 1.5.0 unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color dev: true /find-cache-dir/2.1.0: @@ -8808,20 +8859,35 @@ packages: engines: {node: '>=0.10.0'} dev: true - /fork-ts-checker-webpack-plugin/4.1.6: + /fork-ts-checker-webpack-plugin/4.1.6_7wnmsrtcnse6htziqnucw6w67m: resolution: {integrity: sha512-DUxuQaKoqfNne8iikd14SAkh5uw4+8vNifp6gmA73yYNS6ywLIWSLD/n/mBzHQRpW3J7rbATEakmiA8JvkTyZw==} engines: {node: '>=6.11.5', yarn: '>=1.0.0'} + peerDependencies: + eslint: '>= 6' + typescript: '>= 2.7' + vue-template-compiler: '*' + webpack: '>= 4' + peerDependenciesMeta: + eslint: + optional: true + vue-template-compiler: + optional: true dependencies: '@babel/code-frame': 7.16.7 chalk: 2.4.2 + eslint: 8.15.0 micromatch: 3.1.10 minimatch: 3.1.2 semver: 5.7.1 tapable: 1.1.3 + typescript: 4.6.4 + webpack: 4.46.0 worker-rpc: 0.1.1 + transitivePeerDependencies: + - supports-color dev: true - /fork-ts-checker-webpack-plugin/6.5.1_fd9ac946626c89e3cf2883682b7adefb: + /fork-ts-checker-webpack-plugin/6.5.1_7wnmsrtcnse6htziqnucw6w67m: resolution: {integrity: sha512-x1wumpHOEf4gDROmKTaB6i4/Q6H3LwmjVO7fIX47vBwlZbtPjU33hgoMuD/Q/y6SU8bnuYSoN6ZQOLshGp0T/g==} engines: {node: '>=10', yarn: '>=1.0.0'} peerDependencies: @@ -9280,6 +9346,8 @@ packages: ignore: 4.0.6 pify: 4.0.1 slash: 2.0.0 + transitivePeerDependencies: + - supports-color dev: true /glur/1.1.2: @@ -9679,6 +9747,7 @@ packages: url-join: 4.0.1 transitivePeerDependencies: - debug + - supports-color dev: true /https-browserify/1.0.0: @@ -10597,6 +10666,8 @@ packages: walker: 1.0.8 optionalDependencies: fsevents: 2.3.2 + transitivePeerDependencies: + - supports-color dev: true /jest-haste-map/27.5.1: @@ -10901,6 +10972,8 @@ packages: natural-compare: 1.4.0 pretty-format: 26.6.2 semver: 7.3.7 + transitivePeerDependencies: + - supports-color dev: true /jest-snapshot/27.5.1: @@ -10940,6 +11013,8 @@ packages: dependencies: jest: 27.5.1 jest-snapshot: 26.6.2 + transitivePeerDependencies: + - supports-color dev: true /jest-util/26.6.2: @@ -11638,6 +11713,8 @@ packages: regex-not: 1.0.2 snapdragon: 0.8.2 to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color dev: true /micromatch/4.0.5: @@ -11883,6 +11960,8 @@ packages: regex-not: 1.0.2 snapdragon: 0.8.2 to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color dev: true /nanospinner/1.1.0: @@ -12634,6 +12713,8 @@ packages: async: 2.6.4 debug: 3.2.7 mkdirp: 0.5.6 + transitivePeerDependencies: + - supports-color dev: true /posix-character-classes/0.1.1: @@ -12848,7 +12929,7 @@ packages: postcss-values-parser: 2.0.1 dev: true - /postcss-loader/4.3.0_postcss@7.0.39+webpack@4.46.0: + /postcss-loader/4.3.0_gzaxsinx64nntyd3vmdqwl7coe: resolution: {integrity: sha512-M/dSoIiNDOo8Rk0mUqoj4kpGq91gcxCfb9PoyZVdZ76/AuhxylHDYZblNE8o+EQ9AMSASeMFEKxZf5aU6wlx1Q==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -13343,6 +13424,11 @@ packages: /promise-inflight/1.0.1: resolution: {integrity: sha1-mEcocL8igTL8vdhoEputEsPAKeM=} + peerDependencies: + bluebird: '*' + peerDependenciesMeta: + bluebird: + optional: true dev: true /promise.allsettled/1.0.5: @@ -13617,7 +13703,7 @@ packages: react-dom: '>=16.8.0' dev: true - /react-colorful/5.5.1_react-dom@16.14.0+react@16.14.0: + /react-colorful/5.5.1_wcqkhtmu7mswc6yz4uyexck3ty: resolution: {integrity: sha512-M1TJH2X3RXEt12sWkpa6hLc/bbYS0H6F4rIqjQZ+RxNBstpY67d9TrFXtqdZwhpmBXcCwEi7stKqFue3ZRkiOg==} peerDependencies: react: '>=16.8.0' @@ -13649,7 +13735,7 @@ packages: prop-types: 15.8.1 dev: true - /react-draggable/4.4.4_react-dom@16.14.0+react@16.14.0: + /react-draggable/4.4.4_wcqkhtmu7mswc6yz4uyexck3ty: resolution: {integrity: sha512-6e0WdcNLwpBx/YIDpoyd2Xb04PB0elrDrulKUgdrIlwuYvxh5Ok9M+F8cljm8kPXXs43PmMzek9RrB1b7mLMqA==} peerDependencies: react: '>= 16.3.0' @@ -13689,7 +13775,7 @@ packages: shallowequal: 1.1.0 dev: true - /react-helmet-async/1.3.0_react-dom@16.14.0+react@16.14.0: + /react-helmet-async/1.3.0_wcqkhtmu7mswc6yz4uyexck3ty: resolution: {integrity: sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg==} peerDependencies: react: ^16.6.0 || ^17.0.0 || ^18.0.0 @@ -13733,7 +13819,7 @@ packages: react-popper: 2.2.5_@popperjs+core@2.11.5 dev: true - /react-popper-tooltip/3.1.1_react-dom@16.14.0+react@16.14.0: + /react-popper-tooltip/3.1.1_wcqkhtmu7mswc6yz4uyexck3ty: resolution: {integrity: sha512-EnERAnnKRptQBJyaee5GJScWNUKQPDD2ywvzZyUjst/wj5U64C8/CnSYLNEmP2hG0IJ3ZhtDxE8oDN+KOyavXQ==} peerDependencies: react: ^16.6.0 || ^17.0.0 @@ -13743,28 +13829,28 @@ packages: '@popperjs/core': 2.11.5 react: 16.14.0 react-dom: 16.14.0_react@16.14.0 - react-popper: 2.2.5_6a538338d4aada8f90332fc3121ce9a9 + react-popper: 2.2.5_njjygoguvlni7ebtf7brehhjve dev: true - /react-popper/2.2.5_6a538338d4aada8f90332fc3121ce9a9: + /react-popper/2.2.5_@popperjs+core@2.11.5: resolution: {integrity: sha512-kxGkS80eQGtLl18+uig1UIf9MKixFSyPxglsgLBxlYnyDf65BiY9B3nZSc6C9XUNDgStROB0fMQlTEz1KxGddw==} peerDependencies: '@popperjs/core': ^2.0.0 react: ^16.8.0 || ^17 dependencies: '@popperjs/core': 2.11.5 - react: 16.14.0 react-fast-compare: 3.2.0 warning: 4.0.3 dev: true - /react-popper/2.2.5_@popperjs+core@2.11.5: + /react-popper/2.2.5_njjygoguvlni7ebtf7brehhjve: resolution: {integrity: sha512-kxGkS80eQGtLl18+uig1UIf9MKixFSyPxglsgLBxlYnyDf65BiY9B3nZSc6C9XUNDgStROB0fMQlTEz1KxGddw==} peerDependencies: '@popperjs/core': ^2.0.0 react: ^16.8.0 || ^17 dependencies: '@popperjs/core': 2.11.5 + react: 16.14.0 react-fast-compare: 3.2.0 warning: 4.0.3 dev: true @@ -13779,7 +13865,7 @@ packages: react-router: 6.3.0 dev: true - /react-router-dom/6.3.0_react-dom@16.14.0+react@16.14.0: + /react-router-dom/6.3.0_wcqkhtmu7mswc6yz4uyexck3ty: resolution: {integrity: sha512-uaJj7LKytRxZNQV8+RbzJWnJ8K2nPsOOEuX7aQstlMZKQT0164C+X2w6bnkqU3sjtLvpd5ojrezAyfZ1+0sStw==} peerDependencies: react: '>=16.8' @@ -13989,6 +14075,8 @@ packages: graceful-fs: 4.2.10 micromatch: 3.1.10 readable-stream: 2.3.7 + transitivePeerDependencies: + - supports-color dev: true optional: true @@ -14306,7 +14394,7 @@ packages: inherits: 2.0.4 dev: true - /rollup-plugin-swc/0.2.1_@swc+core@1.2.165+rollup@2.70.1: + /rollup-plugin-swc/0.2.1_se5dfsysqsuwchop2hfe5dxcvm: resolution: {integrity: sha512-wWRYt9tC0aIBvRQHNnVtwJ6DRPDj9XYpOAcOyFB11sKSkR/R+NAmbrjBACCPNVmZcxg6joV29wXgb5mU1DI7eA==} peerDependencies: '@swc/core': '>=1.0' @@ -14397,6 +14485,8 @@ packages: micromatch: 3.1.10 minimist: 1.2.6 walker: 1.0.8 + transitivePeerDependencies: + - supports-color dev: true /sass-loader/10.2.1_sass@1.50.1: @@ -14546,6 +14636,8 @@ packages: on-finished: 2.3.0 range-parser: 1.2.1 statuses: 1.5.0 + transitivePeerDependencies: + - supports-color dev: true /serialize-javascript/4.0.0: @@ -14585,6 +14677,8 @@ packages: escape-html: 1.0.3 parseurl: 1.3.3 send: 0.17.2 + transitivePeerDependencies: + - supports-color dev: true /set-blocking/2.0.0: @@ -14750,6 +14844,8 @@ packages: source-map: 0.5.7 source-map-resolve: 0.5.3 use: 3.1.1 + transitivePeerDependencies: + - supports-color dev: true /source-list-map/2.0.1: @@ -15332,9 +15428,11 @@ packages: terser: 5.12.1 webpack: 4.46.0 webpack-sources: 1.4.3 + transitivePeerDependencies: + - bluebird dev: true - /terser-webpack-plugin/5.3.3_@swc+core@1.2.165+webpack@5.73.0: + /terser-webpack-plugin/5.3.3_b36iqc4l7ttzvjzp6fwwxjlkse: resolution: {integrity: sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -15364,6 +15462,7 @@ packages: engines: {node: '>=6.0.0'} hasBin: true dependencies: + acorn: 8.7.1 commander: 2.20.3 source-map: 0.6.1 source-map-support: 0.5.21 @@ -15543,7 +15642,7 @@ packages: engines: {node: '>=6.10'} dev: true - /ts-node/10.7.0_8ffbbd0e65bf654299df3e9f6b2219d7: + /ts-node/10.7.0_r7532dtfx5sufgo7h2pwwiqz24: resolution: {integrity: sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A==} hasBin: true peerDependencies: @@ -15894,7 +15993,7 @@ packages: resolution: {integrity: sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==} dev: true - /url-loader/4.1.1_file-loader@6.2.0+webpack@4.46.0: + /url-loader/4.1.1_lit45vopotvaqup7lrvlnvtxwy: resolution: {integrity: sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -16113,6 +16212,8 @@ packages: requiresBuild: true dependencies: chokidar: 2.1.8 + transitivePeerDependencies: + - supports-color dev: true optional: true @@ -16124,6 +16225,8 @@ packages: optionalDependencies: chokidar: 3.5.3 watchpack-chokidar2: 2.0.1 + transitivePeerDependencies: + - supports-color dev: true /watchpack/2.3.1: @@ -16214,6 +16317,8 @@ packages: resolution: {integrity: sha512-kDUmfm3BZrei0y+1NTHJInejzxfhtU8eDj2M7OKb2IWrPFAeO1SOH2KuQ68MSZu9IGEHcxbkKKR1v18FrUSOmA==} dependencies: debug: 3.2.7 + transitivePeerDependencies: + - supports-color dev: true /webpack/4.46.0: @@ -16252,6 +16357,8 @@ packages: terser-webpack-plugin: 1.4.5_webpack@4.46.0 watchpack: 1.7.5 webpack-sources: 1.4.3 + transitivePeerDependencies: + - supports-color dev: true /webpack/5.73.0_@swc+core@1.2.165: @@ -16285,7 +16392,7 @@ packages: neo-async: 2.6.2 schema-utils: 3.1.1 tapable: 2.2.1 - terser-webpack-plugin: 5.3.3_@swc+core@1.2.165+webpack@5.73.0 + terser-webpack-plugin: 5.3.3_b36iqc4l7ttzvjzp6fwwxjlkse watchpack: 2.3.1 webpack-sources: 3.2.3 transitivePeerDependencies: From d5e737f41b59e22bb3e97c043a7bc37e6a30ecd2 Mon Sep 17 00:00:00 2001 From: Gion Kunz <gion@syncrea.ch> Date: Tue, 19 Jul 2022 15:09:45 +0200 Subject: [PATCH 41/44] build: switch main bundle to UMD format (#25) --- .size-limit.json | 2 +- rollup.config.js | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.size-limit.json b/.size-limit.json index 5f3e3e0b..c41a94a5 100644 --- a/.size-limit.json +++ b/.size-limit.json @@ -7,7 +7,7 @@ }, { "path": "dist/index.cjs", - "limit": "7.5 kB", + "limit": "11.75 kB", "import": "{ BarChart }" }, { diff --git a/rollup.config.js b/rollup.config.js index f5e19354..43470e9f 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -32,7 +32,8 @@ export default [ external, output: { file: pkg.publishConfig.main, - format: 'cjs', + format: 'umd', + name: 'Chartist', exports: 'named', sourcemap: true } From 7beb636501fbcf1718a8ab14f07a951e5e9c3dca Mon Sep 17 00:00:00 2001 From: dangreen <danon0404@gmail.com> Date: Tue, 19 Jul 2022 17:39:38 +0400 Subject: [PATCH 42/44] ci: npmrc --- .npmrc | 1 + 1 file changed, 1 insertion(+) create mode 100644 .npmrc diff --git a/.npmrc b/.npmrc new file mode 100644 index 00000000..319e41e6 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +strict-peer-dependencies=false From 6c5f30e81d1236efdf49b0a76bb4114bacb0ff0d Mon Sep 17 00:00:00 2001 From: Dan Onoshko <danon0404@gmail.com> Date: Tue, 19 Jul 2022 23:49:47 +0400 Subject: [PATCH 43/44] build: minify bundles (#30) --- .size-limit.json | 2 +- package.json | 1 + pnpm-lock.yaml | 20 +++++++++++++++++--- rollup.config.js | 4 +++- 4 files changed, 22 insertions(+), 5 deletions(-) diff --git a/.size-limit.json b/.size-limit.json index c41a94a5..b4c72f38 100644 --- a/.size-limit.json +++ b/.size-limit.json @@ -18,7 +18,7 @@ }, { "path": "dist/index.js", - "limit": "7.45 kB", + "limit": "9.2 kB", "import": "{ BarChart }" }, { diff --git a/package.json b/package.json index d9651c33..8976771a 100644 --- a/package.json +++ b/package.json @@ -123,6 +123,7 @@ "puppeteer": "^14.0.0", "rollup": "^2.70.1", "rollup-plugin-swc": "^0.2.1", + "rollup-plugin-terser": "^7.0.2", "sass": "^1.50.1", "sass-loader": "^10.0.0", "simple-git-hooks": "^2.7.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5a037c47..59a9cd7e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -49,6 +49,7 @@ specifiers: puppeteer: ^14.0.0 rollup: ^2.70.1 rollup-plugin-swc: ^0.2.1 + rollup-plugin-terser: ^7.0.2 sass: ^1.50.1 sass-loader: ^10.0.0 simple-git-hooks: ^2.7.0 @@ -107,6 +108,7 @@ devDependencies: puppeteer: 14.0.0 rollup: 2.70.1 rollup-plugin-swc: 0.2.1_se5dfsysqsuwchop2hfe5dxcvm + rollup-plugin-terser: 7.0.2_rollup@2.70.1 sass: 1.50.1 sass-loader: 10.2.1_sass@1.50.1 simple-git-hooks: 2.7.0 @@ -6706,7 +6708,7 @@ packages: dev: true /color-name/1.1.3: - resolution: {integrity: sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=} + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} dev: true /color-name/1.1.4: @@ -8136,7 +8138,7 @@ packages: dev: true /escape-string-regexp/1.0.5: - resolution: {integrity: sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=} + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} dev: true @@ -14405,6 +14407,18 @@ packages: rollup: 2.70.1 dev: true + /rollup-plugin-terser/7.0.2_rollup@2.70.1: + resolution: {integrity: sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==} + peerDependencies: + rollup: ^2.0.0 + dependencies: + '@babel/code-frame': 7.16.7 + jest-worker: 26.6.2 + rollup: 2.70.1 + serialize-javascript: 4.0.0 + terser: 5.12.1 + dev: true + /rollup/2.70.1: resolution: {integrity: sha512-CRYsI5EuzLbXdxC6RnYhOuRdtz4bhejPMSWjsFLfVM/7w/85n2szZv6yExqUXsBdz5KT8eoubeyDUDjhLHEslA==} engines: {node: '>=10.0.0'} @@ -14889,7 +14903,7 @@ packages: dev: true /source-map/0.5.7: - resolution: {integrity: sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=} + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} engines: {node: '>=0.10.0'} dev: true diff --git a/rollup.config.js b/rollup.config.js index 43470e9f..747aeeea 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -1,5 +1,6 @@ import swc from 'rollup-plugin-swc'; import { nodeResolve } from '@rollup/plugin-node-resolve'; +import { terser } from 'rollup-plugin-terser'; import pkg from './package.json'; const extensions = ['.js', '.ts', '.tsx']; @@ -22,7 +23,8 @@ const plugins = targets => [ type: 'es6' }, sourceMaps: true - }) + }), + terser() ]; export default [ From 29f11c0935f2c1c76eff9ed08456d6a0ef202dfb Mon Sep 17 00:00:00 2001 From: dangreen <danon0404@gmail.com> Date: Wed, 20 Jul 2022 14:47:58 +0400 Subject: [PATCH 44/44] docs: add info about cube --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index a65db839..8a5aba69 100644 --- a/README.md +++ b/README.md @@ -83,6 +83,10 @@ new BarChart('#chart', { <br /> +Need an API to fetch data? Consider [Cube](https://cube.dev/?ref=eco-chartist), an open-source API for data apps. + +<br /> + [![supported by Cube](https://user-images.githubusercontent.com/986756/154330861-d79ab8ec-aacb-4af8-9e17-1b28f1eccb01.svg)](https://cube.dev/?ref=eco-chartist) ## What is it made for?

4p8NJ!y(5Iegsutjqr9P#jW08xi>oOrI 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 literal 0 HcmV?d00001 diff --git a/test/__image_snapshots__/LineChart__Simple-Interpolation-With-Holes-snap.png b/test/__image_snapshots__/LineChart__Simple-Interpolation-With-Holes-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..927df0f2ae7dd61e8b3a297aa66dfacdea74de8d GIT binary patch literal 12192 zcmeHtcT`hbw{H-|V?T%j3W$ONN-xqO7OGMOL8M9%q=nug=uxC5A}CGZNKinUbg2PB zf>bFIr1uV?C7~sGYlGkY&bas8_x^ihyfJRZ*ktd`+B<8_HOp`Q<_y!(Qay3>{81PT zc0yfE=^hMr*aDo-|G@zMdW7CT1it9p@2TE`<+ZcV!C)6*>Pk2Decmk%`3DSn2Etdo zm!G_rd~!sv`ooI@mhUg>AL_hx=%&(*Gw)=rkEXSkUz+#WX=|DGV3~ z4#uP_6c=%p-#`h0K)mx`E@xyEm5?}NPMJ5vR0VvoHNAiTtf8sr{nw)VyB&N)g`NbH zm6c7asE~ClAIv0nYr_?^;FOK$_kQaGQ!;nxsnIVJsECk|kaVlx3UhVhNS|n5sgtq% z#*f>gA|ii^+qOqCY0HbwsqK%bJ(xykoE{z?{$=IsF>Wrd)DGNI*~o>Gl9JA@uGcPN z`=czzJ8cfSz9(DC6ZgbjR6+vfa1&Q3_WfZpMr@>`}t`vNW_~cXraP_UDxT zjMpNf*mr$8GdDNtocLoUB_*DiuyXeqo_9y@ICNn6(820in z-rZb2*uDP-jR43JUU`IuJznZBDR@*LGCMyXuBRn)<>AAJTuE&z4h{|)sfr5QJ3E-X zJfXKjrimWHt049z#pHOT&HU-IyuU!H|T>ko8tC&5dt7J73<-KSgAF|}W=7MH0a{QWnmGh~(C zl+4_yesL}IE_m@2e+TNTO`M96lhd=S36Z@yMohf#TyAxVT4?kS3}9+%6z5n)c&e+b z3#@P`bs9ZWj5ZKdYl1j0bbo1SN!QSjB`PXPUG-_2r>Ez)kD5uA%Y)_6<&<0bgA)7u z0!D?G=lDc;v=z6kTT|iiIo4W5u`azgZr ztKOufb7Wmq63{pKjN?<9nxae1Qs0V40^EC&k;Cp35EG!!X$;-5$iDU2a65BSViS2| zvCPoB9ih~s9rU1Q=3IXPH%WfYZUbJywQZOaN>#lO^^`Y=LsUZF<88Q6k!62Ue&`d# zR$Kg9cu{zw+_Ak^zLGf6=Q{d_W!Gge+ob$*AySSh+h15eAhxY2JD++R(TR|SRPxNS zIklxPkVYR}O?%o$S>NFz_vk5C=h=6r#Z%=7VIRG*{LL9!fx|NKgX}jo&dWTDmvB2M z`eX{cxrwnMJ(@dIom=(K7z5PBkT6_jcP$^ZNCKS3UHHq;~Y?Yh=e1+s;wm{l?J*y)EKDxj#&~Le*N);&$T+_y^E@97#D{el` z4C;)y^LBqtf9uQB9n)Z~!K9$2K-EwAJwNOzdol=!`>I!;vI8%U%|$RoA>m zylK*hZMYtmyV*>-m8VqBGX7!=H^x3`x$L4yaf z3!r(Oot@Dh$5~^5+Cf$Tjf0G<(wm?q%kcTsi3b+9_z`xYb66Vn!A66XD8YXutiopI z!b%PGpz4_CZ%?_84d+05>um%~80)gKN{=dN68sUZ zyDf0^T9zJ8hGTEA%jNFiL-!o)THf|;<2cc+hBU!(7%ldGdkRO9^LBtnU^g3++CCIu z4}+|+HTX)@>14=%1KlHGgRY{CiE2IOK6ODmK#xe$3d3xTUhPbplPazr%=G z277UTezBq4p-;IR+mYMY0^%vfiV?m1vu$mngi=CdY*D)g-?_c%i5S_{9#D-{KO z;>;QUa=@d8Gjk%Xs8mAQoC5v|)9+QB`Hxj7(vvLgwanOYiiPs$g(^KZRD@Wxs|l2X zEe^a=JZGZ)S2;=w>e{R{3Ix4!SqKUktGSRvR%h=t!E zCv~_2Ka>4!t>H?(H(XZv~B+vkh{?9VLx>X2j{=N+jlp zTbxRtzLN3n>&s>IrwJ5WNyc&>t!1(b8IBZv zs&l60_=B#d-$(O5&Y^qYI^IXZB0>U5-Hnz~Irid~<3On(Ktrds4pmt+w^+5~ox?tk z_;v&tYg2}aiJ$kTQcIUW=MQth=S7`hlT#GsBw{^i8EqvS}-#ttI_do|5N=Lksi17Z6T2)jei{P!ONU}OQMD0Ki4 zND?#;Ys}8SbCGdxfC!_^Gaq&jFR#XJ;sOSXMOx=#vF5ocKZqy}IiTTM&*jzedho4P z>G@Oe(;dCOZIzZgcx-}?B2k>UHq~N<&ogD>K|eIrpllrP3wy1aEA(-=!qXwgtlIDE zq;7UZF7V>K`WH$n;{Ay8Ke@#%cyB=$71`PRDFJKWkHkPvEH5o_B+$t*u4VrG){9o$ zwp$!5cZVLw-P1NW|9K+4x>}((&s6SSzGM!gOW4?x7Z!@-q znvJQ3^{kgp{l!;%bB(1Qf%n-Ht#k4D=A3Mjj`1SCJ@zGjVt8ux{fv_3+1Yp<-=6vU zpTpWZ870GCTrp(#pIN!Q{HlM_N9y8J19>VGiF2J1XU}%J;gPCCzAdkhK+P2Ah091 zEskXF9--CfI=pa{lr-6_VD%Xfdw!3RvA}JrxoOHx9TzO>>&GCFt_~nLFajtpmXwzA zaL_g8g}tp}?wIJ(685^i zlN}BXt=8ie{IX(LK@#Y`r&^>T1vI-n`>_rm50kU{LO4^s=3}ZGu~;0Wlo;h z`KCt<0#AT!_YRwXoJ04(wT3*<0^#69JuTGRN~&Dir}>0$0g93}b8Q8-9}ts!BD5$3 zz_0e09e#;+mThEXIy8`)l^cJZ9~HRyK2v@={$R|$q=gS^*B+<}2H{5nwKWb$KV<7K zydr6`vCX$Zyb=qsAuyQFd%IfHZ#m!1m@~yU=pr{dbshW-DAy#-w%$HJt?B%a@buq> zDv^^Y>bf?rhd-aSq?Zi$R-L&{xWl*a4OVW6&@)?9O}cfub}n%5#Q3WSN+HLsI(IWt zHTcf#%|ho6SoK8a4?N4#ObRFE6kNOs^NLMj0-Xtp)a`@=6Fq zRJEq%!$?MGE~3)Xg$AxYx&pJ7K5+;>ViRwRqo&8I{}< z0E%<4n4H-f9)5oBL()HV`G2d|`aB#LH6aQ>nzGRygQC+A6L0gePRq)=%D}*2Io+DzIv&Q$!*MKL!>xSw%PcXP@?8P* zHp7%y3Xq-g>7)BDE%L=V5CStZLyrkpiI`E>;&8ugQ#rB?^M(9S;9rp89sw|Ft1M6o zU?q9`@)@>~a6$aYE1k>@QGg!A_K)J<-~YH~=DBd9Z|3i+D*4Cl@6HXBA+%+WihPg# ziC1kI@>ZVO-NN*GQzziKUNlwr*6+A&Df8@$T9On3)!*MAFKVTtq%`O|lMH354?bJm z{Q5okyWQtp!QNEjC)WM~tDf!7RH{BZ5qG{|PY@!yPk`WdNK2g{Z|%;|MpLQO%j>}DahsxF zv$M0IFEh$y*x_imT&-*$if_1Eg=1RD4H%3UZ0 zFMQmV_~47nBaH+xkZ#wSJ+3{VVWDS6Y>p={A(Ug$)R~I)L~rE|shT&x{otsDJe{1@ z1^>l@&`{~E$rwOo__cceA``;b;M)_dA94hy1BlaoE3fsKIx_w%(?NW&@cjaZX|A{7nNE7sjlpF~Q+|zyKVd^Hq zX)S%E?{JRlFJ$$;Cx+F62|7%X|H*c~k8TqS7D{R1PH>uUPqND`iR7&{DDzgwJxlxT zFhB+YG6wGqx_gtEXi6&U{8AK0YUOIew_BGaX(Ty}h{TyFEQK@)r8QTI7W~V;O*@Qm zY-v3HGQ5+q{Bx#ZF+bqyCuSiH2~HTy#U&;9klOoPP70>abz+8WoJ#p1tTItT(0~Av z&b43uLFYMU%zb`P61%mctT@dSQ2<#57l6p9mX)VX^Yx(2r7o2zt~Yjki)72whMr2- zexEOVwA|zj!(q&;7Ue~XbU-rOuLu+8jX;c944ZFTQ}y8r;Z*e3+S*5i0Z$wm^Vy$# z$$h5=%!fzl-@%l(W?DNypgBV$EElbix#Hb0e z+)mJ#^j?m9zpQcG(_0lJVj&gc^_=4V@Z}-S68unLAH$4NneDgmbnelk3qP)+s+PE}?e2+j?48aPO1l zQjG=%lsM*>QMb&^yUgp3VRZQB{Wt4~OA~(rfZ!tpLbk{e>zZvu=T@HgDXdWuI?K?E z(Y?mYJ@#kMWss=^e|OxR>s}r|pSdHSn@CuOC?R#6cF7!`X4bmB8wD^840iGch)l2h zJaI_eM=9*}qxAHc-i&vik6UR}q_VG-6_h@`eghtMLXr}ihS$6MiY#q<-g(*gB=5{i zZ^v+=0kBD*xMH7~?Lcs?R^UF-6Udf+Th1#|;{LjVg8zcXqO&Ee4t6!JCluWb2-nLdBh`)6&=o_)E=UZ1}}jYEblY9qax z1_j~UshM)*pA#Ep2Vt`sq(s_F|qc%@Ug zYV{9zA^IgK(Bqx=qvNFnq>01NXNNl1CTL-wUL0dmla$X-173C+}S3X z*>aD>MFmK*y{M@fLsKZxBP9-#DFI&OmEq+f(PArH6VoREH0OjDeECx)1)Gx+)6%j; zuYJ_!EWbeQJ99QFN>?#(TYM)fs(zqOb!0^blz%-i^e6TH_CxNR4cM`Eqa@ zJ~XtBM4Ao2l|Tu*$|E~It~fTTw1mXAmGkVyg?cgzFc!cToMB){6ZuRa4#Tzae|7ZB z)jGH(Cr1-nmYs4)9L01}Mj&vUlDdgvWqrkXsRtq~&&Uq?q>xQpUR4oOOn>P~s` zR#J=Y$=`3KB$u5&OD<#KfqqK9zFp=Z=+{2S03v&TUz0DdZS|2>wHrwtLC)CResS{) z>r_gTt_(8hK%JTNzfmO$8-O6(WXssn;0f_NSy3aC)w*I_gJC${5dlH(o&jgC_^hOT>h| z&&x~4K4)oY8tiz|omS=A??PV$W()F+kJdj|aD~+l1q5OZ`98C&`TeO&q)((R_BT6$ zR87O0D}`jZ%a8mI%kM@)-=^-mu+vCjmhp?A{D`^;_D<5=-E^^Hi9{h?n`w{wWlpsO zT;$CI-(hNh33BebELP2Np8R4s+{cQ`rw|*Sd_8&M+mH5SOj1Ti&9Xw%c8zwjRw-xP zwQC`^L6VXxTg6!&tz^e{r5)SFneo8Kkn_+L&W@35jg6s4f=mcC4ETIB$%aKK4`YR` zZhrgr!AeXe#(wPU!Pg)}ix@rmkF9_-w^LV-|lRHXmAlL#GT@aMAZvc-)!aJo{~V(ExjRy3Ih7S-ej%|r0_R7l#;zL~ z@Uw5$XVAzRu7B<4;^tS)0%AR<%%p;i-n`|!O+Gpk1YKLoxe^0i*IEB-{3K-C&1IR< zKu=E)S#O;Ogh=B(P(l&gcTEed54~ZqQ(90jz-vip->Tu|yruaj=fpwv^*nNCNw>u1 zQCGp=d=OtdG4uo$^5%_lwtf`N4 zX~0T-!TLv}^enZN4bB3x%OG|pI+1gBwai)h`NGQ;3wdA0!}-&6_!@G{hR?^DxT*KZ z3?Gl5^a`Z4_mK*;+1J7{=2@!w9tW(@cWw?K(1nSKt{R7Loc0PNl+KzLh(Q(%0B}TB zocXkmBn)=X78Hdohq~f8*HVC)O9w6GW2&;Ayt@Z}HI|p-q9CY%kI!Pzs89eM3*%+n z9|OMX46(nxy**my^DE|Gj*=IUyQ}F|B6JcayA{%;u_@7+By&JJqv4|p^xE=_+LU%e zV@%PE>Wn8LY!MyA9^HXl{A55 z2g^5Gf204z$w^c8K%^1iAFag_AQlZ&G|y6o&t3lDO(>{;`MSe84FunbR}3kYP{ne2 zs1oGni?``Z)xhjNWoN6-gCI4#uy9v|u~zyTf5a1nue-p*YB8v80-2fOs1tCdVp7QK zvO)o-@-p5x9m~gV7wpuTN4h@%#t_`~-P@a&gDyDM^`L7ssA5^UxQMjNF64xU`iwq3 z3^fQqWpEdj;N+*}LHCn8cgL@12z3S=vS@{VwWg-#%R*iyP_evF07S}$ z{Txi(zFz^gYwte1;(jVE?4iMz01AX092~A)>bzGtUKBS?K}?%UM;Rh&m@srqFe%|)XEH(JL~AM3H8 zfHKb5_?6!U^~9tk2vW3Ii*^3|c{YMs@Q&=!NOcE??3hTk|3k(-`pPR{>|@{d7@FN< zq&q*o4kA>?zP=Fs5K8U}Ue!(T2rh;adWZ)IA{C{6`|(5PoonMc^Z;MIXUKBDJGm|tDK0H7Oy(Q`YBW}vyAA=>1%_0JQu+`z`#M9h{2Qw4l$jynt za$OmOnSNUmn+<4cP_((@xb+wM!so5?qVh3b>m~Sa1*e3Cf5jaEve&o(@kXCmghJc! zCQ|cp-yO6}PrEx)4ciQ1DNF!?tb9Gs9yxT1%C#M|8w1g7mgL(l+-~Jv0n4{8rR6Ms zE^FIqFT((1iJivoz44C!1yjb`Lqotl-qaT~iT7ZK-O~VBzx)oXB}n2GEf-2ln-n%9 zGJQ9rn})rS8^Sajd0S;k3kSHzZGqiETinco-hb_q&?Q=fVmGYO(9~2vrA*+l8PS-L zv9tV%-Xth&JV`cAL;n2Kv^)Nu_2IhD8A*heG#^+VNSBg9aEpI+ltK~x^62)Yq_>Lm z#7EY_;;U{+QmW3~(@jnT%pjKu5ldj*9Vx930=Y6h^qhzp05)nRQHUxruOX`W;h}sP zPj&X4rgiCQR_On*#=qs~V6c^d*7B_uUHAFd^viFwlbC_%@UB`QO#@&!x)qRw8b=|; zhroq3fnwD2uHv%2x!Xf11=StyiS>|xM#4}R0Rg)IxiStGx%UY^ouwgL8+|#hC_|3PPK{@QM^jY@)+ou%Hl$!`$BKWYFPfL32d1&aDrP2XQ$~Mt;u>c2J ziB38JPE8cl!+;0e=v1`=-6yW?GBcOo9Stu6B`+T^>NSc^IZ51B%f#y!;CzBbjjH`T zf#@2t&4`~uLuVHkHKZBY&6JguO#+EOb#-+a85!ZUtqzJ~vTu{dGD9reUuwzuJ(Q!C>2wl5BCF zul+l3s(e?#P)(q}MiM~HE!Da84F-C8Oh75X_JVx{^3*jpPVx|tP6w4qB_tB5kt}SH^ElpKs^_ zJ@N4NM%z2qDU~`8RoFQ=L;$v1dc9RV21T!IRA8wL^%42``2ns`d4WJcPqoD1z@mD3 zdmFPdQqI456Vz&93Hj7tzs`ZSqyn&A52}1z_d1mx=oCYhNwd{(Lr{`BnO#sI$}D8U z>OJghd;G)+sEKIznE;cSrlw{O9*-+^8rVYyiHV7Q)&AZ<+hi6N79zl9bVX@tFa0r* zlU3pe&P+wCUI-KKkQe``k?`8%3}15r?gAV58OL1$jf&VEJq!sTuOSiwV@Kmj>tpROhvYhY9>Kq#4C>sg#-_srggSQ?M z(mBa;-i@(W^+^5|hj`KeK!F<9pjU%E09(zm+M}oaO%%r-1IDI9?6^VB14ht`rE6-c z;C6s6y|V~?nW6C|gMiBesGbf8Ux=gb(zR%vZcAbT)qCwO(b3Napnxw2sJR^i77p6} zEIU#ZT=Ayf-;`NQfn(w82S30B*mlso!ftT;c70RlGaxRg+z)DcAdbdC6TP2p@U6v+ zRG4mcLs!zN|4dt38>8qT3_@3q{l)6^Z;#}Il)4>G1NPNdXmdBmxJ+nFX=U&ys7}__ z)*nfjR4@2iPs)OZ8$CTeNQ+raJ#?#PrR@;&ksP3y910Z`va-Ui z+VpR{j$2U LmQvm=i)a4}twTxv literal 0 HcmV?d00001 diff --git a/test/__image_snapshots__/LineChart__Step-Interpolation-With-Holes-snap.png b/test/__image_snapshots__/LineChart__Step-Interpolation-With-Holes-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..0c7954cb0b80c110096d78a7ec6e575fe4a0024e GIT binary patch literal 8664 zcmeHNXH-*Zw+=Gs42Y;yfq-HG1&uW6We`OL0V|9mU{Db$5u|A#L>-i(fQ2dskq;0N z0-}T-90@^bB2o-hkR~;h(8Jv);nTVEt^2LHf9|?#-FtqJLvr%gy`SgV&zoRNa}z;+ zNq!UxC3x_F@lh0Nl|9^l`*|h&^$a?}2QNHVj+z*uGHavT z^v8@PJl6Cc+Op=2X3UN5vQk05KB0A4FGbfE>=!+~eXu|$Q8d?k_)(fs@nFiCfz0%R zk+$L!g>G?syqwP#;&U>6HV@}|XPh#+{*<`M{GsMU?QHaoOzNN zAs5#nvu>TLs%o|aJ?!G8OCdEiH4h&wH}l&U(K6g#e}Dg16bgNiOeJ}X9BBR8X