diff --git a/samples/react-chartcontrol/.editorconfig b/samples/react-chartcontrol/.editorconfig new file mode 100644 index 000000000..8ffcdc4ec --- /dev/null +++ b/samples/react-chartcontrol/.editorconfig @@ -0,0 +1,25 @@ +# 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 + +[{package,bower}.json] +indent_style = space +indent_size = 2 \ No newline at end of file diff --git a/samples/react-chartcontrol/.gitignore b/samples/react-chartcontrol/.gitignore new file mode 100644 index 000000000..b19bbe123 --- /dev/null +++ b/samples/react-chartcontrol/.gitignore @@ -0,0 +1,32 @@ +# Logs +logs +*.log +npm-debug.log* + +# Dependency directories +node_modules + +# Build generated files +dist +lib +solution +temp +*.sppkg + +# Coverage directory used by tools like istanbul +coverage + +# OSX +.DS_Store + +# Visual Studio files +.ntvs_analysis.dat +.vs +bin +obj + +# Resx Generated Code +*.resx.ts + +# Styles Generated Code +*.scss.ts diff --git a/samples/react-chartcontrol/.yo-rc.json b/samples/react-chartcontrol/.yo-rc.json new file mode 100644 index 000000000..1c5c47fc2 --- /dev/null +++ b/samples/react-chartcontrol/.yo-rc.json @@ -0,0 +1,11 @@ +{ + "@microsoft/generator-sharepoint": { + "isCreatingSolution": false, + "environment": "spo", + "version": "1.7.1", + "libraryName": "react-chartcontrol", + "libraryId": "fb9665fb-4455-4b7f-99ab-2195920871fd", + "packageManager": "npm", + "componentType": "webpart" + } +} \ No newline at end of file diff --git a/samples/react-chartcontrol/README.md b/samples/react-chartcontrol/README.md new file mode 100644 index 000000000..fc334d93c --- /dev/null +++ b/samples/react-chartcontrol/README.md @@ -0,0 +1,224 @@ +## React Chart Control Samples + +## Summary + +This sample contains several web parts that demonstrate how to use the ChartControl from @pnp/spfx-controls-react. + +![The list of web parts](./assets/WebPartList.png) + +The web parts in this sample are not intended to be used in production -- they simply demonstrate how you would use all the capabilities of the ChartControl. + +> **NOTE:** If you are looking for a ready-to-use web part, please look into [joelfmrodrigues' cool react-modern-charts sample](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-modern-charts), which was built without the ChartControl. + +## About the samples + +We created the ChartControl by popular request of [@pnp/spfx-controls-react](https://sharepoint.github.io/sp-dev-fx-controls-react/) users who wanted a way to easily insert [Chart.js](https://www.chartjs.org/) charts into their solutions. + +To keep things as easy as possible, the ChartControl supports (most) of the Chart.js functionality (yes, even the use of plugins!). + +The samples in this solution mostly use code found from the Chart.js code samples -- with little or no conversion. Whereever possible, we localized strings, moved colors and styles to the web part's SCSS, and used Office Fabric UI components instead of regular buttons. + +Each sample retrieves data and passes it to the ChartControl using one of the 3 methods: + +* Static data passed in the control's properties +* Dynamic data passed through the web part's state +* Dynamic data passed directly to the ChartControl, without state. + +Feel free to use any method you wish for your own web parts. + +## Web Part List + +### Accessible Chart + +![Accessible Chart](./assets/AccessibleChart.png) + +Demonstrates the accessibility features of the Chart Control. + +This sample shows the table that is automatically generated by the Chart Control. + +### Area Chart + +![Area Chart](./assets/AreaChart.gif) + +This sample shows how you can render an area chart and configure the chart to use the `fill` option, as well as whether to use straight lines or curves. + +It also shows how to render gradient fills. + +### Bar Chart -- Static data + +![Bar Chart with Static Data](./assets/BarChartStatic.png) + +Uses the most basic features of the ChartControl; It uses static data and does not provide any optional parameters. + +The ChartControl automatic generates chart colors that mimic the colors you would find in Office. + +The control also automatically picks up the environment's theme and changes the chart's background color, lines, and fonts to match the theme. + +For accessibility purposes, the ChartControl also renders a hidden table that contains a summary of the data which will be available for those who use a screen reader. + +### Bar Chart + +![Bar Chart](./assets/BarChart.png) + +Another bar chart, but this one loads data asynchronously from a (fake) service. + +While the sample service simply returns an array of numbers, you could replace it with your own code that reads from SharePoint, or any other service. + +### Bubble Chart + +![Bubble Chart](./assets/BubbleChart.gif) + +This sample demonstrates the use of data elements with a X, Y, and R value to create a bubble chart. + +You can even pop the bubbles, which is a fun way to demonstrate event handlers. + +### Chartinator + +![Chartinator](./assets/Chartinator.gif) + +This is a Chart Control version of the SharePoint Quick Charts. It supports every chart type and offers many configuration options. + +This sample also demonstrates how to create conditional property pane groups and custom property pane controls. + +### Combo Chart + +![Combo Chart](./assets/ComboBar.png) + +Demonstrates how to create combination charts with multiple datasets. + +### Custom Plugin + +![Chart with Custom Plugin](./assets/CustomPlugin.png) + +If you can't find a Chart.js plugin that already exists, and you want to create your own, simply implement the `IChartPlugin` interface. + +This example takes sample plugin code to create a custom plugin. + +The concept for the chart's look and feel came from a [StackOverflow question](https://stackoverflow.com/questions/45446153/chartjs-round-borders-on-a-doughnut-chart-with-multiple-datasets) from fsenna. + +The custom plugin code is inspired from a [JSFiddle](http://jsfiddle.net/tgyxmkLj/1/) written by user8296539 in response to fsenna's question. + +### Doughnut with Patterns + +![Doughnut with Patterns](./assets/DoughnutPatterns.gif) + +This web part demonstrates how to use the ChartControl to render a donut chart with patterns instead of colors. + +It is inspired by the [patternomaly sample](https://github.com/ashiguruma/patternomaly/blob/master/examples/optional.html) referred by the [Chart.js documentation](https://www.chartjs.org/docs/latest/general/colors.html). + +### Dynamic Data Callable + +![Dynamic Data Callable](./assets/DynamicDataCallable.gif) + +I wanted to use real data, but didn't want to deal with creating data on SharePoint, so I created a web part that calls the GitHub REST APIs and shows contributors for a given repository. + +The sample is also a dynamic data provider. It demonstrates how to respond to mouse events (clicking on a segment of the donut chart will send the data to another web part). + +Use in combination with the **Dynamic Data Consumer** web part. + +### Dynamics Data Consumer + +![Dynamic Data Consumer](./assets/DynamicDataConsumer.gif) + +This demonstrates how to render a chart by receiving events from a dynamic data connection. + +It also demonstrates how to render a line chart that looks like the Office 365 Admin dashboards. + +### Horizontal Bar + +![Horizontal Bar](./assets/HorizontalBarChart.png) + +This sample shows how to render a horizontal bar chart. It also demonstrates how to create stacked bars. + +### Line Chart + +![Line Chart](./assets/LineChart.png) + +This sample demonstrates how to render line charts. + +### Pie Chart + +![Pie Chart](./assets/PieChart.png) + +Demonstrates how to create a pie chart. + +### Polar Chart + +![Polar Chart](./assets/PolarChart.png) + +Creates a polar area chart. Also adds ability to add and remove data. + +### Radar Chart + +![Radar Chart](./assets/RadarChart.png) + +Renders a multi-dataset radar chart. + +### Real-Time Chart + +![Real-Time](./assets/RealTime.gif) + +This sample uses an existing plugin to create a scrolling/real-time chart. + +This sample also demonstrates how to use time series for the X axis. + +### Scatter Chart + +![Scatter Chart](./assets/ScatterChart.png) + +This sample shows how to use X and Y coordinate data elements in a scatter chart. + +## Used SharePoint Framework Version + +![SPFx v1.7.1](https://img.shields.io/badge/SPFx-1.7.1-green.svg) + +## Applies to + +* [SharePoint Framework](https:/dev.office.com/sharepoint) +* [Office 365 tenant](https://dev.office.com/sharepoint/docs/spfx/set-up-your-development-environment) + +## Prerequisites + +There are no pre-requisites to use these samples. + +## Solution + +Solution|Author(s) +--------|--------- +react-chart-control | Hugo Bernier ([Tahoe Ninjas](http://tahoeninjas.blog), @bernierh) + +## Version history + +Version|Date|Comments +-------|----|-------- +1.0|January, 2019|Initial release + +## Disclaimer + +**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.** + +--- + +## Minimal Path to Awesome + +* Clone this repository +* in the command line run: + * `npm install` + * `gulp serve` +* Insert the one of the webs part on a page + +## Features + +This Web Part sample pack illustrates the following concepts on top of the SharePoint Framework: + +* Using the @pnp/spfx-controls-react ChartControl +* Creating static charts +* Creating dynamic charts using state +* Creating dynamic charts by calling the ChartControl's update method +* Responding to chart events +* Connecting a chart to dynamic data +* Rendering conditional property pane groups +* Rendering conditional property pane fields +* Creating custom property pane controls + + diff --git a/samples/react-chartcontrol/assets/AccessibleChart.png b/samples/react-chartcontrol/assets/AccessibleChart.png new file mode 100644 index 000000000..7bb23280c Binary files /dev/null and b/samples/react-chartcontrol/assets/AccessibleChart.png differ diff --git a/samples/react-chartcontrol/assets/AreaChart.gif b/samples/react-chartcontrol/assets/AreaChart.gif new file mode 100644 index 000000000..97344b3cf Binary files /dev/null and b/samples/react-chartcontrol/assets/AreaChart.gif differ diff --git a/samples/react-chartcontrol/assets/BarChart.png b/samples/react-chartcontrol/assets/BarChart.png new file mode 100644 index 000000000..8a2b2c019 Binary files /dev/null and b/samples/react-chartcontrol/assets/BarChart.png differ diff --git a/samples/react-chartcontrol/assets/BarChartStatic.png b/samples/react-chartcontrol/assets/BarChartStatic.png new file mode 100644 index 000000000..bfc6bfe47 Binary files /dev/null and b/samples/react-chartcontrol/assets/BarChartStatic.png differ diff --git a/samples/react-chartcontrol/assets/BubbleChart.gif b/samples/react-chartcontrol/assets/BubbleChart.gif new file mode 100644 index 000000000..c1bae5cb4 Binary files /dev/null and b/samples/react-chartcontrol/assets/BubbleChart.gif differ diff --git a/samples/react-chartcontrol/assets/Chartinator.gif b/samples/react-chartcontrol/assets/Chartinator.gif new file mode 100644 index 000000000..59a5764f6 Binary files /dev/null and b/samples/react-chartcontrol/assets/Chartinator.gif differ diff --git a/samples/react-chartcontrol/assets/ComboBar.png b/samples/react-chartcontrol/assets/ComboBar.png new file mode 100644 index 000000000..8967e2613 Binary files /dev/null and b/samples/react-chartcontrol/assets/ComboBar.png differ diff --git a/samples/react-chartcontrol/assets/CustomPlugin.png b/samples/react-chartcontrol/assets/CustomPlugin.png new file mode 100644 index 000000000..7735dc9f7 Binary files /dev/null and b/samples/react-chartcontrol/assets/CustomPlugin.png differ diff --git a/samples/react-chartcontrol/assets/DoughnutPatterns.gif b/samples/react-chartcontrol/assets/DoughnutPatterns.gif new file mode 100644 index 000000000..fa91f9d25 Binary files /dev/null and b/samples/react-chartcontrol/assets/DoughnutPatterns.gif differ diff --git a/samples/react-chartcontrol/assets/DynamicDataCallable.gif b/samples/react-chartcontrol/assets/DynamicDataCallable.gif new file mode 100644 index 000000000..7c368d5ac Binary files /dev/null and b/samples/react-chartcontrol/assets/DynamicDataCallable.gif differ diff --git a/samples/react-chartcontrol/assets/DynamicDataConsumer.gif b/samples/react-chartcontrol/assets/DynamicDataConsumer.gif new file mode 100644 index 000000000..0d3023da4 Binary files /dev/null and b/samples/react-chartcontrol/assets/DynamicDataConsumer.gif differ diff --git a/samples/react-chartcontrol/assets/HorizontalBarChart.png b/samples/react-chartcontrol/assets/HorizontalBarChart.png new file mode 100644 index 000000000..59e034a75 Binary files /dev/null and b/samples/react-chartcontrol/assets/HorizontalBarChart.png differ diff --git a/samples/react-chartcontrol/assets/LineChart.png b/samples/react-chartcontrol/assets/LineChart.png new file mode 100644 index 000000000..3d5f79791 Binary files /dev/null and b/samples/react-chartcontrol/assets/LineChart.png differ diff --git a/samples/react-chartcontrol/assets/PieChart.png b/samples/react-chartcontrol/assets/PieChart.png new file mode 100644 index 000000000..9ca35b9c9 Binary files /dev/null and b/samples/react-chartcontrol/assets/PieChart.png differ diff --git a/samples/react-chartcontrol/assets/PolarChart.png b/samples/react-chartcontrol/assets/PolarChart.png new file mode 100644 index 000000000..636e49671 Binary files /dev/null and b/samples/react-chartcontrol/assets/PolarChart.png differ diff --git a/samples/react-chartcontrol/assets/RadarChart.png b/samples/react-chartcontrol/assets/RadarChart.png new file mode 100644 index 000000000..3556c555d Binary files /dev/null and b/samples/react-chartcontrol/assets/RadarChart.png differ diff --git a/samples/react-chartcontrol/assets/RealTime.gif b/samples/react-chartcontrol/assets/RealTime.gif new file mode 100644 index 000000000..2f461109e Binary files /dev/null and b/samples/react-chartcontrol/assets/RealTime.gif differ diff --git a/samples/react-chartcontrol/assets/ScatterChart.png b/samples/react-chartcontrol/assets/ScatterChart.png new file mode 100644 index 000000000..bf865a7a6 Binary files /dev/null and b/samples/react-chartcontrol/assets/ScatterChart.png differ diff --git a/samples/react-chartcontrol/assets/WebPartList.png b/samples/react-chartcontrol/assets/WebPartList.png new file mode 100644 index 000000000..c7c75976f Binary files /dev/null and b/samples/react-chartcontrol/assets/WebPartList.png differ diff --git a/samples/react-chartcontrol/config/config.json b/samples/react-chartcontrol/config/config.json new file mode 100644 index 000000000..25adfa945 --- /dev/null +++ b/samples/react-chartcontrol/config/config.json @@ -0,0 +1,173 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx-build/config.2.0.schema.json", + "version": "2.0", + "bundles": { + "bar-chart-demo-web-part": { + "components": [ + { + "entrypoint": "./lib/webparts/barChartDemo/BarChartDemoWebPart.js", + "manifest": "./src/webparts/barChartDemo/BarChartDemoWebPart.manifest.json" + } + ] + }, + "bar-chart-static-web-part": { + "components": [ + { + "entrypoint": "./lib/webparts/barChartStatic/BarChartStaticWebPart.js", + "manifest": "./src/webparts/barChartStatic/BarChartStaticWebPart.manifest.json" + } + ] + }, + "donut-patterns-demo-web-part": { + "components": [ + { + "entrypoint": "./lib/webparts/donutPatternsDemo/DonutPatternsDemoWebPart.js", + "manifest": "./src/webparts/donutPatternsDemo/DonutPatternsDemoWebPart.manifest.json" + } + ] + }, + "line-chart-demo-web-part": { + "components": [ + { + "entrypoint": "./lib/webparts/lineChartDemo/LineChartDemoWebPart.js", + "manifest": "./src/webparts/lineChartDemo/LineChartDemoWebPart.manifest.json" + } + ] + }, + "horizontal-bar-demo-web-part": { + "components": [ + { + "entrypoint": "./lib/webparts/horizontalBarDemo/HorizontalBarDemoWebPart.js", + "manifest": "./src/webparts/horizontalBarDemo/HorizontalBarDemoWebPart.manifest.json" + } + ] + }, + "radar-demo-web-part": { + "components": [ + { + "entrypoint": "./lib/webparts/radarDemo/RadarDemoWebPart.js", + "manifest": "./src/webparts/radarDemo/RadarDemoWebPart.manifest.json" + } + ] + }, + "pie-chart-demo-web-part": { + "components": [ + { + "entrypoint": "./lib/webparts/pieChartDemo/PieChartDemoWebPart.js", + "manifest": "./src/webparts/pieChartDemo/PieChartDemoWebPart.manifest.json" + } + ] + }, + "polar-area-demo-web-part": { + "components": [ + { + "entrypoint": "./lib/webparts/polarAreaDemo/PolarAreaDemoWebPart.js", + "manifest": "./src/webparts/polarAreaDemo/PolarAreaDemoWebPart.manifest.json" + } + ] + }, + "bubble-chart-demo-web-part": { + "components": [ + { + "entrypoint": "./lib/webparts/bubbleChartDemo/BubbleChartDemoWebPart.js", + "manifest": "./src/webparts/bubbleChartDemo/BubbleChartDemoWebPart.manifest.json" + } + ] + }, + "scatter-chart-demo-web-part": { + "components": [ + { + "entrypoint": "./lib/webparts/scatterChartDemo/ScatterChartDemoWebPart.js", + "manifest": "./src/webparts/scatterChartDemo/ScatterChartDemoWebPart.manifest.json" + } + ] + }, + "area-chart-demo-web-part": { + "components": [ + { + "entrypoint": "./lib/webparts/areaChartDemo/AreaChartDemoWebPart.js", + "manifest": "./src/webparts/areaChartDemo/AreaChartDemoWebPart.manifest.json" + } + ] + }, + "combo-chart-demo-web-part": { + "components": [ + { + "entrypoint": "./lib/webparts/comboChartDemo/ComboChartDemoWebPart.js", + "manifest": "./src/webparts/comboChartDemo/ComboChartDemoWebPart.manifest.json" + } + ] + }, + "custom-plugin-demo-web-part": { + "components": [ + { + "entrypoint": "./lib/webparts/customPluginDemo/CustomPluginDemoWebPart.js", + "manifest": "./src/webparts/customPluginDemo/CustomPluginDemoWebPart.manifest.json" + } + ] + }, + "realtime-plugin-demo-web-part": { + "components": [ + { + "entrypoint": "./lib/webparts/realtimePluginDemo/RealtimePluginDemoWebPart.js", + "manifest": "./src/webparts/realtimePluginDemo/RealtimePluginDemoWebPart.manifest.json" + } + ] + }, + "accessible-table-web-part": { + "components": [ + { + "entrypoint": "./lib/webparts/accessibleTable/AccessibleTableWebPart.js", + "manifest": "./src/webparts/accessibleTable/AccessibleTableWebPart.manifest.json" + } + ] + }, + "dynamic-data-callable-web-part": { + "components": [ + { + "entrypoint": "./lib/webparts/dynamicDataCallable/DynamicDataCallableWebPart.js", + "manifest": "./src/webparts/dynamicDataCallable/DynamicDataCallableWebPart.manifest.json" + } + ] + }, + "dynamic-data-consumer-web-part": { + "components": [ + { + "entrypoint": "./lib/webparts/dynamicDataConsumer/DynamicDataConsumerWebPart.js", + "manifest": "./src/webparts/dynamicDataConsumer/DynamicDataConsumerWebPart.manifest.json" + } + ] + }, + "chartinator-web-part": { + "components": [ + { + "entrypoint": "./lib/webparts/chartinator/ChartinatorWebPart.js", + "manifest": "./src/webparts/chartinator/ChartinatorWebPart.manifest.json" + } + ] + } + }, + "externals": {}, + "localizedResources": { + "ControlStrings": "node_modules/@pnp/spfx-controls-react/lib/loc/{locale}.js", + "PropertyControlStrings": "node_modules/@pnp/spfx-property-controls/lib/loc/{locale}.js", + "BarChartDemoWebPartStrings": "lib/webparts/barChartDemo/loc/{locale}.js", + "BarChartStaticWebPartStrings": "lib/webparts/barChartStatic/loc/{locale}.js", + "DonutPatternsDemoWebPartStrings": "lib/webparts/donutPatternsDemo/loc/{locale}.js", + "LineChartDemoWebPartStrings": "lib/webparts/lineChartDemo/loc/{locale}.js", + "HorizontalBarDemoWebPartStrings": "lib/webparts/horizontalBarDemo/loc/{locale}.js", + "RadarDemoWebPartStrings": "lib/webparts/radarDemo/loc/{locale}.js", + "PieChartDemoWebPartStrings": "lib/webparts/pieChartDemo/loc/{locale}.js", + "PolarAreaDemoWebPartStrings": "lib/webparts/polarAreaDemo/loc/{locale}.js", + "BubbleChartDemoWebPartStrings": "lib/webparts/bubbleChartDemo/loc/{locale}.js", + "ScatterChartDemoWebPartStrings": "lib/webparts/scatterChartDemo/loc/{locale}.js", + "AreaChartDemoWebPartStrings": "lib/webparts/areaChartDemo/loc/{locale}.js", + "ComboChartDemoWebPartStrings": "lib/webparts/comboChartDemo/loc/{locale}.js", + "CustomPluginDemoWebPartStrings": "lib/webparts/customPluginDemo/loc/{locale}.js", + "RealtimePluginDemoWebPartStrings": "lib/webparts/realtimePluginDemo/loc/{locale}.js", + "AccessibleTableWebPartStrings": "lib/webparts/accessibleTable/loc/{locale}.js", + "DynamicDataCallableWebPartStrings": "lib/webparts/dynamicDataCallable/loc/{locale}.js", + "DynamicDataConsumerWebPartStrings": "lib/webparts/dynamicDataConsumer/loc/{locale}.js", + "ChartinatorWebPartStrings": "lib/webparts/chartinator/loc/{locale}.js" + } +} diff --git a/samples/react-chartcontrol/config/copy-assets.json b/samples/react-chartcontrol/config/copy-assets.json new file mode 100644 index 000000000..3771fd04a --- /dev/null +++ b/samples/react-chartcontrol/config/copy-assets.json @@ -0,0 +1,4 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx-build/copy-assets.schema.json", + "deployCdnPath": "temp/deploy" +} diff --git a/samples/react-chartcontrol/config/deploy-azure-storage.json b/samples/react-chartcontrol/config/deploy-azure-storage.json new file mode 100644 index 000000000..194afc065 --- /dev/null +++ b/samples/react-chartcontrol/config/deploy-azure-storage.json @@ -0,0 +1,7 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx-build/deploy-azure-storage.schema.json", + "workingDir": "./temp/deploy/", + "account": "", + "container": "react-chartcontrol", + "accessKey": "" +} \ No newline at end of file diff --git a/samples/react-chartcontrol/config/package-solution.json b/samples/react-chartcontrol/config/package-solution.json new file mode 100644 index 000000000..c9483296b --- /dev/null +++ b/samples/react-chartcontrol/config/package-solution.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx-build/package-solution.schema.json", + "solution": { + "name": "react-chartcontrol-client-side-solution", + "id": "fb9665fb-4455-4b7f-99ab-2195920871fd", + "version": "1.0.0.0", + "includeClientSideAssets": true + }, + "paths": { + "zippedPackage": "solution/react-chartcontrol.sppkg" + } +} diff --git a/samples/react-chartcontrol/config/serve.json b/samples/react-chartcontrol/config/serve.json new file mode 100644 index 000000000..090cfe9e6 --- /dev/null +++ b/samples/react-chartcontrol/config/serve.json @@ -0,0 +1,10 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/core-build/serve.schema.json", + "port": 4321, + "https": true, + "initialPage": "https://localhost:5432/workbench", + "api": { + "port": 5432, + "entryPath": "node_modules/@microsoft/sp-webpart-workbench/lib/api/" + } +} diff --git a/samples/react-chartcontrol/config/write-manifests.json b/samples/react-chartcontrol/config/write-manifests.json new file mode 100644 index 000000000..bad352605 --- /dev/null +++ b/samples/react-chartcontrol/config/write-manifests.json @@ -0,0 +1,4 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx-build/write-manifests.schema.json", + "cdnBasePath": "" +} \ No newline at end of file diff --git a/samples/react-chartcontrol/gulpfile.js b/samples/react-chartcontrol/gulpfile.js new file mode 100644 index 000000000..7958fd5d8 --- /dev/null +++ b/samples/react-chartcontrol/gulpfile.js @@ -0,0 +1,7 @@ +'use strict'; + +const gulp = require('gulp'); +const build = require('@microsoft/sp-build-web'); +build.addSuppression(`Warning - [sass] The local CSS class 'ms-Grid' is not camelCase and will not be type-safe.`); + +build.initialize(gulp); diff --git a/samples/react-chartcontrol/package-lock.json b/samples/react-chartcontrol/package-lock.json new file mode 100644 index 000000000..96116ec7b --- /dev/null +++ b/samples/react-chartcontrol/package-lock.json @@ -0,0 +1,18370 @@ +{ + "name": "react-chartcontrol", + "version": "0.0.1", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", + "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/highlight": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", + "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@microsoft/api-extractor": { + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-6.0.7.tgz", + "integrity": "sha512-LREmTlKz8Mmvc+OfxAjluxEZEb1R+Rhn/yy9WiEAhpjhR/TwNm0z2+6O40xYEGpuvE76AsYaOTBD3/X/H9cVkw==", + "dev": true, + "requires": { + "@microsoft/node-core-library": "3.4.0", + "@microsoft/ts-command-line": "4.2.2", + "@microsoft/tsdoc": "0.9.2", + "@types/node": "8.5.8", + "@types/z-schema": "3.16.31", + "colors": "~1.2.1", + "jju": "~1.3.0", + "lodash": "~4.17.5", + "typescript": "~3.0.1", + "z-schema": "~3.18.3" + }, + "dependencies": { + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "typescript": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.0.3.tgz", + "integrity": "sha512-kk80vLW9iGtjMnIv11qyxLqZm20UklzuR2tL0QAnDIygIUIemcZMxlMWudl9OOt76H3ntVzcTiddQ1/pAAJMYg==", + "dev": true + } + } + }, + "@microsoft/decorators": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@microsoft/decorators/-/decorators-1.7.1.tgz", + "integrity": "sha512-+W31lCEuVrlwJ/oNROVd2+yXLxH0elYjVDmdGnSL5SCxv0HHgEl2jTFyv8iKutB1M5pNCbC41B3AFV9zsf92zg==", + "requires": { + "tslib": "~1.8.0" + } + }, + "@microsoft/gulp-core-build": { + "version": "3.8.33", + "resolved": "https://registry.npmjs.org/@microsoft/gulp-core-build/-/gulp-core-build-3.8.33.tgz", + "integrity": "sha512-fudWwQ2mTk14HW0XYzD/sixGssIl0TER0MfG/mcPMzcEz4B1vD1KNY0EiPdoJ3fQmdgSGSVD5uJ4sR9/pnzO0g==", + "dev": true, + "requires": { + "@microsoft/node-core-library": "3.4.0", + "@types/assertion-error": "1.0.30", + "@types/chai": "3.4.34", + "@types/chalk": "0.4.31", + "@types/gulp": "3.8.32", + "@types/mocha": "5.2.5", + "@types/node": "8.5.8", + "@types/node-notifier": "0.0.28", + "@types/orchestrator": "0.0.30", + "@types/q": "0.0.32", + "@types/rimraf": "0.0.28", + "@types/semver": "5.3.33", + "@types/through2": "2.0.32", + "@types/vinyl": "1.2.30", + "@types/yargs": "0.0.34", + "colors": "~1.2.1", + "del": "^2.2.2", + "end-of-stream": "~1.1.0", + "glob-escape": "~0.0.1", + "globby": "~5.0.0", + "gulp": "~3.9.1", + "gulp-flatten": "~0.2.0", + "gulp-if": "^2.0.1", + "jest": "~22.4.3", + "jest-cli": "~22.4.3", + "jest-environment-jsdom": "~22.4.3", + "jest-resolve": "~22.4.3", + "jju": "~1.3.0", + "jsdom": "~11.11.0", + "lodash.merge": "~4.3.2", + "merge2": "~1.0.2", + "node-notifier": "~5.0.2", + "object-assign": "~4.1.0", + "orchestrator": "~0.3.8", + "pretty-hrtime": "~1.0.2", + "rimraf": "~2.5.4", + "semver": "~5.3.0", + "through2": "~2.0.1", + "vinyl": "~2.2.0", + "yargs": "~4.6.0", + "z-schema": "~3.18.3" + }, + "dependencies": { + "@types/mocha": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.5.tgz", + "integrity": "sha512-lAVp+Kj54ui/vLUFxsJTMtWvZraZxum3w3Nwkble2dNuV5VnPA+Mi2oGX9XYJAaIvZi3tn3cbjS/qcJXRb6Bww==", + "dev": true + }, + "jest": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/jest/-/jest-22.4.4.tgz", + "integrity": "sha512-eBhhW8OS/UuX3HxgzNBSVEVhSuRDh39Z1kdYkQVWna+scpgsrD7vSeBI7tmEvsguPDMnfJodW28YBnhv/BzSew==", + "dev": true, + "requires": { + "import-local": "^1.0.0", + "jest-cli": "^22.4.4" + } + } + } + }, + "@microsoft/gulp-core-build-karma": { + "version": "4.6.30", + "resolved": "https://registry.npmjs.org/@microsoft/gulp-core-build-karma/-/gulp-core-build-karma-4.6.30.tgz", + "integrity": "sha512-S0gTaackWjXf6gxTbfQzjhdmCUXTdD8pjUpnQoDP0Qkhp8RYLMlxVMqYPe5bdQn5GUPzAa3qZQsTzhNyPHXoVA==", + "dev": true, + "requires": { + "@microsoft/gulp-core-build": "3.8.33", + "@microsoft/node-core-library": "3.4.0", + "chai": "~3.5.0", + "gulp": "~3.9.1", + "gulp-karma": "~0.0.5", + "istanbul-instrumenter-loader": "~3.0.0", + "karma": "~0.13.9", + "karma-coverage": "~0.5.5", + "karma-mocha": "~1.3.0", + "karma-mocha-clean-reporter": "~0.0.1", + "karma-phantomjs-launcher": "~1.0.0", + "karma-sinon-chai": "~1.2.0", + "karma-webpack": "2.0.9", + "lolex": "~1.4.0", + "mocha": "^5.2.0", + "phantomjs-polyfill": "~0.0.2", + "phantomjs-prebuilt": "~2.1.6", + "sinon": "~1.17.3", + "sinon-chai": "~2.8.0", + "webpack": "~3.11.0" + }, + "dependencies": { + "ajv": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.1.tgz", + "integrity": "sha512-ZoJjft5B+EJBjUyu9C9Hc0OZyPZSSlOF+plzouTrg6UlA8f+e/n8NIgBFG/9tppJtpPWfthHakK7juJdNDODww==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "resolved": "http://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "core-js": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.2.tgz", + "integrity": "sha512-NdBPF/RVwPW6jr0NCILuyN9RiqLo2b1mddWHkUL+VnvcB7dzlnBJ1bXYntjpTGOgkZiiLWj2JxmOr7eGE3qK6g==", + "dev": true + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "karma": { + "version": "0.13.22", + "resolved": "https://registry.npmjs.org/karma/-/karma-0.13.22.tgz", + "integrity": "sha1-B3ULG9Bj1+fnuRvNLmNU2PKqh0Q=", + "dev": true, + "requires": { + "batch": "^0.5.3", + "bluebird": "^2.9.27", + "body-parser": "^1.12.4", + "chokidar": "^1.4.1", + "colors": "^1.1.0", + "connect": "^3.3.5", + "core-js": "^2.1.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.0", + "expand-braces": "^0.1.1", + "glob": "^7.0.0", + "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", + "rimraf": "^2.3.3", + "socket.io": "^1.4.5", + "source-map": "^0.5.3", + "useragent": "^2.1.6" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + } + }, + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", + "dev": true + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "^2.0.0" + } + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "^2.0.0" + } + }, + "webpack": { + "version": "3.11.0", + "resolved": "http://registry.npmjs.org/webpack/-/webpack-3.11.0.tgz", + "integrity": "sha512-3kOFejWqj5ISpJk4Qj/V7w98h9Vl52wak3CLiw/cDOfbVTq7FeoZ0SdoHHY9PYlHr50ZS42OfvzE2vB4nncKQg==", + "dev": true, + "requires": { + "acorn": "^5.0.0", + "acorn-dynamic-import": "^2.0.0", + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0", + "async": "^2.1.2", + "enhanced-resolve": "^3.4.0", + "escope": "^3.6.0", + "interpret": "^1.0.0", + "json-loader": "^0.5.4", + "json5": "^0.5.1", + "loader-runner": "^2.3.0", + "loader-utils": "^1.1.0", + "memory-fs": "~0.4.1", + "mkdirp": "~0.5.0", + "node-libs-browser": "^2.0.0", + "source-map": "^0.5.3", + "supports-color": "^4.2.1", + "tapable": "^0.2.7", + "uglifyjs-webpack-plugin": "^0.4.6", + "watchpack": "^1.4.0", + "webpack-sources": "^1.0.1", + "yargs": "^8.0.2" + } + }, + "yargs": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", + "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", + "dev": true, + "requires": { + "camelcase": "^4.1.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "read-pkg-up": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^7.0.0" + } + }, + "yargs-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", + "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + } + } + } + }, + "@microsoft/gulp-core-build-sass": { + "version": "4.5.8", + "resolved": "https://registry.npmjs.org/@microsoft/gulp-core-build-sass/-/gulp-core-build-sass-4.5.8.tgz", + "integrity": "sha512-v3DkUGTiU6OTDjp67r790+veRjG1zsf/i3vecM9ZBS4SiZ4fwCex8z1sU5dJg3qvUmerKvcs+zd8YYkAKsdXdQ==", + "dev": true, + "requires": { + "@microsoft/gulp-core-build": "3.8.33", + "@microsoft/load-themed-styles": "1.8.24", + "@microsoft/node-core-library": "3.4.0", + "@types/gulp": "3.8.32", + "@types/node": "8.5.8", + "autoprefixer": "~9.1.3", + "clean-css": "4.2.1", + "glob": "~7.0.5", + "node-sass": "4.9.3", + "postcss": "7.0.5", + "postcss-modules": "~1.3.1" + }, + "dependencies": { + "@microsoft/load-themed-styles": { + "version": "1.8.24", + "resolved": "https://registry.npmjs.org/@microsoft/load-themed-styles/-/load-themed-styles-1.8.24.tgz", + "integrity": "sha512-Rzsg84Y65jCQ1uwVRTJpTFf0txjYRnxJStW5WTd0XbMxcYTaeUIcTd7FTfMMBtyqv01Fff/ESmNkeCFBlsP2SQ==", + "dev": true + }, + "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" + } + } + } + }, + "@microsoft/gulp-core-build-serve": { + "version": "3.2.65", + "resolved": "https://registry.npmjs.org/@microsoft/gulp-core-build-serve/-/gulp-core-build-serve-3.2.65.tgz", + "integrity": "sha512-dvarasKqeKr4V5n5MauujsL+/UoybTQgWhu0uY3vhV+Y6mUYo73Y+dK2I1OI3H7/WKZgIpgho16R/Qt0zOCLNw==", + "dev": true, + "requires": { + "@microsoft/gulp-core-build": "3.8.33", + "@microsoft/node-core-library": "3.4.0", + "@types/node": "8.5.8", + "colors": "~1.2.1", + "deasync": "~0.1.7", + "express": "~4.16.2", + "gulp": "~3.9.1", + "gulp-connect": "~5.5.0", + "gulp-open": "~3.0.1", + "node-forge": "~0.7.1", + "sudo": "~1.0.3" + } + }, + "@microsoft/gulp-core-build-typescript": { + "version": "6.1.10", + "resolved": "https://registry.npmjs.org/@microsoft/gulp-core-build-typescript/-/gulp-core-build-typescript-6.1.10.tgz", + "integrity": "sha512-VRa1igMKE1Pmz1Y5ch3RWgGKUU5HTU1p1pzh5ObsuWxvsKLC3zeIX3zK2/jCvGH/XjtcDski3SYoTn9RAzgM7g==", + "dev": true, + "requires": { + "@microsoft/api-extractor": "6.0.7", + "@microsoft/gulp-core-build": "3.8.33", + "@microsoft/node-core-library": "3.4.0", + "@types/gulp": "3.8.32", + "@types/node": "8.5.8", + "decomment": "~0.9.1", + "glob": "~7.0.5", + "glob-escape": "~0.0.1", + "gulp": "~3.9.1", + "tslint": "~5.9.1", + "tslint-microsoft-contrib": "~5.2.1", + "typescript": "~2.4.1" + }, + "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" + } + } + } + }, + "@microsoft/gulp-core-build-webpack": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@microsoft/gulp-core-build-webpack/-/gulp-core-build-webpack-3.4.38.tgz", + "integrity": "sha512-g1ey8fgpK5VoZiIdXXh/LUCXoK4qzXqmbcSnomQ/zZVPreoeu4Yi6BBnbKJSd9hVYLBa7Rwi2R/MVrF9NE3IJQ==", + "dev": true, + "requires": { + "@microsoft/gulp-core-build": "3.8.33", + "@types/gulp": "3.8.32", + "@types/node": "8.5.8", + "colors": "~1.2.1", + "gulp": "~3.9.1", + "webpack": "~3.11.0" + }, + "dependencies": { + "ajv": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.1.tgz", + "integrity": "sha512-ZoJjft5B+EJBjUyu9C9Hc0OZyPZSSlOF+plzouTrg6UlA8f+e/n8NIgBFG/9tppJtpPWfthHakK7juJdNDODww==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "resolved": "http://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + } + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "^2.0.0" + } + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "^2.0.0" + } + }, + "webpack": { + "version": "3.11.0", + "resolved": "http://registry.npmjs.org/webpack/-/webpack-3.11.0.tgz", + "integrity": "sha512-3kOFejWqj5ISpJk4Qj/V7w98h9Vl52wak3CLiw/cDOfbVTq7FeoZ0SdoHHY9PYlHr50ZS42OfvzE2vB4nncKQg==", + "dev": true, + "requires": { + "acorn": "^5.0.0", + "acorn-dynamic-import": "^2.0.0", + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0", + "async": "^2.1.2", + "enhanced-resolve": "^3.4.0", + "escope": "^3.6.0", + "interpret": "^1.0.0", + "json-loader": "^0.5.4", + "json5": "^0.5.1", + "loader-runner": "^2.3.0", + "loader-utils": "^1.1.0", + "memory-fs": "~0.4.1", + "mkdirp": "~0.5.0", + "node-libs-browser": "^2.0.0", + "source-map": "^0.5.3", + "supports-color": "^4.2.1", + "tapable": "^0.2.7", + "uglifyjs-webpack-plugin": "^0.4.6", + "watchpack": "^1.4.0", + "webpack-sources": "^1.0.1", + "yargs": "^8.0.2" + } + }, + "yargs": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", + "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", + "dev": true, + "requires": { + "camelcase": "^4.1.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "read-pkg-up": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^7.0.0" + } + }, + "yargs-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", + "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + } + } + } + }, + "@microsoft/load-themed-styles": { + "version": "1.8.26", + "resolved": "https://registry.npmjs.org/@microsoft/load-themed-styles/-/load-themed-styles-1.8.26.tgz", + "integrity": "sha512-ztPv3RpUGayvwzSvXMzSQJrlEJqVpgSMbsauQy7i+kcN8pCu1PMPrX3acOtUaHVZ6aUfa7dSphyJDtqyfl2Ytg==" + }, + "@microsoft/loader-cased-file": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@microsoft/loader-cased-file/-/loader-cased-file-1.7.1.tgz", + "integrity": "sha512-NxhqtI1Ejvc8JcLtZS0UsG1RfhSozHhxLPYiMSHmVYXOYlQICi13JQ6WVwUV4A4sP0VjtpEcznFbfSFAt9RR3Q==", + "dev": true, + "requires": { + "@types/lodash": "4.14.74", + "@types/node": "8.5.8", + "file-loader": "~1.1.5", + "loader-utils": "~1.1.0", + "lodash": "~4.17.5" + }, + "dependencies": { + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + } + } + }, + "@microsoft/loader-load-themed-styles": { + "version": "1.7.92", + "resolved": "https://registry.npmjs.org/@microsoft/loader-load-themed-styles/-/loader-load-themed-styles-1.7.92.tgz", + "integrity": "sha512-kJ2litpO+2Fr6eQNQA+v06t9WzcMQswq1r5N0OE38hrjWfk+cWuiDMmQtjUEfke9N8NcUeHkZo+iVg7klt1joQ==", + "dev": true, + "requires": { + "@microsoft/load-themed-styles": "1.8.24", + "loader-utils": "~1.1.0" + }, + "dependencies": { + "@microsoft/load-themed-styles": { + "version": "1.8.24", + "resolved": "https://registry.npmjs.org/@microsoft/load-themed-styles/-/load-themed-styles-1.8.24.tgz", + "integrity": "sha512-Rzsg84Y65jCQ1uwVRTJpTFf0txjYRnxJStW5WTd0XbMxcYTaeUIcTd7FTfMMBtyqv01Fff/ESmNkeCFBlsP2SQ==", + "dev": true + } + } + }, + "@microsoft/microsoft-graph-client": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@microsoft/microsoft-graph-client/-/microsoft-graph-client-1.1.0.tgz", + "integrity": "sha512-sDgchKZz1l3QJVNdkE1P1KpwTjupNt1mS9h1T0CiP+ayMN7IeFKfElB8IYtxFplNalZTmEq+iqoQFqUVpVMLfQ==", + "requires": { + "es6-promise": "^4.1.0", + "isomorphic-fetch": "^2.2.1" + } + }, + "@microsoft/node-core-library": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@microsoft/node-core-library/-/node-core-library-3.4.0.tgz", + "integrity": "sha512-szR3whwuJEl4RMs6s1xlO0gbgaZG4MpQ9qjv5Ii7HI11ATe50D0dlT2oe4IKno3Jc7i06NIxT3pMvSzFeJltPg==", + "dev": true, + "requires": { + "@types/fs-extra": "5.0.1", + "@types/node": "8.5.8", + "@types/z-schema": "3.16.31", + "colors": "~1.2.1", + "fs-extra": "~5.0.0", + "jju": "~1.3.0", + "z-schema": "~3.18.3" + } + }, + "@microsoft/office-ui-fabric-react-bundle": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@microsoft/office-ui-fabric-react-bundle/-/office-ui-fabric-react-bundle-1.7.1.tgz", + "integrity": "sha512-yC4YUwW1+3NK5aM6UyTe7LoUzNITwK1z/6hYVb6tdQMKieHlNxhuFpmmcD4SSmPk1eUDw3MSMAiuv0VXDlV/Ww==", + "requires": { + "@types/react": "16.4.2", + "@types/webpack-env": "1.13.1", + "@uifabric/icons": "5.8.0", + "office-ui-fabric-react": "5.131.0", + "react": "16.3.2", + "react-dom": "16.3.2", + "tslib": "~1.8.0" + } + }, + "@microsoft/package-deps-hash": { + "version": "2.2.79", + "resolved": "https://registry.npmjs.org/@microsoft/package-deps-hash/-/package-deps-hash-2.2.79.tgz", + "integrity": "sha512-F+G7ixtkBtrsXnvReSE5gdDMUrXnenzrQTygLACeDykDdsN96c0kwKPKDPUNFfNClJ+CpG5Vb2DXTWFEpffSJw==", + "dev": true + }, + "@microsoft/rush-lib": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@microsoft/rush-lib/-/rush-lib-5.3.1.tgz", + "integrity": "sha512-m7g/Dqgo+WsyeqbjaVBRPpD77k3fcO2xvNXi6Pt2zRgVvifuRh0+wu9YyevuLPJm7mLvcIfO5qzQaqGY43yN7A==", + "dev": true, + "requires": { + "@microsoft/node-core-library": "3.1.0", + "@microsoft/package-deps-hash": "2.2.79", + "@microsoft/stream-collator": "2.2.79", + "@microsoft/ts-command-line": "4.2.2", + "@pnpm/link-bins": "~1.0.1", + "@pnpm/logger": "~1.0.1", + "@yarnpkg/lockfile": "~1.0.2", + "builtins": "~1.0.3", + "colors": "~1.2.1", + "git-repo-info": "~1.1.4", + "glob": "~7.0.5", + "glob-escape": "~0.0.1", + "https-proxy-agent": "~2.2.1", + "inquirer": "~1.2.1", + "jju": "~1.3.0", + "js-yaml": "~3.9.1", + "lodash": "~4.17.5", + "minimatch": "~3.0.2", + "node-fetch": "~2.1.2", + "npm-package-arg": "~5.1.2", + "read-package-tree": "~5.1.5", + "rimraf": "~2.5.4", + "semver": "~5.3.0", + "strict-uri-encode": "~2.0.0", + "tar": "~4.4.1", + "wordwrap": "~1.0.0", + "z-schema": "~3.18.3" + }, + "dependencies": { + "@microsoft/node-core-library": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@microsoft/node-core-library/-/node-core-library-3.1.0.tgz", + "integrity": "sha512-a9yVoGy/uVI/QcBxaMZaxScNLP8R+Bnu1YTd6IzR2wGHig75aZt8sKe2V5aZklpyfIUEK7LWoZU4nxPGHSo3nA==", + "dev": true, + "requires": { + "@types/fs-extra": "5.0.1", + "@types/node": "8.5.8", + "@types/z-schema": "3.16.31", + "fs-extra": "~5.0.0", + "jju": "~1.3.0", + "z-schema": "~3.18.3" + } + }, + "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" + } + }, + "js-yaml": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.9.1.tgz", + "integrity": "sha512-CbcG379L1e+mWBnLvHWWeLs8GyV/EMw862uLI3c+GxVyDHWZcjZinwuBd3iW2pgxgIlksW/1vNJa4to+RvDOww==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "node-fetch": { + "version": "2.1.2", + "resolved": "http://registry.npmjs.org/node-fetch/-/node-fetch-2.1.2.tgz", + "integrity": "sha1-q4hOjn5X44qUR1POxwb3iNF2i7U=", + "dev": true + }, + "tar": { + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.8.tgz", + "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", + "dev": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "yallist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", + "dev": true + } + } + }, + "@microsoft/rush-stack-compiler": { + "version": "0.1.18", + "resolved": "https://registry.npmjs.org/@microsoft/rush-stack-compiler/-/rush-stack-compiler-0.1.18.tgz", + "integrity": "sha512-MDDKr/TRPhOKs9p/6+dvQP5K0Zsqx7e/tyGdyU0+WPO38ZjDF714hYG4ScktIjvbbHY0LQocJPq3/ZtBI3xRVw==", + "dev": true, + "requires": { + "@microsoft/api-extractor": "6.0.7", + "tslint": "~5.9.1", + "tslint-microsoft-contrib": "~5.2.1", + "typescript": "~2.4.1" + } + }, + "@microsoft/set-webpack-public-path-plugin": { + "version": "2.1.45", + "resolved": "https://registry.npmjs.org/@microsoft/set-webpack-public-path-plugin/-/set-webpack-public-path-plugin-2.1.45.tgz", + "integrity": "sha512-d5INIkqgo/1arPl3Rq96Mqi8PKMSp7yoD6j3QcpUJ4fVMGp4d9uBOF3Fj5dW0yJpt31RDFnGM0LQeilJoBprHw==", + "dev": true, + "requires": { + "@types/node": "8.5.8", + "@types/tapable": "1.0.2", + "@types/webpack": "4.4.0", + "lodash": "~4.17.5", + "uglify-js": "~3.0.28" + }, + "dependencies": { + "commander": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", + "dev": true + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "uglify-js": { + "version": "3.0.28", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.0.28.tgz", + "integrity": "sha512-0h/qGay016GG2lVav3Kz174F3T2Vjlz2v6HCt+WDQpoXfco0hWwF5gHK9yh88mUYvIC+N7Z8NT8WpjSp1yoqGA==", + "dev": true, + "requires": { + "commander": "~2.11.0", + "source-map": "~0.5.1" + } + } + } + }, + "@microsoft/sp-application-base": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@microsoft/sp-application-base/-/sp-application-base-1.7.1.tgz", + "integrity": "sha512-sKTyw9PUJXmufV+Tj14iy37vdE5EGqf3dYnlGuP6tDui967rDRP+6u5aPMicX9xftNslFAyQQlvPjJT18VpBIQ==", + "dev": true, + "requires": { + "@microsoft/decorators": "1.7.1", + "@microsoft/sp-component-base": "1.7.1", + "@microsoft/sp-core-library": "1.7.1", + "@microsoft/sp-diagnostics": "1.7.1", + "@microsoft/sp-extension-base": "1.7.1", + "@microsoft/sp-http": "1.7.1", + "@microsoft/sp-loader": "1.7.1", + "@microsoft/sp-lodash-subset": "1.7.1", + "@microsoft/sp-module-interfaces": "1.7.1", + "@microsoft/sp-odata-types": "1.7.1", + "@microsoft/sp-page-context": "1.7.1", + "@types/es6-promise": "0.0.33", + "@types/webpack-env": "1.13.1", + "tslib": "~1.8.0" + } + }, + "@microsoft/sp-build-common": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@microsoft/sp-build-common/-/sp-build-common-1.7.1.tgz", + "integrity": "sha512-/gjnAc0ZFHCftreGqMkEvqipbfre9VEe5gQBc1X9qIw2dCaGr0WyL/TGguY9jUBshWFJsnTsququaTdId1OJ/A==", + "dev": true, + "requires": { + "@microsoft/gulp-core-build": "3.8.33", + "@microsoft/gulp-core-build-typescript": "6.1.10", + "@microsoft/sp-tslint-rules": "1.7.1", + "@types/yargs": "0.0.35", + "gulp": "~3.9.1", + "jju": "~1.3.0", + "semver": "~5.2.0", + "typescript": "~2.4.1", + "yargs": "~4.6.0" + }, + "dependencies": { + "@types/yargs": { + "version": "0.0.35", + "resolved": "http://registry.npmjs.org/@types/yargs/-/yargs-0.0.35.tgz", + "integrity": "sha1-QHczV2rO1IlfutZ6Pwr2M9Lfy60=", + "dev": true + }, + "semver": { + "version": "5.2.0", + "resolved": "http://registry.npmjs.org/semver/-/semver-5.2.0.tgz", + "integrity": "sha1-KBmVuAwUSCCUFd28TPUMJpzvVcU=", + "dev": true + } + } + }, + "@microsoft/sp-build-core-tasks": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@microsoft/sp-build-core-tasks/-/sp-build-core-tasks-1.7.1.tgz", + "integrity": "sha512-qzVgJnxUbHLE344LwgfPma5udNWh1W2viSp6JX73JpPznVDmcBVuDZAE4jX6Wak78ezwLcBOJz6aY3XVJob1vg==", + "dev": true, + "requires": { + "@microsoft/gulp-core-build": "3.8.33", + "@microsoft/gulp-core-build-karma": "4.6.30", + "@microsoft/gulp-core-build-serve": "3.2.65", + "@microsoft/gulp-core-build-webpack": "3.4.38", + "@microsoft/load-themed-styles": "1.8.26", + "@microsoft/loader-cased-file": "1.7.1", + "@microsoft/loader-load-themed-styles": "1.7.92", + "@microsoft/node-core-library": "3.4.0", + "@microsoft/rush-lib": "5.3.1", + "@microsoft/set-webpack-public-path-plugin": "2.1.45", + "@microsoft/sp-module-interfaces": "1.7.1", + "@types/finalhandler": "0.0.31", + "@types/fs-extra": "5.0.1", + "@types/glob": "5.0.30", + "@types/gulp-replace": "0.0.29", + "@types/lodash": "4.14.74", + "@types/merge2": "0.3.29", + "@types/node": "8.5.8", + "@types/resolve": "0.0.4", + "@types/rimraf": "0.0.28", + "@types/serve-static": "1.7.31", + "@types/uuid": "3.0.0", + "@types/webpack": "4.4.0", + "@types/webpack-stream": "3.2.10", + "azure-storage": "~2.8.2", + "colors": "~1.2.1", + "css-loader": "~0.28.7", + "finalhandler": "~0.4.1", + "fs-extra": "~5.0.0", + "glob": "~7.0.5", + "glob-escape": "~0.0.1", + "gulp": "~3.9.1", + "gulp-replace": "~0.5.4", + "gulp-util": "~3.0.7", + "html-loader": "~0.5.1", + "json-loader": "~0.5.7", + "json-schema": "~0.2.3", + "lodash": "~4.17.5", + "merge2": "~1.0.2", + "node-zip": "~1.1.1", + "phantomjs-prebuilt": "~2.1.6", + "resolve": "~1.7.1", + "rimraf": "~2.6.1", + "serve-static": "~1.10.2", + "source-map-loader": "~0.2.4", + "through2": "~2.0.1", + "uuid": "~3.1.0", + "webpack": "~3.6.0", + "webpack-stream": "~4.0.0", + "xml": "~1.0.1" + }, + "dependencies": { + "debug": { + "version": "2.2.0", + "resolved": "http://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true, + "requires": { + "ms": "0.7.1" + } + }, + "etag": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.7.0.tgz", + "integrity": "sha1-A9MLX2fdbmMtKUXTDWZScxo01dg=", + "dev": true + }, + "finalhandler": { + "version": "0.4.1", + "resolved": "http://registry.npmjs.org/finalhandler/-/finalhandler-0.4.1.tgz", + "integrity": "sha1-haF8bFmpRxfSYtYSMNSw6+PUoU0=", + "dev": true, + "requires": { + "debug": "~2.2.0", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "unpipe": "~1.0.0" + } + }, + "fresh": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz", + "integrity": "sha1-ZR+DjiJCTnVm3hYdg1jKoZn4PU8=", + "dev": true + }, + "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" + } + }, + "http-errors": { + "version": "1.3.1", + "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", + "integrity": "sha1-GX4izevUGYWF6GlO9nhhl7ke2UI=", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "statuses": "1" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "mime": { + "version": "1.3.4", + "resolved": "http://registry.npmjs.org/mime/-/mime-1.3.4.tgz", + "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=", + "dev": true + }, + "ms": { + "version": "0.7.1", + "resolved": "http://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + }, + "range-parser": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.0.3.tgz", + "integrity": "sha1-aHKCNTXGkuLCoBA4Jq/YLC4P8XU=", + "dev": true + }, + "resolve": { + "version": "1.7.1", + "resolved": "http://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", + "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", + "dev": true, + "requires": { + "path-parse": "^1.0.5" + } + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, + "requires": { + "glob": "^7.0.5" + } + }, + "send": { + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.13.2.tgz", + "integrity": "sha1-dl52B8gFVFK7pvCwUllTUJhgNt4=", + "dev": true, + "requires": { + "debug": "~2.2.0", + "depd": "~1.1.0", + "destroy": "~1.0.4", + "escape-html": "~1.0.3", + "etag": "~1.7.0", + "fresh": "0.3.0", + "http-errors": "~1.3.1", + "mime": "1.3.4", + "ms": "0.7.1", + "on-finished": "~2.3.0", + "range-parser": "~1.0.3", + "statuses": "~1.2.1" + } + }, + "serve-static": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.10.3.tgz", + "integrity": "sha1-zlpuzTEB/tXsCYJ9rCKpwpv7BTU=", + "dev": true, + "requires": { + "escape-html": "~1.0.3", + "parseurl": "~1.3.1", + "send": "0.13.2" + } + }, + "statuses": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.2.1.tgz", + "integrity": "sha1-3e1FzBglbVHtQK7BQkidXGECbSg=", + "dev": true + }, + "uuid": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", + "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", + "dev": true + } + } + }, + "@microsoft/sp-build-web": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@microsoft/sp-build-web/-/sp-build-web-1.7.1.tgz", + "integrity": "sha512-l0exSr8YpnMHkC39/nlTPptQx6+WeQJOiQXZTgUrwdfnvbqz4PYW2zrbp1w0URmMa2AsGx/ELWkIm+fpyj1I+w==", + "dev": true, + "requires": { + "@microsoft/gulp-core-build": "3.8.33", + "@microsoft/gulp-core-build-karma": "4.6.30", + "@microsoft/gulp-core-build-sass": "4.5.8", + "@microsoft/gulp-core-build-serve": "3.2.65", + "@microsoft/gulp-core-build-typescript": "6.1.10", + "@microsoft/gulp-core-build-webpack": "3.4.38", + "@microsoft/sp-build-common": "1.7.1", + "@microsoft/sp-build-core-tasks": "1.7.1", + "@microsoft/sp-polyfills": "1.7.1", + "@types/karma": "0.13.33", + "@types/webpack": "4.4.0", + "gulp": "~3.9.1", + "webpack": "~3.6.0", + "yargs": "~4.6.0" + } + }, + "@microsoft/sp-client-preview": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@microsoft/sp-client-preview/-/sp-client-preview-1.7.1.tgz", + "integrity": "sha512-p2ea6OrChoDGZapANrKYb2aD4Qykcj/ppsOBT1MChTBvcfy8ZRAoM7DFN8hVxbDOt185Ev/gyfEvK8Fe/qOnzw==", + "dev": true, + "requires": { + "@types/webpack-env": "1.13.1", + "tslib": "~1.8.0" + } + }, + "@microsoft/sp-component-base": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@microsoft/sp-component-base/-/sp-component-base-1.7.1.tgz", + "integrity": "sha512-AiOs/xQRjaoyfjwidxsw5WQe0Yz5X0S3CYn04YKhx0gteyczLHZvDJdw4KW7ZnXMiRhDQ6ExagIecjLTW9nMJA==", + "requires": { + "@microsoft/decorators": "1.7.1", + "@microsoft/sp-core-library": "1.7.1", + "@microsoft/sp-diagnostics": "1.7.1", + "@microsoft/sp-dynamic-data": "1.7.1", + "@microsoft/sp-http": "1.7.1", + "@microsoft/sp-loader": "1.7.1", + "@microsoft/sp-lodash-subset": "1.7.1", + "@microsoft/sp-module-interfaces": "1.7.1", + "@microsoft/sp-page-context": "1.7.1", + "@types/es6-promise": "0.0.33", + "@types/webpack-env": "1.13.1" + } + }, + "@microsoft/sp-core-library": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@microsoft/sp-core-library/-/sp-core-library-1.7.1.tgz", + "integrity": "sha512-v03HmWzPeY8lk+77v4bthXGJUu++OEYp/Vh01/1kbCz5eq5j5rY1Ba7ntfqKK9rnd8NexqtTYZHRCEBRDlytdA==", + "requires": { + "@microsoft/sp-lodash-subset": "1.7.1", + "@microsoft/sp-module-interfaces": "1.7.1", + "@types/es6-promise": "0.0.33", + "@types/webpack-env": "1.13.1" + } + }, + "@microsoft/sp-diagnostics": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@microsoft/sp-diagnostics/-/sp-diagnostics-1.7.1.tgz", + "integrity": "sha512-rQJlkhNRLD5qFn2J0AYsuXSHX1azj1w//Q0vJAEoc4buYjaa4HHV8XoIxYXy4Hjol5RgVDA/ryGUchjjekMNAA==", + "requires": { + "@microsoft/sp-core-library": "1.7.1", + "@microsoft/sp-lodash-subset": "1.7.1" + } + }, + "@microsoft/sp-dynamic-data": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@microsoft/sp-dynamic-data/-/sp-dynamic-data-1.7.1.tgz", + "integrity": "sha512-a/tZUcOJdLAGBEsvN3O6p8jmqyuTwkUDUYpjQJUFF5B3MtkhBMH8J6JORvQ1n/pI8jG14gNOHK3Oc889JRjcHA==", + "requires": { + "@microsoft/sp-core-library": "1.7.1", + "@microsoft/sp-diagnostics": "1.7.1", + "@microsoft/sp-lodash-subset": "1.7.1", + "@types/webpack-env": "1.13.1", + "tslib": "~1.8.0" + } + }, + "@microsoft/sp-extension-base": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@microsoft/sp-extension-base/-/sp-extension-base-1.7.1.tgz", + "integrity": "sha512-35bSMtkjRKRvBvXn0zqxI3+9kTDMC/FOAd/A9GbMTa8D3NtwtoCB3KMnMrxLBXsA4wSFLgEChCIJ66zfVrsa3g==", + "dev": true, + "requires": { + "@microsoft/decorators": "1.7.1", + "@microsoft/sp-component-base": "1.7.1", + "@microsoft/sp-core-library": "1.7.1", + "@microsoft/sp-diagnostics": "1.7.1", + "@microsoft/sp-http": "1.7.1", + "@microsoft/sp-loader": "1.7.1", + "@microsoft/sp-lodash-subset": "1.7.1", + "@microsoft/sp-module-interfaces": "1.7.1", + "@microsoft/sp-page-context": "1.7.1", + "@types/es6-promise": "0.0.33", + "@types/webpack-env": "1.13.1" + } + }, + "@microsoft/sp-http": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@microsoft/sp-http/-/sp-http-1.7.1.tgz", + "integrity": "sha512-r/jDsbHsOY9hT9qPmdycaSa/ohOEIp8kblEHvU42BubCXBE3eW5SJuEeRWR+8nYbT2bb6H1RWAgOJ7NQGngJnw==", + "requires": { + "@microsoft/microsoft-graph-client": "~1.1.0", + "@microsoft/sp-core-library": "1.7.1", + "@microsoft/sp-diagnostics": "1.7.1", + "@types/adal-angular": "1.0.1", + "adal-angular": "1.0.16", + "tslib": "~1.8.0" + } + }, + "@microsoft/sp-loader": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@microsoft/sp-loader/-/sp-loader-1.7.1.tgz", + "integrity": "sha512-AuixiVzVI1btN8W5eDuX1L++Bqy8YthkmdYAX3TeHttQnQdTVXFVOMc7QR7GWahxCtLDUDTvzW29hT3tjzLfTA==", + "requires": { + "@microsoft/office-ui-fabric-react-bundle": "1.7.1", + "@microsoft/sp-core-library": "1.7.1", + "@microsoft/sp-diagnostics": "1.7.1", + "@microsoft/sp-dynamic-data": "1.7.1", + "@microsoft/sp-http": "1.7.1", + "@microsoft/sp-lodash-subset": "1.7.1", + "@microsoft/sp-module-interfaces": "1.7.1", + "@microsoft/sp-odata-types": "1.7.1", + "@microsoft/sp-page-context": "1.7.1", + "@microsoft/sp-polyfills": "1.7.1", + "@types/es6-promise": "0.0.33", + "@types/node": "8.5.8", + "@types/react": "16.4.2", + "@types/react-dom": "16.0.5", + "@types/requirejs": "2.1.29", + "@types/webpack-env": "1.13.1", + "@uifabric/utilities": "5.34.2", + "office-ui-fabric-react": "5.131.0", + "react": "16.3.2", + "react-dom": "16.3.2", + "requirejs": "2.1.20" + } + }, + "@microsoft/sp-lodash-subset": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@microsoft/sp-lodash-subset/-/sp-lodash-subset-1.7.1.tgz", + "integrity": "sha512-0mpMNgOz0wmu49AHUL61SK3krrEfbRK1mQpOyIpiUFEvFf7uW3x+rYBzAQZLYIsL4evixrHL0/sC4x+ZQSf+OQ==", + "requires": { + "@types/lodash": "4.14.74", + "@types/webpack-env": "1.13.1", + "tslib": "~1.8.0" + } + }, + "@microsoft/sp-module-interfaces": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@microsoft/sp-module-interfaces/-/sp-module-interfaces-1.7.1.tgz", + "integrity": "sha512-DNkZv7Pw1QmYoucKcBlU84XaJ4JZhIsmA04oO5SbmqUGoIXaqbzajDuKkNjebZHME0qknsT/8R5OgYddYsczZg==", + "requires": { + "@types/node": "8.5.8", + "@types/z-schema": "3.16.31", + "z-schema": "~3.18.3" + } + }, + "@microsoft/sp-odata-types": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@microsoft/sp-odata-types/-/sp-odata-types-1.7.1.tgz", + "integrity": "sha512-y85iKoyJ64b1pU7FEtRmzwCuyt5Ar5x/4/+DAcP/WMzSmvYf0JE1wrQtVdqdqX35FWQ1ibOmwTF0Z5pnFc2XBA==", + "requires": { + "tslib": "~1.8.0" + } + }, + "@microsoft/sp-office-ui-fabric-core": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@microsoft/sp-office-ui-fabric-core/-/sp-office-ui-fabric-core-1.7.1.tgz", + "integrity": "sha512-aFm8FMdktTgk4xb/G5t3wnDYxKKyVFN9dTbWhOcSn1e1XRSQpMplalzPTmX2Lw8AEONDJtCyWShRaxPMo4HZLw==", + "requires": { + "@types/webpack-env": "1.13.1", + "office-ui-fabric-core": "9.6.1-fluent2", + "tslib": "~1.8.0" + } + }, + "@microsoft/sp-page-context": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@microsoft/sp-page-context/-/sp-page-context-1.7.1.tgz", + "integrity": "sha512-C58kDoEzsSq21hpb7APiwJj46T7nEjdTpMfrlhbr+mLDEQT8SDQdygDOemYCQMDIzhn42uYVh7znEP3pgAw74A==", + "requires": { + "@microsoft/sp-core-library": "1.7.1", + "@microsoft/sp-diagnostics": "1.7.1", + "@microsoft/sp-dynamic-data": "1.7.1", + "@microsoft/sp-lodash-subset": "1.7.1", + "@microsoft/sp-odata-types": "1.7.1", + "@microsoft/teams-js": "1.3.0-beta.4", + "@types/es6-promise": "0.0.33", + "@types/webpack-env": "1.13.1", + "tslib": "~1.8.0" + } + }, + "@microsoft/sp-polyfills": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@microsoft/sp-polyfills/-/sp-polyfills-1.7.1.tgz", + "integrity": "sha512-aqVVSxdLyDxJ7L/c818/ByT02tbI0w/7Ghfaz/hNLFkJ8jT/uwuECVteH2JT+qRTAcHmJ1i6wZM3oChUPMoATQ==", + "requires": { + "@types/webpack-env": "1.13.1", + "es6-collections": "0.5.6", + "es6-promise": "4.1.1", + "tslib": "~1.8.0", + "whatwg-fetch": "2.0.3", + "whatwg-url": "4.7.1" + }, + "dependencies": { + "es6-promise": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.1.1.tgz", + "integrity": "sha512-OaU1hHjgJf+b0NzsxCg7NdIYERD6Hy/PEmFLTjw+b65scuisG3Kt4QoTvJ66BBkPZ581gr0kpoVzKnxniM8nng==" + }, + "whatwg-fetch": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz", + "integrity": "sha1-nITsLc9oGH/wC8ZOEnS0QhduHIQ=" + } + } + }, + "@microsoft/sp-tslint-rules": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@microsoft/sp-tslint-rules/-/sp-tslint-rules-1.7.1.tgz", + "integrity": "sha512-SThJF3FXi6n7lkn1KJdpdmRYEXudMm6i9ME37RFT5d36FAcm2jjmklhzfVd+xaTFu0BTX3jArcFTCNI5CDrvgg==", + "dev": true, + "requires": { + "@microsoft/rush-stack-compiler": "0.1.18", + "tslint": "~5.9.1", + "tslint-microsoft-contrib": "~5.2.1", + "tsutils": "~2.11.2", + "typescript": "~2.4.1" + }, + "dependencies": { + "tsutils": { + "version": "2.11.2", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.11.2.tgz", + "integrity": "sha1-YBNgHjb6FP+VhBPlQdQn+4xqw0E=", + "dev": true, + "requires": { + "tslib": "^1.7.1" + } + } + } + }, + "@microsoft/sp-webpart-base": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@microsoft/sp-webpart-base/-/sp-webpart-base-1.7.1.tgz", + "integrity": "sha512-583enT7kIhddjJad9IW91vEZc93EnwrtDsF3c0RtvCLK3+KS29e1SIkiEUoRn+GkyjD4FRN3uc9D+aGOf78LuQ==", + "requires": { + "@microsoft/decorators": "1.7.1", + "@microsoft/load-themed-styles": "1.8.26", + "@microsoft/office-ui-fabric-react-bundle": "1.7.1", + "@microsoft/sp-component-base": "1.7.1", + "@microsoft/sp-core-library": "1.7.1", + "@microsoft/sp-diagnostics": "1.7.1", + "@microsoft/sp-dynamic-data": "1.7.1", + "@microsoft/sp-http": "1.7.1", + "@microsoft/sp-loader": "1.7.1", + "@microsoft/sp-lodash-subset": "1.7.1", + "@microsoft/sp-module-interfaces": "1.7.1", + "@microsoft/sp-page-context": "1.7.1", + "@microsoft/teams-js": "1.3.0-beta.4", + "@types/es6-promise": "0.0.33", + "@types/react": "16.4.2", + "@types/react-dom": "16.0.5", + "@types/webpack-env": "1.13.1", + "office-ui-fabric": "2.6.1", + "office-ui-fabric-react": "5.131.0", + "react": "16.3.2", + "react-dom": "16.3.2", + "tslib": "~1.8.0" + } + }, + "@microsoft/sp-webpart-workbench": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@microsoft/sp-webpart-workbench/-/sp-webpart-workbench-1.7.1.tgz", + "integrity": "sha512-YCQYd1Qg29dgahpjjmAkahJIVFyAG/r6XU7XUSA0tgOnwqbbZoDQO+TAHxzn49D8qcAjpTlfI+sSkEm0t7OHWA==", + "dev": true, + "requires": { + "@microsoft/gulp-core-build-serve": "3.2.65", + "@microsoft/node-core-library": "3.4.0", + "@microsoft/office-ui-fabric-react-bundle": "1.7.1", + "@microsoft/sp-application-base": "1.7.1", + "@microsoft/sp-build-core-tasks": "1.7.1", + "@microsoft/sp-client-preview": "1.7.1", + "@microsoft/sp-core-library": "1.7.1", + "@microsoft/sp-loader": "1.7.1", + "@microsoft/sp-lodash-subset": "1.7.1", + "@microsoft/sp-module-interfaces": "1.7.1", + "@microsoft/sp-webpart-base": "1.7.1", + "@types/es6-promise": "0.0.33", + "@types/fs-extra": "5.0.1", + "@types/react": "16.4.2", + "@types/react-dom": "16.0.5", + "@types/webpack-env": "1.13.1", + "fs-extra": "~5.0.0", + "office-ui-fabric-react": "5.131.0", + "prop-types": "15.5.7", + "react": "16.3.2", + "react-dom": "16.3.2", + "tslib": "~1.8.0" + }, + "dependencies": { + "prop-types": { + "version": "15.5.7", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.5.7.tgz", + "integrity": "sha1-IxxPKc3YLjVQEdSIk4bKkFlUTdE=", + "dev": true, + "requires": { + "fbjs": "^0.8.9" + } + } + } + }, + "@microsoft/stream-collator": { + "version": "2.2.79", + "resolved": "https://registry.npmjs.org/@microsoft/stream-collator/-/stream-collator-2.2.79.tgz", + "integrity": "sha512-N8hAcQMhV4u20+8vCqa+TNF7t4lDW8WwFcTjAimnOtFDmrtYSvvLUkN89jvwyZLBJM8AwOTdcinGHyD+QqMkyg==", + "dev": true, + "requires": { + "@types/node": "8.5.8", + "colors": "~1.2.1" + } + }, + "@microsoft/teams-js": { + "version": "1.3.0-beta.4", + "resolved": "https://registry.npmjs.org/@microsoft/teams-js/-/teams-js-1.3.0-beta.4.tgz", + "integrity": "sha512-AxDfMpiVqh3hsqTxMEYtQoz866WB/sw/Jl0pgTLh6sMHHmIBNMd+E0pVcP9WNk8zTkr9LCphJ5SziU1C8BgZMA==" + }, + "@microsoft/ts-command-line": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@microsoft/ts-command-line/-/ts-command-line-4.2.2.tgz", + "integrity": "sha512-CLLVG+zWmUvD6jZD5oq7QCFYj3WOvrBSc3H6KejXCH6q2ntP5/ZHlmKVzQVvN1cEOSWP+jN9ml2AvUcDY/l6Tw==", + "dev": true, + "requires": { + "@types/argparse": "1.0.33", + "@types/node": "8.5.8", + "argparse": "~1.0.9", + "colors": "~1.2.1" + } + }, + "@microsoft/tsdoc": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.9.2.tgz", + "integrity": "sha512-bdozNnQXIKZgT3fjCcOYSZSpH7zuh+Turv8uQxzXTj5G8AzgTJ/X3GnrYDbliXKgefL8LJeIj4vwdrOnt1J+Ng==", + "dev": true + }, + "@pnp/common": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@pnp/common/-/common-1.2.8.tgz", + "integrity": "sha512-sN2bjf2QbCAiTmzFzs2no4sPNKwW1TLuAxqU78BA3zopGXjA6DWzkYKP2tI7uSkFmiydoEpQBbHRcCwNLP66GA==", + "requires": { + "adal-angular": "1.0.17", + "tslib": "1.9.3" + }, + "dependencies": { + "adal-angular": { + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/adal-angular/-/adal-angular-1.0.17.tgz", + "integrity": "sha1-bpNuDkH5HTsqiOf/ypwvb29WLMQ=" + }, + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" + } + } + }, + "@pnp/logging": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@pnp/logging/-/logging-1.2.8.tgz", + "integrity": "sha512-nyKAaQzn1PB6bOs8PMbGatzTcaukoFNyQrsvBlkrMFtKHSBFqGfNlg5mlGxEdn0pWqtQ5NFgsQcXo64YmaBamg==", + "requires": { + "tslib": "1.9.3" + }, + "dependencies": { + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" + } + } + }, + "@pnp/odata": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@pnp/odata/-/odata-1.2.8.tgz", + "integrity": "sha512-q8h6EZ5cjd5GKov4Y8dTpH773f3scFAQU0hhMlO1Yt8e7SyJGsToGMhSFrWkrC2JgBnt4duRb34T/snES7MYRg==", + "requires": { + "tslib": "1.9.3" + }, + "dependencies": { + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" + } + } + }, + "@pnp/sp": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@pnp/sp/-/sp-1.2.8.tgz", + "integrity": "sha512-dHy7Pt0PWzShbCEIG5iI8ukBtN9uWHkU2lIBHlCkNxhDP8djAm+7a5blNxyR1kG8LXHLRqPQStlYa4DItvV1QA==", + "requires": { + "tslib": "1.9.3" + }, + "dependencies": { + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" + } + } + }, + "@pnp/spfx-controls-react": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@pnp/spfx-controls-react/-/spfx-controls-react-1.11.0.tgz", + "integrity": "sha512-7i2g3l95/CXpiugfM8V0m8aEHeyoRFBlTiZfoQiue5LW9O3XC+okDSbf8vOBNgddYTRLnRZKEo/TMKcuNEi3zQ==", + "requires": { + "@pnp/common": "1.0.1", + "@pnp/logging": "1.0.1", + "@pnp/odata": "1.0.1", + "@pnp/sp": "1.0.1", + "@pnp/telemetry-js": "1.0.0", + "@types/chart.js": "2.7.40", + "chart.js": "2.7.3", + "color": "^3.1.0", + "lodash": "4.17.4", + "office-ui-fabric-react": "5.131.0" + }, + "dependencies": { + "@pnp/common": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@pnp/common/-/common-1.0.1.tgz", + "integrity": "sha1-T+cuONHexjlQSvxxQclSEh5YqOk=", + "requires": { + "tslib": "1.8.1" + } + }, + "@pnp/logging": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@pnp/logging/-/logging-1.0.1.tgz", + "integrity": "sha1-Nl1/dmiW943xIMgd9D3dlrCgojY=", + "requires": { + "tslib": "1.8.1" + } + }, + "@pnp/odata": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@pnp/odata/-/odata-1.0.1.tgz", + "integrity": "sha1-yE5s/MV2VdZj2IEFlgGT8yiOwAI=", + "requires": { + "tslib": "1.8.1" + } + }, + "@pnp/sp": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@pnp/sp/-/sp-1.0.1.tgz", + "integrity": "sha1-5XXJVqZWk9KRkI4yEdzWbc5KFWM=", + "requires": { + "tslib": "1.8.1" + } + }, + "color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.0.tgz", + "integrity": "sha512-CwyopLkuRYO5ei2EpzpIh6LqJMt6Mt+jZhO5VI5f/wJLZriXQE32/SSqzmrh+QB+AZT81Cj8yv+7zwToW8ahZg==", + "requires": { + "color-convert": "^1.9.1", + "color-string": "^1.5.2" + } + }, + "color-string": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", + "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "lodash": { + "version": "4.17.4", + "resolved": "http://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" + } + } + }, + "@pnp/spfx-property-controls": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/@pnp/spfx-property-controls/-/spfx-property-controls-1.13.1.tgz", + "integrity": "sha512-CVlKtAGrwig+cNUr9EQ3dRkwyorqlpuDKOAf7XsnMRaHEcMsa2qenlK9UzpOI5w9bsI14mF69nlztKqpT1NRxA==", + "requires": { + "@pnp/telemetry-js": "1.0.0", + "office-ui-fabric-react": "5.131.0", + "react-ace": "5.8.0" + } + }, + "@pnp/telemetry-js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@pnp/telemetry-js/-/telemetry-js-1.0.0.tgz", + "integrity": "sha512-7Lr22EB6DgB8MZi0WDuou8VuXru3wHdiOQPenB2B2gdhp7bJj2ijN9vTiqF8aL1nh80uJxIyX269Ix/PSnJC7g==", + "requires": { + "whatwg-fetch": "2.0.4" + }, + "dependencies": { + "whatwg-fetch": { + "version": "2.0.4", + "resolved": "http://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", + "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==" + } + } + }, + "@pnpm/link-bins": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@pnpm/link-bins/-/link-bins-1.0.3.tgz", + "integrity": "sha512-thVgwrQ5rMcPYI6a0IPOt2pnlF1n5zX7BN4CrFeBp0/JCGsZAht/VOPv9bD3cZ+j0vDemEwE23BfhOWxmxq2yQ==", + "dev": true, + "requires": { + "@pnpm/package-bins": "^1.0.0", + "@pnpm/types": "^1.7.0", + "@types/mz": "^0.0.32", + "@types/node": "^9.6.5 || 10", + "@types/ramda": "^0.25.20", + "@zkochan/cmd-shim": "^2.2.4", + "arr-flatten": "^1.1.0", + "is-windows": "^1.0.2", + "mkdirp-promise": "^5.0.1", + "mz": "^2.7.0", + "normalize-path": "^3.0.0", + "p-filter": "^1.0.0", + "ramda": "^0.25.0", + "read-package-json": "^2.0.13" + }, + "dependencies": { + "@types/node": { + "version": "10.12.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.18.tgz", + "integrity": "sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==", + "dev": true + }, + "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 + } + } + }, + "@pnpm/logger": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@pnpm/logger/-/logger-1.0.2.tgz", + "integrity": "sha512-A8XbJKvdueazvJGPn1qQ9LL6uopV88ebIT+dJKNQ68gT7yfCbtfT8j5ZzdVczmGbkiuBeZ1VckZerkO0tjOXZA==", + "dev": true, + "requires": { + "@types/node": "^9.4.0 || 10", + "bole": "^3.0.2", + "ndjson": "^1.5.0" + }, + "dependencies": { + "@types/node": { + "version": "10.12.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.18.tgz", + "integrity": "sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==", + "dev": true + } + } + }, + "@pnpm/package-bins": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/@pnpm/package-bins/-/package-bins-1.0.0.tgz", + "integrity": "sha512-ZqVfIXK3r5AsP5VAhPHrhf3isF+T4yEuUpJTF9T03oFTJ9LBnkKvx8F7P7biKEManxSGOkSpNoIBdsura9pY5Q==", + "dev": true, + "requires": { + "@pnpm/types": "^1.7.0", + "@types/mz": "^0.0.32", + "mz": "^2.7.0", + "p-filter": "^1.0.0" + } + }, + "@pnpm/types": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@pnpm/types/-/types-1.8.0.tgz", + "integrity": "sha512-NsEzBVa5aMgn/n79piyJtpUQFzJ97tB2R2r8PSJlLnMA6LJmchKuv7ATN+/nZH/3QRd/+uFXEq07/i/ajsqVGQ==", + "dev": true + }, + "@types/adal-angular": { + "version": "1.0.1", + "resolved": "http://registry.npmjs.org/@types/adal-angular/-/adal-angular-1.0.1.tgz", + "integrity": "sha512-2sRGxJYrluhvIz8ae98i5k5woe9Fics4dMFHTcNfY2xAkj5QGZor+sfZzlgM58Fpw7Kklau9Gn6OhgJP25dKug==" + }, + "@types/argparse": { + "version": "1.0.33", + "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.33.tgz", + "integrity": "sha512-VQgHxyPMTj3hIlq9SY1mctqx+Jj8kpQfoLvDlVSDNOyuYs8JYfkuY3OW/4+dO657yPmNhHpePRx0/Tje5ImNVQ==", + "dev": true + }, + "@types/assertion-error": { + "version": "1.0.30", + "resolved": "https://registry.npmjs.org/@types/assertion-error/-/assertion-error-1.0.30.tgz", + "integrity": "sha1-89DV2i7Ie1FOMNs/+aAYh7VhnCk=", + "dev": true + }, + "@types/bluebird": { + "version": "3.5.24", + "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.24.tgz", + "integrity": "sha512-YeQoDpq4Lm8ppSBqAnAeF/xy1cYp/dMTif2JFcvmAbETMRlvKHT2iLcWu+WyYiJO3b3Ivokwo7EQca/xfLVJmg==", + "dev": true + }, + "@types/chai": { + "version": "3.4.34", + "resolved": "http://registry.npmjs.org/@types/chai/-/chai-3.4.34.tgz", + "integrity": "sha1-1TNXkoI7sJzd1eOMPSEbcJGDhU0=", + "dev": true + }, + "@types/chalk": { + "version": "0.4.31", + "resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-0.4.31.tgz", + "integrity": "sha1-ox10JBprHtu5c8822XooloNKUfk=", + "dev": true + }, + "@types/chart.js": { + "version": "2.7.40", + "resolved": "https://registry.npmjs.org/@types/chart.js/-/chart.js-2.7.40.tgz", + "integrity": "sha512-yC8Ff5vsHFTClGCWXoAmNCh33cNYfP2/yFANBLjLiso4jTKsLfQ0KQuBEuKxOWTRoOSLyT6v+ZYcvz0uonvvsA==" + }, + "@types/es6-promise": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/es6-promise/-/es6-promise-0.0.33.tgz", + "integrity": "sha512-HKJFVLCGrWQ/1unEw8JdaTxu6n3EUxmwTxJ6D0O1x0gD8joCsgoTWxEgevb7fp2XIogNjof3KEd+3bJoGne/nw==" + }, + "@types/events": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/@types/events/-/events-1.2.0.tgz", + "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==", + "dev": true + }, + "@types/express-serve-static-core": { + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.16.0.tgz", + "integrity": "sha512-lTeoCu5NxJU4OD9moCgm0ESZzweAx0YqsAcab6OB0EB3+As1OaHtKnaGJvcngQxYsi9UNv0abn4/DRavrRxt4w==", + "dev": true, + "requires": { + "@types/events": "*", + "@types/node": "*", + "@types/range-parser": "*" + } + }, + "@types/finalhandler": { + "version": "0.0.31", + "resolved": "http://registry.npmjs.org/@types/finalhandler/-/finalhandler-0.0.31.tgz", + "integrity": "sha1-7PMvOpu0Om+0BFdQ6h5VJYLTXcM=", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/fs-extra": { + "version": "5.0.1", + "resolved": "http://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.0.1.tgz", + "integrity": "sha512-h3wnflb+jMTipvbbZnClgA2BexrT4w0GcfoCz5qyxd0IRsbqhLSyesM6mqZTAnhbVmhyTm5tuxfRu9R+8l+lGw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/glob": { + "version": "5.0.30", + "resolved": "http://registry.npmjs.org/@types/glob/-/glob-5.0.30.tgz", + "integrity": "sha1-ECZAnFYlqGiQdGAoCNCCsoZ7ilE=", + "dev": true, + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/gulp": { + "version": "3.8.32", + "resolved": "http://registry.npmjs.org/@types/gulp/-/gulp-3.8.32.tgz", + "integrity": "sha1-g8WcaBzCM9Hsf4LSaVVVZvoTMVY=", + "dev": true, + "requires": { + "@types/node": "*", + "@types/orchestrator": "*", + "@types/vinyl": "*" + } + }, + "@types/gulp-replace": { + "version": "0.0.29", + "resolved": "http://registry.npmjs.org/@types/gulp-replace/-/gulp-replace-0.0.29.tgz", + "integrity": "sha1-gFqGw0pcz8+IS8E24GgzHkj5tls=", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/karma": { + "version": "0.13.33", + "resolved": "http://registry.npmjs.org/@types/karma/-/karma-0.13.33.tgz", + "integrity": "sha1-ODXT2U6IS23oiEo+cKb1aQ5qWFA=", + "dev": true, + "requires": { + "@types/bluebird": "*", + "@types/log4js": "*", + "@types/node": "*" + } + }, + "@types/lodash": { + "version": "4.14.74", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.74.tgz", + "integrity": "sha512-BZknw3E/z3JmCLqQVANcR17okqVTPZdlxvcIz0fJiJVLUCbSH1hK3zs9r634PVSmrzAxN+n/fxlVRiYoArdOIQ==" + }, + "@types/log4js": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@types/log4js/-/log4js-2.3.5.tgz", + "integrity": "sha512-SwF8LkSHqHy9A8GQ67NAYJiGl8zzP4Qtx65Wa+IOxDGdMHxKeoQZjg7m2M1erIT6VK0DYHpu2aTbdLkdkuMHjw==", + "dev": true, + "requires": { + "log4js": "*" + } + }, + "@types/merge2": { + "version": "0.3.29", + "resolved": "http://registry.npmjs.org/@types/merge2/-/merge2-0.3.29.tgz", + "integrity": "sha1-y1UumCbKPAjZ5lSd6ezY8VQX8G0=", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/mime": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.0.tgz", + "integrity": "sha512-A2TAGbTFdBw9azHbpVd+/FkdW2T6msN1uct1O9bH3vTerEHKZhTXJUQXy+hNq1B0RagfU8U+KBdqiZpxjhOUQA==", + "dev": true + }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true + }, + "@types/mocha": { + "version": "2.2.38", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.38.tgz", + "integrity": "sha1-jBiPbjTC58Px0BJ9kI1aNuWmDck=", + "dev": true + }, + "@types/mz": { + "version": "0.0.32", + "resolved": "https://registry.npmjs.org/@types/mz/-/mz-0.0.32.tgz", + "integrity": "sha512-cy3yebKhrHuOcrJGkfwNHhpTXQLgmXSv1BX+4p32j+VUQ6aP2eJ5cL7OvGcAQx75fCTFaAIIAKewvqL+iwSd4g==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/node": { + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.5.8.tgz", + "integrity": "sha512-8KmlRxwbKZfjUHFIt3q8TF5S2B+/E5BaAoo/3mgc5h6FJzqxXkCK/VMetO+IRDtwtU6HUvovHMBn+XRj7SV9Qg==" + }, + "@types/node-notifier": { + "version": "0.0.28", + "resolved": "http://registry.npmjs.org/@types/node-notifier/-/node-notifier-0.0.28.tgz", + "integrity": "sha1-hro9OqjZGDUswxkdiN4yiyDck8E=", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/orchestrator": { + "version": "0.0.30", + "resolved": "http://registry.npmjs.org/@types/orchestrator/-/orchestrator-0.0.30.tgz", + "integrity": "sha1-3N2o1ke1aLex40F4yx8LRKyamOU=", + "dev": true, + "requires": { + "@types/q": "*" + } + }, + "@types/q": { + "version": "0.0.32", + "resolved": "http://registry.npmjs.org/@types/q/-/q-0.0.32.tgz", + "integrity": "sha1-vShOV8hPEyXacCur/IKlMoGQwMU=", + "dev": true + }, + "@types/ramda": { + "version": "0.25.41", + "resolved": "https://registry.npmjs.org/@types/ramda/-/ramda-0.25.41.tgz", + "integrity": "sha512-R6IkySFkrCN6Xd3exKX1PI2hvkmpbDZBKYz7u4uuYas8NeUCmcHkccYo6OWKtWIkYipjGBQP2ZzlTT+R3bUY6Q==", + "dev": true + }, + "@types/range-parser": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", + "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==", + "dev": true + }, + "@types/react": { + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.4.2.tgz", + "integrity": "sha512-oVcVteCDNiVc/fkDjowRfAZQDEOR76j3CJ3FvwXNvfV6zJguhghy1lMgpAzYox+9AZsWch+JPV6Imml3wvIUeg==", + "requires": { + "csstype": "^2.2.0" + } + }, + "@types/react-dom": { + "version": "16.0.5", + "resolved": "http://registry.npmjs.org/@types/react-dom/-/react-dom-16.0.5.tgz", + "integrity": "sha512-ony2hEYlGXCLWNAWWgbsHR7qVvDbeMRFc5b43+7dhj3n+zXzxz81HV9Yjpc3JD8vLCiwYoSLqFCI6bD0+0zG2Q==", + "requires": { + "@types/node": "*", + "@types/react": "*" + } + }, + "@types/requirejs": { + "version": "2.1.29", + "resolved": "https://registry.npmjs.org/@types/requirejs/-/requirejs-2.1.29.tgz", + "integrity": "sha1-vEi8gzwHnCwkumr7ym06A7P04vM=" + }, + "@types/resolve": { + "version": "0.0.4", + "resolved": "http://registry.npmjs.org/@types/resolve/-/resolve-0.0.4.tgz", + "integrity": "sha1-m1htZalH3qiMS8JNoLkF/pUgoNU=", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/rimraf": { + "version": "0.0.28", + "resolved": "http://registry.npmjs.org/@types/rimraf/-/rimraf-0.0.28.tgz", + "integrity": "sha1-VWJRm8eWPKyoq/fxKMrjtZTUHQY=", + "dev": true + }, + "@types/semver": { + "version": "5.3.33", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-5.3.33.tgz", + "integrity": "sha512-UwrBgjsRS8BSsckIEdrAhIAmdh0MJidtKTvD3S6tpMq6qHLY3uGaNYcRDUjPxpF4hOAOEbMNSXhhfxmNHB1QNQ==", + "dev": true + }, + "@types/serve-static": { + "version": "1.7.31", + "resolved": "http://registry.npmjs.org/@types/serve-static/-/serve-static-1.7.31.tgz", + "integrity": "sha1-FUVt6NmNa0z/Mb5savdJKuY/Uho=", + "dev": true, + "requires": { + "@types/express-serve-static-core": "*", + "@types/mime": "*" + } + }, + "@types/tapable": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.2.tgz", + "integrity": "sha512-42zEJkBpNfMEAvWR5WlwtTH22oDzcMjFsL9gDGExwF8X8WvAiw7Vwop7hPw03QT8TKfec83LwbHj6SvpqM4ELQ==", + "dev": true + }, + "@types/through2": { + "version": "2.0.32", + "resolved": "http://registry.npmjs.org/@types/through2/-/through2-2.0.32.tgz", + "integrity": "sha1-RwAkRQ8at2QPGfnr9C09pXTCYSk=", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/uglify-js": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.0.4.tgz", + "integrity": "sha512-SudIN9TRJ+v8g5pTG8RRCqfqTMNqgWCKKd3vtynhGzkIIjxaicNAMuY5TRadJ6tzDu3Dotf3ngaMILtmOdmWEQ==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "@types/uuid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-3.0.0.tgz", + "integrity": "sha512-CGaBAcUB4o+YTaUBZ2VfBc7PcIZXwHflZs4FDtr5Kk7MpAl0PVfH7W/VqoHH+OAG41d9YSCV8eWDfz/KKqVm+A==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/vinyl": { + "version": "1.2.30", + "resolved": "http://registry.npmjs.org/@types/vinyl/-/vinyl-1.2.30.tgz", + "integrity": "sha1-kRXAxFxAxXVziQa+n7Tfb1ueUBM=", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/webpack": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.4.0.tgz", + "integrity": "sha512-G7TXt4IRP7NTQO8R8QyDN7YwkQzlxjiKhA+z7W5FvkGbK7kIdOUtW2e7AE2w33Q10uphyG+vr8pfRy7wBWLmsA==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/tapable": "*", + "@types/uglify-js": "*", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "@types/webpack-env": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.13.1.tgz", + "integrity": "sha512-oHyg0NssP2RCpCvE35hhbSqMJRsc5lSW+GFe+Vc65JL+kHII1VMYM+0KeV/z4utFuUqPoQRmq8KMMp7ba0dj6Q==" + }, + "@types/webpack-stream": { + "version": "3.2.10", + "resolved": "http://registry.npmjs.org/@types/webpack-stream/-/webpack-stream-3.2.10.tgz", + "integrity": "sha512-gzUDP7oa60qMUlKUUoT7EZJ77OpGPJ9ZmNFLfcG7ITJS80lIx/9r6F2MkGJNLjsNV/ygDGVHGLn4/5e8813/Og==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/webpack": "*" + } + }, + "@types/yargs": { + "version": "0.0.34", + "resolved": "http://registry.npmjs.org/@types/yargs/-/yargs-0.0.34.tgz", + "integrity": "sha1-FWBCn8VQxDvEGnt9PfoK+8yRSjU=", + "dev": true + }, + "@types/z-schema": { + "version": "3.16.31", + "resolved": "https://registry.npmjs.org/@types/z-schema/-/z-schema-3.16.31.tgz", + "integrity": "sha1-LrHQCl5Ow/pYx2r94S4YK2bcXBw=" + }, + "@uifabric/icons": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@uifabric/icons/-/icons-5.8.0.tgz", + "integrity": "sha512-EUhKxYlIPJshg4fQvCNTYSk0p7RhzEWeEAJBV4sao1SKmN0/pZBnkLbDqWjU5VUfdwZZYiIdaLRpM+pyzhniZw==", + "requires": { + "@uifabric/styling": ">=5.30.1 <6.0.0", + "tslib": "^1.7.1" + } + }, + "@uifabric/merge-styles": { + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/@uifabric/merge-styles/-/merge-styles-5.17.1.tgz", + "integrity": "sha512-4/EtO6Ns7kNtKxC+6InShwVQeNQEDT5H8Ex7m/i4OrT9i7csje4YwBQPkkpm31qJwEZEyD7bbAwyLezI63sLhg==", + "requires": { + "tslib": "^1.7.1" + } + }, + "@uifabric/styling": { + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/@uifabric/styling/-/styling-5.37.0.tgz", + "integrity": "sha512-3hC0itW/hWSD5J4uANzUKk8XVGWUNkU+VLjEjWsQ6i5lvwFGaanR6Qy0bTkZdFGqFWMXe91CkBHV7HnvEx7tCA==", + "requires": { + "@microsoft/load-themed-styles": "^1.7.13", + "@uifabric/merge-styles": ">=5.17.1 <6.0.0", + "@uifabric/utilities": ">=5.34.2 <6.0.0", + "tslib": "^1.7.1" + } + }, + "@uifabric/utilities": { + "version": "5.34.2", + "resolved": "https://registry.npmjs.org/@uifabric/utilities/-/utilities-5.34.2.tgz", + "integrity": "sha512-7LDHamnrKpY49S49Nzu1YMTuBtZIgTsQd9AuWTvXlUevD67ZyjSRnhCKlKVZHwe/Vi0jWLIodbup4p5IyRGWoQ==", + "requires": { + "@uifabric/merge-styles": ">=5.17.1 <6.0.0", + "prop-types": "^15.5.10", + "tslib": "^1.7.1" + } + }, + "@yarnpkg/lockfile": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.0.2.tgz", + "integrity": "sha512-MqJ00WXw89ga0rK6GZkdmmgv3bAsxpJixyTthjcix73O44pBqotyU2BejBkLuIsaOBI6SEu77vAnSyLe5iIHkw==", + "dev": true + }, + "@zkochan/cmd-shim": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@zkochan/cmd-shim/-/cmd-shim-2.2.4.tgz", + "integrity": "sha512-BDy1oz6aFYyY73618IkXzJzFghnXwVZDc3SVa6MVKTrrk4RgubahAF5yKK+Mx4a78tfO0OHeZnJKPs0pNy5uNA==", + "dev": true, + "requires": { + "is-windows": "^1.0.0", + "mkdirp-promise": "^5.0.1", + "mz": "^2.5.0" + } + }, + "abab": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz", + "integrity": "sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4=", + "dev": true + }, + "abbrev": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", + "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", + "dev": true + }, + "accepts": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", + "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=", + "dev": true, + "requires": { + "mime-types": "~2.1.11", + "negotiator": "0.6.1" + } + }, + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "dev": true + }, + "acorn-dynamic-import": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", + "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", + "dev": true, + "requires": { + "acorn": "^4.0.3" + }, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", + "dev": true + } + } + }, + "acorn-globals": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.0.tgz", + "integrity": "sha512-hMtHj3s5RnuhvHPowpBYvJVj3rAar82JiDQHvGs1zO0l10ocX/xEdBShNHTJaboucJUsScghp74pH3s7EnHHQw==", + "dev": true, + "requires": { + "acorn": "^6.0.1", + "acorn-walk": "^6.0.1" + }, + "dependencies": { + "acorn": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.4.tgz", + "integrity": "sha512-VY4i5EKSKkofY2I+6QLTbTTN/UvEQPCo6eiwzzSaSWfpaDhOmStMCMod6wmuPciNq+XS0faCglFu2lHZpdHUtg==", + "dev": true + } + } + }, + "acorn-walk": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.1.1.tgz", + "integrity": "sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw==", + "dev": true + }, + "adal-angular": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/adal-angular/-/adal-angular-1.0.16.tgz", + "integrity": "sha1-4rwxvHEqr/ugU6pN1GvITrXSCQ8=" + }, + "after": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", + "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", + "dev": true + }, + "agent-base": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", + "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", + "dev": true, + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "ajv": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.2.5.tgz", + "integrity": "sha1-tjcjTT4mdetfefxlIkKoU6SMtJ8=", + "dev": true, + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "json-schema-traverse": "^0.3.0", + "json-stable-stringify": "^1.0.1" + }, + "dependencies": { + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + } + } + }, + "ajv-keywords": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", + "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", + "dev": true + }, + "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" + } + } + } + }, + "alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", + "dev": true + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, + "ansi-colors": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "dev": true, + "requires": { + "ansi-wrap": "^0.1.0" + } + }, + "ansi-escapes": { + "version": "3.1.0", + "resolved": "http://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", + "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", + "dev": true + }, + "ansi-gray": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", + "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "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 + }, + "ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", + "dev": true + }, + "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": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "append-transform": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", + "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", + "dev": true, + "requires": { + "default-require-extensions": "^1.0.0" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-differ": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", + "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", + "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-equal": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", + "dev": true + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "http://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "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-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "arraybuffer.slice": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz", + "integrity": "sha1-8zshWfBTKj8xB6JywMz70a0peco=", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "dev": true, + "requires": { + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "http://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "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 + }, + "ast-types": { + "version": "0.9.6", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.9.6.tgz", + "integrity": "sha1-ECyenpAF0+fjgpvwxPok7oYu6bk=", + "dev": true + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", + "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", + "dev": true, + "requires": { + "lodash": "^4.17.10" + }, + "dependencies": { + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + } + } + }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", + "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 + }, + "async-limiter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", + "dev": true + }, + "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": "9.1.5", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.1.5.tgz", + "integrity": "sha512-kk4Zb6RUc58ld7gdosERHMF3DzIYJc2fp5sX46qEsGXQQy5bXsu8qyLjoxuY1NuQ/cJuCYnx99BfjwnRggrYIw==", + "dev": true, + "requires": { + "browserslist": "^4.1.0", + "caniuse-lite": "^1.0.30000884", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.2", + "postcss-value-parser": "^3.2.3" + } + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "dev": true + }, + "azure-storage": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/azure-storage/-/azure-storage-2.8.3.tgz", + "integrity": "sha512-gcbdUY0tLivJvjUZD9BAxWrRDcige4OLFHhN3kY0p9oZYAFNNNqwgO7rBXvV+zdoX9HajeMOEog9/S/wxabeGg==", + "dev": true, + "requires": { + "browserify-mime": "~1.2.9", + "extend": "~1.2.1", + "json-edm-parser": "0.1.2", + "md5.js": "1.3.4", + "readable-stream": "~2.0.0", + "request": "^2.86.0", + "underscore": "~1.8.3", + "uuid": "^3.0.0", + "validator": "~9.4.1", + "xml2js": "0.2.8", + "xmlbuilder": "0.4.3" + }, + "dependencies": { + "extend": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-1.2.1.tgz", + "integrity": "sha1-oPX9bPyDpf5J72mNYOyKYk3UV2w=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "md5.js": { + "version": "1.3.4", + "resolved": "http://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", + "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "readable-stream": { + "version": "2.0.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", + "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", + "dev": true, + "requires": { + "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" + } + }, + "validator": { + "version": "9.4.1", + "resolved": "http://registry.npmjs.org/validator/-/validator-9.4.1.tgz", + "integrity": "sha512-YV5KjzvRmSyJ1ee/Dm5UED0G+1L4GZnLN3w6/T+zZm8scVua4sOhYKWTUrKa0H/tMiJyO9QLHMPN+9mB/aMunA==", + "dev": true + } + } + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + }, + "dependencies": { + "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 + } + } + }, + "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": { + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + } + } + }, + "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": { + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + } + } + }, + "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-jest": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-22.4.4.tgz", + "integrity": "sha512-A9NB6/lZhYyypR9ATryOSDcqBaqNdzq4U+CN+/wcMsLcmKkPxQEoTKLajGfd3IkxNyVBT8NewUK2nWyGbSzHEQ==", + "dev": true, + "requires": { + "babel-plugin-istanbul": "^4.1.5", + "babel-preset-jest": "^22.4.4" + } + }, + "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-istanbul": { + "version": "4.1.6", + "resolved": "http://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz", + "integrity": "sha512-PWP9FQ1AhZhS01T/4qLSKoHGY/xvkZdVBGlKM/HuxxS3+sC66HhTNR7+MpbO/so/cz/wY94MeSWJuP1hXIPfwQ==", + "dev": true, + "requires": { + "babel-plugin-syntax-object-rest-spread": "^6.13.0", + "find-up": "^2.1.0", + "istanbul-lib-instrument": "^1.10.1", + "test-exclude": "^4.2.1" + } + }, + "babel-plugin-jest-hoist": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-22.4.4.tgz", + "integrity": "sha512-DUvGfYaAIlkdnygVIEl0O4Av69NtuQWcrjMOv6DODPuhuGLDnbsARz3AwiiI/EkIMMlxQDUcrZ9yoyJvTNjcVQ==", + "dev": true + }, + "babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "http://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", + "dev": true + }, + "babel-preset-jest": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-22.4.4.tgz", + "integrity": "sha512-+dxMtOFwnSYWfum0NaEc0O03oSdwBsjx4tMSChRDPGwu/4wSY6Q6ANW3wkjKpJzzguaovRs/DODcT4hbSN8yiA==", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "^22.4.4", + "babel-plugin-syntax-object-rest-spread": "^6.13.0" + } + }, + "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": { + "core-js": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.0.tgz", + "integrity": "sha512-kLRC6ncVpuEW/1kwrOXYX6KQASCVtrh1gQr/UiaVgFlf9WE5Vp+lNe5+h3LuMr5PAucWnnEXwH0nQHRH/gpGtw==", + "dev": true + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "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" + }, + "dependencies": { + "core-js": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.0.tgz", + "integrity": "sha512-kLRC6ncVpuEW/1kwrOXYX6KQASCVtrh1gQr/UiaVgFlf9WE5Vp+lNe5+h3LuMr5PAucWnnEXwH0nQHRH/gpGtw==", + "dev": true + } + } + }, + "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" + }, + "dependencies": { + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + } + } + }, + "babel-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" + }, + "dependencies": { + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + } + } + }, + "babel-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" + }, + "dependencies": { + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + } + } + }, + "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.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-arraybuffer": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", + "dev": true + }, + "base64-js": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", + "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", + "dev": true + }, + "base64id": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", + "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", + "dev": true + }, + "batch": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.5.3.tgz", + "integrity": "sha1-PzQU84AyF0O/wQQvmoP/HVgk1GQ=", + "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" + } + }, + "beeper": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", + "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", + "dev": true + }, + "better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "dev": true, + "requires": { + "callsite": "1.0.0" + } + }, + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true + }, + "binary-extensions": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.12.0.tgz", + "integrity": "sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg==", + "dev": true + }, + "binaryextensions": { + "version": "1.0.1", + "resolved": "http://registry.npmjs.org/binaryextensions/-/binaryextensions-1.0.1.tgz", + "integrity": "sha1-HmN0iLNbWL2l9HdL+WpSEqjJB1U=", + "dev": true + }, + "bindings": { + "version": "1.2.1", + "resolved": "http://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz", + "integrity": "sha1-FK1hE4EtLTfXLme0ystLtyZQXxE=", + "dev": true + }, + "blob": { + "version": "0.0.4", + "resolved": "http://registry.npmjs.org/blob/-/blob-0.0.4.tgz", + "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=", + "dev": true + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "dev": true, + "requires": { + "inherits": "~2.0.0" + } + }, + "bluebird": { + "version": "2.11.0", + "resolved": "http://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", + "integrity": "sha1-U0uQM8AiyVecVro7Plpcqvu2UOE=", + "dev": true + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + }, + "body-parser": { + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", + "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", + "dev": true, + "requires": { + "bytes": "3.0.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "~1.6.3", + "iconv-lite": "0.4.23", + "on-finished": "~2.3.0", + "qs": "6.5.2", + "raw-body": "2.3.3", + "type-is": "~1.6.16" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + } + } + }, + "bole": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/bole/-/bole-3.0.2.tgz", + "integrity": "sha1-vIpIPKlASdqbg3wa0Rzf6+5uBRQ=", + "dev": true, + "requires": { + "fast-safe-stringify": "~1.1.0", + "individual": "~3.0.0" + } + }, + "brace": { + "version": "0.11.1", + "resolved": "http://registry.npmjs.org/brace/-/brace-0.11.1.tgz", + "integrity": "sha1-SJb8ydVE7vRfS7dmDbMg07N5/lg=" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "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" + } + } + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browser-process-hrtime": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz", + "integrity": "sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==", + "dev": true + }, + "browser-resolve": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "dev": true, + "requires": { + "resolve": "1.1.7" + }, + "dependencies": { + "resolve": { + "version": "1.1.7", + "resolved": "http://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + } + } + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-mime": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/browserify-mime/-/browserify-mime-1.2.9.tgz", + "integrity": "sha1-rrGvKN5sDXpqLOQK22j/GEIq8x8=", + "dev": true + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dev": true, + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.3.5.tgz", + "integrity": "sha512-z9ZhGc3d9e/sJ9dIx5NFXkKoaiQTnrvrMsN3R1fGb1tkWWNSz12UewJn9TNxGo1l7J23h0MRaPmk7jfeTZYs1w==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30000912", + "electron-to-chromium": "^1.3.86", + "node-releases": "^1.0.5" + } + }, + "bser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.0.0.tgz", + "integrity": "sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk=", + "dev": true, + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer": { + "version": "4.9.1", + "resolved": "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + } + } + }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dev": true, + "requires": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", + "dev": true + }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", + "dev": true + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "builtins": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", + "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=", + "dev": true + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", + "dev": true + }, + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + }, + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "dev": true, + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "http://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + } + } + }, + "caniuse-api": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz", + "integrity": "sha1-tTTnxzTE+B7F++isoq0kNUuWLGw=", + "dev": true, + "requires": { + "browserslist": "^1.3.6", + "caniuse-db": "^1.0.30000529", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + }, + "dependencies": { + "browserslist": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", + "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", + "dev": true, + "requires": { + "caniuse-db": "^1.0.30000639", + "electron-to-chromium": "^1.2.7" + } + } + } + }, + "caniuse-db": { + "version": "1.0.30000918", + "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000918.tgz", + "integrity": "sha512-ZaBZBV3FSuGf1/rOEMY+hfyb2GNgOY9vXQzBSVtXEeLTbYu5y/qcXeu8oFXG6WX9LhLf+v+JEH8lT7YWUHb6VA==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30000918", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000918.tgz", + "integrity": "sha512-CAZ9QXGViBvhHnmIHhsTPSWFBujDaelKnUj7wwImbyQRxmXynYqKGi3UaZTSz9MoVh+1EVxOS/DFIkrJYgR3aw==", + "dev": true + }, + "capture-exit": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-1.2.0.tgz", + "integrity": "sha1-HF/MSJ/QqwDU8ax64QcuMXP7q28=", + "dev": true, + "requires": { + "rsvp": "^3.3.3" + } + }, + "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" + } + }, + "chai": { + "version": "3.5.0", + "resolved": "http://registry.npmjs.org/chai/-/chai-3.5.0.tgz", + "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=", + "dev": true, + "requires": { + "assertion-error": "^1.0.1", + "deep-eql": "^0.1.3", + "type-detect": "^1.0.0" + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "http://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" + } + }, + "chart.js": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-2.7.3.tgz", + "integrity": "sha512-3+7k/DbR92m6BsMUYP6M0dMsMVZpMnwkUyNSAbqolHKsbIzH2Q4LWVEHHYq7v0fmEV8whXE0DrjANulw9j2K5g==", + "requires": { + "chartjs-color": "^2.1.0", + "moment": "^2.10.2" + } + }, + "chartjs-color": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/chartjs-color/-/chartjs-color-2.2.0.tgz", + "integrity": "sha1-hKL7dVeH7YXDndbdjHsdiEKbrq4=", + "requires": { + "chartjs-color-string": "^0.5.0", + "color-convert": "^0.5.3" + }, + "dependencies": { + "color-convert": { + "version": "0.5.3", + "resolved": "http://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz", + "integrity": "sha1-vbbGnOZg+t/+CwAHzER+G59ygr0=" + } + } + }, + "chartjs-color-string": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/chartjs-color-string/-/chartjs-color-string-0.5.0.tgz", + "integrity": "sha512-amWNvCOXlOUYxZVDSa0YOab5K/lmEhbFNKI55PWc4mlv28BDzA7zaoQTGxSBgJMHIW+hGX8YUrvw/FH4LyhwSQ==", + "requires": { + "color-name": "^1.0.0" + } + }, + "chartjs-plugin-streaming": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/chartjs-plugin-streaming/-/chartjs-plugin-streaming-1.7.1.tgz", + "integrity": "sha512-JHtwko9SqObpSgdy9bs3iqZmmpyXSD0akHhQtdggzFTsD8T4vaomdLjK9YhDA99QIGAF8pqE+Mm3OL9mZuD0kg==", + "requires": { + "chart.js": "^2.7.0", + "moment": "^2.10.2" + } + }, + "chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "dev": true, + "requires": { + "anymatch": "^1.3.0", + "async-each": "^1.0.0", + "fsevents": "^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" + }, + "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" + } + } + } + }, + "chownr": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", + "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", + "dev": true + }, + "ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", + "dev": true + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "circular-json": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.5.9.tgz", + "integrity": "sha512-4ivwqHpIFJZBuhN3g/pEcdbnGUywkBblloGbkglyloVjjR3uT6tieI89MVOfbP2tHX5sgb01FuLgAOzebNlJNQ==", + "dev": true + }, + "clap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz", + "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==", + "dev": true, + "requires": { + "chalk": "^1.1.3" + } + }, + "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-css": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz", + "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==", + "dev": true, + "requires": { + "source-map": "~0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "dev": true, + "requires": { + "restore-cursor": "^1.0.1" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", + "dev": true + }, + "clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", + "dev": true + }, + "cloneable-readable": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.2.tgz", + "integrity": "sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "http://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" + } + } + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "coa": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz", + "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=", + "dev": true, + "requires": { + "q": "^1.1.2" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.0.tgz", + "integrity": "sha512-CwyopLkuRYO5ei2EpzpIh6LqJMt6Mt+jZhO5VI5f/wJLZriXQE32/SSqzmrh+QB+AZT81Cj8yv+7zwToW8ahZg==", + "requires": { + "color-convert": "^1.9.1", + "color-string": "^1.5.2" + } + }, + "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==", + "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=" + }, + "color-string": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", + "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "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 + }, + "colormin": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz", + "integrity": "sha1-6i90IKcrlogaOKrlnsEkpvcpgTM=", + "dev": true, + "requires": { + "color": "^0.11.0", + "css-color-names": "0.0.4", + "has": "^1.0.1" + }, + "dependencies": { + "color": { + "version": "0.11.4", + "resolved": "http://registry.npmjs.org/color/-/color-0.11.4.tgz", + "integrity": "sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=", + "dev": true, + "requires": { + "clone": "^1.0.2", + "color-convert": "^1.3.0", + "color-string": "^0.3.0" + } + }, + "color-string": { + "version": "0.3.0", + "resolved": "http://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz", + "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", + "dev": true, + "requires": { + "color-name": "^1.0.0" + } + } + } + }, + "colors": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.5.tgz", + "integrity": "sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==", + "dev": true + }, + "combine-lists": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/combine-lists/-/combine-lists-1.0.1.tgz", + "integrity": "sha1-RYwH4J4NkA/Ci3Cj/sLazR0st/Y=", + "dev": true, + "requires": { + "lodash": "^4.5.0" + }, + "dependencies": { + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + } + } + }, + "combined-stream": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", + "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==" + }, + "component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", + "dev": true + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "http://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" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "connect": { + "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-livereload": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/connect-livereload/-/connect-livereload-0.5.4.tgz", + "integrity": "sha1-gBV9E3HJ83zBQDmrGJWXDRGdw7w=", + "dev": true + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "requires": { + "date-now": "^0.1.4" + } + }, + "console-control-strings": { + "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 + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", + "dev": true + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "convert-source-map": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "copy-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": "1.2.7", + "resolved": "http://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" + }, + "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 + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + } + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "css-color-names": { + "version": "0.0.4", + "resolved": "http://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", + "dev": true + }, + "css-loader": { + "version": "0.28.11", + "resolved": "http://registry.npmjs.org/css-loader/-/css-loader-0.28.11.tgz", + "integrity": "sha512-wovHgjAx8ZIMGSL8pTys7edA1ClmzxHeY6n/d97gg5odgsxEgKjULPR0viqyC+FWMCL9sfqoC/QCUBo62tLvPg==", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "css-selector-tokenizer": "^0.7.0", + "cssnano": "^3.10.0", + "icss-utils": "^2.1.0", + "loader-utils": "^1.0.2", + "lodash.camelcase": "^4.3.0", + "object-assign": "^4.1.1", + "postcss": "^5.0.6", + "postcss-modules-extract-imports": "^1.2.0", + "postcss-modules-local-by-default": "^1.2.0", + "postcss-modules-scope": "^1.1.0", + "postcss-modules-values": "^1.3.0", + "postcss-value-parser": "^3.3.0", + "source-list-map": "^2.0.0" + }, + "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" + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "postcss-modules-extract-imports": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz", + "integrity": "sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw==", + "dev": true, + "requires": { + "postcss": "^6.0.1" + }, + "dependencies": { + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + }, + "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 + }, + "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" + } + } + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "css-modules-loader-core": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/css-modules-loader-core/-/css-modules-loader-core-1.1.0.tgz", + "integrity": "sha1-WQhmgpShvs0mGuCkziGwtVHyHRY=", + "dev": true, + "requires": { + "icss-replace-symbols": "1.1.0", + "postcss": "6.0.1", + "postcss-modules-extract-imports": "1.1.0", + "postcss-modules-local-by-default": "1.2.0", + "postcss-modules-scope": "1.1.0", + "postcss-modules-values": "1.3.0" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.1.tgz", + "integrity": "sha1-AA29H47vIXqjaLmiEsX8QLKo8/I=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "css-selector-tokenizer": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz", + "integrity": "sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA==", + "dev": true, + "requires": { + "cssesc": "^0.1.0", + "fastparse": "^1.1.1", + "regexpu-core": "^1.0.0" + } + }, + "cssesc": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", + "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=", + "dev": true + }, + "cssnano": { + "version": "3.10.0", + "resolved": "http://registry.npmjs.org/cssnano/-/cssnano-3.10.0.tgz", + "integrity": "sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg=", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "autoprefixer": { + "version": "6.7.7", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz", + "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=", + "dev": true, + "requires": { + "browserslist": "^1.7.6", + "caniuse-db": "^1.0.30000634", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^5.2.16", + "postcss-value-parser": "^3.2.3" + } + }, + "browserslist": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", + "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", + "dev": true, + "requires": { + "caniuse-db": "^1.0.30000639", + "electron-to-chromium": "^1.2.7" + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "csso": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz", + "integrity": "sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=", + "dev": true, + "requires": { + "clap": "^1.0.9", + "source-map": "^0.5.3" + } + }, + "cssom": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.4.tgz", + "integrity": "sha512-+7prCSORpXNeR4/fUP3rL+TzqtiFfhMvTd7uEqMdgPvLPt4+uzFUeufx5RHjGTACCargg/DiEt/moMQmvnfkog==", + "dev": true + }, + "cssstyle": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.3.1.tgz", + "integrity": "sha512-tNvaxM5blOnxanyxI6panOsnfiyLRj3HV4qjqqS45WPNS1usdYWRUQjqTEEELK73lpeP/1KoIGYUwrBn/VcECA==", + "dev": true, + "requires": { + "cssom": "0.3.x" + } + }, + "csstype": { + "version": "2.5.8", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.5.8.tgz", + "integrity": "sha512-r4DbsyNJ7slwBSKoGesxDubRWJ71ghG8W2+1HcsDlAo12KGca9dDLv0u98tfdFw7ldBdoA7XmCnI6Q8LpAJXaQ==" + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "^1.0.1" + } + }, + "custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", + "dev": true + }, + "d": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/d/-/d-1.0.0.tgz", + "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "dev": true, + "requires": { + "es5-ext": "^0.10.9" + } + }, + "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-urls": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", + "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", + "dev": true, + "requires": { + "abab": "^2.0.0", + "whatwg-mimetype": "^2.2.0", + "whatwg-url": "^7.0.0" + }, + "dependencies": { + "abab": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz", + "integrity": "sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w==", + "dev": true + }, + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, + "whatwg-url": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz", + "integrity": "sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + } + } + }, + "date-format": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-1.2.0.tgz", + "integrity": "sha1-YV6CjiM90aubua4JUODOzPpuytg=", + "dev": true + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "dateformat": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", + "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=", + "dev": true + }, + "deasync": { + "version": "0.1.14", + "resolved": "https://registry.npmjs.org/deasync/-/deasync-0.1.14.tgz", + "integrity": "sha512-wN8sIuEqIwyQh72AG7oY6YQODCxIp1eXzEZlZznBuwDF8Q03Tdy9QNp1BNZXeadXoklNrw+Ip1fch+KXo/+ASw==", + "dev": true, + "requires": { + "bindings": "~1.2.1", + "node-addon-api": "^1.6.0" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "debuglog": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", + "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=", + "dev": true + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "decomment": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/decomment/-/decomment-0.9.2.tgz", + "integrity": "sha512-sblyUmOJZxiL7oJ2ogJS6jtl/67+CTOW87SrYE/96u3PhDYikYoLCdLzcnceToiQejOLlqNnLCkaxx/+nE/ehg==", + "dev": true, + "requires": { + "esprima": "4.0.1" + } + }, + "deep-eql": { + "version": "0.1.3", + "resolved": "http://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", + "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=", + "dev": true, + "requires": { + "type-detect": "0.1.1" + }, + "dependencies": { + "type-detect": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", + "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=", + "dev": true + } + } + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "default-require-extensions": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", + "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", + "dev": true, + "requires": { + "strip-bom": "^2.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + } + } + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "requires": { + "clone": "^1.0.2" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "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" + } + } + } + }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", + "dev": true + }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "dev": true, + "requires": { + "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": { + "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": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "deprecated": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/deprecated/-/deprecated-0.0.1.tgz", + "integrity": "sha1-+cmvVGSvoeepcUWKi97yqpTVuxk=", + "dev": true + }, + "des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detect-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" + } + }, + "detect-newline": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", + "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", + "dev": true + }, + "dezalgo": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", + "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", + "dev": true, + "requires": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", + "dev": true + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", + "dev": true, + "requires": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "domexception": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", + "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "dev": true, + "requires": { + "webidl-conversions": "^4.0.2" + }, + "dependencies": { + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + } + } + }, + "duplexer": { + "version": "0.1.1", + "resolved": "http://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", + "dev": true + }, + "duplexer2": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", + "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", + "dev": true, + "requires": { + "readable-stream": "~1.1.9" + } + }, + "duplexify": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.1.tgz", + "integrity": "sha512-vM58DwdnKmty+FSPzT14K9JXb90H+j5emaR4KYbr2KTIz00WHGbWOe5ghQTx233ZCLZtrGDALzKwcjEtSt35mA==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "http://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" + } + } + } + }, + "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.3.90", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.90.tgz", + "integrity": "sha512-IjJZKRhFbWSOX1w0sdIXgp4CMRguu6UYcTckyFF/Gjtemsu/25eZ+RXwFlV+UWcIueHyQA1UnRJxocTpH5NdGA==", + "dev": true + }, + "elliptic": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz", + "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", + "dev": true, + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "requires": { + "iconv-lite": "~0.4.13" + } + }, + "end-of-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.1.0.tgz", + "integrity": "sha1-6TUyWLqpEIll78QcsO+K3i88+wc=", + "dev": true, + "requires": { + "once": "~1.3.0" + }, + "dependencies": { + "once": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", + "dev": true, + "requires": { + "wrappy": "1" + } + } + } + }, + "engine.io": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-1.8.5.tgz", + "integrity": "sha512-j1DWIcktw4hRwrv6nWx++5nFH2X64x16MAG2P0Lmi5Dvdfi3I+Jhc7JKJIdAmDJa+5aZ/imHV7dWRPy2Cqjh3A==", + "dev": true, + "requires": { + "accepts": "1.3.3", + "base64id": "1.0.0", + "cookie": "0.3.1", + "debug": "2.3.3", + "engine.io-parser": "1.3.2", + "ws": "~1.1.5" + }, + "dependencies": { + "debug": { + "version": "2.3.3", + "resolved": "http://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "http://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + }, + "ws": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.5.tgz", + "integrity": "sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w==", + "dev": true, + "requires": { + "options": ">=0.0.5", + "ultron": "1.0.x" + } + } + } + }, + "engine.io-client": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-1.8.5.tgz", + "integrity": "sha512-AYTgHyeVUPitsseqjoedjhYJapNVoSPShbZ+tEUX9/73jgZ/Z3sUlJf9oYgdEBBdVhupUpUqSxH0kBCXlQnmZg==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "component-inherit": "0.0.3", + "debug": "2.3.3", + "engine.io-parser": "1.3.2", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parsejson": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "~1.1.5", + "xmlhttprequest-ssl": "1.5.3", + "yeast": "0.1.2" + }, + "dependencies": { + "debug": { + "version": "2.3.3", + "resolved": "http://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "http://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + }, + "ws": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.5.tgz", + "integrity": "sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w==", + "dev": true, + "requires": { + "options": ">=0.0.5", + "ultron": "1.0.x" + } + } + } + }, + "engine.io-parser": { + "version": "1.3.2", + "resolved": "http://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.3.2.tgz", + "integrity": "sha1-k3sHnwAH0Ik+xW1GyyILjLQ1Igo=", + "dev": true, + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "0.0.6", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.4", + "has-binary": "0.1.7", + "wtf-8": "1.0.0" + } + }, + "enhanced-resolve": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", + "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "object-assign": "^4.0.1", + "tapable": "^0.2.7" + } + }, + "ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", + "dev": true + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", + "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", + "dev": true, + "requires": { + "es-to-primitive": "^1.1.1", + "function-bind": "^1.1.1", + "has": "^1.0.1", + "is-callable": "^1.1.3", + "is-regex": "^1.0.4" + } + }, + "es-to-primitive": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", + "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es5-ext": { + "version": "0.10.46", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.46.tgz", + "integrity": "sha512-24XxRvJXNFwEMpJb3nOkiRJKRoupmjYmOPVlI65Qy2SrtxwOTB+g6ODjBKOtwEHbYrhWRty9xxOWLNdClT2djw==", + "dev": true, + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.1", + "next-tick": "1" + } + }, + "es6-collections": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/es6-collections/-/es6-collections-0.5.6.tgz", + "integrity": "sha1-VVLoAK0SwYIM2ivUp5rn27A9iaI=" + }, + "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-map": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-set": "~0.1.5", + "es6-symbol": "~3.1.1", + "event-emitter": "~0.3.5" + } + }, + "es6-promise": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.5.tgz", + "integrity": "sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg==" + }, + "es6-promisify": { + "version": "5.0.0", + "resolved": "http://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "dev": true, + "requires": { + "es6-promise": "^4.0.3" + } + }, + "es6-set": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", + "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-symbol": "3.1.1", + "event-emitter": "~0.3.5" + } + }, + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "es6-templates": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/es6-templates/-/es6-templates-0.2.3.tgz", + "integrity": "sha1-XLmsn7He1usSOTQrgdeSu7QHjuQ=", + "dev": true, + "requires": { + "recast": "~0.11.12", + "through": "~2.3.6" + } + }, + "es6-weak-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", + "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.14", + "es6-iterator": "^2.0.1", + "es6-symbol": "^3.1.1" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "escodegen": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.0.tgz", + "integrity": "sha512-IeMV45ReixHS53K/OmfKAIztN/igDHzTJUhZM3k1jMhIZWjk45SMwAtBsEXiJp3vSPmTcu6CXn7mDvFHRN66fw==", + "dev": true, + "requires": { + "esprima": "^3.1.3", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "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, + "optional": true + } + } + }, + "escope": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", + "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", + "dev": true, + "requires": { + "es6-map": "^0.1.3", + "es6-weak-map": "^2.0.1", + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "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" + } + }, + "event-stream": { + "version": "3.0.20", + "resolved": "http://registry.npmjs.org/event-stream/-/event-stream-3.0.20.tgz", + "integrity": "sha1-A4u7LqnqkDhbJvvBhU0LU58qvqM=", + "dev": true, + "requires": { + "duplexer": "~0.1.1", + "from": "~0", + "map-stream": "~0.0.3", + "pause-stream": "0.0.11", + "split": "0.2", + "stream-combiner": "~0.0.3", + "through": "~2.3.1" + } + }, + "eventemitter3": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz", + "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==", + "dev": true + }, + "events": { + "version": "1.1.1", + "resolved": "http://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "dev": true + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "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" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "exit-hook": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", + "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", + "dev": true + }, + "expand-braces": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/expand-braces/-/expand-braces-0.1.2.tgz", + "integrity": "sha1-SIsdHSRRyz06axks/AMPRMWFX+o=", + "dev": true, + "requires": { + "array-slice": "^0.2.3", + "array-unique": "^0.2.1", + "braces": "^0.1.2" + }, + "dependencies": { + "array-slice": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", + "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", + "dev": true + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "braces": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-0.1.5.tgz", + "integrity": "sha1-wIVxEIUpHYt1/ddOqw+FlygHEeY=", + "dev": true, + "requires": { + "expand-range": "^0.1.0" + } + }, + "expand-range": { + "version": "0.1.1", + "resolved": "http://registry.npmjs.org/expand-range/-/expand-range-0.1.1.tgz", + "integrity": "sha1-TLjtoJk8pW+k9B/ELzy7TMrf8EQ=", + "dev": true, + "requires": { + "is-number": "^0.1.1", + "repeat-string": "^0.2.2" + } + }, + "is-number": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-0.1.1.tgz", + "integrity": "sha1-aaevEWlj1HIG7JvZtIoUIW8eOAY=", + "dev": true + }, + "repeat-string": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-0.2.2.tgz", + "integrity": "sha1-x6jTI2BoNiBZp+RlH8aITosftK4=", + "dev": true + } + } + }, + "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": "http://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "requires": { + "fill-range": "^2.1.0" + }, + "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" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + }, + "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": "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" + } + }, + "expect": { + "version": "22.4.3", + "resolved": "http://registry.npmjs.org/expect/-/expect-22.4.3.tgz", + "integrity": "sha512-XcNXEPehqn8b/jm8FYotdX0YrXn36qp4HWlrVT4ktwQas1l1LPxiVWncYnnL2eyMtKAmVIaG0XAp0QlrqJaxaA==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "jest-diff": "^22.4.3", + "jest-get-type": "^22.4.3", + "jest-matcher-utils": "^22.4.3", + "jest-message-util": "^22.4.3", + "jest-regex-util": "^22.4.3" + }, + "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" + } + } + } + }, + "express": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", + "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", + "dev": true, + "requires": { + "accepts": "~1.3.5", + "array-flatten": "1.1.1", + "body-parser": "1.18.3", + "content-disposition": "0.5.2", + "content-type": "~1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.1.1", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.4", + "qs": "6.5.2", + "range-parser": "~1.2.0", + "safe-buffer": "5.1.2", + "send": "0.16.2", + "serve-static": "1.13.2", + "setprototypeof": "1.1.0", + "statuses": "~1.4.0", + "type-is": "~1.6.16", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "accepts": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", + "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "dev": true, + "requires": { + "mime-types": "~2.1.18", + "negotiator": "0.6.1" + } + }, + "finalhandler": { + "version": "1.1.1", + "resolved": "http://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", + "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.4.0", + "unpipe": "~1.0.0" + } + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "dev": true + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "external-editor": { + "version": "1.1.1", + "resolved": "http://registry.npmjs.org/external-editor/-/external-editor-1.1.1.tgz", + "integrity": "sha1-Etew24UPf/fnCBuvQAVwAGDEYAs=", + "dev": true, + "requires": { + "extend": "^3.0.0", + "spawn-sync": "^1.0.15", + "tmp": "^0.0.29" + }, + "dependencies": { + "tmp": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.29.tgz", + "integrity": "sha1-8lEl/w3Z2jzLDC3Tce4SiLuRKMA=", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.1" + } + } + } + }, + "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.6.7", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz", + "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=", + "dev": true, + "requires": { + "concat-stream": "1.6.2", + "debug": "2.6.9", + "mkdirp": "0.5.1", + "yauzl": "2.4.1" + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fancy-log": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", + "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", + "dev": true, + "requires": { + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "parse-node-version": "^1.0.0", + "time-stamp": "^1.0.0" + } + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fast-safe-stringify": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-1.1.13.tgz", + "integrity": "sha1-oB6c2cnkkXFcmKdaQtXwu9EH/3Y=", + "dev": true + }, + "fastparse": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", + "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", + "dev": true + }, + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "fb-watchman": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", + "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", + "dev": true, + "requires": { + "bser": "^2.0.0" + } + }, + "fbjs": { + "version": "0.8.17", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.17.tgz", + "integrity": "sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=", + "requires": { + "core-js": "^1.0.0", + "isomorphic-fetch": "^2.1.1", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^0.7.18" + } + }, + "fd-slicer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", + "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", + "dev": true, + "requires": { + "pend": "~1.2.0" + } + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + } + }, + "file-loader": { + "version": "1.1.11", + "resolved": "http://registry.npmjs.org/file-loader/-/file-loader-1.1.11.tgz", + "integrity": "sha512-TGR4HU7HUsGg6GCOPJnFk06RhWgEWFLAGWiT6rcD+GRC2keU3s9RGJ+b3Z6/U73jwwNb2gKLJ7YCrp+jvU4ALg==", + "dev": true, + "requires": { + "loader-utils": "^1.0.2", + "schema-utils": "^0.4.5" + }, + "dependencies": { + "ajv": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.1.tgz", + "integrity": "sha512-ZoJjft5B+EJBjUyu9C9Hc0OZyPZSSlOF+plzouTrg6UlA8f+e/n8NIgBFG/9tppJtpPWfthHakK7juJdNDODww==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "schema-utils": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", + "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "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 + }, + "fileset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", + "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", + "dev": true, + "requires": { + "glob": "^7.0.3", + "minimatch": "^3.0.3" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "finalhandler": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.3.1", + "unpipe": "~1.0.0" + }, + "dependencies": { + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "dev": true + } + } + }, + "find-index": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz", + "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=", + "dev": true + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "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" + } + }, + "fined": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.1.1.tgz", + "integrity": "sha512-jQp949ZmEbiYHk3gkbdtpJ0G1+kgtLQBNdP5edFP7Fh+WAYceLQz6yO1SBj72Xkg8GVyTB3bBzAYrHJVh5Xd5g==", + "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" + } + }, + "first-chunk-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", + "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=", + "dev": true + }, + "flagged-respawn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.0.tgz", + "integrity": "sha1-Tnmumy6zi/hrO7Vr8+ClaqX8q9c=", + "dev": true + }, + "flatted": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.0.tgz", + "integrity": "sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg==", + "dev": true + }, + "flatten": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz", + "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=", + "dev": true + }, + "follow-redirects": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", + "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", + "dev": true, + "requires": { + "debug": "=3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "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 + }, + "fork-stream": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/fork-stream/-/fork-stream-0.0.4.tgz", + "integrity": "sha1-24Sfznf2cIpfjzhq5TOgkHtUrnA=", + "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" + } + }, + "formatio": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.1.1.tgz", + "integrity": "sha1-XtPM1jZVEJc4NGXZlhmRAOhhYek=", + "dev": true, + "requires": { + "samsam": "~1.1" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "from": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", + "dev": true + }, + "fs-extra": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", + "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs-minipass": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", + "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", + "dev": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", + "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.9.2", + "node-pre-gyp": "^0.10.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "2.6.9", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.21", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": "^2.1.0" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "minipass": { + "version": "2.2.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.1", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.2.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.10.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.0", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.1.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.1.10", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.5.1", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.0.5" + } + }, + "safe-buffer": { + "version": "5.1.1", + "bundled": true, + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.5.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.0.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.2.4", + "minizlib": "^1.1.0", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.1", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "3.0.2", + "bundled": true, + "dev": true + } + } + }, + "fstream": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", + "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "http://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "gaze": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz", + "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=", + "dev": true, + "requires": { + "globule": "~0.1.0" + } + }, + "generic-names": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/generic-names/-/generic-names-1.0.3.tgz", + "integrity": "sha1-LXhqEhruUIh2eWk56OO/+DbCCRc=", + "dev": true, + "requires": { + "loader-utils": "^0.2.16" + }, + "dependencies": { + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" + } + } + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "git-repo-info": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/git-repo-info/-/git-repo-info-1.1.4.tgz", + "integrity": "sha1-E0n6OIinZh6h/2OgR8L/Q7PglgI=", + "dev": true + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-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": { + "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-escape": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/glob-escape/-/glob-escape-0.0.2.tgz", + "integrity": "sha1-nCf3gh7RwTd1gvPv2VWOP2dWKO0=", + "dev": true + }, + "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" + }, + "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" + } + } + } + }, + "glob-stream": { + "version": "3.1.18", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.18.tgz", + "integrity": "sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs=", + "dev": true, + "requires": { + "glob": "^4.3.1", + "glob2base": "^0.0.12", + "minimatch": "^2.0.1", + "ordered-read-streams": "^0.1.0", + "through2": "^0.6.1", + "unique-stream": "^1.0.0" + }, + "dependencies": { + "glob": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", + "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=", + "dev": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^2.0.1", + "once": "^1.3.0" + } + }, + "minimatch": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", + "dev": true, + "requires": { + "brace-expansion": "^1.0.0" + } + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "through2": { + "version": "0.6.5", + "resolved": "http://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + } + } + }, + "glob-watcher": { + "version": "0.0.6", + "resolved": "http://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.6.tgz", + "integrity": "sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs=", + "dev": true, + "requires": { + "gaze": "^0.5.1" + } + }, + "glob2base": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", + "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=", + "dev": true, + "requires": { + "find-index": "^0.1.1" + } + }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "requires": { + "global-prefix": "^1.0.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" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "globby": { + "version": "5.0.0", + "resolved": "http://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "globule": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz", + "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=", + "dev": true, + "requires": { + "glob": "~3.1.21", + "lodash": "~1.0.1", + "minimatch": "~0.2.11" + }, + "dependencies": { + "glob": { + "version": "3.1.21", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", + "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=", + "dev": true, + "requires": { + "graceful-fs": "~1.2.0", + "inherits": "1", + "minimatch": "~0.2.11" + } + }, + "graceful-fs": { + "version": "1.2.3", + "resolved": "http://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", + "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=", + "dev": true + }, + "inherits": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", + "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=", + "dev": true + }, + "minimatch": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", + "dev": true, + "requires": { + "lru-cache": "2", + "sigmund": "~1.0.0" + } + } + } + }, + "glogg": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", + "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", + "dev": true, + "requires": { + "sparkles": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true + }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true + }, + "gulp": { + "version": "3.9.1", + "resolved": "http://registry.npmjs.org/gulp/-/gulp-3.9.1.tgz", + "integrity": "sha1-VxzkWSjdQK9lFPxAEYZgFsE4RbQ=", + "dev": true, + "requires": { + "archy": "^1.0.0", + "chalk": "^1.0.0", + "deprecated": "^0.0.1", + "gulp-util": "^3.0.0", + "interpret": "^1.0.0", + "liftoff": "^2.1.0", + "minimist": "^1.1.0", + "orchestrator": "^0.3.0", + "pretty-hrtime": "^1.0.0", + "semver": "^4.1.0", + "tildify": "^1.0.0", + "v8flags": "^2.0.2", + "vinyl-fs": "^0.3.0" + }, + "dependencies": { + "semver": { + "version": "4.3.6", + "resolved": "http://registry.npmjs.org/semver/-/semver-4.3.6.tgz", + "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", + "dev": true + } + } + }, + "gulp-connect": { + "version": "5.5.0", + "resolved": "http://registry.npmjs.org/gulp-connect/-/gulp-connect-5.5.0.tgz", + "integrity": "sha512-oRBLjw/4EVaZb8g8OcxOVdGD8ZXYrRiWKcNxlrGjxb/6Cp0GDdqw7ieX7D8xJrQS7sbXT+G94u63pMJF3MMjQA==", + "dev": true, + "requires": { + "ansi-colors": "^1.0.1", + "connect": "^3.6.5", + "connect-livereload": "^0.5.4", + "event-stream": "^3.3.2", + "fancy-log": "^1.3.2", + "send": "^0.13.2", + "serve-index": "^1.9.1", + "serve-static": "^1.13.1", + "tiny-lr": "^0.2.1" + }, + "dependencies": { + "debug": { + "version": "2.2.0", + "resolved": "http://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true, + "requires": { + "ms": "0.7.1" + } + }, + "etag": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.7.0.tgz", + "integrity": "sha1-A9MLX2fdbmMtKUXTDWZScxo01dg=", + "dev": true + }, + "event-stream": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.5.tgz", + "integrity": "sha512-vyibDcu5JL20Me1fP734QBH/kenBGLZap2n0+XXM7mvuUPzJ20Ydqj1aKcIeMdri1p+PU+4yAKugjN8KCVst+g==", + "dev": true, + "requires": { + "duplexer": "^0.1.1", + "from": "^0.1.7", + "map-stream": "0.0.7", + "pause-stream": "^0.0.11", + "split": "^1.0.1", + "stream-combiner": "^0.2.2", + "through": "^2.3.8" + } + }, + "fresh": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz", + "integrity": "sha1-ZR+DjiJCTnVm3hYdg1jKoZn4PU8=", + "dev": true + }, + "http-errors": { + "version": "1.3.1", + "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", + "integrity": "sha1-GX4izevUGYWF6GlO9nhhl7ke2UI=", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "statuses": "1" + } + }, + "mime": { + "version": "1.3.4", + "resolved": "http://registry.npmjs.org/mime/-/mime-1.3.4.tgz", + "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=", + "dev": true + }, + "ms": { + "version": "0.7.1", + "resolved": "http://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + }, + "range-parser": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.0.3.tgz", + "integrity": "sha1-aHKCNTXGkuLCoBA4Jq/YLC4P8XU=", + "dev": true + }, + "send": { + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.13.2.tgz", + "integrity": "sha1-dl52B8gFVFK7pvCwUllTUJhgNt4=", + "dev": true, + "requires": { + "debug": "~2.2.0", + "depd": "~1.1.0", + "destroy": "~1.0.4", + "escape-html": "~1.0.3", + "etag": "~1.7.0", + "fresh": "0.3.0", + "http-errors": "~1.3.1", + "mime": "1.3.4", + "ms": "0.7.1", + "on-finished": "~2.3.0", + "range-parser": "~1.0.3", + "statuses": "~1.2.1" + } + }, + "split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "dev": true, + "requires": { + "through": "2" + } + }, + "statuses": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.2.1.tgz", + "integrity": "sha1-3e1FzBglbVHtQK7BQkidXGECbSg=", + "dev": true + }, + "stream-combiner": { + "version": "0.2.2", + "resolved": "http://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", + "integrity": "sha1-rsjLrBd7Vrb0+kec7YwZEs7lKFg=", + "dev": true, + "requires": { + "duplexer": "~0.1.1", + "through": "~2.3.4" + } + } + } + }, + "gulp-flatten": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/gulp-flatten/-/gulp-flatten-0.2.0.tgz", + "integrity": "sha1-iS1RfjjXkA/UVM+aHgIQMA6S6wY=", + "dev": true, + "requires": { + "gulp-util": "^3.0.1", + "through2": "^2.0.0" + } + }, + "gulp-if": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/gulp-if/-/gulp-if-2.0.2.tgz", + "integrity": "sha1-pJe351cwBQQcqivIt92jyARE1ik=", + "dev": true, + "requires": { + "gulp-match": "^1.0.3", + "ternary-stream": "^2.0.1", + "through2": "^2.0.1" + } + }, + "gulp-karma": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/gulp-karma/-/gulp-karma-0.0.5.tgz", + "integrity": "sha1-RLoZejEFTlyXOlujOUITwUKAOVg=", + "dev": true, + "requires": { + "event-stream": "~3.0.20", + "gulp-util": "~2.2.14", + "optimist": "~0.6.0", + "xtend": "~2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "0.2.1", + "resolved": "http://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", + "integrity": "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk=", + "dev": true + }, + "ansi-styles": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz", + "integrity": "sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94=", + "dev": true + }, + "chalk": { + "version": "0.5.1", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", + "integrity": "sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ=", + "dev": true, + "requires": { + "ansi-styles": "^1.1.0", + "escape-string-regexp": "^1.0.0", + "has-ansi": "^0.1.0", + "strip-ansi": "^0.3.0", + "supports-color": "^0.2.0" + } + }, + "dateformat": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", + "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1", + "meow": "^3.3.0" + } + }, + "gulp-util": { + "version": "2.2.20", + "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-2.2.20.tgz", + "integrity": "sha1-1xRuVyiRC9jwR6awseVJvCLb1kw=", + "dev": true, + "requires": { + "chalk": "^0.5.0", + "dateformat": "^1.0.7-1.2.3", + "lodash._reinterpolate": "^2.4.1", + "lodash.template": "^2.4.1", + "minimist": "^0.2.0", + "multipipe": "^0.1.0", + "through2": "^0.5.0", + "vinyl": "^0.2.1" + } + }, + "has-ansi": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", + "integrity": "sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4=", + "dev": true, + "requires": { + "ansi-regex": "^0.2.0" + } + }, + "lodash._reinterpolate": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz", + "integrity": "sha1-TxInqlqHEfxjL1sHofRgequLMiI=", + "dev": true + }, + "lodash.escape": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-2.4.1.tgz", + "integrity": "sha1-LOEsXghNsKV92l5dHu659dF1o7Q=", + "dev": true, + "requires": { + "lodash._escapehtmlchar": "~2.4.1", + "lodash._reunescapedhtml": "~2.4.1", + "lodash.keys": "~2.4.1" + } + }, + "lodash.keys": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", + "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", + "dev": true, + "requires": { + "lodash._isnative": "~2.4.1", + "lodash._shimkeys": "~2.4.1", + "lodash.isobject": "~2.4.1" + } + }, + "lodash.template": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-2.4.1.tgz", + "integrity": "sha1-nmEQB+32KRKal0qzxIuBez4c8g0=", + "dev": true, + "requires": { + "lodash._escapestringchar": "~2.4.1", + "lodash._reinterpolate": "~2.4.1", + "lodash.defaults": "~2.4.1", + "lodash.escape": "~2.4.1", + "lodash.keys": "~2.4.1", + "lodash.templatesettings": "~2.4.1", + "lodash.values": "~2.4.1" + } + }, + "lodash.templatesettings": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-2.4.1.tgz", + "integrity": "sha1-6nbHXRHrhtTb6JqDiTu4YZKaxpk=", + "dev": true, + "requires": { + "lodash._reinterpolate": "~2.4.1", + "lodash.escape": "~2.4.1" + } + }, + "minimist": { + "version": "0.2.0", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.2.0.tgz", + "integrity": "sha1-Tf/lJdriuGTGbC4jxicdev3s784=", + "dev": true + }, + "object-keys": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", + "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "strip-ansi": { + "version": "0.3.0", + "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", + "integrity": "sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA=", + "dev": true, + "requires": { + "ansi-regex": "^0.2.1" + } + }, + "supports-color": { + "version": "0.2.0", + "resolved": "http://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz", + "integrity": "sha1-2S3iaU6z9nMjlz1649i1W0wiGQo=", + "dev": true + }, + "through2": { + "version": "0.5.1", + "resolved": "http://registry.npmjs.org/through2/-/through2-0.5.1.tgz", + "integrity": "sha1-390BLrnHAOIyP9M084rGIqs3Lac=", + "dev": true, + "requires": { + "readable-stream": "~1.0.17", + "xtend": "~3.0.0" + }, + "dependencies": { + "xtend": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", + "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=", + "dev": true + } + } + }, + "vinyl": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.2.3.tgz", + "integrity": "sha1-vKk4IJWC7FpJrVOKAPofEl5RMlI=", + "dev": true, + "requires": { + "clone-stats": "~0.0.1" + } + }, + "xtend": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", + "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", + "dev": true, + "requires": { + "object-keys": "~0.4.0" + } + } + } + }, + "gulp-match": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/gulp-match/-/gulp-match-1.0.3.tgz", + "integrity": "sha1-kcfA1/Kb7NZgbVfYCn+Hdqh6uo4=", + "dev": true, + "requires": { + "minimatch": "^3.0.3" + } + }, + "gulp-open": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/gulp-open/-/gulp-open-3.0.1.tgz", + "integrity": "sha512-dohokw+npnt48AsD0hhvCLEHLnDMqM35F+amvIfJlX1H2nNHYUClR0Oy1rI0TvbL1/pHiHGNLmohhk+kvwIKjA==", + "dev": true, + "requires": { + "colors": "^1.1.2", + "opn": "5.2.0", + "plugin-log": "^0.1.0", + "through2": "^2.0.1" + } + }, + "gulp-replace": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/gulp-replace/-/gulp-replace-0.5.4.tgz", + "integrity": "sha1-aaZ5FLvRPFYr/xT1BKQDeWqg2qk=", + "dev": true, + "requires": { + "istextorbinary": "1.0.2", + "readable-stream": "^2.0.1", + "replacestream": "^4.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "http://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" + } + } + } + }, + "gulp-util": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", + "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", + "dev": true, + "requires": { + "array-differ": "^1.0.0", + "array-uniq": "^1.0.2", + "beeper": "^1.0.0", + "chalk": "^1.0.0", + "dateformat": "^2.0.0", + "fancy-log": "^1.1.0", + "gulplog": "^1.0.0", + "has-gulplog": "^0.1.0", + "lodash._reescape": "^3.0.0", + "lodash._reevaluate": "^3.0.0", + "lodash._reinterpolate": "^3.0.0", + "lodash.template": "^3.0.0", + "minimist": "^1.1.0", + "multipipe": "^0.1.2", + "object-assign": "^3.0.0", + "replace-ext": "0.0.1", + "through2": "^2.0.0", + "vinyl": "^0.5.0" + }, + "dependencies": { + "object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", + "dev": true + }, + "vinyl": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", + "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", + "dev": true, + "requires": { + "clone": "^1.0.0", + "clone-stats": "^0.0.1", + "replace-ext": "0.0.1" + } + } + } + }, + "gulplog": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", + "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", + "dev": true, + "requires": { + "glogg": "^1.0.0" + } + }, + "handlebars": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.12.tgz", + "integrity": "sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA==", + "dev": true, + "requires": { + "async": "^2.5.0", + "optimist": "^0.6.1", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "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.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "dev": true, + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.1.tgz", + "integrity": "sha512-ZoJjft5B+EJBjUyu9C9Hc0OZyPZSSlOF+plzouTrg6UlA8f+e/n8NIgBFG/9tppJtpPWfthHakK7juJdNDODww==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + } + } + }, + "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-binary": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.7.tgz", + "integrity": "sha1-aOYesWIQyVRaClzOBqhzkS/h5ow=", + "dev": true, + "requires": { + "isarray": "0.0.1" + } + }, + "has-binary2": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", + "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", + "dev": true, + "requires": { + "isarray": "2.0.1" + }, + "dependencies": { + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + } + } + }, + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-gulplog": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", + "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", + "dev": true, + "requires": { + "sparkles": "^1.0.0" + } + }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "dev": true + }, + "has-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": { + "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" + } + } + } + }, + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "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" + } + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "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.1", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", + "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hosted-git-info": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "dev": true + }, + "html-comment-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", + "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==", + "dev": true + }, + "html-encoding-sniffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "dev": true, + "requires": { + "whatwg-encoding": "^1.0.1" + } + }, + "html-loader": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-0.5.5.tgz", + "integrity": "sha512-7hIW7YinOYUpo//kSYcPB6dCKoceKLmOwjEMmhIobHuWGDVl0Nwe4l68mdG/Ru0wcUxQjVMEoZpkalZ/SE7zog==", + "dev": true, + "requires": { + "es6-templates": "^0.2.3", + "fastparse": "^1.1.1", + "html-minifier": "^3.5.8", + "loader-utils": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "html-minifier": { + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", + "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", + "dev": true, + "requires": { + "camel-case": "3.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.2.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" + }, + "dependencies": { + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + } + } + }, + "http-errors": { + "version": "1.6.3", + "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "http-parser-js": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.0.tgz", + "integrity": "sha512-cZdEF7r4gfRIq7ezX9J0T+kQmJNOub71dWbgAXVHDct80TKP4MCETtZQ31xyv38UwgzkWPYF/Xc0ge55dW9Z9w==", + "dev": true + }, + "http-proxy": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", + "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==", + "dev": true, + "requires": { + "eventemitter3": "^3.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "https-proxy-agent": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz", + "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==", + "dev": true, + "requires": { + "agent-base": "^4.1.0", + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "icss-replace-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", + "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=", + "dev": true + }, + "icss-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", + "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", + "dev": true, + "requires": { + "postcss": "^6.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + }, + "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 + }, + "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" + } + } + } + }, + "ieee754": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", + "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==", + "dev": true + }, + "import-local": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", + "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", + "dev": true, + "requires": { + "pkg-dir": "^2.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "in-publish": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz", + "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=", + "dev": true + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", + "dev": true + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "individual": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/individual/-/individual-3.0.0.tgz", + "integrity": "sha1-58pPhfiVewGHNPKFdQ3CLsL5hi0=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "inpath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/inpath/-/inpath-1.0.2.tgz", + "integrity": "sha1-SsIZcQ7Hpy9GD/lL9CTdPvDlKBc=", + "dev": true + }, + "inquirer": { + "version": "1.2.3", + "resolved": "http://registry.npmjs.org/inquirer/-/inquirer-1.2.3.tgz", + "integrity": "sha1-TexvMvN+97sLLtPx0aXD9UUHSRg=", + "dev": true, + "requires": { + "ansi-escapes": "^1.1.0", + "chalk": "^1.0.0", + "cli-cursor": "^1.0.1", + "cli-width": "^2.0.0", + "external-editor": "^1.1.0", + "figures": "^1.3.5", + "lodash": "^4.3.0", + "mute-stream": "0.0.6", + "pinkie-promise": "^2.0.0", + "run-async": "^2.2.0", + "rx": "^4.1.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-escapes": { + "version": "1.4.0", + "resolved": "http://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "mute-stream": { + "version": "0.0.6", + "resolved": "http://registry.npmjs.org/mute-stream/-/mute-stream-0.0.6.tgz", + "integrity": "sha1-SJYrGeFp/R38JAs/HnMXYnu8R9s=", + "dev": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "http://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "interpret": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", + "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", + "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" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "ipaddr.js": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", + "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=", + "dev": true + }, + "is-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-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", + "dev": true + }, + "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": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "^1.0.0" + } + }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "dev": true + }, + "is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "dev": true, + "requires": { + "ci-info": "^1.5.0" + } + }, + "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-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "is-descriptor": { + "version": "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.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-generator-fn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-1.0.0.tgz", + "integrity": "sha1-lp1J4bszKfa7fwkIm+JleLLd1Go=", + "dev": true + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.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" + } + } + } + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "dev": true, + "requires": { + "is-path-inside": "^1.0.0" + } + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "^1.0.1" + } + }, + "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-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "^1.0.1" + } + }, + "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=" + }, + "is-svg": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz", + "integrity": "sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk=", + "dev": true, + "requires": { + "html-comment-regex": "^1.1.0" + } + }, + "is-symbol": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "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-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "isbinaryfile": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", + "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", + "dev": true, + "requires": { + "buffer-alloc": "^1.2.0" + } + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "isomorphic-fetch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", + "requires": { + "node-fetch": "^1.0.1", + "whatwg-fetch": ">=0.10.0" + } + }, + "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 + }, + "istanbul": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", + "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", + "dev": true, + "requires": { + "abbrev": "1.0.x", + "async": "1.x", + "escodegen": "1.8.x", + "esprima": "2.7.x", + "glob": "^5.0.15", + "handlebars": "^4.0.1", + "js-yaml": "3.x", + "mkdirp": "0.5.x", + "nopt": "3.x", + "once": "1.x", + "resolve": "1.1.x", + "supports-color": "^3.1.0", + "which": "^1.1.1", + "wordwrap": "^1.0.0" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "http://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "escodegen": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", + "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", + "dev": true, + "requires": { + "esprima": "^2.7.1", + "estraverse": "^1.9.1", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.2.0" + } + }, + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "estraverse": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", + "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", + "dev": true + }, + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "resolve": { + "version": "1.1.7", + "resolved": "http://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + }, + "source-map": { + "version": "0.2.0", + "resolved": "http://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", + "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", + "dev": true, + "optional": true, + "requires": { + "amdefine": ">=0.0.4" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + } + } + }, + "istanbul-api": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.3.7.tgz", + "integrity": "sha512-4/ApBnMVeEPG3EkSzcw25wDe4N66wxwn+KKn6b47vyek8Xb3NBAcg4xfuQbS7BqcZuTX4wxfD5lVagdggR3gyA==", + "dev": true, + "requires": { + "async": "^2.1.4", + "fileset": "^2.0.2", + "istanbul-lib-coverage": "^1.2.1", + "istanbul-lib-hook": "^1.2.2", + "istanbul-lib-instrument": "^1.10.2", + "istanbul-lib-report": "^1.1.5", + "istanbul-lib-source-maps": "^1.2.6", + "istanbul-reports": "^1.5.1", + "js-yaml": "^3.7.0", + "mkdirp": "^0.5.1", + "once": "^1.4.0" + } + }, + "istanbul-instrumenter-loader": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-3.0.1.tgz", + "integrity": "sha512-a5SPObZgS0jB/ixaKSMdn6n/gXSrK2S6q/UfRJBT3e6gQmVjwZROTODQsYW5ZNwOu78hG62Y3fWlebaVOL0C+w==", + "dev": true, + "requires": { + "convert-source-map": "^1.5.0", + "istanbul-lib-instrument": "^1.7.3", + "loader-utils": "^1.1.0", + "schema-utils": "^0.3.0" + } + }, + "istanbul-lib-coverage": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz", + "integrity": "sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.2.tgz", + "integrity": "sha512-/Jmq7Y1VeHnZEQ3TL10VHyb564mn6VrQXHchON9Jf/AEcmQ3ZIiyD1BVzNOKTZf/G3gE+kiGK6SmpF9y3qGPLw==", + "dev": true, + "requires": { + "append-transform": "^0.4.0" + } + }, + "istanbul-lib-instrument": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz", + "integrity": "sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A==", + "dev": true, + "requires": { + "babel-generator": "^6.18.0", + "babel-template": "^6.16.0", + "babel-traverse": "^6.18.0", + "babel-types": "^6.18.0", + "babylon": "^6.18.0", + "istanbul-lib-coverage": "^1.2.1", + "semver": "^5.3.0" + } + }, + "istanbul-lib-report": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.5.tgz", + "integrity": "sha512-UsYfRMoi6QO/doUshYNqcKJqVmFe9w51GZz8BS3WB0lYxAllQYklka2wP9+dGZeHYaWIdcXUx8JGdbqaoXRXzw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^1.2.1", + "mkdirp": "^0.5.1", + "path-parse": "^1.0.5", + "supports-color": "^3.1.2" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.6.tgz", + "integrity": "sha512-TtbsY5GIHgbMsMiRw35YBHGpZ1DVFEO19vxxeiDMYaeOFOCzfnYVxvl6pOUIZR4dtPhAGpSMup8OyF8ubsaqEg==", + "dev": true, + "requires": { + "debug": "^3.1.0", + "istanbul-lib-coverage": "^1.2.1", + "mkdirp": "^0.5.1", + "rimraf": "^2.6.1", + "source-map": "^0.5.3" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, + "requires": { + "glob": "^7.0.5" + } + } + } + }, + "istanbul-reports": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.5.1.tgz", + "integrity": "sha512-+cfoZ0UXzWjhAdzosCPP3AN8vvef8XDkWtTfgaN+7L3YTpNYITnCaEkceo5SEYy644VkHka/P1FvkWvrG/rrJw==", + "dev": true, + "requires": { + "handlebars": "^4.0.3" + } + }, + "istextorbinary": { + "version": "1.0.2", + "resolved": "http://registry.npmjs.org/istextorbinary/-/istextorbinary-1.0.2.tgz", + "integrity": "sha1-rOGTVNGpoBc+/rEITOD4ewrX3s8=", + "dev": true, + "requires": { + "binaryextensions": "~1.0.0", + "textextensions": "~1.0.0" + } + }, + "jest-changed-files": { + "version": "22.4.3", + "resolved": "http://registry.npmjs.org/jest-changed-files/-/jest-changed-files-22.4.3.tgz", + "integrity": "sha512-83Dh0w1aSkUNFhy5d2dvqWxi/y6weDwVVLU6vmK0cV9VpRxPzhTeGimbsbRDSnEoszhF937M4sDLLeS7Cu/Tmw==", + "dev": true, + "requires": { + "throat": "^4.0.0" + } + }, + "jest-cli": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-22.4.4.tgz", + "integrity": "sha512-I9dsgkeyjVEEZj9wrGrqlH+8OlNob9Iptyl+6L5+ToOLJmHm4JwOPatin1b2Bzp5R5YRQJ+oiedx7o1H7wJzhA==", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "import-local": "^1.0.0", + "is-ci": "^1.0.10", + "istanbul-api": "^1.1.14", + "istanbul-lib-coverage": "^1.1.1", + "istanbul-lib-instrument": "^1.8.0", + "istanbul-lib-source-maps": "^1.2.1", + "jest-changed-files": "^22.2.0", + "jest-config": "^22.4.4", + "jest-environment-jsdom": "^22.4.1", + "jest-get-type": "^22.1.0", + "jest-haste-map": "^22.4.2", + "jest-message-util": "^22.4.0", + "jest-regex-util": "^22.1.0", + "jest-resolve-dependencies": "^22.1.0", + "jest-runner": "^22.4.4", + "jest-runtime": "^22.4.4", + "jest-snapshot": "^22.4.0", + "jest-util": "^22.4.1", + "jest-validate": "^22.4.4", + "jest-worker": "^22.2.2", + "micromatch": "^2.3.11", + "node-notifier": "^5.2.1", + "realpath-native": "^1.0.0", + "rimraf": "^2.5.4", + "slash": "^1.0.0", + "string-length": "^2.0.0", + "strip-ansi": "^4.0.0", + "which": "^1.2.12", + "yargs": "^10.0.3" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "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" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "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" + } + }, + "node-notifier": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.3.0.tgz", + "integrity": "sha512-AhENzCSGZnZJgBARsUjnQ7DnZbzyP+HxlVXuD0xqAnvL8q+OqtSX7lGg9e8nHzwXkMMXNdVeqq4E2M3EUAqX6Q==", + "dev": true, + "requires": { + "growly": "^1.3.0", + "semver": "^5.5.0", + "shellwords": "^0.1.1", + "which": "^1.3.0" + } + }, + "semver": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "yargs": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.1.2.tgz", + "integrity": "sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.1.1", + "find-up": "^2.1.0", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^8.1.0" + } + } + } + }, + "jest-config": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-22.4.4.tgz", + "integrity": "sha512-9CKfo1GC4zrXSoMLcNeDvQBfgtqGTB1uP8iDIZ97oB26RCUb886KkKWhVcpyxVDOUxbhN+uzcBCeFe7w+Iem4A==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "glob": "^7.1.1", + "jest-environment-jsdom": "^22.4.1", + "jest-environment-node": "^22.4.1", + "jest-get-type": "^22.1.0", + "jest-jasmine2": "^22.4.4", + "jest-regex-util": "^22.1.0", + "jest-resolve": "^22.4.2", + "jest-util": "^22.4.1", + "jest-validate": "^22.4.4", + "pretty-format": "^22.4.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "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" + } + } + } + }, + "jest-diff": { + "version": "22.4.3", + "resolved": "http://registry.npmjs.org/jest-diff/-/jest-diff-22.4.3.tgz", + "integrity": "sha512-/QqGvCDP5oZOF6PebDuLwrB2BMD8ffJv6TAGAdEVuDx1+uEgrHpSFrfrOiMRx2eJ1hgNjlQrOQEHetVwij90KA==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "diff": "^3.2.0", + "jest-get-type": "^22.4.3", + "pretty-format": "^22.4.3" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "jest-docblock": { + "version": "22.4.3", + "resolved": "http://registry.npmjs.org/jest-docblock/-/jest-docblock-22.4.3.tgz", + "integrity": "sha512-uPKBEAw7YrEMcXueMKZXn/rbMxBiSv48fSqy3uEnmgOlQhSX+lthBqHb1fKWNVmFqAp9E/RsSdBfiV31LbzaOg==", + "dev": true, + "requires": { + "detect-newline": "^2.1.0" + } + }, + "jest-environment-jsdom": { + "version": "22.4.3", + "resolved": "http://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-22.4.3.tgz", + "integrity": "sha512-FviwfR+VyT3Datf13+ULjIMO5CSeajlayhhYQwpzgunswoaLIPutdbrnfUHEMyJCwvqQFaVtTmn9+Y8WCt6n1w==", + "dev": true, + "requires": { + "jest-mock": "^22.4.3", + "jest-util": "^22.4.3", + "jsdom": "^11.5.1" + } + }, + "jest-environment-node": { + "version": "22.4.3", + "resolved": "http://registry.npmjs.org/jest-environment-node/-/jest-environment-node-22.4.3.tgz", + "integrity": "sha512-reZl8XF6t/lMEuPWwo9OLfttyC26A5AMgDyEQ6DBgZuyfyeNUzYT8BFo6uxCCP/Av/b7eb9fTi3sIHFPBzmlRA==", + "dev": true, + "requires": { + "jest-mock": "^22.4.3", + "jest-util": "^22.4.3" + } + }, + "jest-get-type": { + "version": "22.4.3", + "resolved": "http://registry.npmjs.org/jest-get-type/-/jest-get-type-22.4.3.tgz", + "integrity": "sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w==", + "dev": true + }, + "jest-haste-map": { + "version": "22.4.3", + "resolved": "http://registry.npmjs.org/jest-haste-map/-/jest-haste-map-22.4.3.tgz", + "integrity": "sha512-4Q9fjzuPVwnaqGKDpIsCSoTSnG3cteyk2oNVjBX12HHOaF1oxql+uUiqZb5Ndu7g/vTZfdNwwy4WwYogLh29DQ==", + "dev": true, + "requires": { + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.1.11", + "jest-docblock": "^22.4.3", + "jest-serializer": "^22.4.3", + "jest-worker": "^22.4.3", + "micromatch": "^2.3.11", + "sane": "^2.0.0" + }, + "dependencies": { + "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" + } + } + } + }, + "jest-jasmine2": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-22.4.4.tgz", + "integrity": "sha512-nK3vdUl50MuH7vj/8at7EQVjPGWCi3d5+6aCi7Gxy/XMWdOdbH1qtO/LjKbqD8+8dUAEH+BVVh7HkjpCWC1CSw==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "co": "^4.6.0", + "expect": "^22.4.0", + "graceful-fs": "^4.1.11", + "is-generator-fn": "^1.0.0", + "jest-diff": "^22.4.0", + "jest-matcher-utils": "^22.4.0", + "jest-message-util": "^22.4.0", + "jest-snapshot": "^22.4.0", + "jest-util": "^22.4.1", + "source-map-support": "^0.5.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "jest-leak-detector": { + "version": "22.4.3", + "resolved": "http://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-22.4.3.tgz", + "integrity": "sha512-NZpR/Ls7+ndO57LuXROdgCGz2RmUdC541tTImL9bdUtU3WadgFGm0yV+Ok4Fuia/1rLAn5KaJ+i76L6e3zGJYQ==", + "dev": true, + "requires": { + "pretty-format": "^22.4.3" + } + }, + "jest-matcher-utils": { + "version": "22.4.3", + "resolved": "http://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-22.4.3.tgz", + "integrity": "sha512-lsEHVaTnKzdAPR5t4B6OcxXo9Vy4K+kRRbG5gtddY8lBEC+Mlpvm1CJcsMESRjzUhzkz568exMV1hTB76nAKbA==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-get-type": "^22.4.3", + "pretty-format": "^22.4.3" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "jest-message-util": { + "version": "22.4.3", + "resolved": "http://registry.npmjs.org/jest-message-util/-/jest-message-util-22.4.3.tgz", + "integrity": "sha512-iAMeKxhB3Se5xkSjU0NndLLCHtP4n+GtCqV0bISKA5dmOXQfEbdEmYiu2qpnWBDCQdEafNDDU6Q+l6oBMd/+BA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0-beta.35", + "chalk": "^2.0.1", + "micromatch": "^2.3.11", + "slash": "^1.0.0", + "stack-utils": "^1.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "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" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "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" + } + }, + "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" + } + } + } + }, + "jest-mock": { + "version": "22.4.3", + "resolved": "http://registry.npmjs.org/jest-mock/-/jest-mock-22.4.3.tgz", + "integrity": "sha512-+4R6mH5M1G4NK16CKg9N1DtCaFmuxhcIqF4lQK/Q1CIotqMs/XBemfpDPeVZBFow6iyUNu6EBT9ugdNOTT5o5Q==", + "dev": true + }, + "jest-regex-util": { + "version": "22.4.3", + "resolved": "http://registry.npmjs.org/jest-regex-util/-/jest-regex-util-22.4.3.tgz", + "integrity": "sha512-LFg1gWr3QinIjb8j833bq7jtQopiwdAs67OGfkPrvy7uNUbVMfTXXcOKXJaeY5GgjobELkKvKENqq1xrUectWg==", + "dev": true + }, + "jest-resolve": { + "version": "22.4.3", + "resolved": "http://registry.npmjs.org/jest-resolve/-/jest-resolve-22.4.3.tgz", + "integrity": "sha512-u3BkD/MQBmwrOJDzDIaxpyqTxYH+XqAXzVJP51gt29H8jpj3QgKof5GGO2uPGKGeA1yTMlpbMs1gIQ6U4vcRhw==", + "dev": true, + "requires": { + "browser-resolve": "^1.11.2", + "chalk": "^2.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "jest-resolve-dependencies": { + "version": "22.4.3", + "resolved": "http://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-22.4.3.tgz", + "integrity": "sha512-06czCMVToSN8F2U4EvgSB1Bv/56gc7MpCftZ9z9fBgUQM7dzHGCMBsyfVA6dZTx8v0FDcnALf7hupeQxaBCvpA==", + "dev": true, + "requires": { + "jest-regex-util": "^22.4.3" + } + }, + "jest-runner": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-22.4.4.tgz", + "integrity": "sha512-5S/OpB51igQW9xnkM5Tgd/7ZjiAuIoiJAVtvVTBcEBiXBIFzWM3BAMPBM19FX68gRV0KWyFuGKj0EY3M3aceeQ==", + "dev": true, + "requires": { + "exit": "^0.1.2", + "jest-config": "^22.4.4", + "jest-docblock": "^22.4.0", + "jest-haste-map": "^22.4.2", + "jest-jasmine2": "^22.4.4", + "jest-leak-detector": "^22.4.0", + "jest-message-util": "^22.4.0", + "jest-runtime": "^22.4.4", + "jest-util": "^22.4.1", + "jest-worker": "^22.2.2", + "throat": "^4.0.0" + } + }, + "jest-runtime": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-22.4.4.tgz", + "integrity": "sha512-WRTj9m///npte1YjuphCYX7GRY/c2YvJImU9t7qOwFcqHr4YMzmX6evP/3Sehz5DKW2Vi8ONYPCFWe36JVXxfw==", + "dev": true, + "requires": { + "babel-core": "^6.0.0", + "babel-jest": "^22.4.4", + "babel-plugin-istanbul": "^4.1.5", + "chalk": "^2.0.1", + "convert-source-map": "^1.4.0", + "exit": "^0.1.2", + "graceful-fs": "^4.1.11", + "jest-config": "^22.4.4", + "jest-haste-map": "^22.4.2", + "jest-regex-util": "^22.1.0", + "jest-resolve": "^22.4.2", + "jest-util": "^22.4.1", + "jest-validate": "^22.4.4", + "json-stable-stringify": "^1.0.1", + "micromatch": "^2.3.11", + "realpath-native": "^1.0.0", + "slash": "^1.0.0", + "strip-bom": "3.0.0", + "write-file-atomic": "^2.1.0", + "yargs": "^10.0.3" + }, + "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" + } + }, + "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" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "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" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "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" + } + }, + "yargs": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.1.2.tgz", + "integrity": "sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.1.1", + "find-up": "^2.1.0", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^8.1.0" + } + } + } + }, + "jest-serializer": { + "version": "22.4.3", + "resolved": "http://registry.npmjs.org/jest-serializer/-/jest-serializer-22.4.3.tgz", + "integrity": "sha512-uPaUAppx4VUfJ0QDerpNdF43F68eqKWCzzhUlKNDsUPhjOon7ZehR4C809GCqh765FoMRtTVUVnGvIoskkYHiw==", + "dev": true + }, + "jest-snapshot": { + "version": "22.4.3", + "resolved": "http://registry.npmjs.org/jest-snapshot/-/jest-snapshot-22.4.3.tgz", + "integrity": "sha512-JXA0gVs5YL0HtLDCGa9YxcmmV2LZbwJ+0MfyXBBc5qpgkEYITQFJP7XNhcHFbUvRiniRpRbGVfJrOoYhhGE0RQ==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-diff": "^22.4.3", + "jest-matcher-utils": "^22.4.3", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^22.4.3" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "jest-util": { + "version": "22.4.3", + "resolved": "http://registry.npmjs.org/jest-util/-/jest-util-22.4.3.tgz", + "integrity": "sha512-rfDfG8wyC5pDPNdcnAlZgwKnzHvZDu8Td2NJI/jAGKEGxJPYiE4F0ss/gSAkG4778Y23Hvbz+0GMrDJTeo7RjQ==", + "dev": true, + "requires": { + "callsites": "^2.0.0", + "chalk": "^2.0.1", + "graceful-fs": "^4.1.11", + "is-ci": "^1.0.10", + "jest-message-util": "^22.4.3", + "mkdirp": "^0.5.1", + "source-map": "^0.6.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "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 + }, + "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" + } + } + } + }, + "jest-validate": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-22.4.4.tgz", + "integrity": "sha512-dmlf4CIZRGvkaVg3fa0uetepcua44DHtktHm6rcoNVtYlpwe6fEJRkMFsaUVcFHLzbuBJ2cPw9Gl9TKfnzMVwg==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-config": "^22.4.4", + "jest-get-type": "^22.1.0", + "leven": "^2.1.0", + "pretty-format": "^22.4.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "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" + } + } + } + }, + "jest-worker": { + "version": "22.4.3", + "resolved": "http://registry.npmjs.org/jest-worker/-/jest-worker-22.4.3.tgz", + "integrity": "sha512-B1ucW4fI8qVAuZmicFxI1R3kr2fNeYJyvIQ1rKcuLYnenFV5K5aMbxFj6J0i00Ju83S8jP2d7Dz14+AvbIHRYQ==", + "dev": true, + "requires": { + "merge-stream": "^1.0.1" + } + }, + "jju": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jju/-/jju-1.3.0.tgz", + "integrity": "sha1-2t2e8BkkvHKLA/L3l5vb1i96Kqo=", + "dev": true + }, + "js-base64": { + "version": "2.4.9", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.9.tgz", + "integrity": "sha512-xcinL3AuDJk7VSzsHgb9DvvIXayBbadtMZ4HFPx8rUszbW1MuNMlwYVC4zzCZ6e1sqZpnNS5ZFYOhXqA39T7LQ==", + "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==" + }, + "js-yaml": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", + "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "jsdom": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.11.0.tgz", + "integrity": "sha512-ou1VyfjwsSuWkudGxb03FotDajxAto6USAlmMZjE2lc0jCznt7sBWkhfRBRaWwbnmDqdMSTKTLT5d9sBFkkM7A==", + "dev": true, + "requires": { + "abab": "^1.0.4", + "acorn": "^5.3.0", + "acorn-globals": "^4.1.0", + "array-equal": "^1.0.0", + "cssom": ">= 0.3.2 < 0.4.0", + "cssstyle": ">= 0.3.1 < 0.4.0", + "data-urls": "^1.0.0", + "domexception": "^1.0.0", + "escodegen": "^1.9.0", + "html-encoding-sniffer": "^1.0.2", + "left-pad": "^1.2.0", + "nwsapi": "^2.0.0", + "parse5": "4.0.0", + "pn": "^1.1.0", + "request": "^2.83.0", + "request-promise-native": "^1.0.5", + "sax": "^1.2.4", + "symbol-tree": "^3.2.2", + "tough-cookie": "^2.3.3", + "w3c-hr-time": "^1.0.1", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.3", + "whatwg-mimetype": "^2.1.0", + "whatwg-url": "^6.4.1", + "ws": "^4.0.0", + "xml-name-validator": "^3.0.0" + }, + "dependencies": { + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, + "whatwg-url": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", + "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + } + } + }, + "jsesc": { + "version": "1.3.0", + "resolved": "http://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + }, + "json-edm-parser": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/json-edm-parser/-/json-edm-parser-0.1.2.tgz", + "integrity": "sha1-HmCw/vG8CvZ7wNFG393lSGzWFbQ=", + "dev": true, + "requires": { + "jsonparse": "~1.2.0" + } + }, + "json-loader": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", + "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "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": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "requires": { + "jsonify": "~0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json3": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "http://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsonparse": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.2.0.tgz", + "integrity": "sha1-XAxWhRBxYOcv50ib3eoLRMK8Z70=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "jszip": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-2.5.0.tgz", + "integrity": "sha1-dET9hVHd8+XacZj+oMkbyDCMwnQ=", + "dev": true, + "requires": { + "pako": "~0.2.5" + }, + "dependencies": { + "pako": { + "version": "0.2.9", + "resolved": "http://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=", + "dev": true + } + } + }, + "karma": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/karma/-/karma-3.1.4.tgz", + "integrity": "sha512-31Vo8Qr5glN+dZEVIpnPCxEGleqE0EY6CtC2X9TagRV3rRQ3SNrvfhddICkJgUK3AgqpeKSZau03QumTGhGoSw==", + "dev": true, + "requires": { + "bluebird": "^3.3.0", + "body-parser": "^1.16.1", + "chokidar": "^2.0.3", + "colors": "^1.1.0", + "combine-lists": "^1.0.0", + "connect": "^3.6.0", + "core-js": "^2.2.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.0", + "expand-braces": "^0.1.1", + "flatted": "^2.0.0", + "glob": "^7.1.1", + "graceful-fs": "^4.1.2", + "http-proxy": "^1.13.0", + "isbinaryfile": "^3.0.0", + "lodash": "^4.17.5", + "log4js": "^3.0.0", + "mime": "^2.3.1", + "minimatch": "^3.0.2", + "optimist": "^0.6.1", + "qjobs": "^1.1.4", + "range-parser": "^1.2.0", + "rimraf": "^2.6.0", + "safe-buffer": "^5.0.1", + "socket.io": "2.1.1", + "source-map": "^0.6.1", + "tmp": "0.0.33", + "useragent": "2.3.0" + }, + "dependencies": { + "accepts": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", + "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "dev": true, + "requires": { + "mime-types": "~2.1.18", + "negotiator": "0.6.1" + } + }, + "arraybuffer.slice": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", + "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", + "dev": true + }, + "blob": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", + "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", + "dev": true + }, + "bluebird": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz", + "integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==", + "dev": true + }, + "chokidar": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", + "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.0", + "braces": "^2.3.0", + "fsevents": "^1.2.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "lodash.debounce": "^4.0.8", + "normalize-path": "^2.1.1", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0", + "upath": "^1.0.5" + } + }, + "core-js": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.2.tgz", + "integrity": "sha512-NdBPF/RVwPW6jr0NCILuyN9RiqLo2b1mddWHkUL+VnvcB7dzlnBJ1bXYntjpTGOgkZiiLWj2JxmOr7eGE3qK6g==", + "dev": true + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "engine.io": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.1.tgz", + "integrity": "sha512-+VlKzHzMhaU+GsCIg4AoXF1UdDFjHHwMmMKqMJNDNLlUlejz58FCy4LBqB2YVJskHGYl06BatYWKP2TVdVXE5w==", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "base64id": "1.0.0", + "cookie": "0.3.1", + "debug": "~3.1.0", + "engine.io-parser": "~2.1.0", + "ws": "~3.3.1" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "engine.io-client": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz", + "integrity": "sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "component-inherit": "0.0.3", + "debug": "~3.1.0", + "engine.io-parser": "~2.1.1", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "~3.3.1", + "xmlhttprequest-ssl": "~1.5.4", + "yeast": "0.1.2" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "engine.io-parser": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz", + "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==", + "dev": true, + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "~0.0.7", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.5", + "has-binary2": "~1.0.2" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "log4js": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-3.0.6.tgz", + "integrity": "sha512-ezXZk6oPJCWL483zj64pNkMuY/NcRX5MPiB0zE6tjZM137aeusrOnW1ecxgF9cmwMWkBMhjteQxBPoZBh9FDxQ==", + "dev": true, + "requires": { + "circular-json": "^0.5.5", + "date-format": "^1.2.0", + "debug": "^3.1.0", + "rfdc": "^1.1.2", + "streamroller": "0.7.0" + } + }, + "mime": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.0.tgz", + "integrity": "sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w==", + "dev": true + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "socket.io": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.1.1.tgz", + "integrity": "sha512-rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA==", + "dev": true, + "requires": { + "debug": "~3.1.0", + "engine.io": "~3.2.0", + "has-binary2": "~1.0.2", + "socket.io-adapter": "~1.1.0", + "socket.io-client": "2.1.1", + "socket.io-parser": "~3.2.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "socket.io-adapter": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz", + "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=", + "dev": true + }, + "socket.io-client": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.1.1.tgz", + "integrity": "sha512-jxnFyhAuFxYfjqIgduQlhzqTcOEQSn+OHKVfAxWaNWa7ecP7xSNk2Dx/3UEsDcY7NcFafxvNvKPmmO7HTwTxGQ==", + "dev": true, + "requires": { + "backo2": "1.0.2", + "base64-arraybuffer": "0.1.5", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "~3.1.0", + "engine.io-client": "~3.2.0", + "has-binary2": "~1.0.2", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "socket.io-parser": "~3.2.0", + "to-array": "0.1.4" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "socket.io-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz", + "integrity": "sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "debug": "~3.1.0", + "isarray": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", + "dev": true + }, + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" + } + }, + "xmlhttprequest-ssl": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", + "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=", + "dev": true + } + } + }, + "karma-coverage": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-0.5.5.tgz", + "integrity": "sha1-sNWLECXVnVxmICYxhvHVj11TSMU=", + "dev": true, + "requires": { + "dateformat": "^1.0.6", + "istanbul": "^0.4.0", + "minimatch": "^3.0.0", + "source-map": "^0.5.1" + }, + "dependencies": { + "dateformat": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", + "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1", + "meow": "^3.3.0" + } + } + } + }, + "karma-mocha": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/karma-mocha/-/karma-mocha-1.3.0.tgz", + "integrity": "sha1-7qrH/8DiAetjxGdEDStpx883eL8=", + "dev": true, + "requires": { + "minimist": "1.2.0" + } + }, + "karma-mocha-clean-reporter": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/karma-mocha-clean-reporter/-/karma-mocha-clean-reporter-0.0.1.tgz", + "integrity": "sha1-6G961LxefGLX8uJC3ydRzPk/Rvo=", + "dev": true, + "requires": { + "chalk": "^1.0.0", + "karma": ">=0.9", + "log-symbols": "^1.0.2", + "mocha-clean": "^0.4.0" + } + }, + "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" + }, + "dependencies": { + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + } + } + }, + "karma-sinon-chai": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/karma-sinon-chai/-/karma-sinon-chai-1.2.4.tgz", + "integrity": "sha1-/qk19ivjNmzwJxyNi+UcDHDkCrw=", + "dev": true, + "requires": { + "lolex": "^1.5.0" + }, + "dependencies": { + "lolex": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.6.0.tgz", + "integrity": "sha1-OpoCg0UqR9dDnnJzG54H1zhuSfY=", + "dev": true + } + } + }, + "karma-webpack": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/karma-webpack/-/karma-webpack-2.0.9.tgz", + "integrity": "sha512-F1j3IG/XhiMzcunAXbWXH95uizjzr3WdTzmVWlta8xqxcCtAu9FByCb4sccIMxaVFAefpgnUW9KlCo0oLvIX6A==", + "dev": true, + "requires": { + "async": "~0.9.0", + "loader-utils": "^0.2.5", + "lodash": "^3.8.0", + "source-map": "^0.5.6", + "webpack-dev-middleware": "^1.12.0" + }, + "dependencies": { + "async": { + "version": "0.9.2", + "resolved": "http://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", + "dev": true + }, + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" + } + }, + "lodash": { + "version": "3.10.1", + "resolved": "http://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", + "dev": true + } + } + }, + "kew": { + "version": "0.7.0", + "resolved": "http://registry.npmjs.org/kew/-/kew-0.7.0.tgz", + "integrity": "sha1-edk9LTM2PW/dKXCzNdkUGtWR15s=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "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 + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "^1.0.0" + } + }, + "left-pad": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", + "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==", + "dev": true + }, + "leven": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", + "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", + "dev": true + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "liftoff": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz", + "integrity": "sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=", + "dev": true, + "requires": { + "extend": "^3.0.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" + } + }, + "livereload-js": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.4.0.tgz", + "integrity": "sha512-XPQH8Z2GDP/Hwz2PCDrh2mth4yFejwA1OZ/81Ti3LgKyhDcEjsSsqFWZojHG0va/duGd+WyosY7eXLDoOyqcPw==", + "dev": true + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + } + } + }, + "loader-runner": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.1.tgz", + "integrity": "sha512-By6ZFY7ETWOc9RFaAIb23IjJVcM4dvJC/N57nmdz9RSkMXvAXGI7SyVlAw3v8vjtDRlqThgVDVmTnr9fqMlxkw==", + "dev": true + }, + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "1.0.2", + "resolved": "http://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz", + "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=", + "dev": true + }, + "lodash._baseclone": { + "version": "4.5.7", + "resolved": "https://registry.npmjs.org/lodash._baseclone/-/lodash._baseclone-4.5.7.tgz", + "integrity": "sha1-zkKt4IOE711i+nfDD2GkbmhvhDQ=", + "dev": true + }, + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", + "dev": true + }, + "lodash._basetostring": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", + "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", + "dev": true + }, + "lodash._basevalues": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", + "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=", + "dev": true + }, + "lodash._escapehtmlchar": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.4.1.tgz", + "integrity": "sha1-32fDu2t+jh6DGrSL+geVuSr+iZ0=", + "dev": true, + "requires": { + "lodash._htmlescapes": "~2.4.1" + } + }, + "lodash._escapestringchar": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._escapestringchar/-/lodash._escapestringchar-2.4.1.tgz", + "integrity": "sha1-7P4iYYoq3lC/7qQ5N+Ud9m8O23I=", + "dev": true + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true + }, + "lodash._htmlescapes": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz", + "integrity": "sha1-MtFL8IRLbeb4tioFG09nwii2JMs=", + "dev": true + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "dev": true + }, + "lodash._isnative": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", + "integrity": "sha1-PqZAS3hKe+g2x7V1gOHN95sUgyw=", + "dev": true + }, + "lodash._objecttypes": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", + "integrity": "sha1-fAt/admKH3ZSn4kLDNsbTf7BHBE=", + "dev": true + }, + "lodash._reescape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", + "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=", + "dev": true + }, + "lodash._reevaluate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", + "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=", + "dev": true + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "dev": true + }, + "lodash._reunescapedhtml": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.4.1.tgz", + "integrity": "sha1-dHxPxAED6zu4oJduVx96JlnpO6c=", + "dev": true, + "requires": { + "lodash._htmlescapes": "~2.4.1", + "lodash.keys": "~2.4.1" + }, + "dependencies": { + "lodash.keys": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", + "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", + "dev": true, + "requires": { + "lodash._isnative": "~2.4.1", + "lodash._shimkeys": "~2.4.1", + "lodash.isobject": "~2.4.1" + } + } + } + }, + "lodash._root": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", + "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", + "dev": true + }, + "lodash._shimkeys": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz", + "integrity": "sha1-bpzJZm/wgfC1psl4uD4kLmlJ0gM=", + "dev": true, + "requires": { + "lodash._objecttypes": "~2.4.1" + } + }, + "lodash._stack": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/lodash._stack/-/lodash._stack-4.1.3.tgz", + "integrity": "sha1-dRqnbBuWSwR+dtFPxyoJP8teLdA=", + "dev": true + }, + "lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", + "dev": true + }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", + "dev": true + }, + "lodash.clone": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz", + "integrity": "sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y=", + "dev": true + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "dev": true + }, + "lodash.defaults": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-2.4.1.tgz", + "integrity": "sha1-p+iIXwXmiFEUS24SqPNngCa8TFQ=", + "dev": true, + "requires": { + "lodash._objecttypes": "~2.4.1", + "lodash.keys": "~2.4.1" + }, + "dependencies": { + "lodash.keys": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", + "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", + "dev": true, + "requires": { + "lodash._isnative": "~2.4.1", + "lodash._shimkeys": "~2.4.1", + "lodash.isobject": "~2.4.1" + } + } + } + }, + "lodash.escape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", + "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", + "dev": true, + "requires": { + "lodash._root": "^3.0.0" + } + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true + }, + "lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" + }, + "lodash.isobject": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", + "integrity": "sha1-Wi5H/mmVPx7mMafrof5k0tBlWPU=", + "dev": true, + "requires": { + "lodash._objecttypes": "~2.4.1" + } + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", + "dev": true + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true, + "requires": { + "lodash._getnative": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" + } + }, + "lodash.keysin": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.keysin/-/lodash.keysin-4.2.0.tgz", + "integrity": "sha1-jMP7NcLZSsxEOhhj4C+kB5nqbyg=", + "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.3.5", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.3.5.tgz", + "integrity": "sha1-VOWMTyCD2f7MsVeaYPdLCT1yrRc=", + "dev": true, + "requires": { + "lodash._baseclone": "~4.5.0", + "lodash._stack": "~4.1.0", + "lodash.isplainobject": "^4.0.0", + "lodash.keysin": "^4.0.0", + "lodash.rest": "^4.0.0" + } + }, + "lodash.mergewith": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz", + "integrity": "sha512-eWw5r+PYICtEBgrBE5hhlT6aAa75f411bgDz/ZL2KZqYV03USvucsxcHUIlGTDTECs1eunpI7HOV7U+WLDvNdQ==", + "dev": true + }, + "lodash.rest": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/lodash.rest/-/lodash.rest-4.0.5.tgz", + "integrity": "sha1-lU73UEkmIDjJbR/Jiyj9r58Hcqo=", + "dev": true + }, + "lodash.restparam": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", + "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", + "dev": true + }, + "lodash.some": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", + "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=", + "dev": true + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "dev": true + }, + "lodash.template": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", + "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", + "dev": true, + "requires": { + "lodash._basecopy": "^3.0.0", + "lodash._basetostring": "^3.0.0", + "lodash._basevalues": "^3.0.0", + "lodash._isiterateecall": "^3.0.0", + "lodash._reinterpolate": "^3.0.0", + "lodash.escape": "^3.0.0", + "lodash.keys": "^3.0.0", + "lodash.restparam": "^3.0.0", + "lodash.templatesettings": "^3.0.0" + } + }, + "lodash.templatesettings": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", + "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", + "dev": true, + "requires": { + "lodash._reinterpolate": "^3.0.0", + "lodash.escape": "^3.0.0" + } + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true + }, + "lodash.values": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.values/-/lodash.values-2.4.1.tgz", + "integrity": "sha1-q/UUQ2s8twUAFieXjLzzCxKA7qQ=", + "dev": true, + "requires": { + "lodash.keys": "~2.4.1" + }, + "dependencies": { + "lodash.keys": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", + "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", + "dev": true, + "requires": { + "lodash._isnative": "~2.4.1", + "lodash._shimkeys": "~2.4.1", + "lodash.isobject": "~2.4.1" + } + } + } + }, + "log-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", + "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", + "dev": true, + "requires": { + "chalk": "^1.0.0" + } + }, + "log4js": { + "version": "0.6.38", + "resolved": "http://registry.npmjs.org/log4js/-/log4js-0.6.38.tgz", + "integrity": "sha1-LElBFmldb7JUgJQ9P8hy5mKlIv0=", + "dev": true, + "requires": { + "readable-stream": "~1.0.2", + "semver": "~4.3.3" + }, + "dependencies": { + "readable-stream": { + "version": "1.0.34", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "semver": { + "version": "4.3.6", + "resolved": "http://registry.npmjs.org/semver/-/semver-4.3.6.tgz", + "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", + "dev": true + } + } + }, + "lolex": { + "version": "1.4.0", + "resolved": "http://registry.npmjs.org/lolex/-/lolex-1.4.0.tgz", + "integrity": "sha1-LycSsbwYDendzF06epbvPAuxYq0=", + "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==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", + "dev": true + }, + "lru-cache": { + "version": "2.7.3", + "resolved": "http://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", + "dev": true + }, + "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.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "dev": true, + "requires": { + "tmpl": "1.0.x" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "map-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz", + "integrity": "sha1-ih8HiW2CsQkmvTdEokIACfiJdKg=", + "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-expression-evaluator": { + "version": "1.2.17", + "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz", + "integrity": "sha1-3oGf282E3M2PrlnGrreWFbnSZqw=", + "dev": true + }, + "math-random": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", + "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", + "dev": true + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "http://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" + } + } + } + }, + "meow": { + "version": "3.7.0", + "resolved": "http://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + } + }, + "merge": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz", + "integrity": "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==", + "dev": true + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "merge-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", + "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", + "dev": true, + "requires": { + "readable-stream": "^2.0.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "http://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" + } + } + } + }, + "merge2": { + "version": "1.0.3", + "resolved": "http://registry.npmjs.org/merge2/-/merge2-1.0.3.tgz", + "integrity": "sha1-+kT4siYmFaty8ICKQB1HinDjlNs=", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "mime-db": { + "version": "1.37.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", + "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==", + "dev": true + }, + "mime-types": { + "version": "2.1.21", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", + "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", + "dev": true, + "requires": { + "mime-db": "~1.37.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "minipass": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", + "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + }, + "dependencies": { + "yallist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", + "dev": true + } + } + }, + "minizlib": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz", + "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", + "dev": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } + } + }, + "mkdirp-promise": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", + "integrity": "sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE=", + "dev": true, + "requires": { + "mkdirp": "*" + } + }, + "mocha": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", + "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", + "dev": true, + "requires": { + "browser-stdout": "1.3.1", + "commander": "2.15.1", + "debug": "3.1.0", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "glob": "7.1.2", + "growl": "1.10.5", + "he": "1.1.1", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "supports-color": "5.4.0" + }, + "dependencies": { + "commander": { + "version": "2.15.1", + "resolved": "http://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "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" + } + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "mocha-clean": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/mocha-clean/-/mocha-clean-0.4.0.tgz", + "integrity": "sha1-CbaYXDIYFhQDIeED593ktIdgkhw=", + "dev": true + }, + "moment": { + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.23.0.tgz", + "integrity": "sha512-3IE39bHVqFbWWaPOMHZF98Q9c3LDKGTmypMiTM2QygGXXElkFWIH7GxfmlwmY2vwa+wmNsoYZmG2iusf1ZjJoA==" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "multipipe": { + "version": "0.1.2", + "resolved": "http://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", + "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", + "dev": true, + "requires": { + "duplexer2": "0.0.2" + } + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "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.11.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.1.tgz", + "integrity": "sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA==", + "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" + } + }, + "natives": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.6.tgz", + "integrity": "sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA==", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "ndjson": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/ndjson/-/ndjson-1.5.0.tgz", + "integrity": "sha1-rmA7NrE0vOw0e0UkIrC/mNWDLsg=", + "dev": true, + "requires": { + "json-stringify-safe": "^5.0.1", + "minimist": "^1.2.0", + "split2": "^2.1.0", + "through2": "^2.0.3" + } + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", + "dev": true + }, + "neo-async": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.0.tgz", + "integrity": "sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA==", + "dev": true + }, + "next-tick": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true + }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dev": true, + "requires": { + "lower-case": "^1.1.1" + } + }, + "node-addon-api": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.6.2.tgz", + "integrity": "sha512-479Bjw9nTE5DdBSZZWprFryHGjUaQC31y1wHo19We/k0BZlrmhqQitWoUL0cD8+scljCbIUL+E58oRDEakdGGA==", + "dev": true + }, + "node-fetch": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "requires": { + "encoding": "^0.1.11", + "is-stream": "^1.0.1" + } + }, + "node-forge": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.6.tgz", + "integrity": "sha512-sol30LUpz1jQFBjOKwbjxijiE3b6pjd74YwfD0fJOKPjF+fONKb2Yg8rYgS6+bK6VDl+/wfr4IYpC7jDzLUIfw==", + "dev": true + }, + "node-gyp": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", + "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", + "dev": true, + "requires": { + "fstream": "^1.0.0", + "glob": "^7.0.3", + "graceful-fs": "^4.1.2", + "mkdirp": "^0.5.0", + "nopt": "2 || 3", + "npmlog": "0 || 1 || 2 || 3 || 4", + "osenv": "0", + "request": "^2.87.0", + "rimraf": "2", + "semver": "~5.3.0", + "tar": "^2.0.0", + "which": "1" + } + }, + "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-libs-browser": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", + "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^1.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.0", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.10.3", + "vm-browserify": "0.0.4" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "string_decoder": { + "version": "1.1.1", + "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "string_decoder": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz", + "integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + } + } + }, + "node-notifier": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.0.2.tgz", + "integrity": "sha1-RDhEn+aeMh+UHO+UOYaweXAycBs=", + "dev": true, + "requires": { + "growly": "^1.3.0", + "semver": "^5.3.0", + "shellwords": "^0.1.0", + "which": "^1.2.12" + } + }, + "node-releases": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.1.tgz", + "integrity": "sha512-2UXrBr6gvaebo5TNF84C66qyJJ6r0kxBObgZIDX3D3/mt1ADKiHux3NJPWisq0wxvJJdkjECH+9IIKYViKj71Q==", + "dev": true, + "requires": { + "semver": "^5.3.0" + } + }, + "node-sass": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.9.3.tgz", + "integrity": "sha512-XzXyGjO+84wxyH7fV6IwBOTrEBe2f0a6SBze9QWWYR/cL74AcQUks2AsqcCZenl/Fp/JVbuEaLpgrLtocwBUww==", + "dev": true, + "requires": { + "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", + "lodash.mergewith": "^4.6.0", + "meow": "^3.7.0", + "mkdirp": "^0.5.1", + "nan": "^2.10.0", + "node-gyp": "^3.8.0", + "npmlog": "^4.0.0", + "request": "2.87.0", + "sass-graph": "^2.2.4", + "stdout-stream": "^1.4.0", + "true-case-path": "^1.0.2" + }, + "dependencies": { + "cross-spawn": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", + "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "which": "^1.2.9" + } + }, + "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" + } + }, + "globule": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz", + "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==", + "dev": true, + "requires": { + "glob": "~7.1.1", + "lodash": "~4.17.10", + "minimatch": "~3.0.2" + } + }, + "har-validator": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "dev": true, + "requires": { + "ajv": "^5.1.0", + "har-schema": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "dev": true + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "request": { + "version": "2.87.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", + "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.6.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.1", + "forever-agent": "~0.6.1", + "form-data": "~2.3.1", + "har-validator": "~5.0.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.17", + "oauth-sign": "~0.8.2", + "performance-now": "^2.1.0", + "qs": "~6.5.1", + "safe-buffer": "^5.1.1", + "tough-cookie": "~2.3.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.1.0" + } + }, + "tough-cookie": { + "version": "2.3.4", + "resolved": "http://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", + "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", + "dev": true, + "requires": { + "punycode": "^1.4.1" + } + } + } + }, + "node-zip": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/node-zip/-/node-zip-1.1.1.tgz", + "integrity": "sha1-lNGtZ0o81GoViN1zb0qaeMdX62I=", + "dev": true, + "requires": { + "jszip": "2.5.0" + } + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "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" + } + }, + "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": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "dev": true, + "requires": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" + } + }, + "npm-package-arg": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-5.1.2.tgz", + "integrity": "sha512-wJBsrf0qpypPT7A0LART18hCdyhpCMxeTtcb0X4IZO2jsP6Om7EHN1d9KSKiqD+KVH030RVNpWS9thk+pb7wzA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.4.2", + "osenv": "^0.1.4", + "semver": "^5.1.0", + "validate-npm-package-name": "^3.0.0" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dev": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "nwsapi": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.0.9.tgz", + "integrity": "sha512-nlWFSCTYQcHk/6A9FFnfhKc14c3aFhfdNBXgo8Qgi9QTBu/qg3Ww+Uiz9wMzXd1T8GFxPc2QIHB6Qtf2XFryFQ==", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-component": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", + "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "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-keys": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", + "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", + "dev": true + }, + "object-visit": { + "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.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.1" + } + }, + "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" + } + }, + "office-ui-fabric": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/office-ui-fabric/-/office-ui-fabric-2.6.1.tgz", + "integrity": "sha1-4qyf8+T8eI2mYReN6/CUA2sKLiY=" + }, + "office-ui-fabric-core": { + "version": "9.6.1-fluent2", + "resolved": "https://registry.npmjs.org/office-ui-fabric-core/-/office-ui-fabric-core-9.6.1-fluent2.tgz", + "integrity": "sha512-gcBs5HHr7tjkvk/+Ls10ttb3jEllRn7SvJitX/kx/gQq8BiFMSMKr1w+oNqXlh4EgkBHWUlJVPrYUu1KW/jVaQ==" + }, + "office-ui-fabric-react": { + "version": "5.131.0", + "resolved": "https://registry.npmjs.org/office-ui-fabric-react/-/office-ui-fabric-react-5.131.0.tgz", + "integrity": "sha512-QOYu1uf92qhTTIlBAj8teKvRpCmpliRZjynYtgeeUbDm4C4GtXdb/O1rPNFsfT0PNtPC8dCNeQ7/CXjQenUkyw==", + "requires": { + "@microsoft/load-themed-styles": "^1.7.13", + "@uifabric/icons": ">=5.8.0 <6.0.0", + "@uifabric/merge-styles": ">=5.17.1 <6.0.0", + "@uifabric/styling": ">=5.36.0 <6.0.0", + "@uifabric/utilities": ">=5.34.2 <6.0.0", + "prop-types": "^15.5.10", + "tslib": "^1.7.1" + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + }, + "opn": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.2.0.tgz", + "integrity": "sha512-Jd/GpzPyHF4P2/aNOVmS3lfMSWV9J7cOhCG1s08XCEAsPkB7lp6ddiU0J7XzyQRDUh8BqJ7PchfINjR8jyofRQ==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + }, + "dependencies": { + "minimist": { + "version": "0.0.10", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", + "dev": true + } + } + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" + }, + "dependencies": { + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + } + } + }, + "options": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", + "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=", + "dev": true + }, + "orchestrator": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.8.tgz", + "integrity": "sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4=", + "dev": true, + "requires": { + "end-of-stream": "~0.1.5", + "sequencify": "~0.0.7", + "stream-consume": "~0.1.0" + }, + "dependencies": { + "end-of-stream": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-0.1.5.tgz", + "integrity": "sha1-jhdyBsPICDfYVjLouTWd/osvbq8=", + "dev": true, + "requires": { + "once": "~1.3.0" + } + }, + "once": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", + "dev": true, + "requires": { + "wrappy": "1" + } + } + } + }, + "ordered-read-streams": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz", + "integrity": "sha1-/VZamvjrRHO6abbtijQ1LLVS8SY=", + "dev": true + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "http://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "dev": true, + "requires": { + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" + } + }, + "os-shim": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/os-shim/-/os-shim-0.1.3.tgz", + "integrity": "sha1-a2LDeRz3kJ6jXtRuF2WLtBfLORc=", + "dev": true + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "http://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "p-filter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-1.0.0.tgz", + "integrity": "sha1-Yp0xcVAgnI/VCLoTdxPvS7kg6ds=", + "dev": true, + "requires": { + "p-map": "^1.0.0" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-map": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", + "dev": true + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "pako": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.7.tgz", + "integrity": "sha512-3HNK5tW4x8o5mO8RuHZp3Ydw9icZXx0RANAOMzlMzx7LVXhMJ4mo3MOBpzyd7r/+RUu8BmndP47LXT+vzjtWcQ==", + "dev": true + }, + "param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "dev": true, + "requires": { + "no-case": "^2.2.0" + } + }, + "parse-asn1": { + "version": "5.1.1", + "resolved": "http://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", + "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", + "dev": true, + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3" + } + }, + "parse-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": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "parse-node-version": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.0.tgz", + "integrity": "sha512-02GTVHD1u0nWc20n2G7WX/PgdhNFG04j5fi1OkaJzPWLTcf6vh6229Lta1wTmXG/7Dg42tCssgkccVt7qvd8Kg==", + "dev": true + }, + "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 + }, + "parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "dev": true + }, + "parsejson": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/parsejson/-/parsejson-0.0.3.tgz", + "integrity": "sha1-q343WfIJ7OmUN5c/fQ8fZK4OZKs=", + "dev": true, + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseqs": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", + "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", + "dev": true, + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseuri": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", + "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", + "dev": true, + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.0", + "resolved": "http://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-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 + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "patternomaly": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/patternomaly/-/patternomaly-1.3.2.tgz", + "integrity": "sha512-70UhA5+ZrnNgdfDBKXIGbMHpP+naTzfx9vPT4KwIdhtWWs0x6FWZRJQMXXhV2jcK0mxl28FA/2LPAKArNG058Q==" + }, + "pause-stream": { + "version": "0.0.11", + "resolved": "http://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", + "dev": true, + "requires": { + "through": "~2.3" + } + }, + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "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-polyfill": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/phantomjs-polyfill/-/phantomjs-polyfill-0.0.2.tgz", + "integrity": "sha1-jGpxY+m8j9n/2+fWBctTUvn7iR4=", + "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": "http://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": "http://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + } + } + }, + "pidof": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pidof/-/pidof-1.0.2.tgz", + "integrity": "sha1-+6Dq4cgzWhHrgJn10PPvvEXLTpA=", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-conf": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-1.1.3.tgz", + "integrity": "sha1-N45W1v0T6Iv7b0ol33qD+qvduls=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "load-json-file": "^1.1.0", + "object-assign": "^4.0.1", + "symbol": "^0.2.1" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + } + } + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + }, + "plugin-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", + "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", + "dev": true, + "requires": { + "ansi-colors": "^1.0.1", + "arr-diff": "^4.0.0", + "arr-union": "^3.1.0", + "extend-shallow": "^3.0.2" + } + }, + "plugin-log": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/plugin-log/-/plugin-log-0.1.0.tgz", + "integrity": "sha1-hgSc9qsQgzOYqTHzaJy67nteEzM=", + "dev": true, + "requires": { + "chalk": "^1.1.1", + "dateformat": "^1.0.11" + }, + "dependencies": { + "dateformat": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", + "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1", + "meow": "^3.3.0" + } + } + } + }, + "pn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", + "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", + "dev": true + }, + "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": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.5.tgz", + "integrity": "sha512-HBNpviAUFCKvEh7NZhw1e8MBPivRszIiUnhrJ+sBFVSYSqubrzwX3KG51mYgcRHX8j/cAgZJedONZcm5jTBdgQ==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.5.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "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 + }, + "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" + } + } + } + }, + "postcss-calc": { + "version": "5.3.1", + "resolved": "http://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz", + "integrity": "sha1-d7rnypKK2FcW4v2kLyYb98HWW14=", + "dev": true, + "requires": { + "postcss": "^5.0.2", + "postcss-message-helpers": "^2.0.0", + "reduce-css-calc": "^1.2.6" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-colormin": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz", + "integrity": "sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks=", + "dev": true, + "requires": { + "colormin": "^1.0.5", + "postcss": "^5.0.13", + "postcss-value-parser": "^3.2.3" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-convert-values": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz", + "integrity": "sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0=", + "dev": true, + "requires": { + "postcss": "^5.0.11", + "postcss-value-parser": "^3.1.2" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-discard-comments": { + "version": "2.0.4", + "resolved": "http://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz", + "integrity": "sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0=", + "dev": true, + "requires": { + "postcss": "^5.0.14" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-discard-duplicates": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz", + "integrity": "sha1-uavye4isGIFYpesSq8riAmO5GTI=", + "dev": true, + "requires": { + "postcss": "^5.0.4" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-discard-empty": { + "version": "2.1.0", + "resolved": "http://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz", + "integrity": "sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU=", + "dev": true, + "requires": { + "postcss": "^5.0.14" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-discard-overridden": { + "version": "0.1.1", + "resolved": "http://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz", + "integrity": "sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg=", + "dev": true, + "requires": { + "postcss": "^5.0.16" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-discard-unused": { + "version": "2.2.3", + "resolved": "http://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz", + "integrity": "sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM=", + "dev": true, + "requires": { + "postcss": "^5.0.14", + "uniqs": "^2.0.0" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-filter-plugins": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.3.tgz", + "integrity": "sha512-T53GVFsdinJhgwm7rg1BzbeBRomOg9y5MBVhGcsV0CxurUdVj1UlPdKtn7aqYA/c/QVkzKMjq2bSV5dKG5+AwQ==", + "dev": true, + "requires": { + "postcss": "^5.0.4" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-merge-idents": { + "version": "2.1.7", + "resolved": "http://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz", + "integrity": "sha1-TFUwMTwI4dWzu/PSu8dH4njuonA=", + "dev": true, + "requires": { + "has": "^1.0.1", + "postcss": "^5.0.10", + "postcss-value-parser": "^3.1.1" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-merge-longhand": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz", + "integrity": "sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg=", + "dev": true, + "requires": { + "postcss": "^5.0.4" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-merge-rules": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz", + "integrity": "sha1-0d9d+qexrMO+VT8OnhDofGG19yE=", + "dev": true, + "requires": { + "browserslist": "^1.5.2", + "caniuse-api": "^1.5.2", + "postcss": "^5.0.4", + "postcss-selector-parser": "^2.2.2", + "vendors": "^1.0.0" + }, + "dependencies": { + "browserslist": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", + "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", + "dev": true, + "requires": { + "caniuse-db": "^1.0.30000639", + "electron-to-chromium": "^1.2.7" + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-message-helpers": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz", + "integrity": "sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4=", + "dev": true + }, + "postcss-minify-font-values": { + "version": "1.0.5", + "resolved": "http://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz", + "integrity": "sha1-S1jttWZB66fIR0qzUmyv17vey2k=", + "dev": true, + "requires": { + "object-assign": "^4.0.1", + "postcss": "^5.0.4", + "postcss-value-parser": "^3.0.2" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-minify-gradients": { + "version": "1.0.5", + "resolved": "http://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz", + "integrity": "sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE=", + "dev": true, + "requires": { + "postcss": "^5.0.12", + "postcss-value-parser": "^3.3.0" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-minify-params": { + "version": "1.2.2", + "resolved": "http://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz", + "integrity": "sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM=", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.1", + "postcss": "^5.0.2", + "postcss-value-parser": "^3.0.2", + "uniqs": "^2.0.0" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-minify-selectors": { + "version": "2.1.1", + "resolved": "http://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz", + "integrity": "sha1-ssapjAByz5G5MtGkllCBFDEXNb8=", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.2", + "has": "^1.0.1", + "postcss": "^5.0.14", + "postcss-selector-parser": "^2.0.0" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-modules": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/postcss-modules/-/postcss-modules-1.3.2.tgz", + "integrity": "sha512-QujH5ZpPtr1fBWTKDa43Hx45gm7p19aEtHaAtkMCBZZiB/D5za2wXSMtAf94tDUZHF3F5KZcTXISUNqgEQRiDw==", + "dev": true, + "requires": { + "css-modules-loader-core": "^1.1.0", + "generic-names": "^1.0.3", + "lodash.camelcase": "^4.3.0", + "postcss": "^7.0.1", + "string-hash": "^1.1.1" + } + }, + "postcss-modules-extract-imports": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz", + "integrity": "sha1-thTJcgvmgW6u41+zpfqh26agXds=", + "dev": true, + "requires": { + "postcss": "^6.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + }, + "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 + }, + "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" + } + } + } + }, + "postcss-modules-local-by-default": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", + "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", + "dev": true, + "requires": { + "css-selector-tokenizer": "^0.7.0", + "postcss": "^6.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + }, + "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 + }, + "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" + } + } + } + }, + "postcss-modules-scope": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", + "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", + "dev": true, + "requires": { + "css-selector-tokenizer": "^0.7.0", + "postcss": "^6.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + }, + "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 + }, + "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" + } + } + } + }, + "postcss-modules-values": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", + "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", + "dev": true, + "requires": { + "icss-replace-symbols": "^1.1.0", + "postcss": "^6.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + }, + "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 + }, + "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" + } + } + } + }, + "postcss-normalize-charset": { + "version": "1.1.1", + "resolved": "http://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz", + "integrity": "sha1-757nEhLX/nWceO0WL2HtYrXLk/E=", + "dev": true, + "requires": { + "postcss": "^5.0.5" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-normalize-url": { + "version": "3.0.8", + "resolved": "http://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz", + "integrity": "sha1-EI90s/L82viRov+j6kWSJ5/HgiI=", + "dev": true, + "requires": { + "is-absolute-url": "^2.0.0", + "normalize-url": "^1.4.0", + "postcss": "^5.0.14", + "postcss-value-parser": "^3.2.3" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-ordered-values": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz", + "integrity": "sha1-7sbCpntsQSqNsgQud/6NpD+VwR0=", + "dev": true, + "requires": { + "postcss": "^5.0.4", + "postcss-value-parser": "^3.0.1" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-reduce-idents": { + "version": "2.4.0", + "resolved": "http://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz", + "integrity": "sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM=", + "dev": true, + "requires": { + "postcss": "^5.0.4", + "postcss-value-parser": "^3.0.2" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-reduce-initial": { + "version": "1.0.1", + "resolved": "http://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz", + "integrity": "sha1-aPgGlfBF0IJjqHmtJA343WT2ROo=", + "dev": true, + "requires": { + "postcss": "^5.0.4" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-reduce-transforms": { + "version": "1.0.4", + "resolved": "http://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz", + "integrity": "sha1-/3b02CEkN7McKYpC0uFEQCV3GuE=", + "dev": true, + "requires": { + "has": "^1.0.1", + "postcss": "^5.0.8", + "postcss-value-parser": "^3.0.1" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-selector-parser": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz", + "integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=", + "dev": true, + "requires": { + "flatten": "^1.0.2", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "postcss-svgo": { + "version": "2.1.6", + "resolved": "http://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz", + "integrity": "sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0=", + "dev": true, + "requires": { + "is-svg": "^2.0.0", + "postcss": "^5.0.14", + "postcss-value-parser": "^3.2.3", + "svgo": "^0.7.0" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-unique-selectors": { + "version": "2.0.2", + "resolved": "http://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz", + "integrity": "sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0=", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.1", + "postcss": "^5.0.4", + "uniqs": "^2.0.0" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "postcss-zindex": { + "version": "2.2.0", + "resolved": "http://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz", + "integrity": "sha1-0hCd3AVbka9n/EyzsCWUZjnSryI=", + "dev": true, + "requires": { + "has": "^1.0.1", + "postcss": "^5.0.4", + "uniqs": "^2.0.0" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "pretty-format": { + "version": "22.4.3", + "resolved": "http://registry.npmjs.org/pretty-format/-/pretty-format-22.4.3.tgz", + "integrity": "sha512-S4oT9/sT6MN7/3COoOy+ZJeA92VmOnveLHgrwBE3Z1W5N9S2A1QGNYiE1z75DAENbJrXXUb+OWXhpJcg05QKQQ==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + } + } + }, + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "http://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", + "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": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "progress": { + "version": "1.1.8", + "resolved": "http://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", + "dev": true + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "requires": { + "asap": "~2.0.3" + } + }, + "prop-types": { + "version": "15.6.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz", + "integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==", + "requires": { + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" + } + }, + "proxy-addr": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", + "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", + "dev": true, + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.8.0" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "psl": { + "version": "1.1.29", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", + "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==", + "dev": true + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "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 + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true + }, + "qjobs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "dev": true, + "requires": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + }, + "dependencies": { + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "dev": true + } + } + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "ramda": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.25.0.tgz", + "integrity": "sha512-GXpfrYVPwx3K7RQ6aYT8KPS8XViSXUVJT1ONhoKPE9VAleW42YE+U+8VEyGWt41EnEQW7gwecYJriTI0pKoecQ==", + "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 + } + } + }, + "randombytes": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", + "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", + "dev": true + }, + "raw-body": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", + "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", + "dev": true, + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.3", + "iconv-lite": "0.4.23", + "unpipe": "1.0.0" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + } + } + }, + "react": { + "version": "16.3.2", + "resolved": "https://registry.npmjs.org/react/-/react-16.3.2.tgz", + "integrity": "sha512-o5GPdkhciQ3cEph6qgvYB7LTOHw/GB0qRI6ZFNugj49qJCFfgHwVNjZ5u+b7nif4vOeMIOuYj3CeYe2IBD74lg==", + "requires": { + "fbjs": "^0.8.16", + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.0" + } + }, + "react-ace": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/react-ace/-/react-ace-5.8.0.tgz", + "integrity": "sha1-hy2e6LZkMA7Vq57axiNLvpCDaDY=", + "requires": { + "brace": "^0.11.0", + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.1.1", + "prop-types": "^15.5.8" + } + }, + "react-dom": { + "version": "16.3.2", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.3.2.tgz", + "integrity": "sha512-MMPko3zYncNrz/7gG17wJWUREZDvskZHXOwbttzl0F0L3wDmToyuETuo/r8Y5yvDejwYcRyWI1lvVBjLJWFwKA==", + "requires": { + "fbjs": "^0.8.16", + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.0" + } + }, + "read": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", + "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", + "dev": true, + "requires": { + "mute-stream": "~0.0.4" + } + }, + "read-package-json": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.0.13.tgz", + "integrity": "sha512-/1dZ7TRZvGrYqE0UAfN6qQb5GYBsNcqS1C0tNK601CFOJmtHI7NIGXwetEPU/OtoFHZL3hDxm4rolFFVE9Bnmg==", + "dev": true, + "requires": { + "glob": "^7.1.1", + "graceful-fs": "^4.1.2", + "json-parse-better-errors": "^1.0.1", + "normalize-package-data": "^2.0.0", + "slash": "^1.0.0" + } + }, + "read-package-tree": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/read-package-tree/-/read-package-tree-5.1.6.tgz", + "integrity": "sha512-FCX1aT3GWyY658wzDICef4p+n0dB+ENRct8E/Qyvppj6xVpOYerBHfUu7OP5Rt1/393Tdglguf5ju5DEX4wZNg==", + "dev": true, + "requires": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "once": "^1.3.0", + "read-package-json": "^2.0.0", + "readdir-scoped-modules": "^1.0.0" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + } + } + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "readdir-scoped-modules": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.0.2.tgz", + "integrity": "sha1-n6+jfShr5dksuuve4DDcm19AZ0c=", + "dev": true, + "requires": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "graceful-fs": "^4.1.2", + "once": "^1.3.0" + } + }, + "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" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "http://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" + } + } + } + }, + "realpath-native": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.0.2.tgz", + "integrity": "sha512-+S3zTvVt9yTntFrBpm7TQmQ3tzpCrnA1a/y+3cUHAc9ZR6aIjG0WNLR+Rj79QpJktY+VeW/TQtFlQ1bzsehI8g==", + "dev": true, + "requires": { + "util.promisify": "^1.0.0" + } + }, + "recast": { + "version": "0.11.23", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.11.23.tgz", + "integrity": "sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM=", + "dev": true, + "requires": { + "ast-types": "0.9.6", + "esprima": "~3.1.0", + "private": "~0.1.5", + "source-map": "~0.5.0" + }, + "dependencies": { + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "dev": true + } + } + }, + "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": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, + "reduce-css-calc": { + "version": "1.3.0", + "resolved": "http://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", + "integrity": "sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=", + "dev": true, + "requires": { + "balanced-match": "^0.4.2", + "math-expression-evaluator": "^1.2.14", + "reduce-function-call": "^1.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", + "dev": true + } + } + }, + "reduce-function-call": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.2.tgz", + "integrity": "sha1-WiAL+S4ON3UXUv5FsKszD9S2vpk=", + "dev": true, + "requires": { + "balanced-match": "^0.4.2" + }, + "dependencies": { + "balanced-match": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", + "dev": true + } + } + }, + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "dev": true + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "regex-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" + } + }, + "regexpu-core": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", + "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", + "dev": true, + "requires": { + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "http://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "dev": true + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "http://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "http://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "dev": true + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "replace-ext": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", + "dev": true + }, + "replacestream": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/replacestream/-/replacestream-4.0.3.tgz", + "integrity": "sha512-AC0FiLS352pBBiZhd4VXB1Ab/lh0lEgpP+GGvZqbQh8a5cmXVoTe5EX/YeTFArnp4SRGTHh1qCHu9lGs1qG8sA==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.3", + "object-assign": "^4.0.1", + "readable-stream": "^2.0.2" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "http://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" + } + } + } + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "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.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dev": true, + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + } + } + } + }, + "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" + } + }, + "request-promise-core": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.1.tgz", + "integrity": "sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY=", + "dev": true, + "requires": { + "lodash": "^4.13.1" + }, + "dependencies": { + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + } + } + }, + "request-promise-native": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.5.tgz", + "integrity": "sha1-UoF3D2jgyXGeUWP9P6tIIhX0/aU=", + "dev": true, + "requires": { + "request-promise-core": "1.1.1", + "stealthy-require": "^1.1.0", + "tough-cookie": ">=2.3.3" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "requirejs": { + "version": "2.1.20", + "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.1.20.tgz", + "integrity": "sha1-EUgiyRfsh5NFCy2qoeubvxEB6TE=" + }, + "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.9.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.9.0.tgz", + "integrity": "sha512-TZNye00tI67lwYvzxCxHGjwTNlUV70io54/Ed4j6PscB8xVfuBJpRenI/o6dVk0cY0PYTY27AgCoGGxRnYuItQ==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "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" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true, + "requires": { + "exit-hook": "^1.0.0", + "onetime": "^1.0.0" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "rfdc": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.2.tgz", + "integrity": "sha512-92ktAgvZhBzYTIK0Mja9uen5q5J3NRVMoDkJL2VMwq6SXjVCgqvQeVP2XAaUY6HT+XpQYeLSjb3UoitBryKmdA==", + "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": "2.5.4", + "resolved": "http://registry.npmjs.org/rimraf/-/rimraf-2.5.4.tgz", + "integrity": "sha1-loAAk8vxoMhr2VtGJUZ1NcKd+gQ=", + "dev": true, + "requires": { + "glob": "^7.0.5" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "rsvp": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", + "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==", + "dev": true + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, + "requires": { + "is-promise": "^2.1.0" + } + }, + "rx": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", + "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=", + "dev": true + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "http://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==" + }, + "samsam": { + "version": "1.1.2", + "resolved": "http://registry.npmjs.org/samsam/-/samsam-1.1.2.tgz", + "integrity": "sha1-vsEf3IOp/aBjQBIQ5AF2wwJNFWc=", + "dev": true + }, + "sane": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/sane/-/sane-2.5.2.tgz", + "integrity": "sha1-tNwYYcIbQn6SlQej51HiosuKs/o=", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "capture-exit": "^1.2.0", + "exec-sh": "^0.2.0", + "fb-watchman": "^2.0.0", + "fsevents": "^1.2.3", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5", + "watch": "~0.18.0" + } + }, + "sass-graph": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz", + "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=", + "dev": true, + "requires": { + "glob": "^7.0.0", + "lodash": "^4.0.0", + "scss-tokenizer": "^0.2.3", + "yargs": "^7.0.0" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "os-locale": { + "version": "1.4.0", + "resolved": "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "http://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true + }, + "yargs": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", + "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", + "dev": true, + "requires": { + "camelcase": "^3.0.0", + "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", + "y18n": "^3.2.1", + "yargs-parser": "^5.0.0" + } + }, + "yargs-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", + "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", + "dev": true, + "requires": { + "camelcase": "^3.0.0" + } + } + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "schema-utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", + "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", + "dev": true, + "requires": { + "ajv": "^5.0.0" + } + }, + "scss-tokenizer": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", + "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", + "dev": true, + "requires": { + "js-base64": "^2.1.8", + "source-map": "^0.4.2" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "resolved": "http://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "semver": { + "version": "5.3.0", + "resolved": "http://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "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": { + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "dev": true + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "dev": true + } + } + }, + "sequencify": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/sequencify/-/sequencify-0.0.7.tgz", + "integrity": "sha1-kM/xnQLgcCf9dn9erT57ldHnOAw=", + "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": { + "accepts": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", + "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "dev": true, + "requires": { + "mime-types": "~2.1.18", + "negotiator": "0.6.1" + } + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + } + } + }, + "serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", + "send": "0.16.2" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "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" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "requires": { + "is-arrayish": "^0.3.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + } + } + }, + "sinon": { + "version": "1.17.7", + "resolved": "http://registry.npmjs.org/sinon/-/sinon-1.17.7.tgz", + "integrity": "sha1-RUKk9JugxFwF6y6d2dID4rjv4L8=", + "dev": true, + "requires": { + "formatio": "1.1.1", + "lolex": "1.3.2", + "samsam": "1.1.2", + "util": ">=0.10.3 <1" + }, + "dependencies": { + "lolex": { + "version": "1.3.2", + "resolved": "http://registry.npmjs.org/lolex/-/lolex-1.3.2.tgz", + "integrity": "sha1-fD2mL/yzDw9agKJWbKJORdigHzE=", + "dev": true + } + } + }, + "sinon-chai": { + "version": "2.8.0", + "resolved": "http://registry.npmjs.org/sinon-chai/-/sinon-chai-2.8.0.tgz", + "integrity": "sha1-Qyqbv9Uab8AHmPTSUmqCnAYGh6w=", + "dev": true + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "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" + } + } + } + }, + "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": "1.7.4", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-1.7.4.tgz", + "integrity": "sha1-L37O3DORvy1cc+KR/iM+bjTU3QA=", + "dev": true, + "requires": { + "debug": "2.3.3", + "engine.io": "~1.8.4", + "has-binary": "0.1.7", + "object-assign": "4.1.0", + "socket.io-adapter": "0.5.0", + "socket.io-client": "1.7.4", + "socket.io-parser": "2.3.1" + }, + "dependencies": { + "debug": { + "version": "2.3.3", + "resolved": "http://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "http://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + }, + "object-assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", + "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=", + "dev": true + } + } + }, + "socket.io-adapter": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz", + "integrity": "sha1-y21LuL7IHhB4uZZ3+c7QBGBmu4s=", + "dev": true, + "requires": { + "debug": "2.3.3", + "socket.io-parser": "2.3.1" + }, + "dependencies": { + "debug": { + "version": "2.3.3", + "resolved": "http://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "http://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + } + } + }, + "socket.io-client": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-1.7.4.tgz", + "integrity": "sha1-7J+CA1btme9tNX8HVtZIcXvdQoE=", + "dev": true, + "requires": { + "backo2": "1.0.2", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "2.3.3", + "engine.io-client": "~1.8.4", + "has-binary": "0.1.7", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseuri": "0.0.5", + "socket.io-parser": "2.3.1", + "to-array": "0.1.4" + }, + "dependencies": { + "debug": { + "version": "2.3.3", + "resolved": "http://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "http://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + } + } + }, + "socket.io-parser": { + "version": "2.3.1", + "resolved": "http://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.3.1.tgz", + "integrity": "sha1-3VMgJRA85Clpcya+/WQAX8/ltKA=", + "dev": true, + "requires": { + "component-emitter": "1.1.2", + "debug": "2.2.0", + "isarray": "0.0.1", + "json3": "3.3.2" + }, + "dependencies": { + "component-emitter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz", + "integrity": "sha1-KWWU8nU9qmOZbSrwjRWpURbJrsM=", + "dev": true + }, + "debug": { + "version": "2.2.0", + "resolved": "http://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true, + "requires": { + "ms": "0.7.1" + } + }, + "ms": { + "version": "0.7.1", + "resolved": "http://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + } + } + }, + "sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "dev": true, + "requires": { + "is-plain-obj": "^1.0.0" + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-loader": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-0.2.4.tgz", + "integrity": "sha512-OU6UJUty+i2JDpTItnizPrlpOIBLmQbWMuBg9q5bVtnHACqw1tn9nNwqJLbv0/00JjnJb/Ee5g5WS5vrRv7zIQ==", + "dev": true, + "requires": { + "async": "^2.5.0", + "loader-utils": "^1.1.0" + } + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dev": true, + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", + "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "sparkles": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", + "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", + "dev": true + }, + "spawn-sync": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/spawn-sync/-/spawn-sync-1.0.15.tgz", + "integrity": "sha1-sAeZVX63+wyDdsKdROih6mfldHY=", + "dev": true, + "requires": { + "concat-stream": "^1.4.7", + "os-shim": "^0.1.2" + } + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.3.tgz", + "integrity": "sha512-uBIcIl3Ih6Phe3XHK1NqboJLdGfwr1UN3k6wSD1dZpmPsIkb8AGNbZYJ1fOBk834+Gxy8rpfDxrS6XLEMZMY2g==", + "dev": true + }, + "split": { + "version": "0.2.10", + "resolved": "http://registry.npmjs.org/split/-/split-0.2.10.tgz", + "integrity": "sha1-Zwl8YB1pfOE2j0GPBs0gHPBSGlc=", + "dev": true, + "requires": { + "through": "2" + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "split2": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz", + "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==", + "dev": true, + "requires": { + "through2": "^2.0.2" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "http://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.15.2.tgz", + "integrity": "sha512-Ra/OXQtuh0/enyl4ETZAfTaeksa6BXks5ZcjpSUNrjBr0DvrJKX+1fsKDPpT9TBXgHAFsa4510aNVgI8g/+SzA==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "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" + } + }, + "stack-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", + "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==", + "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.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "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" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "http://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" + } + } + } + }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", + "dev": true + }, + "stream-browserify": { + "version": "2.0.1", + "resolved": "http://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", + "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "stream-combiner": { + "version": "0.0.4", + "resolved": "http://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", + "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", + "dev": true, + "requires": { + "duplexer": "~0.1.1" + } + }, + "stream-consume": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.1.tgz", + "integrity": "sha512-tNa3hzgkjEP7XbCkbRXe1jpg+ievoa0O4SCFlMOYEscGSS4JJsckGL8swUyAa/ApGU3Ae4t6Honor4HhL+tRyg==", + "dev": true + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "stream-shift": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "dev": true + }, + "streamroller": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-0.7.0.tgz", + "integrity": "sha512-WREzfy0r0zUqp3lGO096wRuUp7ho1X6uo/7DJfTlEi0Iv/4gT7YHqXDjKC2ioVGBZtE8QzsQD9nx1nIuoZ57jQ==", + "dev": true, + "requires": { + "date-format": "^1.2.0", + "debug": "^3.1.0", + "mkdirp": "^0.5.1", + "readable-stream": "^2.3.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "strict-uri-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", + "integrity": "sha1-ucczDHBChi9rFC3CdLvMWGbONUY=", + "dev": true + }, + "string-hash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", + "integrity": "sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs=", + "dev": true + }, + "string-length": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", + "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", + "dev": true, + "requires": { + "astral-regex": "^1.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-1.0.0.tgz", + "integrity": "sha1-hbiGLzhEtabV7IRnqTWYFzo295Q=", + "dev": true, + "requires": { + "first-chunk-stream": "^1.0.0", + "is-utf8": "^0.2.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1" + } + }, + "sudo": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sudo/-/sudo-1.0.3.tgz", + "integrity": "sha1-zPKGaRIPi3T4K4Rt/38clRIO/yA=", + "dev": true, + "requires": { + "inpath": "~1.0.2", + "pidof": "~1.0.2", + "read": "~1.0.3" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "http://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "svgo": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz", + "integrity": "sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U=", + "dev": true, + "requires": { + "coa": "~1.0.1", + "colors": "~1.1.2", + "csso": "~2.3.1", + "js-yaml": "~3.7.0", + "mkdirp": "~0.5.1", + "sax": "~1.2.1", + "whet.extend": "~0.9.9" + }, + "dependencies": { + "colors": { + "version": "1.1.2", + "resolved": "http://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "dev": true + }, + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "js-yaml": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", + "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^2.6.0" + } + } + } + }, + "symbol": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/symbol/-/symbol-0.2.3.tgz", + "integrity": "sha1-O5hzuKkB5Hxu/iFSajrDcu8ou8c=", + "dev": true + }, + "symbol-tree": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", + "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=", + "dev": true + }, + "tapable": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.9.tgz", + "integrity": "sha512-2wsvQ+4GwBvLPLWsNfLCDYGsW6xb7aeC6utq2Qh0PFwgEy7K7dsma9Jsmb2zSQj7GvYAyUGSntLtsv++GmgL1A==", + "dev": true + }, + "tar": { + "version": "2.2.1", + "resolved": "http://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "dev": true, + "requires": { + "block-stream": "*", + "fstream": "^1.0.2", + "inherits": "2" + } + }, + "ternary-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ternary-stream/-/ternary-stream-2.0.1.tgz", + "integrity": "sha1-Bk5Im0tb9gumpre8fy9cJ07Pgmk=", + "dev": true, + "requires": { + "duplexify": "^3.5.0", + "fork-stream": "^0.0.4", + "merge-stream": "^1.0.0", + "through2": "^2.0.1" + } + }, + "test-exclude": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.2.3.tgz", + "integrity": "sha512-SYbXgY64PT+4GAL2ocI3HwPa4Q4TBKm0cwAVeKOt/Aoc0gSpNRjJX8w0pA1LMKZ3LBmd8pYBqApFNQLII9kavA==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "micromatch": "^2.3.11", + "object-assign": "^4.1.0", + "read-pkg-up": "^1.0.1", + "require-main-filename": "^1.0.1" + }, + "dependencies": { + "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" + } + } + } + }, + "textextensions": { + "version": "1.0.2", + "resolved": "http://registry.npmjs.org/textextensions/-/textextensions-1.0.2.tgz", + "integrity": "sha1-ZUhjk+4fK7A5pgy7oFsLaL2VAdI=", + "dev": true + }, + "thenify": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.0.tgz", + "integrity": "sha1-5p44obq+lpsBCCB5eLn2K4hgSDk=", + "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" + } + }, + "throat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", + "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=", + "dev": true + }, + "throttleit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", + "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "http://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" + } + } + } + }, + "tildify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz", + "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=", + "dev": true, + "requires": { + "os-homedir": "^1.0.0" + } + }, + "time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", + "dev": true + }, + "timers-browserify": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", + "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "tiny-lr": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tiny-lr/-/tiny-lr-0.2.1.tgz", + "integrity": "sha1-s/26gC5dVqM8L28QeUsy5Hescp0=", + "dev": true, + "requires": { + "body-parser": "~1.14.0", + "debug": "~2.2.0", + "faye-websocket": "~0.10.0", + "livereload-js": "^2.2.0", + "parseurl": "~1.3.0", + "qs": "~5.1.0" + }, + "dependencies": { + "body-parser": { + "version": "1.14.2", + "resolved": "http://registry.npmjs.org/body-parser/-/body-parser-1.14.2.tgz", + "integrity": "sha1-EBXLH+LEQ4WCWVgdtTMy+NDPUPk=", + "dev": true, + "requires": { + "bytes": "2.2.0", + "content-type": "~1.0.1", + "debug": "~2.2.0", + "depd": "~1.1.0", + "http-errors": "~1.3.1", + "iconv-lite": "0.4.13", + "on-finished": "~2.3.0", + "qs": "5.2.0", + "raw-body": "~2.1.5", + "type-is": "~1.6.10" + }, + "dependencies": { + "qs": { + "version": "5.2.0", + "resolved": "http://registry.npmjs.org/qs/-/qs-5.2.0.tgz", + "integrity": "sha1-qfMRQq9GjLcrJbMBNrokVoNJFr4=", + "dev": true + } + } + }, + "bytes": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.2.0.tgz", + "integrity": "sha1-/TVGSkA/b5EXwt42Cez/nK4ABYg=", + "dev": true + }, + "debug": { + "version": "2.2.0", + "resolved": "http://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true, + "requires": { + "ms": "0.7.1" + } + }, + "http-errors": { + "version": "1.3.1", + "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", + "integrity": "sha1-GX4izevUGYWF6GlO9nhhl7ke2UI=", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "statuses": "1" + } + }, + "iconv-lite": { + "version": "0.4.13", + "resolved": "http://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz", + "integrity": "sha1-H4irpKsLFQjoMSrMOTRfNumS4vI=", + "dev": true + }, + "ms": { + "version": "0.7.1", + "resolved": "http://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + }, + "qs": { + "version": "5.1.0", + "resolved": "http://registry.npmjs.org/qs/-/qs-5.1.0.tgz", + "integrity": "sha1-TZMuXH6kEcynajEtOaYGIA/VDNk=", + "dev": true + }, + "raw-body": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.1.7.tgz", + "integrity": "sha1-rf6s4uT7MJgFgBTQjActzFl1h3Q=", + "dev": true, + "requires": { + "bytes": "2.4.0", + "iconv-lite": "0.4.13", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz", + "integrity": "sha1-fZcZb51br39pNeJZhVSe3SpsIzk=", + "dev": true + } + } + } + } + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "dev": true + }, + "to-array": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", + "dev": true + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-fast-properties": { + "version": "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": "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" + } + }, + "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" + } + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "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" + } + }, + "tslib": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.8.1.tgz", + "integrity": "sha1-aUavLR1lGnsYY7Ux1uWvpBqkTqw=" + }, + "tslint": { + "version": "5.9.1", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.9.1.tgz", + "integrity": "sha1-ElX4ej/1frCw4fDmEKi0dIBGya4=", + "dev": true, + "requires": { + "babel-code-frame": "^6.22.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^3.2.0", + "glob": "^7.1.1", + "js-yaml": "^3.7.0", + "minimatch": "^3.0.4", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.8.0", + "tsutils": "^2.12.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "tslint-microsoft-contrib": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/tslint-microsoft-contrib/-/tslint-microsoft-contrib-5.2.1.tgz", + "integrity": "sha512-PDYjvpo0gN9IfMULwKk0KpVOPMhU6cNoT9VwCOLeDl/QS8v8W2yspRpFFuUS7/c5EIH/n8ApMi8TxJAz1tfFUA==", + "dev": true, + "requires": { + "tsutils": "^2.27.2 <2.29.0" + }, + "dependencies": { + "tsutils": { + "version": "2.28.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.28.0.tgz", + "integrity": "sha512-bh5nAtW0tuhvOJnx1GLRn5ScraRLICGyJV5wJhtRWOLsxW70Kk5tZtpK3O/hW6LDnqKS9mlUMPZj9fEMJ0gxqA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + } + } + }, + "tsutils": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "http://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-detect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz", + "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI=", + "dev": true + }, + "type-is": { + "version": "1.6.16", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", + "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.18" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "typescript": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.4.2.tgz", + "integrity": "sha1-+DlfhdRZJ2BnyYiqQYN6j4KHCEQ=", + "dev": true + }, + "ua-parser-js": { + "version": "0.7.19", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.19.tgz", + "integrity": "sha512-T3PVJ6uz8i0HzPxOF9SWzWAlfN/DavlpQqepn22xgve/5QecC+XMCAtmUNnY7C9StehaV6exjUCI801lOI7QlQ==" + }, + "uglify-js": { + "version": "3.4.9", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", + "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", + "dev": true, + "requires": { + "commander": "~2.17.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "uglify-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 + }, + "uglifyjs-webpack-plugin": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", + "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", + "dev": true, + "requires": { + "source-map": "^0.5.6", + "uglify-js": "^2.8.29", + "webpack-sources": "^1.0.1" + }, + "dependencies": { + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true + }, + "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" + } + }, + "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" + } + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "dev": true + }, + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true + }, + "yargs": { + "version": "3.10.0", + "resolved": "http://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" + } + } + } + }, + "ultron": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", + "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=", + "dev": true + }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "dev": true + }, + "underscore": { + "version": "1.8.3", + "resolved": "http://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", + "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=", + "dev": true + }, + "union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" + }, + "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" + } + }, + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" + } + } + } + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", + "dev": true + }, + "unique-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-1.0.0.tgz", + "integrity": "sha1-1ZpKdUJ0R9mqbJHnAmP40mpLEEs=", + "dev": true + }, + "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 + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + } + } + }, + "upath": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", + "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==", + "dev": true + }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", + "dev": true + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "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 + }, + "user-home": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", + "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", + "dev": true + }, + "useragent": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.3.0.tgz", + "integrity": "sha512-4AoH4pxuSvHCjqLO04sU6U/uE65BYza8l/KKBS0b0hnUPWi+cQ2BpeTEwejCSx9SPV5/U03nniDTrWx5NrmKdw==", + "dev": true, + "requires": { + "lru-cache": "4.1.x", + "tmp": "0.0.x" + }, + "dependencies": { + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + } + } + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "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.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "dev": true + }, + "v8flags": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", + "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", + "dev": true, + "requires": { + "user-home": "^1.1.1" + } + }, + "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" + } + }, + "validate-npm-package-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", + "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", + "dev": true, + "requires": { + "builtins": "^1.0.3" + } + }, + "validator": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-8.2.0.tgz", + "integrity": "sha512-Yw5wW34fSv5spzTXNkokD6S6/Oq92d8q/t14TqsS3fAiA1RYnxSFSIZ+CY3n6PGGRCq5HhJTSepQvFUS2QUDxA==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "vendors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.2.tgz", + "integrity": "sha512-w/hry/368nO21AN9QljsaIhb9ZiZtZARoVH5f3CsFbawdLdayCgKRPup7CggujvySMxx0I91NOyxdVENohprLQ==", + "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" + } + }, + "vinyl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", + "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", + "dev": true, + "requires": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + }, + "dependencies": { + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true + }, + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true + }, + "replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", + "dev": true + } + } + }, + "vinyl-fs": { + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.3.14.tgz", + "integrity": "sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY=", + "dev": true, + "requires": { + "defaults": "^1.0.0", + "glob-stream": "^3.1.5", + "glob-watcher": "^0.0.6", + "graceful-fs": "^3.0.0", + "mkdirp": "^0.5.0", + "strip-bom": "^1.0.0", + "through2": "^0.6.1", + "vinyl": "^0.4.0" + }, + "dependencies": { + "clone": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", + "dev": true + }, + "graceful-fs": { + "version": "3.0.11", + "resolved": "http://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz", + "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=", + "dev": true, + "requires": { + "natives": "^1.1.0" + } + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "through2": { + "version": "0.6.5", + "resolved": "http://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + }, + "vinyl": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", + "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", + "dev": true, + "requires": { + "clone": "^0.2.0", + "clone-stats": "^0.0.1" + } + } + } + }, + "vm-browserify": { + "version": "0.0.4", + "resolved": "http://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", + "dev": true, + "requires": { + "indexof": "0.0.1" + } + }, + "void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", + "dev": true + }, + "w3c-hr-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", + "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", + "dev": true, + "requires": { + "browser-process-hrtime": "^0.1.2" + } + }, + "walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "dev": true, + "requires": { + "makeerror": "1.0.x" + } + }, + "watch": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/watch/-/watch-0.18.0.tgz", + "integrity": "sha1-KAlUdsbffJDJYxOJkMClQj60uYY=", + "dev": true, + "requires": { + "exec-sh": "^0.2.0", + "minimist": "^1.2.0" + } + }, + "watchpack": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", + "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "dev": true, + "requires": { + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + }, + "dependencies": { + "chokidar": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", + "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.0", + "braces": "^2.3.0", + "fsevents": "^1.2.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "lodash.debounce": "^4.0.8", + "normalize-path": "^2.1.1", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0", + "upath": "^1.0.5" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + } + } + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + }, + "webpack": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.6.0.tgz", + "integrity": "sha512-OsHT3D0W0KmPPh60tC7asNnOmST6bKTiR90UyEdT9QYoaJ4OYN4Gg7WK1k3VxHK07ZoiYWPsKvlS/gAjwL/vRA==", + "dev": true, + "requires": { + "acorn": "^5.0.0", + "acorn-dynamic-import": "^2.0.0", + "ajv": "^5.1.5", + "ajv-keywords": "^2.0.0", + "async": "^2.1.2", + "enhanced-resolve": "^3.4.0", + "escope": "^3.6.0", + "interpret": "^1.0.0", + "json-loader": "^0.5.4", + "json5": "^0.5.1", + "loader-runner": "^2.3.0", + "loader-utils": "^1.1.0", + "memory-fs": "~0.4.1", + "mkdirp": "~0.5.0", + "node-libs-browser": "^2.0.0", + "source-map": "^0.5.3", + "supports-color": "^4.2.1", + "tapable": "^0.2.7", + "uglifyjs-webpack-plugin": "^0.4.6", + "watchpack": "^1.4.0", + "webpack-sources": "^1.0.1", + "yargs": "^8.0.2" + }, + "dependencies": { + "ajv-keywords": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", + "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "resolved": "http://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + } + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "^2.0.0" + } + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "^2.0.0" + } + }, + "yargs": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", + "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", + "dev": true, + "requires": { + "camelcase": "^4.1.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "read-pkg-up": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^7.0.0" + } + }, + "yargs-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", + "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + } + } + } + }, + "webpack-dev-middleware": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz", + "integrity": "sha512-FCrqPy1yy/sN6U/SaEZcHKRXGlqU0DUaEBL45jkUYoB8foVb6wCnbIJ1HKIx+qUFTW+3JpVcCJCxZ8VATL4e+A==", + "dev": true, + "requires": { + "memory-fs": "~0.4.1", + "mime": "^1.5.0", + "path-is-absolute": "^1.0.0", + "range-parser": "^1.0.3", + "time-stamp": "^2.0.0" + }, + "dependencies": { + "time-stamp": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.2.0.tgz", + "integrity": "sha512-zxke8goJQpBeEgD82CXABeMh0LSJcj7CXEd0OHOg45HgcofF7pxNwZm9+RknpxpDhwN4gFpySkApKfFYfRQnUA==", + "dev": true + } + } + }, + "webpack-sources": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", + "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "webpack-stream": { + "version": "4.0.3", + "resolved": "http://registry.npmjs.org/webpack-stream/-/webpack-stream-4.0.3.tgz", + "integrity": "sha512-Tx7ks7Of/JiPz7/tUM4WqSg4OcXF4m4OzNSaEzNA1TNXQaiTHIjiKqUoL79wGXbFt2q1IP8VG5DcEdaxifY5Ew==", + "dev": true, + "requires": { + "fancy-log": "^1.3.2", + "lodash.clone": "^4.3.2", + "lodash.some": "^4.2.2", + "memory-fs": "^0.4.1", + "plugin-error": "^1.0.1", + "supports-color": "^5.3.0", + "through": "^2.3.8", + "vinyl": "^2.1.0", + "webpack": "^3.4.1" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "websocket-driver": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", + "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", + "dev": true, + "requires": { + "http-parser-js": ">=0.4.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", + "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", + "dev": true + }, + "whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "requires": { + "iconv-lite": "0.4.24" + } + }, + "whatwg-fetch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz", + "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==" + }, + "whatwg-mimetype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.2.0.tgz", + "integrity": "sha512-5YSO1nMd5D1hY3WzAQV3PzZL83W3YeyR1yW9PcH26Weh1t+Vzh9B6XkDh7aXm83HBZ4nSMvkjvN2H2ySWIvBgw==", + "dev": true + }, + "whatwg-url": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-4.7.1.tgz", + "integrity": "sha1-303C4/JaY7H6WzLtbWwTlXfWkN4=", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "whet.extend": { + "version": "0.9.9", + "resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz", + "integrity": "sha1-+HfVv2SMl+WqVC+twW1qJZucEaE=", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "window-size": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", + "integrity": "sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=", + "dev": true + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "http://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write-file-atomic": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", + "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "ws": { + "version": "4.1.0", + "resolved": "http://registry.npmjs.org/ws/-/ws-4.1.0.tgz", + "integrity": "sha512-ZGh/8kF9rrRNffkLFV4AzhvooEclrOH0xaugmqGsIfFgOE/pIz4fMc4Ef+5HSQqTEug2S9JZIWDR47duDSLfaA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0" + } + }, + "wtf-8": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wtf-8/-/wtf-8-1.0.0.tgz", + "integrity": "sha1-OS2LotDxw00e4tYw8V0O+2jhBIo=", + "dev": true + }, + "xml": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", + "integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=", + "dev": true + }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "xml2js": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.2.8.tgz", + "integrity": "sha1-m4FpCTFjH/CdGVdUn69U9PmAs8I=", + "dev": true, + "requires": { + "sax": "0.5.x" + }, + "dependencies": { + "sax": { + "version": "0.5.8", + "resolved": "http://registry.npmjs.org/sax/-/sax-0.5.8.tgz", + "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=", + "dev": true + } + } + }, + "xmlbuilder": { + "version": "0.4.3", + "resolved": "http://registry.npmjs.org/xmlbuilder/-/xmlbuilder-0.4.3.tgz", + "integrity": "sha1-xGFLp04K0ZbmCcknLNnh3bKKilg=", + "dev": true + }, + "xmlhttprequest-ssl": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz", + "integrity": "sha1-GFqIjATspGw+QHDZn3tJ3jUomS0=", + "dev": true + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yargs": { + "version": "4.6.0", + "resolved": "http://registry.npmjs.org/yargs/-/yargs-4.6.0.tgz", + "integrity": "sha1-y0BQwBWb+2u2ScD0r1UFJqhGGdw=", + "dev": true, + "requires": { + "camelcase": "^2.0.1", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "lodash.assign": "^4.0.3", + "os-locale": "^1.4.0", + "pkg-conf": "^1.1.2", + "read-pkg-up": "^1.0.1", + "require-main-filename": "^1.0.1", + "string-width": "^1.0.1", + "window-size": "^0.2.0", + "y18n": "^3.2.1", + "yargs-parser": "^2.4.0" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "os-locale": { + "version": "1.4.0", + "resolved": "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "http://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "yargs-parser": { + "version": "2.4.1", + "resolved": "http://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", + "integrity": "sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ=", + "dev": true, + "requires": { + "camelcase": "^3.0.0", + "lodash.assign": "^4.0.6" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + } + } + } + } + }, + "yargs-parser": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.1.0.tgz", + "integrity": "sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + } + }, + "yauzl": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", + "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", + "dev": true, + "requires": { + "fd-slicer": "~1.0.1" + } + }, + "yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", + "dev": true + }, + "z-schema": { + "version": "3.18.4", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-3.18.4.tgz", + "integrity": "sha512-DUOKC/IhbkdLKKiV89gw9DUauTV8U/8yJl1sjf6MtDmzevLKOF2duNJ495S3MFVjqZarr+qNGCPbkg4mu4PpLw==", + "requires": { + "commander": "^2.7.1", + "lodash.get": "^4.0.0", + "lodash.isequal": "^4.0.0", + "validator": "^8.0.0" + } + } + } +} diff --git a/samples/react-chartcontrol/package.json b/samples/react-chartcontrol/package.json new file mode 100644 index 000000000..f29aa07c9 --- /dev/null +++ b/samples/react-chartcontrol/package.json @@ -0,0 +1,48 @@ +{ + "name": "react-chartcontrol", + "version": "0.0.1", + "private": true, + "engines": { + "node": ">=0.10.0" + }, + "scripts": { + "build": "gulp bundle", + "clean": "gulp clean", + "test": "gulp test" + }, + "dependencies": { + "@microsoft/sp-core-library": "1.7.1", + "@microsoft/sp-lodash-subset": "1.7.1", + "@microsoft/sp-office-ui-fabric-core": "1.7.1", + "@microsoft/sp-webpart-base": "1.7.1", + "@pnp/common": "^1.2.8", + "@pnp/logging": "^1.2.8", + "@pnp/odata": "^1.2.8", + "@pnp/sp": "^1.2.8", + "@pnp/spfx-controls-react": "1.11.0", + "@pnp/spfx-property-controls": "^1.13.1", + "@types/es6-promise": "0.0.33", + "@types/react": "16.4.2", + "@types/react-dom": "16.0.5", + "@types/webpack-env": "1.13.1", + "chartjs-plugin-streaming": "^1.7.1", + "color": "^3.1.0", + "moment": "^2.23.0", + "patternomaly": "^1.3.2", + "react": "16.3.2", + "react-dom": "16.3.2" + }, + "resolutions": { + "@types/react": "16.4.2" + }, + "devDependencies": { + "@microsoft/sp-build-web": "1.7.1", + "@microsoft/sp-tslint-rules": "1.7.1", + "@microsoft/sp-module-interfaces": "1.7.1", + "@microsoft/sp-webpart-workbench": "1.7.1", + "gulp": "~3.9.1", + "@types/chai": "3.4.34", + "@types/mocha": "2.2.38", + "ajv": "~5.2.2" + } +} diff --git a/samples/react-chartcontrol/src/index.ts b/samples/react-chartcontrol/src/index.ts new file mode 100644 index 000000000..fb81db1e2 --- /dev/null +++ b/samples/react-chartcontrol/src/index.ts @@ -0,0 +1 @@ +// A file is required to be in the root of the /src directory by the TypeScript compiler diff --git a/samples/react-chartcontrol/src/services/ChartDataProvider/IChartDataProvider.ts b/samples/react-chartcontrol/src/services/ChartDataProvider/IChartDataProvider.ts new file mode 100644 index 000000000..4da3d396d --- /dev/null +++ b/samples/react-chartcontrol/src/services/ChartDataProvider/IChartDataProvider.ts @@ -0,0 +1,12 @@ +/** + * Provides sample chart data. All returned results are randomized. + * Any resemblance to winning lottery numbers is purely coincidental. + */ +export default interface IChartDataProvider { + getMultiBubbleArrays(numDatasets: number, length: number): Promise>; + getMultiDataset(numDatasets: number, length: number): Promise>; + getNumberArray(length: number, waitduration?: number): Promise; + getPointArray(length: number): Promise; + getScatterArray(length: number): Promise; + getSignedNumberArray(length: number): Promise; +} diff --git a/samples/react-chartcontrol/src/services/ChartDataProvider/MockChartDataProvider.ts b/samples/react-chartcontrol/src/services/ChartDataProvider/MockChartDataProvider.ts new file mode 100644 index 000000000..02f913de0 --- /dev/null +++ b/samples/react-chartcontrol/src/services/ChartDataProvider/MockChartDataProvider.ts @@ -0,0 +1,146 @@ +import IChartDataProvider from "./IChartDataProvider"; + +const FAKE_DELAY: number = 500; +/** + * Returns an array of chart points (x,y) + */ +export default class MockChartDataProvider implements IChartDataProvider { + public getSignedNumberArray(length: number): Promise { + return new Promise((resolve) => { + // pretend we're getting the data from a service + setTimeout(() => { + let numArray: number[] = []; + for (let index = 0; index < length; index++) { + numArray.push(MockChartDataProvider.getRandomSignedNumber()); + } + resolve(numArray); + }, FAKE_DELAY); + }); + } + + /** + * Returns a multi-dataset array of points for a bubble chart + * @param numDatasets How many datesets to generate + * @param length How long should each dataset be? + */ + public getMultiBubbleArrays(numDatasets: number, length: number): Promise> { + return new Promise>((resolve) => { + // pretend we're getting the data from a service + setTimeout(() => { + let dataSetArray: Array = []; + for (let dsIndex = 0; dsIndex < numDatasets; dsIndex++) { + let bubbleArray: Chart.ChartPoint[] = []; + for (let index = 0; index < length; index++) { + bubbleArray.push({ + x: MockChartDataProvider.getRandomNumber(), + y: MockChartDataProvider.getRandomNumber(), + r: Math.abs(MockChartDataProvider.getRandomNumber()) / 5 + }); + } + dataSetArray.push(bubbleArray); + } + resolve(dataSetArray); + }, FAKE_DELAY); + }); + } + + /** + * Returns a multi-dataset array of numbers for use in a chart + * @param numDatasets The number of datasets you would like + * @param length The length of each dataset + */ + public getMultiDataset(numDatasets: number, length: number): Promise> { + return new Promise>((resolve) => { + // pretend we're getting the data from a service + setTimeout(() => { + let dataSetArray: Array = []; + for (let dsIndex = 0; dsIndex < numDatasets; dsIndex++) { + let numArray: number[] = []; + for (let index = 0; index < length; index++) { + numArray.push(MockChartDataProvider.getRandomNumber()); + } + + dataSetArray.push(numArray); + } + + resolve(dataSetArray); + }, FAKE_DELAY); + }); + } + + /** + * Gets an array of points to render on a chart requiring X, Y coordinates + * @param length Length of the dataset to generate + */ + public getPointArray(length: number): Promise { + return new Promise((resolve) => { + // pretend we're getting the data from a service + setTimeout(() => { + let numArray: Chart.ChartPoint[] = []; + for (let index = 0; index < length; index++) { + numArray.push( + { + x: MockChartDataProvider.getRandomNumber(), + y: MockChartDataProvider.getRandomNumber(), + } + ); + } + resolve(numArray); + }, FAKE_DELAY); + }); + } + + /** + * Gets an array of points for a scatter chart + * @param length Length of the dataset to generate + */ + public getScatterArray(length: number): Promise { + return new Promise((resolve) => { + // pretend we're getting the data from a service + setTimeout(() => { + let numArray: Chart.ChartPoint[] = []; + for (let index = 0; index < length; index++) { + numArray.push( + { + x: MockChartDataProvider.getRandomNumber(), + y: MockChartDataProvider.getRandomSignedNumber(), + } + ); + } + resolve(numArray); + }, FAKE_DELAY); + }); + } + + /** + * Returns an array of numbers + */ + public getNumberArray(length: number, waitduration?: number): Promise { + return new Promise((resolve) => { + // pretend we're getting the data from a service + setTimeout(() => { + let numArray: number[] = []; + for (let index = 0; index < length; index++) { + numArray.push(MockChartDataProvider.getRandomNumber()); + } + resolve(numArray); + }, waitduration && FAKE_DELAY); + }); + } + + /** + * Returns a random number between 1-100. + */ + public static getRandomNumber(): number { + return Math.round(Math.random() * 101); + } + + /** + * Returns a random signed number between -100 and 100 + * This method is used for charts with signed numbers, + * such as line charts. + */ + public static getRandomSignedNumber(): number { + return Math.round(Math.random() * 201) - 100; + } +} diff --git a/samples/react-chartcontrol/src/services/ChartDataProvider/index.ts b/samples/react-chartcontrol/src/services/ChartDataProvider/index.ts new file mode 100644 index 000000000..12d63e9dc --- /dev/null +++ b/samples/react-chartcontrol/src/services/ChartDataProvider/index.ts @@ -0,0 +1,2 @@ +export * from './IChartDataProvider'; +export * from './MockChartDataProvider'; diff --git a/samples/react-chartcontrol/src/services/GitHubService/GitHubService.ts b/samples/react-chartcontrol/src/services/GitHubService/GitHubService.ts new file mode 100644 index 000000000..7af2bdc38 --- /dev/null +++ b/samples/react-chartcontrol/src/services/GitHubService/GitHubService.ts @@ -0,0 +1,46 @@ +import { IGitHubService, IGitHubContributor, IAuthorCommit } from "./IGitHubService.types"; +import { HttpClient, HttpClientResponse } from '@microsoft/sp-http'; + +export default class GitHubService implements IGitHubService { + /** + * Gets a list of github commits in a repo for a single contributor + * @param client the HttpClient object that will make the call + * @param repoOwner the repo owner (i.e.: the first slash after github.com. E.g.: https://github.com/SharePoint/sp-dev-docs = sharepoint) + * @param repo the repo name (i.e.: the second slash after github.com. E.g.: https://github.com/SharePoint/sp-dev-docs- = sp-dev-docs) + * @param alias the GitHub contributor alias. e.g.: hugoabernier + * + * NOTE: GitHub only allows a certain number of API calls without authentication. If you plan on using this + * more extensively, you may want to add authentication, by adding an Http headers: + * "cache-control": "no-cache") -- no necessary, but useful + * "Authorization" "token f11111f1100bb1ec1111ad11c1111ed1d1a1111a"); + */ + public getCommits(client: HttpClient, repoOwner: string, repo: string, alias: string): Promise { + const requestUrl: string = `https://api.github.com/repos/${repoOwner}/${repo}/commits?author=${alias}`; + // call the GitHub API + return client.fetch(requestUrl, + HttpClient.configurations.v1, {}).then((response: HttpClientResponse) => response.json()) + .then((commits: IAuthorCommit[]): IAuthorCommit[] => { + return commits; + }); + } + + /** + * Gets a list of contributors in a repo + * @param client the HttpClient + * @param repoOwner the repo owner (i.e.: the first slash after github.com. E.g.: https://github.com/SharePoint/sp-dev-docs = sharepoint) + * @param repo the repo name (i.e.: the second slash after github.com. E.g.: https://github.com/SharePoint/sp-dev-docs- = sp-dev-docs) + * + * See above notes regarding daily limits on GitHub API + */ + public getContributors(client: HttpClient, repoOwner: string, repo: string): Promise { + // note that for simplicity, we don't escape strings or verify that they are valid. + const requestUrl: string = `https://api.github.com/repos/${repoOwner}/${repo}/contributors`; + + // call the GitHub API + return client.fetch(requestUrl, + HttpClient.configurations.v1, {}).then((response: HttpClientResponse) => response.json()) + .then((contributors: IGitHubContributor[]): IGitHubContributor[] => { + return contributors; + }); + } +} diff --git a/samples/react-chartcontrol/src/services/GitHubService/IGitHubService.types.ts b/samples/react-chartcontrol/src/services/GitHubService/IGitHubService.types.ts new file mode 100644 index 000000000..30730ae6e --- /dev/null +++ b/samples/react-chartcontrol/src/services/GitHubService/IGitHubService.types.ts @@ -0,0 +1,138 @@ +import { HttpClient } from '@microsoft/sp-http'; + +/** + * Exposes GitHub API calls + */ +export interface IGitHubService { + getCommits(client: HttpClient, repoOwner: string, repo: string, alias: string): Promise; + getContributors(client: HttpClient, repoOwner: string, repo: string): Promise; +} + +// The majority of the interfaces in this file were auto-generated from JSON. +// I don't use everything, but I left everything here in case you'd like to +// use this code for your own purpose. +export interface IGitHubContributor { + avatar_url: string; + contributions: number; + events_url: string; + followers_url: string; + following_url: string; + gists_url: string; + gravatar_id: string; + html_url: string; + id: number; + login: string; + node_id: string; + organizations_url: string; + received_events_url: string; + repos_url: string; + site_admin: boolean; + starred_url: string; + subscriptions_url: string; + type: string; + url: string; +} + +export interface IContributor { + alias: string; + repoOwner: string; + repo: string; +} + +export interface Author { + date: Date; + email: string; + name: string; +} + +export interface Committer { + date: Date; + email: string; + name: string; +} + +export interface Tree { + sha: string; + url: string; +} + +export interface Verification { + payload?: any; + reason: string; + signature?: any; + verified: boolean; +} + +export interface Commit { + author: Author; + comment_count: number; + committer: Committer; + message: string; + tree: Tree; + url: string; + verification: Verification; +} + +export interface Author2 { + avatar_url: string; + events_url: string; + followers_url: string; + following_url: string; + gists_url: string; + gravatar_id: string; + html_url: string; + id: number; + login: string; + node_id: string; + organizations_url: string; + received_events_url: string; + repos_url: string; + site_admin: boolean; + starred_url: string; + subscriptions_url: string; + type: string; + url: string; +} + +export interface Committer2 { + avatar_url: string; + events_url: string; + followers_url: string; + following_url: string; + gists_url: string; + gravatar_id: string; + html_url: string; + id: number; + login: string; + node_id: string; + organizations_url: string; + received_events_url: string; + repos_url: string; + site_admin: boolean; + starred_url: string; + subscriptions_url: string; + type: string; + url: string; +} + +export interface Parent { + html_url: string; + sha: string; + url: string; +} + +/** + * Describes a commit + */ +export interface IAuthorCommit { + author: Author2; + comments_url: string; + commit: Commit; + committer: Committer2; + html_url: string; + node_id: string; + parents: Parent[]; + sha: string; + url: string; +} + diff --git a/samples/react-chartcontrol/src/services/GitHubService/index.ts b/samples/react-chartcontrol/src/services/GitHubService/index.ts new file mode 100644 index 000000000..5f384c3ae --- /dev/null +++ b/samples/react-chartcontrol/src/services/GitHubService/index.ts @@ -0,0 +1,2 @@ +export * from './GitHubService'; +export * from './IGitHubService.types'; diff --git a/samples/react-chartcontrol/src/services/ListService/IListField.ts b/samples/react-chartcontrol/src/services/ListService/IListField.ts new file mode 100644 index 000000000..f4a7401b8 --- /dev/null +++ b/samples/react-chartcontrol/src/services/ListService/IListField.ts @@ -0,0 +1,6 @@ +export interface IListField { + Id: string; + Title: string; + InternalName: string; + TypeAsString: string; +} diff --git a/samples/react-chartcontrol/src/services/ListService/IListItem.ts b/samples/react-chartcontrol/src/services/ListService/IListItem.ts new file mode 100644 index 000000000..1f5835072 --- /dev/null +++ b/samples/react-chartcontrol/src/services/ListService/IListItem.ts @@ -0,0 +1,7 @@ +export interface IListItem { + Id: string; + Label: string; + Value: number; + YValue?: number; + RValue?: number; +} diff --git a/samples/react-chartcontrol/src/services/ListService/IListService.ts b/samples/react-chartcontrol/src/services/ListService/IListService.ts new file mode 100644 index 000000000..d9821b1c7 --- /dev/null +++ b/samples/react-chartcontrol/src/services/ListService/IListService.ts @@ -0,0 +1,7 @@ +import { IListField } from "./IListField"; +import { IListItem } from "./IListItem"; + +export interface IListService { + getFields(listId: string): Promise>; + getListItems(listId: string, labelField: string, valueField: string, yValueField?: string, rValueField?: string): Promise>; +} diff --git a/samples/react-chartcontrol/src/services/ListService/ListService.ts b/samples/react-chartcontrol/src/services/ListService/ListService.ts new file mode 100644 index 000000000..b22585b2d --- /dev/null +++ b/samples/react-chartcontrol/src/services/ListService/ListService.ts @@ -0,0 +1,57 @@ +import { IListService } from "./IListService"; +import { WebPartContext } from "@microsoft/sp-webpart-base"; +import { sp } from "@pnp/sp"; +import { IListField } from "./IListField"; +import { IListItem } from "./IListItem"; + +export class ListService implements IListService { + private _context: WebPartContext; + + /** + * + */ + constructor(context: WebPartContext) { + this._context = context; + } + + public getFields = (listId: string): Promise> => { + sp.setup({ + spfxContext: this._context + }); + + return sp.web.lists.getById(listId).fields.filter('ReadOnlyField eq false and Hidden eq false') + .select("Id", "Title", "InternalName", "TypeAsString").get(); + } + + public getListItems(listId: string, labelField: string, valueField: string, yValueField?: string, rValueField?: string): Promise> { + sp.setup({ + spfxContext: this._context + }); + + // build the list of fields we need + let fields: string[] = ["Id", labelField, valueField]; + + // Add the y value if necessary + if (yValueField) { + fields.push(yValueField); + } + + // Add a R value if necessary + if (rValueField) { + fields.push(rValueField); + } + + return sp.web.lists.getById(listId).items.select(...fields).getAll().then((rows: any[]) => { + return rows.map((item: any) => { + let listItem: IListItem = { + Id: item.Id, + Label: item[labelField], + Value: valueField && item[valueField], + YValue: yValueField && item[yValueField], + RValue: rValueField && item[rValueField] + }; + return listItem; + }); + }); + } +} diff --git a/samples/react-chartcontrol/src/services/ListService/MockListService.ts b/samples/react-chartcontrol/src/services/ListService/MockListService.ts new file mode 100644 index 000000000..61c0fabee --- /dev/null +++ b/samples/react-chartcontrol/src/services/ListService/MockListService.ts @@ -0,0 +1,96 @@ +import { IListService } from "./IListService"; +import { IListField } from "./IListField"; +import { IListItem } from "./IListItem"; +import { ChartType } from '@pnp/spfx-controls-react/lib/ChartControl'; +import MockChartDataProvider from "../ChartDataProvider/MockChartDataProvider"; +import IChartDataProvider from "../ChartDataProvider/IChartDataProvider"; + +const DATA_COUNT: number = 7; + +export class MockListService implements IListService { + private _chartType: ChartType; + private _labels: string[]; + + constructor(chartType: ChartType, labels: string[]) { + this._chartType = chartType; + this._labels = labels; + } + + public getFields(_listId: string): Promise { + throw new Error("Method not implemented for Mock service."); + } + + public getListItems(_listId: string, _labelField: string, _valueField: string, _yValueField?: string, _rValueField?: string): Promise> { + + if (this._chartType === ChartType.Bubble) { + return this._getSampleBubbleData(); + } + + if (this._chartType === ChartType.Scatter) { + return this._getSampleScatterData(); + } + + return this._getSampleArrayData(); + } + + private _getSampleArrayData = (): Promise> => { + return new Promise>((resolve, _reject) => { + // we're using a mock service that returns random numbers. + const dataProvider: IChartDataProvider = new MockChartDataProvider(); + dataProvider.getNumberArray(DATA_COUNT, 500).then((dataSet: number[]) => { + const listRows: Array = dataSet.map((value: number, index: number) => { + const listRow: IListItem = { + Id: `row_${index}`, + Label: this._labels[index], + Value: value + }; + return listRow; + }); + + resolve(listRows); + }); + }); + } + + private _getSampleBubbleData(): Promise> { + + return new Promise>((resolve, _reject) => { + // we're using a mock service that returns random numbers. + const dataProvider: IChartDataProvider = new MockChartDataProvider(); + dataProvider.getMultiBubbleArrays(1, DATA_COUNT).then((dataSet: Array) => { + const listRows: Array = dataSet[0].map((value: Chart.ChartPoint, index: number) => { + const listRow: IListItem = { + Id: `row_${index}`, + Label: this._labels[index], + Value: value.x as number, + YValue: value.y as number, + RValue: value.r + }; + return listRow; + }); + + resolve(listRows); + }); + }); + } + + private _getSampleScatterData(): Promise> { + return new Promise>((resolve, _reject) => { + // we're using a mock service that returns random numbers. + const dataProvider: IChartDataProvider = new MockChartDataProvider(); + dataProvider.getScatterArray(DATA_COUNT).then((dataSet: Chart.ChartPoint[]) => { + const listRows: Array = dataSet.map((value: Chart.ChartPoint, index: number) => { + const listRow: IListItem = { + Id: `row_${index}`, + Label: this._labels[index], + Value: value.x as number, + YValue: value.y as number + }; + return listRow; + }); + + resolve(listRows); + }); + }); + } +} diff --git a/samples/react-chartcontrol/src/services/ListService/index.ts b/samples/react-chartcontrol/src/services/ListService/index.ts new file mode 100644 index 000000000..9031b36df --- /dev/null +++ b/samples/react-chartcontrol/src/services/ListService/index.ts @@ -0,0 +1,5 @@ +export * from './IListField'; +export * from './IListItem'; +export * from './IListService'; +export * from './ListService'; +export * from './MockListService'; diff --git a/samples/react-chartcontrol/src/webparts/accessibleTable/AccessibleTableWebPart.manifest.json b/samples/react-chartcontrol/src/webparts/accessibleTable/AccessibleTableWebPart.manifest.json new file mode 100644 index 000000000..04b6186a5 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/accessibleTable/AccessibleTableWebPart.manifest.json @@ -0,0 +1,24 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx/client-side-web-part-manifest.schema.json", + "id": "afb76932-d38c-482c-ade4-649d5b65ad99", + "alias": "AccessibleTableWebPart", + "componentType": "WebPart", + + "version": "*", + "manifestVersion": 2, + + "requiresCustomScript": false, + + "preconfiguredEntries": [{ + "groupId": "5c03119e-3074-46fd-976b-c60198311f70", + "group": { "default": "Other" }, + "title": { "default": "Accessible Table" }, + "description": { "default": "Shows how to use the accessibility features of the PnP ChartControl to render an accessible table" }, + "iconImageUrl": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAcCAYAAAATFf3WAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAD6AAAA+gBtXtSawAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAIdSURBVFiF5dc5aBZBGMbxn0aMt+SQxCMEBDWNB0lh8MDCxsZGo4JgGkubgDairSAIFqKVqRURCxERFUQURVErUVARtPKoYhpRQ2Ixm3ybZffLfsuuKXzghZnZ2Yf/zuy8M8N/oNN4GYuVZZrPK8GjG32x+vwSPKc0t0yzKlQUcAF2YnmJLKlqFLALF/EVj9BZOlFCjfyDQziDRRWxpCov4FacRXOFLKnKO8XPsRvfMY5h9ONdRVxTmmkE9+EPbuGJMJIdAvCsayG+YAwn6vS7jIlYdJcJUW+KB4VV2oRzwuj9c9UDPBwrP1X+tG6WIyNkATZjW6x+JaPfBrQn2jZiXaJtMVoScRD3o3LDahfSymR0ZfQbElZ1/B/8JowOrMWHxPNkvMGaIpB5dUxYSBP4iJ6ovTeCrQc3Ge+F7bMy7RVSUVtU34WRnHC/MJBlPCejvRNvY/UBPMgJu0RISzONyCbhwLEf9xoFJBwIOqLyeRzPCZjUDmyPymOR14Tw0Z/xoqDvtAQ8gtaCPndiPneLwqSpL2b8GqsL+qzA48jnQDloNd3AbSwr8G6/Wp5txikVnOBbhK2OcNcYxjWsqvPOclwQ8uNNYdFUrjY8VJvyn7iKo1ga9ekRPmDU9DTySskXqTRtwSfpeaw36jOY8uwH9lQNN6lWXMLvDMAjsbZxXFfxFpalbpwUTjijanfiQ3gm7N3rZwMsS00zdymuv/ffiLs8snLxAAAAAElFTkSuQmCC", + "properties": { + "title": "Top Contributors", + "datasetlabel": "Number of commits", + "summary": "This is a text representation of the chart above" + } + }] +} diff --git a/samples/react-chartcontrol/src/webparts/accessibleTable/AccessibleTableWebPart.ts b/samples/react-chartcontrol/src/webparts/accessibleTable/AccessibleTableWebPart.ts new file mode 100644 index 000000000..29d196789 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/accessibleTable/AccessibleTableWebPart.ts @@ -0,0 +1,92 @@ +import * as React from 'react'; +import * as ReactDom from 'react-dom'; +import { Version } from '@microsoft/sp-core-library'; +import { + BaseClientSideWebPart, + IPropertyPaneConfiguration, + PropertyPaneTextField +} from '@microsoft/sp-webpart-base'; + +import * as strings from 'AccessibleTableWebPartStrings'; +import AccessibleTable from './components/AccessibleTable'; +import { IAccessibleTableProps } from './components/IAccessibleTable.types'; + +import { CalloutTriggers } from '@pnp/spfx-property-controls/lib/PropertyFieldHeader'; +import { PropertyFieldTextWithCallout } from '@pnp/spfx-property-controls/lib/PropertyFieldTextWithCallout'; + +export interface IAccessibleTableWebPartProps { + summary: string; + caption: string; + title: string; + datasetlabel: string; +} + +export default class AccessibleTableWebPart extends BaseClientSideWebPart { + public render(): void { + const element: React.ReactElement = React.createElement( + AccessibleTable, + { + summary: this.properties.summary, + caption: this.properties.caption, + title: this.properties.title, + datasetlabel: this.properties.datasetlabel + } + ); + + ReactDom.render(element, this.domElement); + } + + protected onDispose(): void { + ReactDom.unmountComponentAtNode(this.domElement); + } + + protected get dataVersion(): Version { + return Version.parse('1.0'); + } + + protected getPropertyPaneConfiguration(): IPropertyPaneConfiguration { + return { + pages: [ + { + header: { + description: strings.PropertyPaneDescription + }, + groups: [ + { + groupName: strings.ChartSettingsGroupName, + groupFields: [ + PropertyPaneTextField('title', { + label: strings.TitleFieldLabel + }), + PropertyPaneTextField('datasetlabel', { + label: strings.DatasetFieldLabel + }) + ] + }, + { + groupName: strings.AccessibilitySettingsGroupName, + groupFields: [ + PropertyFieldTextWithCallout('caption', { + calloutTrigger: CalloutTriggers.Hover, + key: 'captionFieldId', + label: strings.CaptionFieldLabel, + calloutContent: React.createElement('span', {}, strings.CaptionFieldDescription), + calloutWidth: 150, + value: this.properties.caption + }), + PropertyFieldTextWithCallout('summary', { + calloutTrigger: CalloutTriggers.Hover, + key: 'summaryFieldId', + label: strings.SummaryFieldLabel, + calloutContent: React.createElement('span', {}, strings.SummaryFieldDescription), + calloutWidth: 150, + value: this.properties.summary + }) + ] + } + ] + } + ] + }; + } +} diff --git a/samples/react-chartcontrol/src/webparts/accessibleTable/components/AccessibleTable.module.scss b/samples/react-chartcontrol/src/webparts/accessibleTable/components/AccessibleTable.module.scss new file mode 100644 index 000000000..8f8da8d3b --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/accessibleTable/components/AccessibleTable.module.scss @@ -0,0 +1,42 @@ +@import "~@microsoft/sp-office-ui-fabric-core/dist/sass/SPFabricCore.scss"; + +.accessibleTable { + .shomMeTheTable { + position: unset !important; + left: unset !important; + top: unset !important; + width: unset !important; + height: unset !important; + display: block !important; + color: $ms-color-neutralSecondary; + background-color: $ms-color-neutralLighter; + text-align: left; + padding: 20px; + margin-top: 20px; + + & > table, + th, + td { + border: 1px solid black; + border-collapse: collapse; + } + + & > table { + margin-left: auto; + margin-right: auto; + width: 100%; + + & th { + border-bottom: 1px double black; + } + + & > caption { + font-size: $ms-font-size-xl; + font-weight: $ms-font-weight-semibold; + & span { + font-size: $ms-font-size-16; + } + } + } + } +} diff --git a/samples/react-chartcontrol/src/webparts/accessibleTable/components/AccessibleTable.tsx b/samples/react-chartcontrol/src/webparts/accessibleTable/components/AccessibleTable.tsx new file mode 100644 index 000000000..927da4acc --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/accessibleTable/components/AccessibleTable.tsx @@ -0,0 +1,59 @@ +import * as React from 'react'; +import styles from './AccessibleTable.module.scss'; +import { IAccessibleTableProps } from './IAccessibleTable.types'; +import * as strings from 'AccessibleTableWebPartStrings'; +import { escape } from '@microsoft/sp-lodash-subset'; +import { MessageBar } from 'office-ui-fabric-react/lib/MessageBar'; +import { Spinner, SpinnerSize } from 'office-ui-fabric-react/lib/Spinner'; + +import { ChartControl, ChartType, OFFICE_COLORFUL1, PaletteGenerator } from '@pnp/spfx-controls-react/lib/ChartControl'; + +import MockChartDataProvider from '../../../services/ChartDataProvider/MockChartDataProvider'; + +export default class AccessibleTable extends React.Component { + public render(): React.ReactElement { + + return ( +
+ + {strings.TableWarning} + + + } + options={{ + title: { + display: true, + text: escape(this.props.title), + } + }} + accessibility={ + { + className: styles.shomMeTheTable, + summary: this.props.summary, + caption: this.props.caption !== '' ? this.props.caption : this.props.title + } + } + /> +
+ ); + } +} diff --git a/samples/react-chartcontrol/src/webparts/accessibleTable/components/IAccessibleTable.types.ts b/samples/react-chartcontrol/src/webparts/accessibleTable/components/IAccessibleTable.types.ts new file mode 100644 index 000000000..6bbba585f --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/accessibleTable/components/IAccessibleTable.types.ts @@ -0,0 +1,7 @@ +export interface IAccessibleTableProps { + summary: string; + caption: string; + title: string; + datasetlabel: string; +} + diff --git a/samples/react-chartcontrol/src/webparts/accessibleTable/loc/en-us.js b/samples/react-chartcontrol/src/webparts/accessibleTable/loc/en-us.js new file mode 100644 index 000000000..c2cdf92f2 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/accessibleTable/loc/en-us.js @@ -0,0 +1,25 @@ +define([], function() { + return { + "TableWarning": "The table shown below is usually invisible except to users with a screen reader. We have made it visible for this example.", + "ChartTitle": "Top Contributors", + "DatasetLabel": "Number of Commits", + "DataLabels": [ + 'David', + 'Mikael', + 'Simon-Pierre', + 'Velin', + 'Vesa', + 'Waldek' + ], + "PropertyPaneDescription": "Use the options below to configure the accessiblity settings of the chart control.", + "AccessibilitySettingsGroupName": "Accessibility Settings", + "SummaryFieldLabel": "Summary", + "SummaryFieldDescription": "The summary is used to describe the chart. The summary appears at a 'summary' attribute of the table, which is read by screen readers, but isn't visible otherwsie.", + "CaptionFieldLabel": "Caption", + "CaptionFieldDescription": "If not provided, the accessible table will use the chart's title", + "DatasetFieldLabel": "Dataset label", + "TitleFieldLabel": "Chart title", + "ChartSettingsGroupName": "Chart Settings", + "Loading": "Loading" + } +}); diff --git a/samples/react-chartcontrol/src/webparts/accessibleTable/loc/mystrings.d.ts b/samples/react-chartcontrol/src/webparts/accessibleTable/loc/mystrings.d.ts new file mode 100644 index 000000000..98e1a1275 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/accessibleTable/loc/mystrings.d.ts @@ -0,0 +1,21 @@ +declare interface IAccessibleTableWebPartStrings { + DatasetFieldLabel: string; + TitleFieldLabel: string; + ChartSettingsGroupName: any; + CaptionFieldLabel: string; + TableWarning: string; + ChartTitle: string; + PropertyPaneDescription: string; + AccessibilitySettingsGroupName: string; + SummaryFieldLabel: string; + SummaryFieldDescription: string; + DatasetLabel: string; + DataLabels: string[]; + CaptionFieldDescription: string; + Loading: string; +} + +declare module 'AccessibleTableWebPartStrings' { + const strings: IAccessibleTableWebPartStrings; + export = strings; +} diff --git a/samples/react-chartcontrol/src/webparts/areaChartDemo/AreaChartDemoWebPart.manifest.json b/samples/react-chartcontrol/src/webparts/areaChartDemo/AreaChartDemoWebPart.manifest.json new file mode 100644 index 000000000..188cd5849 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/areaChartDemo/AreaChartDemoWebPart.manifest.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx/client-side-web-part-manifest.schema.json", + "id": "fcba1920-e685-428a-8637-ab15883a2d0b", + "alias": "AreaChartDemoWebPart", + "componentType": "WebPart", + + "version": "*", + "manifestVersion": 2, + "requiresCustomScript": false, + + "preconfiguredEntries": [{ + "groupId": "5c03119e-3074-46fd-976b-c60198311f70", + "group": { "default": "Other" }, + "title": { "default": "Area Chart" }, + "description": { "default": "Demonstrates how to use an area chart" }, + "officeFabricIconFontName": "AreaChart", + "properties": { + "description": "Area Chart" + } + }] +} diff --git a/samples/react-chartcontrol/src/webparts/areaChartDemo/AreaChartDemoWebPart.ts b/samples/react-chartcontrol/src/webparts/areaChartDemo/AreaChartDemoWebPart.ts new file mode 100644 index 000000000..de73d00b1 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/areaChartDemo/AreaChartDemoWebPart.ts @@ -0,0 +1,57 @@ +import * as React from 'react'; +import * as ReactDom from 'react-dom'; +import { Version } from '@microsoft/sp-core-library'; +import { + BaseClientSideWebPart, + IPropertyPaneConfiguration, +} from '@microsoft/sp-webpart-base'; +import { PropertyPaneWebPartInformation } from '@pnp/spfx-property-controls/lib/PropertyPaneWebPartInformation'; + +import * as strings from 'AreaChartDemoWebPartStrings'; +import AreaChartDemo from './components/AreaChartDemo'; +import { IAreaChartDemoProps } from './components/IAreaChartDemo.types'; + +export interface IAreaChartDemoWebPartProps { + description: string; +} + +export default class AreaChartDemoWebPart extends BaseClientSideWebPart { + + public render(): void { + const element: React.ReactElement = React.createElement( + AreaChartDemo, + { + } + ); + + ReactDom.render(element, this.domElement); + } + + protected onDispose(): void { + ReactDom.unmountComponentAtNode(this.domElement); + } + + protected get dataVersion(): Version { + return Version.parse('1.0'); + } + + protected getPropertyPaneConfiguration(): IPropertyPaneConfiguration { + return { + pages: [ + { + groups: [ + { + groupFields: [ + PropertyPaneWebPartInformation({ + description: strings.WebPartDescription, + moreInfoLink: strings.MoreInfoLinkUrl, + key: 'webPartInfoId' + }) + ] + } + ] + } + ] + }; + } +} diff --git a/samples/react-chartcontrol/src/webparts/areaChartDemo/components/AreaChartDemo.module.scss b/samples/react-chartcontrol/src/webparts/areaChartDemo/components/AreaChartDemo.module.scss new file mode 100644 index 000000000..4d2ebe47e --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/areaChartDemo/components/AreaChartDemo.module.scss @@ -0,0 +1,10 @@ +@import '~@microsoft/sp-office-ui-fabric-core/dist/sass/SPFabricCore.scss'; + +.areaChartDemo { + color:inherit; +} + +:export { + backgroundColor: rgba(255, 99, 132, 0.2); + borderColor: rgba(255,99,132,1); +} diff --git a/samples/react-chartcontrol/src/webparts/areaChartDemo/components/AreaChartDemo.tsx b/samples/react-chartcontrol/src/webparts/areaChartDemo/components/AreaChartDemo.tsx new file mode 100644 index 000000000..d09398fa2 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/areaChartDemo/components/AreaChartDemo.tsx @@ -0,0 +1,294 @@ +import * as React from 'react'; +import styles from './AreaChartDemo.module.scss'; +import { IAreaChartDemoProps, IAreaChartDemoState } from './IAreaChartDemo.types'; +import * as strings from 'AreaChartDemoWebPartStrings'; + +// used to add a chart control +import { ChartControl, ChartType } from '@pnp/spfx-controls-react/lib/ChartControl'; + +// used to retrieve (fake) data from a (fake) service +import MockChartDataProvider from '../../../services/ChartDataProvider/MockChartDataProvider'; + +// used to render the toolbar above the chart +import { + CommandBar, + IContextualMenuItem, + DirectionalHint +} from 'office-ui-fabric-react'; + +/** +In chart.js, there are really no "area" chart types; They're just line charts with a 'fill' +value. +This demo shows the following: +- Render a line chart with random data +- Store data in the state and randomize it +- Generate a gradient for a background color +- Change the fill value + */ +export default class AreaChartDemo extends React.Component { + /** +* The chart element +*/ + private _chartElem: ChartControl = undefined; + + + /** + * Always start showing 'loading' and with an empty dataset + * @param props + */ + constructor(props: IAreaChartDemoProps) { + super(props); + this.state = { + dataSet: [ + MockChartDataProvider.getRandomSignedNumber(), + MockChartDataProvider.getRandomSignedNumber(), + MockChartDataProvider.getRandomSignedNumber(), + MockChartDataProvider.getRandomSignedNumber(), + MockChartDataProvider.getRandomSignedNumber(), + MockChartDataProvider.getRandomSignedNumber(), + MockChartDataProvider.getRandomSignedNumber(), + MockChartDataProvider.getRandomSignedNumber(), + ], + fill: 'origin', + curved: false + }; + } + + /** + * Renders the command bar and the chart + */ + public render(): React.ReactElement { + const { + dataSet, + fill, + curved + } = this.state; + + + const data: Chart.ChartData = { + labels: + [ + 'January', 'February', 'March', 'April', 'May', 'June', 'July' + ], + datasets: [ + { + label: 'My First Dataset', + fill: fill, + lineTension: curved ? 0.4 : 0.000001, + backgroundColor: styles.backgroundColor, // 20% opacity red + borderColor: styles.borderColor, // opaque red + borderWidth: 1, + data: dataSet + } + ] + }; + + // set the options + const options: Chart.ChartOptions = { + legend: { + display: false, + }, + title: { + display: true, + text: 'My First Area Chart' + } + }; + + return ( +
+ {this._renderCommandBar()} + +
+ ); + } + + public componentDidMount(): void { + this._applyGradientFill(); + + } + + public componentDidUpdate(prevProps: IAreaChartDemoProps, prevState: IAreaChartDemoState): void { + this._applyGradientFill(); + } + + /** + * Renders the command bar control. + */ + private _renderCommandBar(): JSX.Element { + return ( + { this._handleRandomizeData(); }, + ['data-automation-id']: 'randomizeData' + }, + { + key: 'fill', + iconProps: { + iconName: 'BucketColor' + }, + subMenuProps: { + directionalHint: DirectionalHint.bottomCenter, + items: [ + { + key: 'fillNegative', + name: 'false', + canCheck: true, + isChecked: this.state.fill === false, + onClick: (ev: React.MouseEvent, item: IContextualMenuItem) => { this._handleToggleFill(ev, item); } + }, + { + key: 'fillOrigin', + name: 'origin', + canCheck: true, + isChecked: this.state.fill === 'origin', + onClick: (ev: React.MouseEvent, item: IContextualMenuItem) => { this._handleToggleFill(ev, item); } + }, + { + key: 'fillStart', + name: 'start', + canCheck: true, + isChecked: this.state.fill === 'start', + onClick: (ev: React.MouseEvent, item: IContextualMenuItem) => { this._handleToggleFill(ev, item); } + }, + { + key: 'fillEnd', + name: 'end', + canCheck: true, + isChecked: this.state.fill === 'end', + onClick: (ev: React.MouseEvent, item: IContextualMenuItem) => { this._handleToggleFill(ev, item); } + } + ] + }, + name: this.state.fill === false ? 'fill: false' : `fill: '${this.state.fill}'`, + canCheck: false, + split: true, + }, + { + key: 'alignment', + iconProps: { + iconName: 'Line' + }, + subMenuProps: { + directionalHint: DirectionalHint.bottomLeftEdge, + items: [ + { + key: 'smoothOff', + name: strings.NotSmooth, + canCheck: true, + isChecked: this.state.curved === false, + onClick: (ev: React.MouseEvent, item: IContextualMenuItem) => { this._handleToggleSmooth(ev, item); } + }, + { + key: 'smoothOn', + name: strings.Smooth, + canCheck: true, + isChecked: this.state.curved === true, + onClick: (ev: React.MouseEvent, item: IContextualMenuItem) => { this._handleToggleSmooth(ev, item); } + }, + ] + }, + name: strings.LineTypeCommandLabel, + canCheck: false, + split: true, + } + ]} + /> + ); + } + + /** + * Called when user clicks on Randomize Data. + * Reloads the entire dataset with newly retrieved randomized numbers + */ + private _handleRandomizeData = () => { + this.setState({ + dataSet: [ + MockChartDataProvider.getRandomSignedNumber(), + MockChartDataProvider.getRandomSignedNumber(), + MockChartDataProvider.getRandomSignedNumber(), + MockChartDataProvider.getRandomSignedNumber(), + MockChartDataProvider.getRandomSignedNumber(), + MockChartDataProvider.getRandomSignedNumber(), + MockChartDataProvider.getRandomSignedNumber(), + MockChartDataProvider.getRandomSignedNumber(), + ], + }); + } + + /** + * Changes the line type from straight to curved, and vice-versa + */ + private _handleToggleSmooth = (ev: React.MouseEvent, item: IContextualMenuItem) => { + ev!.preventDefault(); + + // Should it be curved -- or smooth + const isSmooth: boolean = item.key === 'smoothOn'; + this.setState({ + curved: isSmooth + }, () => { + this.forceUpdate(); + }); + } + + /** + * Changes the type of fill + */ + private _handleToggleFill = (ev: React.MouseEvent, item: IContextualMenuItem) => { + ev!.preventDefault(); + + let fillType: false | 'origin' | 'start' | 'end' = undefined; + switch (item.key) { + case 'fillOrigin': + fillType = 'origin'; + break; + case 'fillStart': + fillType = 'start'; + break; + case 'fillEnd': + fillType = 'end'; + break; + default: + fillType = false; + } + + this.setState({ + fill: fillType + }, () => { + this.forceUpdate(); + }); + } + + /** + * Links a reference to the chart so that we can + * refer to it later and change its data + */ + // tslint:disable-next-line no-any + private _linkElement = (e: any) => { + this._chartElem = e; + } + + private _applyGradientFill() { + const canvas: HTMLCanvasElement = this._chartElem.getCanvas(); + const ctx = canvas.getContext('2d'); + let gradientFill = ctx.createLinearGradient(0, 0, 0, canvas.height); + gradientFill.addColorStop(0, 'rgba(255, 99, 132, 0.5)'); + gradientFill.addColorStop(1, 'rgba(255, 255, 255, 0)'); + + let data: Chart.ChartDataSets = this._chartElem.getChart().data.datasets[0]; + data.backgroundColor = gradientFill; + this._chartElem.update(); + } +} diff --git a/samples/react-chartcontrol/src/webparts/areaChartDemo/components/IAreaChartDemo.types.ts b/samples/react-chartcontrol/src/webparts/areaChartDemo/components/IAreaChartDemo.types.ts new file mode 100644 index 000000000..16be394aa --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/areaChartDemo/components/IAreaChartDemo.types.ts @@ -0,0 +1,8 @@ +export interface IAreaChartDemoProps { +} + +export interface IAreaChartDemoState { + dataSet: number[]; + fill: false | 'origin' | 'start' | 'end'; + curved: boolean; +} diff --git a/samples/react-chartcontrol/src/webparts/areaChartDemo/loc/en-us.js b/samples/react-chartcontrol/src/webparts/areaChartDemo/loc/en-us.js new file mode 100644 index 000000000..614071591 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/areaChartDemo/loc/en-us.js @@ -0,0 +1,14 @@ +define([], function() { + return { + "ChartTitle": "Area Chart", + "RandomizeCommandLabel": "Randomize data", + "LineTypeCommandLabel": "Line type", + "Smooth": "Curved", + "NotSmooth": "Straight", + "ChartLabes": [ + 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug' + ], + "WebPartDescription": `

This web part demonstrates how to use the PnP ChartControl to render an area chart as per the Chart.js sample

`, + "MoreInfoLinkUrl": "https://sharepoint.github.io/sp-dev-fx-controls-react/controls/ChartControl/" + } +}); diff --git a/samples/react-chartcontrol/src/webparts/areaChartDemo/loc/mystrings.d.ts b/samples/react-chartcontrol/src/webparts/areaChartDemo/loc/mystrings.d.ts new file mode 100644 index 000000000..a815df8bd --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/areaChartDemo/loc/mystrings.d.ts @@ -0,0 +1,15 @@ +declare interface IAreaChartDemoWebPartStrings { + ChartTitle: string; + RandomizeCommandLabel: string; + ChartLabels: string[]; + LineTypeCommandLabel: string; + Smooth: string; + NotSmooth: string; + WebPartDescription: string; + MoreInfoLinkUrl: string; +} + +declare module 'AreaChartDemoWebPartStrings' { + const strings: IAreaChartDemoWebPartStrings; + export = strings; +} diff --git a/samples/react-chartcontrol/src/webparts/barChartDemo/BarChartDemoWebPart.manifest.json b/samples/react-chartcontrol/src/webparts/barChartDemo/BarChartDemoWebPart.manifest.json new file mode 100644 index 000000000..47b9244d2 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/barChartDemo/BarChartDemoWebPart.manifest.json @@ -0,0 +1,22 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx/client-side-web-part-manifest.schema.json", + "id": "74f7231a-c3f1-4ef5-94e7-3d2dd97cb39b", + "alias": "BarChartDemoWebPart", + "componentType": "WebPart", + + "version": "*", + "manifestVersion": 2, + + "requiresCustomScript": false, + + "preconfiguredEntries": [{ + "groupId": "5c03119e-3074-46fd-976b-c60198311f70", + "group": { "default": "Other" }, + "title": { "default": "Bar Chart" }, + "description": { "default": "Demonstrates how to create a bar chart with the least possible amount of code" }, + "officeFabricIconFontName": "BarChartVertical", + "properties": { + "description": "BarChartDemo" + } + }] +} diff --git a/samples/react-chartcontrol/src/webparts/barChartDemo/BarChartDemoWebPart.ts b/samples/react-chartcontrol/src/webparts/barChartDemo/BarChartDemoWebPart.ts new file mode 100644 index 000000000..4d7c84dae --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/barChartDemo/BarChartDemoWebPart.ts @@ -0,0 +1,63 @@ +import * as React from 'react'; +import * as ReactDom from 'react-dom'; +import * as strings from 'BarChartDemoWebPartStrings'; +import { Version } from '@microsoft/sp-core-library'; +import { + BaseClientSideWebPart, + IPropertyPaneConfiguration, +} from '@microsoft/sp-webpart-base'; +import { PropertyPaneWebPartInformation } from '@pnp/spfx-property-controls/lib/PropertyPaneWebPartInformation'; +import BarChartDemo from './components/BarChartDemo'; +import { IBarChartDemoProps } from './components/IBarChartDemo.types'; + +export interface IBarChartDemoWebPartProps { + description: string; +} +/** + * This web part retrieves data asynchronously and renders a bar chart once loaded + * It mimics a "real-life" scenario by loading (random) data asynchronously + * and rendering the chart once the data has been retrieved. + * To keep the demo simple, we don't specify custom colors. + */ +export default class BarChartDemoWebPart extends BaseClientSideWebPart { + + public render(): void { + + const element: React.ReactElement = React.createElement( + BarChartDemo, + { + // there are no properties to pass for this demo + } + ); + + ReactDom.render(element, this.domElement); + } + + protected onDispose(): void { + ReactDom.unmountComponentAtNode(this.domElement); + } + + protected get dataVersion(): Version { + return Version.parse('1.0'); + } + + protected getPropertyPaneConfiguration(): IPropertyPaneConfiguration { + return { + pages: [ + { + groups: [ + { + groupFields: [ + PropertyPaneWebPartInformation({ + description: strings.WebPartDescription, + moreInfoLink: strings.MoreInfoLinkUrl, + key: 'webPartInfoId' + }) + ] + } + ] + } + ] + }; + } +} diff --git a/samples/react-chartcontrol/src/webparts/barChartDemo/components/BarChartDemo.module.scss b/samples/react-chartcontrol/src/webparts/barChartDemo/components/BarChartDemo.module.scss new file mode 100644 index 000000000..ee6ef2892 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/barChartDemo/components/BarChartDemo.module.scss @@ -0,0 +1,21 @@ +@import "~@microsoft/sp-office-ui-fabric-core/dist/sass/SPFabricCore.scss"; + +.barChartDemo { + color: inherit; // so that SCSS doesn't complain about an empty class +} + +:export { + background1: rgba(255, 99, 132, 0.2); + background2: rgba(54, 162, 235, 0.2); + background3: rgba(255, 206, 86, 0.2); + background4: rgba(75, 192, 192, 0.2); + background5: rgba(153, 102, 255, 0.2); + background6: rgba(255, 159, 64, 0.2); + + border1: rgba(255, 99, 132, 1); + border2: rgba(54, 162, 235, 1); + border3: rgba(255, 206, 86, 1); + border4: rgba(75, 192, 192, 1); + border5: rgba(153, 102, 255, 1); + border6: rgba(255, 159, 64, 1); +} diff --git a/samples/react-chartcontrol/src/webparts/barChartDemo/components/BarChartDemo.tsx b/samples/react-chartcontrol/src/webparts/barChartDemo/components/BarChartDemo.tsx new file mode 100644 index 000000000..caec90abe --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/barChartDemo/components/BarChartDemo.tsx @@ -0,0 +1,91 @@ +import * as React from 'react'; +import styles from './BarChartDemo.module.scss'; +import * as strings from 'BarChartDemoWebPartStrings'; +import { IBarChartDemoProps, IBarChartDemoState } from './IBarChartDemo.types'; +import MockChartDataProvider from '../../../services/ChartDataProvider/MockChartDataProvider'; +import IChartDataProvider from '../../../services/ChartDataProvider/IChartDataProvider'; +import { Spinner, SpinnerSize } from 'office-ui-fabric-react/lib/Spinner'; + +import { ChartControl, ChartType } from '@pnp/spfx-controls-react/lib/ChartControl'; + +const DATA_LENGTH: number = 7; + +/** + * This demo shows how to easily load data from an asynchronous service + * and display the results, rendering a "please wait" message while + * data is loading. + */ +export default class BarChartDemo extends React.Component { + /** + * Renders the "Loading" spinner if the state is currently loading, + * or the chart once data is loladed + */ + public render(): React.ReactElement { + return ( +
+ } + options={{ + scales: + { + yAxes: + [{ + ticks: + { + beginAtZero: true // optional, but makes the chart start at zero instead of the minimum value + } + }] + }, + // animation is totally unecessary -- it just makes this demo pretty + animation: { + easing: 'easeInOutBack' + } + }} + /> +
+ ); + } + + /** + * Loads data from a service. + * This is where you would replace for your own code + */ + private _loadAsyncData(): Promise { + return new Promise((resolve, reject) => { + // we're using a mock service that returns random numbers. + const dataProvider: IChartDataProvider = new MockChartDataProvider(); + dataProvider.getNumberArray(DATA_LENGTH, 2000).then((dataSet: number[]) => { + const data: Chart.ChartData = + { + labels: strings.ChartLabels, + datasets: [ + { + label: strings.DataSetLabel, + data: dataSet, + backgroundColor: [ + styles.background1, + styles.background2, + styles.background3, + styles.background4, + styles.background5, + styles.background6 + ], + borderColor: [ + styles.border1, + styles.border2, + styles.border3, + styles.border4, + styles.border5, + styles.border6 + ], + borderWidth: 1 + } + ] + }; + resolve(data); + }); + }); + } +} diff --git a/samples/react-chartcontrol/src/webparts/barChartDemo/components/IBarChartDemo.types.ts b/samples/react-chartcontrol/src/webparts/barChartDemo/components/IBarChartDemo.types.ts new file mode 100644 index 000000000..b657404ef --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/barChartDemo/components/IBarChartDemo.types.ts @@ -0,0 +1,7 @@ +export interface IBarChartDemoProps { + // no props +} + +export interface IBarChartDemoState { +// no state +} diff --git a/samples/react-chartcontrol/src/webparts/barChartDemo/loc/en-us.js b/samples/react-chartcontrol/src/webparts/barChartDemo/loc/en-us.js new file mode 100644 index 000000000..aaaa30a90 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/barChartDemo/loc/en-us.js @@ -0,0 +1,11 @@ +define([], function() { + return { + "DataSetLabel": "Cat Videos", + "ChartLabels": [ + 'January', 'February', 'March', 'April', 'May', 'June', 'July' + ], + "PleaseWait" : "Counting cat videos per month...", + "WebPartDescription": `

This web part demonstrates how to use the PnP ChartControl to render a bar chart using data from asynchronous service.

It uses the sample bar chart found in Chart.js's documentation from Chart.js

`, + "MoreInfoLinkUrl": "https://sharepoint.github.io/sp-dev-fx-controls-react/controls/ChartControl/" + } +}); diff --git a/samples/react-chartcontrol/src/webparts/barChartDemo/loc/mystrings.d.ts b/samples/react-chartcontrol/src/webparts/barChartDemo/loc/mystrings.d.ts new file mode 100644 index 000000000..3d39e9566 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/barChartDemo/loc/mystrings.d.ts @@ -0,0 +1,12 @@ +declare interface IBarChartDemoWebPartStrings { + DataSetLabel: string; + ChartLabels: string[]; + WebPartDescription: string; + MoreInfoLinkUrl: string; + PleaseWait: string; +} + +declare module 'BarChartDemoWebPartStrings' { + const strings: IBarChartDemoWebPartStrings; + export = strings; +} diff --git a/samples/react-chartcontrol/src/webparts/barChartStatic/BarChartStaticWebPart.manifest.json b/samples/react-chartcontrol/src/webparts/barChartStatic/BarChartStaticWebPart.manifest.json new file mode 100644 index 000000000..79d79da02 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/barChartStatic/BarChartStaticWebPart.manifest.json @@ -0,0 +1,22 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx/client-side-web-part-manifest.schema.json", + "id": "8459e5ba-c215-4887-a23b-563af4733ddc", + "alias": "BarChartStaticWebPart", + "componentType": "WebPart", + + "version": "*", + "manifestVersion": 2, + + "requiresCustomScript": false, + + "preconfiguredEntries": [{ + "groupId": "5c03119e-3074-46fd-976b-c60198311f70", + "group": { "default": "Other" }, + "title": { "default": "Bar Chart - Static Data" }, + "description": { "default": "Shows the easiest way to display static data." }, + "iconImageUrl": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAcCAYAAAATFf3WAAABG2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS41LjAiPgogPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIi8+CiA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgo8P3hwYWNrZXQgZW5kPSJyIj8+Gkqr6gAAAYFpQ0NQc1JHQiBJRUM2MTk2Ni0yLjEAACiRdZG/S0JRFMc/aqGUYVBDUIOENWlYQdTSoJQF1aAGWS368keg9nhPCWkNWoWCqKVfQ/0FtQbNQVAUQTQ0NRe1lLzOy8CIPJdzz+d+7z2He88FazSr5PQGP+TyBS0cCrjnYvNu+xNOHFjpxB5XdHU6Mh6lrr3fYjHjtc+sVf/cv9a8lNQVsDiERxVVKwhPCE+tFlSTt4TblUx8SfhE2KvJBYVvTD1R5WeT01X+NFmLhoNgbRV2p39x4hcrGS0nLC/Hk8sWlZ/7mC9xJvOzEYnd4l3ohAkRwM0kYwQZop8RmYfwMUCfrKiT7//On2FFchWZVUpoLJMmQwGvqEWpnpSYEj0pI0vJ7P/fvuqpwYFqdWcAGh8N47UH7JtQKRvGx4FhVA7B9gDn+Vr+yj4Mv4lermmePXCtw+lFTUtsw9kGdNyrcS3+LdnErakUvBxDSwzarqBpodqzn32O7iC6Jl91CTu70CvnXYtfBnVnugxnM5UAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAGoSURBVFiFzZY/bsIwFId/pj1AxVgppBITqlTWKoOdDpSBSyC2DohWIorY4CQ5BXsSJEaUTKw5Qm/gDhDEHyfYxHH5JCvRs579ybFfDNw5D4LYE4D3/fuvQRdpXAAcwPx/NXY81jj2EMDLWSzcN2nqFmSCeKgySEOHyRU+APzcmlznCuaEVZJlVjDE7tAct3mVSVVQ+cQRgLQukSJUBF0A3zV5FFJ1Dw6hoZSUoUOwcikpQ1eZqVRKytBVZkJN41xgolBXwqjgYrF4zd89z+OUUk4p5Z7n8aIco4KO49gA4Ps+t20bcRyTOI5Jq9WC7/tCSRO/ugOdTscCgPV6jdVqRfL4eDwmlFKhoLEV7Ha74JxzAGg0LqclhFzEAEOCs9msnaYpsSzrWTXXiGCv13sDgCAIOGOMJ0kCxhg/bnksCIKTT62yBwtP2rW+zWYDAJMsyxBFEQAcnsdEUQTXdU9iMoKJIJap9DWbzbbEPEJkBMtuMFJ9o9FIWuicMkEXmi6my+XyczAYOLfklgkyiG8qymy325tzRYIJdrcTbfT7/a/pdKpzyPvhD3sccj6XxnsRAAAAAElFTkSuQmCC", + "properties": { + "description": "BarChartStatic" + } + }] +} diff --git a/samples/react-chartcontrol/src/webparts/barChartStatic/BarChartStaticWebPart.ts b/samples/react-chartcontrol/src/webparts/barChartStatic/BarChartStaticWebPart.ts new file mode 100644 index 000000000..33db122a8 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/barChartStatic/BarChartStaticWebPart.ts @@ -0,0 +1,57 @@ +import * as React from 'react'; +import * as ReactDom from 'react-dom'; +import { Version } from '@microsoft/sp-core-library'; +import { + BaseClientSideWebPart, + IPropertyPaneConfiguration, +} from '@microsoft/sp-webpart-base'; +import { PropertyPaneWebPartInformation } from '@pnp/spfx-property-controls/lib/PropertyPaneWebPartInformation'; +import * as strings from 'BarChartStaticWebPartStrings'; +import BarChartStatic from './components/BarChartStatic'; +import { IBarChartStaticProps } from './components/IBarChartStaticProps'; + +export interface IBarChartStaticWebPartProps { + description: string; +} + +export default class BarChartStaticWebPart extends BaseClientSideWebPart { + + public render(): void { + const element: React.ReactElement = React.createElement( + BarChartStatic, + { + // no properties to pass + } + ); + + ReactDom.render(element, this.domElement); + } + + protected onDispose(): void { + ReactDom.unmountComponentAtNode(this.domElement); + } + + protected get dataVersion(): Version { + return Version.parse('1.0'); + } + + protected getPropertyPaneConfiguration(): IPropertyPaneConfiguration { + return { + pages: [ + { + groups: [ + { + groupFields: [ + PropertyPaneWebPartInformation({ + description: strings.WebPartDescription, + moreInfoLink: strings.MoreInfoLinkUrl, + key: 'webPartInfoId' + }) + ] + } + ] + } + ] + }; + } +} diff --git a/samples/react-chartcontrol/src/webparts/barChartStatic/components/BarChartStatic.module.scss b/samples/react-chartcontrol/src/webparts/barChartStatic/components/BarChartStatic.module.scss new file mode 100644 index 000000000..978690ac8 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/barChartStatic/components/BarChartStatic.module.scss @@ -0,0 +1,74 @@ +@import '~@microsoft/sp-office-ui-fabric-core/dist/sass/SPFabricCore.scss'; + +.barChartStatic { + .container { + max-width: 700px; + margin: 0px auto; + box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2), 0 25px 50px 0 rgba(0, 0, 0, 0.1); + } + + .row { + @include ms-Grid-row; + @include ms-fontColor-white; + background-color: $ms-color-themeDark; + padding: 20px; + } + + .column { + @include ms-Grid-col; + @include ms-lg10; + @include ms-xl8; + @include ms-xlPush2; + @include ms-lgPush1; + } + + .title { + @include ms-font-xl; + @include ms-fontColor-white; + } + + .subTitle { + @include ms-font-l; + @include ms-fontColor-white; + } + + .description { + @include ms-font-l; + @include ms-fontColor-white; + } + + .button { + // Our button + text-decoration: none; + height: 32px; + + // Primary Button + min-width: 80px; + background-color: $ms-color-themePrimary; + border-color: $ms-color-themePrimary; + color: $ms-color-white; + + // Basic Button + outline: transparent; + position: relative; + font-family: "Segoe UI WestEuropean","Segoe UI",-apple-system,BlinkMacSystemFont,Roboto,"Helvetica Neue",sans-serif; + -webkit-font-smoothing: antialiased; + font-size: $ms-font-size-m; + font-weight: $ms-font-weight-regular; + border-width: 0; + text-align: center; + cursor: pointer; + display: inline-block; + padding: 0 16px; + + .label { + font-weight: $ms-font-weight-semibold; + font-size: $ms-font-size-m; + height: 32px; + line-height: 32px; + margin: 0 4px; + vertical-align: top; + display: inline-block; + } + } +} \ No newline at end of file diff --git a/samples/react-chartcontrol/src/webparts/barChartStatic/components/BarChartStatic.tsx b/samples/react-chartcontrol/src/webparts/barChartStatic/components/BarChartStatic.tsx new file mode 100644 index 000000000..79d96ae22 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/barChartStatic/components/BarChartStatic.tsx @@ -0,0 +1,43 @@ +import * as React from 'react'; +import styles from './BarChartStatic.module.scss'; +import { IBarChartStaticProps } from './IBarChartStaticProps'; + +import { ChartControl, ChartType } from '@pnp/spfx-controls-react/lib/ChartControl'; + +/** + * Renders a static bar chart. + * This demo is intended to demonstrate how to take a sample from Chart.js + * and use it with the ChartControl. + * You shouldn't hard-code the data or the text, but we're trying to keep + * this sample as simple as possible. + * @see https://www.chartjs.org/docs/latest/ for the original sample code. + */ +export default class BarChartStatic extends React.Component { + public render(): React.ReactElement { + return ( +
+ +
+ ); + } +} diff --git a/samples/react-chartcontrol/src/webparts/barChartStatic/components/IBarChartStaticProps.ts b/samples/react-chartcontrol/src/webparts/barChartStatic/components/IBarChartStaticProps.ts new file mode 100644 index 000000000..5348997a7 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/barChartStatic/components/IBarChartStaticProps.ts @@ -0,0 +1,3 @@ +export interface IBarChartStaticProps { + +} diff --git a/samples/react-chartcontrol/src/webparts/barChartStatic/loc/en-us.js b/samples/react-chartcontrol/src/webparts/barChartStatic/loc/en-us.js new file mode 100644 index 000000000..db030511e --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/barChartStatic/loc/en-us.js @@ -0,0 +1,13 @@ +define([], function() { + return { + "WebPartDescription": `

This web part shows how to use the PnP ChartControl to render a bar chart in its simplest form.

We took the sample code from Chart.js and simplified it by: +

    +
  • Keeping the hard-coded (in real life, you would want to retrieve the data from somewhere) +
  • We did not localize any strings (in real life, you should localize your strings) +
  • We did not change the colors (the ChartComponent automatically provides colors if none are provided) +
+

+ `, + "MoreInfoLinkUrl": "https://sharepoint.github.io/sp-dev-fx-controls-react/controls/ChartControl/" + } +}); diff --git a/samples/react-chartcontrol/src/webparts/barChartStatic/loc/mystrings.d.ts b/samples/react-chartcontrol/src/webparts/barChartStatic/loc/mystrings.d.ts new file mode 100644 index 000000000..135348086 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/barChartStatic/loc/mystrings.d.ts @@ -0,0 +1,9 @@ +declare interface IBarChartStaticWebPartStrings { + WebPartDescription: string; + MoreInfoLinkUrl: string; +} + +declare module 'BarChartStaticWebPartStrings' { + const strings: IBarChartStaticWebPartStrings; + export = strings; +} diff --git a/samples/react-chartcontrol/src/webparts/bubbleChartDemo/BubbleChartDemoWebPart.manifest.json b/samples/react-chartcontrol/src/webparts/bubbleChartDemo/BubbleChartDemoWebPart.manifest.json new file mode 100644 index 000000000..0df1a5712 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/bubbleChartDemo/BubbleChartDemoWebPart.manifest.json @@ -0,0 +1,23 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx/client-side-web-part-manifest.schema.json", + "id": "dd21a307-fd9f-4fef-8d9f-d8abcb83b814", + "alias": "BubbleChartDemoWebPart", + "componentType": "WebPart", + + "version": "*", + "manifestVersion": 2, + + "requiresCustomScript": false, + + "preconfiguredEntries": [{ + "groupId": "5c03119e-3074-46fd-976b-c60198311f70", + "group": { "default": "Other" }, + + "title": { "default": "Bubble Chart" }, + "description": { "default": "Demonstrates how to use bubble charts" }, + "iconImageUrl": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAcCAYAAAATFf3WAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAO3QAADt0BKvL0UAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAARcSURBVFiF7Zh/SKN1HMffcw43vXM2/9C5sJhyxoyJNg1s5jkOpEKzKeIho4H/mDgcYnj+ERSoRafpdQYFlwaHYDjxSJyxzCRNGUuW4hy7cj8YrtJukT8677z89Iduzcdn3q7YKOgNDzzf7+fD5/N6ns/3+X6+PBycVg2A1wFkA+Cw2KMhAvA9gKsAxkINTIDnAcwAuA7gp5ig/aV0ADoAFwHMh3N6H8BqjIDYtArgWuhEHMPhMQAHgUF/f/+1lpaWOYvFIo0BHI5zi0InmIAn5HK5FAaD4dnd3V15VLEeQTcBWAMDi8UinZ2dfSWG+a3HDEHFn+VdWFjoBOCMJtHDdGaJ/w36H/Cf6r8NSESSlZWV6zab7W0iEsYK6iwFtxkiSpuamvohPT2dsrOzaXFx8Tsi4kc5/6ltJiygw+G4IpPJCEeNnKqqqu7t7+9fijVg2BLz+XyfRCIJtj2ZTPZ7QkLCnSjCsYp5mrkJ4GkA+UTEtVqtUxMTE0UbGxuJNpsNqampXpVK9bFer+8+K6jRaMw3m811Ozs75+VyuUWr1Q5FyGPF0YFBE87hRKvzer2iiooKN47LDIDS0tLuDQ4OXg4XYGhoSJ2fn/9zwD85OfmPzs7OTx4BMLI1CAAGg+FVLpcbhAtcOp0u7Bupr6//lukvEokOxsbGIunpka9BAEhMTNzn8Xin5rlc7v3A/ebmptJut3+5vr7+GhGl2u32p5j+fr8/3mazKSIAPCVWQCLiarXaWz09PW81NDTcDrXl5OT8Vlxc/Glg7PF4buTl5anMZvMbAM6JxWLWD0ksFm/9HUDW04zL5XrcZDK95PP54nNzcwdbW1uFKysraTweD+Xl5bba2tqZgG9CQsKeQqGARCJ5AGC7tLR03GQytRwcBDcAVFdXr6pUqqGQ+PyRkZHO9fV1qUKhMDU2Nn4YKXBwDer1+jfVavXI5ORkY1JSUnA9ZWVl3Xc4HMEyzs3NXV5YWPh8a2vrIgAQUXxvb+87arV6ubKy0tnc3Dw+PT0tC03S3d19NS4ujgBQRkbG3dHR0ReOTZGdB4mI39HRka1UKj8TCoVeoVB4sLe3xwOAlJSUuwKBYBsAhoeHX9ZoNDfcbndiU1PTeQDPcTicBwCuHF8AgIGBgRPxnU5n1uHhIQDA5/PxvV5vPoApNhbWNbi0tPTk/Px8hd/vv6RUKud0Ot1HRUVF2yUlJXfq6urey8zM9AGAx+MpcLvdiQCwtrZ2gYgEjAeNI6JTL6GwsPALiUSyDwBlZWVeuVx+i42DTcESO53OJ4go+AkTkYiIkkOdZ2ZmcjQazXJBQcFuV1fXB8xg7e3txra2tq/ZEhkMhhf7+vo6GOV/aIl/BcADAKlU6gk1cDgcPzOJSqVyENEzAFI4HM4vTLtAIFgmonNsgDU1NUYARsY0D8CJPMxWVwLgKwADAH5kCxxFiQE0AygF8E1gku3XhhpHvz4uhLFHQwTgNoB3AYyHGv4Ec4GuEtcWUi8AAAAASUVORK5CYII=", + "properties": { + "description": "Bubble Chart" + } + }] +} diff --git a/samples/react-chartcontrol/src/webparts/bubbleChartDemo/BubbleChartDemoWebPart.ts b/samples/react-chartcontrol/src/webparts/bubbleChartDemo/BubbleChartDemoWebPart.ts new file mode 100644 index 000000000..d11780263 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/bubbleChartDemo/BubbleChartDemoWebPart.ts @@ -0,0 +1,57 @@ +import * as React from 'react'; +import * as ReactDom from 'react-dom'; +import { Version } from '@microsoft/sp-core-library'; +import { + BaseClientSideWebPart, + IPropertyPaneConfiguration, +} from '@microsoft/sp-webpart-base'; +import { PropertyPaneWebPartInformation } from '@pnp/spfx-property-controls/lib/PropertyPaneWebPartInformation'; + +import * as strings from 'BubbleChartDemoWebPartStrings'; +import BubbleChartDemo from './components/BubbleChartDemo'; +import { IBubbleChartDemoProps } from './components/IBubbleChartDemo.types'; + +export interface IBubbleChartDemoWebPartProps { + description: string; +} + +export default class BubbleChartDemoWebPart extends BaseClientSideWebPart { + + public render(): void { + const element: React.ReactElement = React.createElement( + BubbleChartDemo, + { + } + ); + + ReactDom.render(element, this.domElement); + } + + protected onDispose(): void { + ReactDom.unmountComponentAtNode(this.domElement); + } + + protected get dataVersion(): Version { + return Version.parse('1.0'); + } + + protected getPropertyPaneConfiguration(): IPropertyPaneConfiguration { + return { + pages: [ + { + groups: [ + { + groupFields: [ + PropertyPaneWebPartInformation({ + description: strings.WebPartDescription, + moreInfoLink: strings.MoreInfoLinkUrl, + key: 'webPartInfoId' + }) + ] + } + ] + } + ] + }; + } +} diff --git a/samples/react-chartcontrol/src/webparts/bubbleChartDemo/components/BubbleChartDemo.module.scss b/samples/react-chartcontrol/src/webparts/bubbleChartDemo/components/BubbleChartDemo.module.scss new file mode 100644 index 000000000..591d06b38 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/bubbleChartDemo/components/BubbleChartDemo.module.scss @@ -0,0 +1,13 @@ +@import '~@microsoft/sp-office-ui-fabric-core/dist/sass/SPFabricCore.scss'; + +.bubbleChartDemo { + color: inherit; +} + +:export { +color1: rgb(255, 99, 132); +color2: rgb(255, 159, 64); +color3: rgb(255, 205, 86); +color4: rgb(75, 192, 192); +color5: rgb(54, 162, 235); +} diff --git a/samples/react-chartcontrol/src/webparts/bubbleChartDemo/components/BubbleChartDemo.tsx b/samples/react-chartcontrol/src/webparts/bubbleChartDemo/components/BubbleChartDemo.tsx new file mode 100644 index 000000000..0459439de --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/bubbleChartDemo/components/BubbleChartDemo.tsx @@ -0,0 +1,243 @@ +import * as React from 'react'; +import styles from './BubbleChartDemo.module.scss'; +import { IBubbleChartDemoProps } from './IBubbleChartDemo.types'; +import * as strings from 'BubbleChartDemoWebPartStrings'; +import * as Color from 'color'; + +// used to add a chart control +import { ChartControl, ChartType, PaletteGenerator } from '@pnp/spfx-controls-react/lib/ChartControl'; + +// used to retrieve (fake) data from a (fake) service +import IChartDataProvider from '../../../services/ChartDataProvider/IChartDataProvider'; +import MockChartDataProvider from '../../../services/ChartDataProvider/MockChartDataProvider'; + +// used to render the toolbar above the chart +import { + CommandBar +} from 'office-ui-fabric-react'; + +/** + * Define the chart colors: + * Red, + * Orange, + * Yellow, + * Green, + * Blue + */ +const chartColors: string[] = [ + styles.color1, + styles.color2, + styles.color3, + styles.color4, + styles.color5]; + +const chartBackgroundColors: string[] = PaletteGenerator.alpha(chartColors, 0.2) as string[]; + +const DATA_COUNT: number = 16; +const DATSET_LENGTH: number = 2; +const MAX_BORDERWIDTH: number = 8; + +export default class BubbleChartDemo extends React.Component { + /** + * The chart element + */ + private _chartElem: ChartControl = undefined; + + + public render(): React.ReactElement { + return ( +
+ {this._renderCommandBar()} + { + const eventItem = this._chartElem.getElementAtEvent(event); + + // don't do anything if we didn't click on a bubble + if (eventItem[0] === undefined) { + return; + } + + // get the data item passed from the event + const datasetIndex: number = eventItem![0]!['_datasetIndex']; + const itemIndex: number = eventItem![0]!['_index']; + + // pop that bubble! + if (datasetIndex !== undefined && itemIndex !== undefined) { + // I wish I could make a 'pop' sound + + // get the chart's data + const { data } = this._chartElem.getChart(); + + // remove the data item that was clicked + data.datasets[datasetIndex]!.data!.splice(itemIndex, 1); + + // update that chart! + this._chartElem.update(); + } + }} + /> +
+ ); + } + + /** + * Renders the command bar control. + */ + private _renderCommandBar(): JSX.Element { + return ( + { this._handleRandomizeData(); }, + ['data-automation-id']: 'randomizeData' + }, + { + key: 'addData', + name: strings.AddDatasetCommandLabel, + iconProps: { + iconName: 'Table' + }, + onClick: () => { this._handleAddDataset(); }, + ['data-automation-id']: 'addDataset' + }, + { + key: 'removeData', + name: strings.RemoveDatasetCommandLabel, + icon: 'DeleteTable', + onClick: () => { this._handleRemoveDataset(); }, + ['data-automation-id']: 'removeData' + }, + ]} + /> + ); + } + + /** + * Links a reference to the chart so that we can + * refer to it later and change its data + */ + // tslint:disable-next-line no-any + private _linkElement = (e: any) => { + this._chartElem = e; + } + + /** + * Loads data from a service. + * This is where you would replace for your own code + */ + private _loadAsyncData(): Promise { + return new Promise((resolve, reject) => { + const dataProvider: IChartDataProvider = new MockChartDataProvider(); + dataProvider + .getMultiBubbleArrays(DATSET_LENGTH, DATA_COUNT) // we only need 5 data elements for this demo + .then((bubbleArrays: Array) => { + const data: Chart.ChartData = { + datasets: [{ + label: strings.DataSet1Label, + backgroundColor: chartBackgroundColors[0], + borderColor: chartColors[0], + hoverBackgroundColor: chartColors[0], + borderWidth: 1, + data: bubbleArrays[0] + }, { + label: strings.DataSet2Label, + backgroundColor: chartBackgroundColors[1], + borderColor: chartColors[1], + hoverBackgroundColor: chartColors[1], + borderWidth: 2, + data: bubbleArrays[1] + }] + }; + + resolve(data); + }); + }); + } + + /** + * Called when user clicks on Randomize Data. + * Reloads the entire dataset with newly retrieved randomized numbers + */ + private _handleRandomizeData = () => { + const { data } = this._chartElem.getChart(); + data.datasets.forEach((dataset) => { + // get the data as array of IBubblePoint + dataset.data = this._generateData(); + }); + + this._chartElem.update(); + } + + /** + * Handles requests to add a new dataset. + */ + private _handleAddDataset = () => { + // get the chart's data + const { data } = this._chartElem.getChart(); + + data.datasets.push({ + backgroundColor: chartBackgroundColors[data.datasets.length % chartColors.length], + borderColor: chartColors[data.datasets.length % chartColors.length], + hoverBackgroundColor: chartColors[data.datasets.length % chartColors.length], + data: this._generateData(), + borderWidth: Math.min(Math.max(1, data.datasets.length + 1), MAX_BORDERWIDTH) + }); + + // update that chart + this._chartElem.update(); + } + + /** + * Removes the oldset dataset + */ + private _handleRemoveDataset = () => { + const { data } = this._chartElem.getChart(); + data.datasets.shift(); + + // update that chart + this._chartElem.update(); + } + + private _generateData(): Chart.ChartPoint[] { + const data: Chart.ChartPoint[] = []; + + for (let i = 0; i < DATA_COUNT; ++i) { + data.push({ + x: MockChartDataProvider.getRandomNumber(), + y: MockChartDataProvider.getRandomNumber(), + r: Math.abs(MockChartDataProvider.getRandomNumber()) / 5 + }); + } + + return data; + } +} diff --git a/samples/react-chartcontrol/src/webparts/bubbleChartDemo/components/IBubbleChartDemo.types.ts b/samples/react-chartcontrol/src/webparts/bubbleChartDemo/components/IBubbleChartDemo.types.ts new file mode 100644 index 000000000..62a2e6ab1 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/bubbleChartDemo/components/IBubbleChartDemo.types.ts @@ -0,0 +1,3 @@ +export interface IBubbleChartDemoProps { + +} diff --git a/samples/react-chartcontrol/src/webparts/bubbleChartDemo/loc/en-us.js b/samples/react-chartcontrol/src/webparts/bubbleChartDemo/loc/en-us.js new file mode 100644 index 000000000..a07b01149 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/bubbleChartDemo/loc/en-us.js @@ -0,0 +1,13 @@ +define([], function() { + return { + "ChartTitle": "Bubble Chart", + "DataSet1Label": "My first dataset", + "DataSet2Label": "My second dataset", + "RandomizeCommandLabel": "Randomize data", + "AddDatasetCommandLabel": "Add dataset", + "RemoveDatasetCommandLabel": "Remove dataset", + "WebPartDescription": `

This web part demonstrates how to use the PnP ChartControl to render a bubble chart as per the Chart.js sample

+

Note that this example uses points that provide an x and y coordinate, along with a r value, for the bubble's radius.`, + "MoreInfoLinkUrl": "https://sharepoint.github.io/sp-dev-fx-controls-react/controls/ChartControl/" + } +}); diff --git a/samples/react-chartcontrol/src/webparts/bubbleChartDemo/loc/mystrings.d.ts b/samples/react-chartcontrol/src/webparts/bubbleChartDemo/loc/mystrings.d.ts new file mode 100644 index 000000000..905f703c1 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/bubbleChartDemo/loc/mystrings.d.ts @@ -0,0 +1,15 @@ +declare interface IBubbleChartDemoWebPartStrings { + ChartTitle: string; + DataSet1Label: string; + DataSet2Label: string; + RandomizeCommandLabel: string; + AddDatasetCommandLabel: string; + RemoveDatasetCommandLabel: string; + WebPartDescription: string; + MoreInfoLinkUrl: string; +} + +declare module 'BubbleChartDemoWebPartStrings' { + const strings: IBubbleChartDemoWebPartStrings; + export = strings; +} diff --git a/samples/react-chartcontrol/src/webparts/chartinator/ChartinatorWebPart.manifest.json b/samples/react-chartcontrol/src/webparts/chartinator/ChartinatorWebPart.manifest.json new file mode 100644 index 000000000..f92a89222 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/chartinator/ChartinatorWebPart.manifest.json @@ -0,0 +1,29 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx/client-side-web-part-manifest.schema.json", + "id": "604dd344-80a9-4efb-9cd5-7caddc5ac653", + "alias": "ChartinatorWebPart", + "componentType": "WebPart", + "version": "*", + "manifestVersion": 2, + "requiresCustomScript": false, + "preconfiguredEntries": [ + { + "groupId": "5c03119e-3074-46fd-976b-c60198311f70", + "group": { + "default": "Other" + }, + "title": { + "default": "Chartinator" + }, + "description": { + "default": "Easily create and configure a chart to show your data visually." + }, + "officeFabricIconFontName": "Chart", + "properties": { + "description": "Chartinator", + "dataSourceType": 0, + "data": [] + } + } + ] +} diff --git a/samples/react-chartcontrol/src/webparts/chartinator/ChartinatorWebPart.ts b/samples/react-chartcontrol/src/webparts/chartinator/ChartinatorWebPart.ts new file mode 100644 index 000000000..9fcca3a7e --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/chartinator/ChartinatorWebPart.ts @@ -0,0 +1,1592 @@ +import * as React from 'react'; +import * as ReactDom from 'react-dom'; + +// Needed for data versions +import { Version } from '@microsoft/sp-core-library'; + +// Stuff for out-of-the-box property panes +import { + BaseClientSideWebPart, + IPropertyPaneConfiguration, + PropertyPaneChoiceGroup, + PropertyPaneLabel, + PropertyPaneDropdown, + PropertyPaneToggle, + PropertyPaneTextField, + IPropertyPaneChoiceGroupOption, + PropertyPaneSlider, + IPropertyPaneGroup, + PropertyPaneButton, + IPropertyPaneDropdownOption, + PropertyPaneHorizontalRule +} from '@microsoft/sp-webpart-base'; + +// Needed to create drop down choices +import { + IDropdownOption +} from 'office-ui-fabric-react/lib/components/Dropdown'; + +// Needed for charts +import { ChartPalette, PaletteGenerator, ChartType } from '@pnp/spfx-controls-react/lib/ChartControl'; + +// PnP property fields +import { PropertyFieldNumber } from '@pnp/spfx-property-controls/lib/PropertyFieldNumber'; +import { PropertyFieldSpinButton } from '@pnp/spfx-property-controls/lib/PropertyFieldSpinButton'; +import { PropertyFieldToggleWithCallout } from '@pnp/spfx-property-controls/lib/PropertyFieldToggleWithCallout'; +import { PropertyFieldListPicker, PropertyFieldListPickerOrderBy } from '@pnp/spfx-property-controls/lib/PropertyFieldListPicker'; +import { CalloutTriggers } from '@pnp/spfx-property-controls/lib/PropertyFieldHeader'; +import { PropertyFieldColorPicker, PropertyFieldColorPickerStyle } from '@pnp/spfx-property-controls/lib/PropertyFieldColorPicker'; + +// Component that actually renders the web part content +import Chartinator from './components/Chartinator'; +import { IChartinatorProps, DataSourceType } from './components/Chartinator.types'; + +// Needed to generate unique data row ids +import { Guid } from '@microsoft/sp-core-library'; + +// Custom property field +import { PropertyFieldRepeatingData } from './controls/PropertyFieldRepeatingData'; +import { PropertyPaneChartPaletteSelector } from './controls/PropertyPaneChartPaletteSelector'; +import { PropertyPaneDashSelector } from './controls/PropertyPaneDashSelector'; + +// Properties for this web part +// I prefer to keep the web part props as a +// separate file -- keeps things cleaner +// (in my mind, at least) +import { + IChartinatorWebPartProps, +} from './ChartinatorWebPart.types'; + +// Needed for localization and other resource-types +import * as Assets from './LocalizedResources'; +import * as strings from 'ChartinatorWebPartStrings'; +import { ListService } from '../../services/ListService/ListService'; +import { IListService } from '../../services/ListService/IListService'; +import { IListField } from '../../services/ListService/IListField'; +import { DashType, DashStrokes } from './controls/PropertyPaneDashSelector/components/DashSelector.types'; + +/** + * Constant for the number of colors to show in the + * palette previews. + * Chart palettes in Office show 6 colours, so who + * am I to argue with them? + */ +const NUMCOLORS: number = 6; + +/**Default values -- store them as constants because + * we refer to them in a few places + */ +const DEFAULT_CUTOUTPERCENTAGE: number = 50; +const DEFAULT_CIRCUMFERENCE: number = 100; +const DEFAULT_CHARTROTATION: number = -180; +const DEFAULT_POINTRADIUS = 3; + +export default class ChartinatorWebPart extends BaseClientSideWebPart { + private _fields: IListField[]; + + /** + * Draws the chartinator + */ + public render(): void { + const element: React.ReactElement = React.createElement( + Chartinator, + { + ...this.properties, // passes all properties without having to list every single one + context: this.context, + displayMode: this.displayMode, + radialChart: this._isRadialChart(), + updateTitle: (value: string) => { + // when title is changed, store the new title + this.properties.title = value; + } + } + ); + + ReactDom.render(element, this.domElement); + } + + /** + * Resets data when the chart type changes + */ + protected onPropertyPaneFieldChanged(propertyPath: string, oldValue: any, newValue: any): void { + // If the chart type is changed, always reset the data to prevent + // nasty errors from ChartJs. + if (propertyPath === 'chartType') { + // Bubble charts datasets are incompatible with other chart types + if (oldValue === ChartType.Bubble || newValue === ChartType.Bubble) { + this._initalizeData(); + + } + // so are scatter charts + else if (oldValue === ChartType.Scatter || newValue === ChartType.Scatter) { + this._initalizeData(); + } + + // every other chart type is compatible with other charts + } + + if (propertyPath === 'dataSourceListId' && newValue) { + this._getFields().then(fields => { + this.properties.dataLabelField = undefined; + this.properties.dataValueField = undefined; + this.properties.dataYValueField = undefined; + this.properties.dataRValueField = undefined; + this._fields = fields; + this.context.propertyPane.refresh(); + }); + } + } + + protected onPropertyPaneConfigurationStart(): void { + this._getFields().then(fields => { + this._fields = fields; + this.context.propertyPane.refresh(); + }); + } + + /*** + * called when web part is disposed + */ + protected onDispose(): void { + ReactDom.unmountComponentAtNode(this.domElement); + } + + /** + * Returns the data version + */ + protected get dataVersion(): Version { + return Version.parse('1.0'); + } + + /** + * Initializes properties for the web part. + * You could absolutely replace this function with + * pre-setting the properties in the manifest file, + * but I wanted to make it easy to test all the settings + * without having to remove and re-add the web part. + */ + protected onInit(): Promise { + return new Promise((resolve, _reject) => { + + // Initialize data if no data yet + if (this.properties.data === undefined) { + this._initalizeData(); + } + + // Default chart type is bar + if (this.properties.chartType === undefined) { + this.properties.chartType = ChartType.Bar; + } + + // Default data type is manual + if (this.properties.dataSourceType === undefined) { + this.properties.dataSourceType = DataSourceType.Static; + } + + // Default ChartJs animation duration is 1000 milliseconds + if (this.properties.animationDuration === undefined) { + this.properties.animationDuration = 1000; + } + + // Default ChartJs animation is easOutQuart + if (this.properties.animationEasing === undefined) { + this.properties.animationEasing = 'easeOutQuart'; + } + + // Layout: default is no padding. + if (this.properties.leftPadding === undefined) { + this.properties.leftPadding = 0; + } + + if (this.properties.rightPadding === undefined) { + this.properties.rightPadding = 0; + } + + if (this.properties.topPadding === undefined) { + this.properties.topPadding = 0; + } + + if (this.properties.bottomPadding === undefined) { + this.properties.bottomPadding = 0; + } + + // legend: ChartJs's default is to show it, but + // we hide it to appear consistent with the + // out-of-the-box Quick Chart web part. + if (this.properties.legendPosition === undefined) { + this.properties.legendPosition = 'none'; + } + + // legends are not reversed by default + if (this.properties.legendReversed === undefined) { + this.properties.legendReversed = false; + } + + // ChartJs will render 'undefined' in the tooltips + // and legends if you don't provide a dataset name. + // Use the standard 'My Dataset' as the default value. + if (this.properties.dataSetName === undefined) { + this.properties.dataSetName = strings.DataSetDefault; + } + + // tooltip are enabled by default in ChartJs, but + // we want this to behave more like the + // out-of-the-box Quick Charts web part, so we + // disable them. + if (this.properties.tooltipEnabled === undefined) { + this.properties.tooltipEnabled = false; + } + + // Default ChartJs tooltip mode is 'nearest' + if (this.properties.tooltipMode === undefined) { + this.properties.tooltipMode = 'nearest'; + } + + // Default ChartJs interset is enabled. + if (this.properties.tooltipIntersect === undefined) { + this.properties.tooltipIntersect = true; + } + + // Default tooltip position in ChartJs is average + if (this.properties.tooltipPosition === undefined) { + this.properties.tooltipPosition = 'average'; + } + + // ChartControl uses Colorful1 as the default option + // -- just like Office charts do. + if (this.properties.chartPalette === undefined) { + this.properties.chartPalette = ChartPalette.OfficeColorful1; + } + + // Lines are usually on for line charts... otherwise, they'd + // just be charts :-) + if (this.properties.lineShowLine === undefined) { + this.properties.lineShowLine = true; + } + + // Stepped lines are off by default + if (this.properties.lineStepped === undefined) { + this.properties.lineStepped = false; + } + + if (this.properties.lineFill === undefined) { + this.properties.lineFill = 'none'; + } + + // Point style default in ChartJs is circle + if (this.properties.pointStyle === undefined) { + this.properties.pointStyle = 'circle'; + } + + // Point radius default in ChartJs is 3 + if (this.properties.pointRadius === undefined) { + this.properties.pointRadius = DEFAULT_POINTRADIUS; + } + + // Point rotation default in ChartJs is 0 + if (this.properties.pointRotation === undefined) { + this.properties.pointRotation = 0; // don't rotate + } + + // Default cutout percentage for donut charts is 50 + if (this.properties.cutoutPercentage === undefined) { + this.properties.cutoutPercentage = DEFAULT_CUTOUTPERCENTAGE; + } + + if (this.properties.chartRotation === undefined) { + this.properties.chartRotation = DEFAULT_CHARTROTATION; + } + + if (this.properties.circumference === undefined) { + this.properties.circumference = DEFAULT_CIRCUMFERENCE; + } + + if (this.properties.offsetGridLines === undefined) { + this.properties.offsetGridLines = true; + } + + if (this.properties.borderWidth === undefined) { + this.properties.borderWidth = 1; + } + + if (this.properties.borderDash === undefined) { + this.properties.borderDash = DashType.Solid; + } + + if (this.properties.borderJoinStyle === undefined) { + this.properties.borderJoinStyle = 'miter'; + } + + if (this.properties.borderCapStyle === undefined) { + this.properties.borderCapStyle = 'butt'; + } + + // We like to show gridlines by default + if (this.properties.xAxisShowGridlines === undefined) { + this.properties.xAxisShowGridlines = true; + } + + if (this.properties.yAxisShowGridlines === undefined) { + this.properties.yAxisShowGridlines = true; + } + + if (this.properties.yAxisBeginAtZero === undefined) { + this.properties.yAxisBeginAtZero = true; + } + + resolve(undefined); + }); + } + + /** + * Renders the property pane. + * + * Note that normally the property groups are rendered directly within + * this function, but we have so many settings (and we wanted some + * conditional settings) that we split each setting group into their + * respective function. + * + * Here, we just call each _render____PropertyGroup function in the order + * we want them to appear. + */ + protected getPropertyPaneConfiguration(): IPropertyPaneConfiguration { + const { chartType } = this.properties; + // create a configuration variable so that we can change its content + // before returning it + const configuration: IPropertyPaneConfiguration = { + pages: [ + { + displayGroupsAsAccordion: true, + header: { + description: strings.PropertyPaneDescription + }, + groups: [ + // chart type + this._renderChartTypePropertyGroup(), + + // Data Source + this._renderDataSourcePropertyGroup(), + + // Chart Palette + this._renderPalettePropertyGroup(), + + // Layout + this._renderLayoutPropertyGroup(), + + // Legend + this._renderLegendPropertyGroup(), + + // Tooltips + this._renderTooltipPropertyGroup(), + + // Animation + this._renderAnimationGroup(), + ] + }, + ] + }; + + // Insert options in reverse order so that we don't have to worry about + // whether something else was inserted before it + const { groups } = configuration.pages[0]; + + // These two options shouldn't appear if the charts are radial + // e.g.: pie, donut, etc. + if (!this._isRadialChart()) { + // X Axis -- insert as the 4th item + groups.splice(3, 0, this._renderXAxisPropertyGroup()); + + // Y Axis -- insert as the 5th item + groups.splice(4, 0, this._renderYAxisPropertyGroup()); + } + + // Chart settings -- changes based on what chart type you select + + // Scatter, radar and line charts can configure points + if (chartType === ChartType.Line || chartType === ChartType.Scatter || chartType === ChartType.Radar || chartType === ChartType.Bubble) { + groups.splice(3, 0, this._renderPointSettingsPropertyGroup()); + } + + // Line charts can configure line and area settings + if (chartType === ChartType.Line) { + groups.splice(3, 0, this._renderLineSettingsPropertyGroup()); + } + + // Donut charts, pie charts, polar charts + if (chartType === ChartType.Doughnut || chartType == ChartType.Pie || chartType == ChartType.PolarArea) { + groups.splice(3, 0, this._renderDonutPiePolarSettingsPropertyGroup()); + } + + if (chartType === ChartType.Bar || chartType === ChartType.HorizontalBar) { + groups.splice(3, 0, this._renderBarSettingsPropertyGroup()); + } + + return configuration; + } + + /** + * Shows legend settings + */ + private _renderLegendPropertyGroup = (): IPropertyPaneGroup => { + return { + groupName: strings.LegendGroupName, + isCollapsed: true, + groupFields: [ + PropertyPaneLabel('legendPosition', { + text: strings.LegendGroupDescription + }), + PropertyPaneChoiceGroup('legendPosition', { + label: strings.LegendPositionFieldLabel, + options: [ + { + key: 'none', + text: strings.None, + selectedImageSrc: Assets.LegendNone, + imageSrc: Assets.LegendNone, + }, + { + key: 'top', + text: strings.Top, + selectedImageSrc: Assets.LegendTop, + imageSrc: Assets.LegendTop, + }, + { + key: 'bottom', + text: strings.Bottom, + selectedImageSrc: Assets.LegendBottom, + imageSrc: Assets.LegendBottom, + }, + { + key: 'left', + text: strings.Left, + selectedImageSrc: Assets.LegendLeft, + imageSrc: Assets.LegendLeft, + }, + { + key: 'right', + text: strings.Right, + selectedImageSrc: Assets.LegendRight, + imageSrc: Assets.LegendRight, + }, + ] + }), + this.properties.legendPosition !== 'none' && PropertyPaneToggle('legendReversed', { + label: strings.LegendReversedFieldLabel, + onText: strings.On, + offText: strings.Off + }) + ] + }; + } + + /** + * Shows layout settings + */ + private _renderLayoutPropertyGroup = (): IPropertyPaneGroup => { + const { + leftPadding, + topPadding, + rightPadding, + bottomPadding + } = this.properties; + return { + groupName: strings.LayoutGroupName, + isCollapsed: true, + groupFields: [ + PropertyPaneLabel('topPadding', { + text: strings.LayoutGroupDescription + }), + PropertyFieldNumber('topPadding', { + key: 'topPadding', + label: strings.TopPaddingFieldLabel, + value: topPadding, + minValue: 0 + }), + PropertyFieldNumber('leftPadding', { + key: 'leftPadding', + label: strings.LeftPaddingFieldLabel, + value: leftPadding, + minValue: 0 + }), + PropertyFieldNumber('bottomPadding', { + key: 'bottomPadding', + label: strings.BottomPaddingFieldLabel, + value: bottomPadding, + minValue: 0 + }), + PropertyFieldNumber('rightPadding', { + key: 'rightPadding', + label: strings.RightPaddingFieldLabel, + value: rightPadding, + minValue: 0 + }), + ] + }; + } + + /** + * Shows X axis settings + */ + private _renderXAxisPropertyGroup = (): IPropertyPaneGroup => { + const radialChart: boolean = this._isRadialChart(); + const { + xAxisLabelEnabled + } = this.properties; + + // Axis settings don't show up if the chart type is radial + return { + groupName: strings.XAxisGroupName, + isCollapsed: true, + groupFields: [ + PropertyPaneLabel('chartType', { + text: radialChart ? strings.GroupNotAvailable : strings.XAxisGroupDescription + }), + PropertyPaneToggle('xAxisLabelEnabled', { + disabled: radialChart, + label: strings.AxisShowLabel, + offText: strings.Hide, + onText: strings.Show, + }), + PropertyPaneTextField('xAxisLabelText', { + disabled: xAxisLabelEnabled !== true, + label: strings.AxisLabelText, + }), + PropertyPaneHorizontalRule(), + PropertyPaneToggle('xAxisShowGridlines', { + label: strings.ShowGridlinesFieldLabel, + offText: strings.Hide, + onText: strings.Show + }), + ] + }; + } + + /** + * Shows Y axis settings + */ + private _renderYAxisPropertyGroup = (): IPropertyPaneGroup => { + const radialChart: boolean = this._isRadialChart(); + const { + yAxisLabelEnabled, + yAxisBeginAtZero, + yAxisMax, + yAxisMaxTicksLimit, + yAxisMin, + yAxisStepSize + } = this.properties; + + return { + groupName: strings.YAxisGroupName, + isCollapsed: true, + groupFields: [ + PropertyPaneLabel('chartType', { + text: radialChart ? strings.GroupNotAvailable : strings.YAxisGroupDescription + }), + PropertyPaneToggle('yAxisLabelEnabled', { + disabled: radialChart, + label: strings.AxisShowLabel, + offText: strings.Hide, + onText: strings.Show + }), + PropertyPaneTextField('yAxisLabelText', { + disabled: yAxisLabelEnabled !== true, + label: strings.AxisLabelText, + }), + PropertyPaneHorizontalRule(), + PropertyPaneToggle('yAxisShowGridlines', { + label: strings.ShowGridlinesFieldLabel, + offText: strings.Hide, + onText: strings.Show + }), + PropertyPaneHorizontalRule(), + PropertyPaneToggle('yAxisBeginAtZero', { + disabled: radialChart, + label: strings.YAxisBeginAtZero, + offText: strings.Off, + onText: strings.On + }), + PropertyFieldNumber('yAxisMin', { + key: 'yAxisMin', + label: strings.YAxisMinValueFieldLabel, + value: yAxisMin, + disabled: radialChart || yAxisBeginAtZero + }), + PropertyFieldNumber('yAxisMax', { + key: 'yAxisMax', + label: strings.YAxisMaxValueFieldLabel, + value: yAxisMax, + disabled: radialChart + }), + PropertyFieldNumber('yAxisMaxTicksLimit', { + key: 'yAxisMaxTicksLimit', + label: strings.YAxisMaxStepsFieldLabel, + value: yAxisMaxTicksLimit, + disabled: radialChart + }), + PropertyFieldNumber('yAxisStepSize', { + key: 'yAxisStepSize', + label: strings.YAxisStepSizeFieldLabel, + value: yAxisStepSize, + disabled: radialChart + }) + ] + }; + } + + /** + * Shows palette settings + */ + private _renderPalettePropertyGroup = (): IPropertyPaneGroup => { + const { + chartPalette + } = this.properties; + return { + groupName: strings.PaletteGroupName, + isCollapsed: true, + groupFields: [ + PropertyPaneLabel('chartPalette', { + text: strings.PaletteGroupDescription + }), + PropertyPaneChartPaletteSelector('chartPalette', { + label: strings.ColorPaletteFieldLabel, + disabled: false, + selectedKey: chartPalette, + options: this._getPaletteOptions(), + onPropertyChange: (propertyPath: string, newValue: any) => this._handlePropertyChange(propertyPath, newValue), + }), + ] + }; + } + + /** + * Shows chart type settings + */ + private _renderChartTypePropertyGroup = (): IPropertyPaneGroup => { + const { + chartType + } = this.properties; + + return { + groupName: strings.ChartTypeGroupName, + groupFields: [ + PropertyPaneChoiceGroup('chartType', { + options: this._getChartChoices() + }), + PropertyPaneLabel('chartType', { + text: strings.ChartDescription[chartType] + }) + ] + }; + } + + /** + * Shows data source settings + */ + private _renderDataSourcePropertyGroup = (): IPropertyPaneGroup => { + const { + chartType, + dataSourceType + } = this.properties; + + const hasX: boolean = chartType === ChartType.Bubble || chartType === ChartType.Scatter; + const hasY: boolean = chartType === ChartType.Bubble || chartType === ChartType.Scatter; + const hasR: boolean = chartType === ChartType.Bubble; + + return { + groupName: strings.DataGroupName, + groupFields: [ + PropertyPaneTextField('dataSetName', { + label: strings.DataSetFieldName, + }), + PropertyPaneHorizontalRule(), + PropertyPaneChoiceGroup('dataSourceType', { + options: [ + { + key: DataSourceType.Static, + text: strings.StaticDataSource, + }, + { + key: DataSourceType.List, + text: strings.ListDataSource, + } + ] + }), + dataSourceType === DataSourceType.Static && PropertyFieldRepeatingData({ + key: 'repeatingData', + data: this.properties.data, + chartType: chartType, + onDataChanged: (data: any) => this._handleChangeData(data) + }), + dataSourceType === DataSourceType.List && PropertyFieldListPicker('dataSourceListId', { + label: strings.DataSourcListIdFieldLabel, + selectedList: this.properties.dataSourceListId, + includeHidden: false, + orderBy: PropertyFieldListPickerOrderBy.Title, + disabled: false, + onPropertyChange: this.onPropertyPaneFieldChanged.bind(this), + properties: this.properties, + context: this.context, + onGetErrorMessage: null, + deferredValidationTime: 0, + key: 'dataSourceListId' + }), + dataSourceType === DataSourceType.List && PropertyPaneDropdown('dataValueField', { + options: this._getDataFields(), + label: hasX ? strings.DataSourceDataXValueFieldLabel : strings.DataSourceDataValueFieldLabel, + selectedKey: this.properties.dataValueField + }), + dataSourceType === DataSourceType.List && hasY && PropertyPaneDropdown('dataYValueField', { + options: this._getDataFields(), + label: strings.DataSourceDataYValueFieldLabel, + selectedKey: this.properties.dataYValueField + }), + dataSourceType === DataSourceType.List && hasR && PropertyPaneDropdown('dataRValueField', { + options: this._getDataFields(), + label: strings.DataSourceDataRValueFieldLabel, + selectedKey: this.properties.dataRValueField + }), + dataSourceType === DataSourceType.List && PropertyPaneDropdown('dataLabelField', { + options: this._getLabelFields(), + label: strings.DataSourceDataLabelFieldLabel, + selectedKey: this.properties.dataLabelField + }) + ] + }; + } + + /** + * Shows line chart-specific settings + */ + private _renderLineSettingsPropertyGroup = (): IPropertyPaneGroup => { + return { + groupName: strings.LineSettingsGroupName, + isCollapsed: true, + groupFields: [ + PropertyFieldToggleWithCallout('lineShowLine', { + disabled: this.properties.lineStepped === true, + key: 'lineShowLine', + label: strings.LineShowLinesFieldLabel, + onText: strings.LineShowLinesOn, + offText: strings.LineShowLinesOff, + checked: this.properties.lineShowLine !== false, + calloutContent: React.createElement('div', {}, strings.LineShowLinesFieldTooltip), + calloutTrigger: CalloutTriggers.Hover, + }), + PropertyFieldToggleWithCallout('lineStepped', { + disabled: this.properties.lineShowLine === false, + key: 'lineStepped', + label: strings.LineSteppedFieldLabel, + onText: strings.LineSteppedOn, + offText: strings.LineSteppedOff, + checked: this.properties.lineStepped !== false, + calloutContent: React.createElement('div', {}, + // always tell people why you disable options + this.properties.lineShowLine === false ? + strings.LineSteppedFieldTooltipDisabled // disabled because show lines is off + : strings.LineSteppedFieldTooltipEnabled // enabled tooltip + ), + calloutTrigger: CalloutTriggers.Hover, + }), + PropertyFieldToggleWithCallout('lineCurved', { + disabled: this.properties.lineStepped === true || this.properties.lineShowLine === false, + // I know, I know, I just like to explictly say true to make it more legible + key: 'lineCurved', + label: strings.LineCurvedFieldName, + onText: strings.LineCurvedOn, + offText: strings.LineCurvedOff, + checked: this.properties.lineCurved !== false, + calloutContent: React.createElement('div', {}, + // always tell people why you disable options + this.properties.lineShowLine === false ? + strings.LineCurvedFieldTooltipDisabled // disabled because show lines is off + : this.properties.lineStepped === true ? + strings.LineCurvedFieldTooltipDisabledCozStepped // disabled because stepped lines are on + : strings.LineCurvedFieldTooltipEnabled // enabled tooltip + ), + calloutTrigger: CalloutTriggers.Hover, + }), + PropertyFieldSpinButton('borderWidth', { + decimalPlaces: 0, + min: 0, + step: 1, + suffix: strings.PixelUnitSuffix, + label: strings.BorderWidthFieldLabel, + key: 'borderWidthId', + onPropertyChange: this.onPropertyPaneFieldChanged.bind(this), + properties: this.properties, + initialValue: this.properties.borderWidth + }), + PropertyFieldColorPicker('borderColor', { + label: strings.BorderColorFieldLabel, + selectedColor: this.properties.borderColor, + onPropertyChange: this.onPropertyPaneFieldChanged, + properties: this.properties, + alphaSliderHidden: false, + style: PropertyFieldColorPickerStyle.Inline, + key: 'borderColorId' + }), + PropertyPaneDashSelector('borderDash', { + label: "Dash type", + disabled: false, + selectedKey: this.properties.borderDash, + options: this._getDashOptions(), + onPropertyChange: (propertyPath: string, newValue: any) => this._handlePropertyChange(propertyPath, newValue) + }), + PropertyPaneDropdown('borderCapStyle', { + label: strings.LineCapStyleFieldLabel, + selectedKey: this.properties.borderCapStyle, + options: [ + { + key: 'butt', + text: strings.CapStyleButt // tee hee + }, + { + key: 'round', + text: strings.CapStyleRound + }, + { + key: 'square', + text: strings.CapStyleSquare + } + ] + }), + PropertyPaneDropdown('borderJoinStyle', { + label: strings.LineJoinStyleFieldLabel, + selectedKey: this.properties.borderJoinStyle, + options: [ + { + key: 'bevel', + text: strings.JoinTypeBevel + }, + { + key: 'round', + text: strings.JoinTypeRound + }, + { + key: 'miter', + text: strings.JoinTypeMiter + } + ] + }), + PropertyPaneHorizontalRule(), + PropertyPaneChoiceGroup('lineFill', { + label: strings.FillFieldLabel, + options: [ + { + key: 'none', + text: strings.FillNone, + selectedImageSrc: Assets.FillNone, + imageSrc: Assets.FillNone, + }, + { + key: 'start', + text: strings.FillStart, + selectedImageSrc: Assets.FillStart, + imageSrc: Assets.FillStart, + }, + { + key: 'end', + text: strings.FillEnd, + selectedImageSrc: Assets.FillEnd, + imageSrc: Assets.FillEnd, + }, + { + key: 'origin', + text: strings.FillOrigin, + selectedImageSrc: Assets.FillOrigin, + imageSrc: Assets.FillOrigin, + }, + ] + }), + + ] + }; + } + + /** + * Renders the point configuration propety group + */ + private _renderPointSettingsPropertyGroup = (): IPropertyPaneGroup => { + return { + groupName: strings.PointSettingsGroup, + isCollapsed: true, + groupFields: [ + PropertyPaneChoiceGroup('pointStyle', { + label: strings.PointStyleFieldLabel, + options: [ + { + key: 'circle', + text: strings.PointStyleCircle, + selectedImageSrc: Assets.PointStyleCircle, + imageSrc: Assets.PointStyleCircle, + }, + { + key: 'cross', + text: strings.PointStyleCross, + selectedImageSrc: Assets.PointStyleCross, + imageSrc: Assets.PointStyleCross, + }, + { + key: 'crossRot', + text: strings.PointStyleRectRot, + selectedImageSrc: Assets.PointStyleCrossRot, + imageSrc: Assets.PointStyleCrossRot, + }, + { + key: 'dash', + text: strings.PointStyleDash, + selectedImageSrc: Assets.PointStyleDash, + imageSrc: Assets.PointStyleDash, + }, + { + key: 'line', + text: strings.PointStyleLine, + selectedImageSrc: Assets.PointStyleLine, + imageSrc: Assets.PointStyleLine, + }, + { + key: 'rect', + text: strings.PointStyleRect, + selectedImageSrc: Assets.PointStyleRect, + imageSrc: Assets.PointStyleRect + }, + { + key: 'rectRounded', + text: strings.PointStyleRectRounded, + selectedImageSrc: Assets.PointStyleRectRounded, + imageSrc: Assets.PointStyleRectRounded, + }, + { + key: 'rectRot', + text: strings.PointStyleRectRot, + selectedImageSrc: Assets.PointStyleRectRot, + imageSrc: Assets.PointStyleRectRot, + }, + { + key: 'star', + text: strings.PointStyleStar, + selectedImageSrc: Assets.PointStyleStar, + imageSrc: Assets.PointStyleStar, + }, + { + key: 'triangle', + text: strings.PointStyleTriangle, + selectedImageSrc: Assets.PointStyleTriangle, + imageSrc: Assets.PointStyleTriangle, + }, + ] + }), + PropertyFieldSpinButton('pointRadius', { + properties: this.properties, + key: 'pointRadiusId', + label: strings.PointRadiusFieldLabel, + initialValue: this.properties.pointRadius, + min: 0, + step: 1, + decimalPlaces: 0, + onPropertyChange: (propertyPath: string, newValue: any) => this._handlePropertyChange(propertyPath, newValue), + }), + PropertyPaneSlider('pointRotation', { + label: strings.PointRotationFieldLabel, + min: 0, + max: 360, + value: this.properties.pointRotation, + showValue: true, + step: 1 + }) + ] + }; + } + + /** + * Render property groups for donuts, pie, or polar charts. + * You know... the round ones. + */ + private _renderDonutPiePolarSettingsPropertyGroup = (): IPropertyPaneGroup => { + + const isDonut: boolean = this.properties.chartType === ChartType.Doughnut; + const isPie: boolean = this.properties.chartType === ChartType.Pie; + + return { + groupName: isDonut ? + strings.DonutSettingsGroupName + : isPie + ? strings.PieSettingsGroupName + : strings.PolarSettingsGroupName, + isCollapsed: true, + groupFields: [ + isDonut && PropertyPaneSlider('cutoutPercentage', { + label: strings.DonutCutoutPercentageFieldLabel, + min: 0, + max: 100, + step: 1, + showValue: true + }), + PropertyPaneSlider('chartRotation', { + label: strings.ChartRotationFieldLabel, + min: -360, + max: 360, + step: 1, + showValue: true, + value: this.properties.chartRotation + }), + (isDonut || isPie) && PropertyPaneSlider('circumference', { + label: strings.CircumferenceFieldLabel, + min: 0, + max: 100, + step: 1, + showValue: true, + value: this.properties.circumference + }), + PropertyPaneToggle('animateRotate', { + label: strings.AnimateRotateFieldLabel, + onText: strings.On, + offText: strings.Off, + checked: this.properties.animateRotate !== false + }), + PropertyPaneToggle('animateScale', { + label: strings.AnimateScaleFieldLabel, + onText: strings.On, + offText: strings.Off, + checked: this.properties.animateScale !== false + }), + PropertyPaneButton('animateScale', { + text: strings.ResetDonutPieSettingsButtonLabel, + onClick: ((_value: any) => { + // reset to the default values + this.properties.animateRotate = true; + this.properties.animateScale = true; + this.properties.circumference = DEFAULT_CIRCUMFERENCE; + this.properties.chartRotation = DEFAULT_CHARTROTATION; + this.properties.cutoutPercentage = DEFAULT_CUTOUTPERCENTAGE; + }) + }) + ] + }; + } + + /** + * Renders settings for bar charts (and vertical ones too) + */ + private _renderBarSettingsPropertyGroup = (): IPropertyPaneGroup => { + return { + groupName: strings.BarSettingsGroupName, + isCollapsed: true, + groupFields: [ + PropertyPaneLabel('offsetGridLines', { + text: strings.BarSettingsGroupDescription + }), + PropertyPaneToggle('offsetGridLines', { + label: strings.OffsetGridLinesFieldName, + onText: strings.On, + offText: strings.Off, + checked: this.properties.offsetGridLines !== false + }) + ] + }; + } + + /** + * Shows Tooltip settings + */ + private _renderTooltipPropertyGroup = (): IPropertyPaneGroup => { + const { + tooltipEnabled + } = this.properties; + return { + groupName: strings.TooltipsGroupName, + isCollapsed: true, + groupFields: [ + PropertyPaneLabel('tooltipEnabled', { + text: strings.TooltipGroupDescription + }), + PropertyPaneToggle('tooltipEnabled', { + label: strings.TooltipsEnabledFieldLabel, + offText: strings.Hide, + onText: strings.Show + }), + PropertyPaneDropdown('tooltipMode', { + disabled: tooltipEnabled === false, + label: strings.TooltipModeFieldLabel, + options: [ + { + key: 'nearest', + text: strings.TooltipModeNearest + }, + { + key: 'point', + text: strings.TooltipModePoint + }, + + { + key: 'index', + text: strings.TooltipModeIndex + }, + { + key: 'dataset', + text: strings.TooltipModeDataset + }, + { + key: 'x', + text: strings.TooltipModeX + }, + { + key: 'y', + text: strings.TooltipModeY + }, + ] + }), + PropertyPaneToggle('tooltipIntersect', { + disabled: tooltipEnabled === false, + label: strings.TooltipsIntersectFieldLabel, + offText: strings.Off, + onText: strings.On + }), + PropertyPaneDropdown('tooltipPosition', { + disabled: tooltipEnabled === false, + label: strings.TooltipsPositionFieldLabel, + options: [ + { + key: 'average', + text: strings.TooltipsPositionAverage + }, + { + key: 'nearest', + text: strings.TooltipsPositionNearest + }, + ] + }), + ] + }; + } + + /** + * Lists all animation types. + * There are a lot. + */ + private _renderAnimationGroup = (): IPropertyPaneGroup => { + const { + animationDuration + } = this.properties; + return { + groupName: strings.AnimationGroupName, + isCollapsed: true, + groupFields: [ + PropertyPaneLabel('animationDuration', { + text: strings.AnimationGroupDescription + }), + PropertyFieldNumber('animationDuration', { + key: 'animationDurationId', + label: strings.DurationFieldLabel, + description: strings.DurationFieldDescription, + value: animationDuration, + minValue: 0 + }), + PropertyPaneChoiceGroup('animationEasing', { + label: strings.EasingFieldLabel, + options: [ + { + key: 'linear', + text: strings.EasingLinear, + selectedImageSrc: Assets.Linear, + imageSrc: Assets.Linear + }, + { + key: 'easeInQuad', + text: strings.EasingEaseInQuad, + selectedImageSrc: Assets.EaseInQuad, + imageSrc: Assets.EaseInQuad + }, + { + key: 'easeOutQuad', + text: strings.EasingEaseOutQuad, + selectedImageSrc: Assets.EaseOutQuad, + imageSrc: Assets.EaseOutQuad + }, + { + key: 'easeInOutQuad', + text: strings.EasingEaseInOutQuad, + selectedImageSrc: Assets.EaseInOutQuad, + imageSrc: Assets.EaseInOutQuad + }, + { + key: 'easeInCubic', + text: strings.EasingEaseInCubic, + selectedImageSrc: Assets.EaseInCubic, + imageSrc: Assets.EaseInCubic + }, + { + key: 'easeOutCubic', + text: strings.EasingEaseOutCubic, + selectedImageSrc: Assets.EaseOutCubic, + imageSrc: Assets.EaseOutCubic + }, + { + key: 'easeInOutCubic', + text: strings.EasingEaseInOutCubic, + selectedImageSrc: Assets.EaseInOutCubic, + imageSrc: Assets.EaseInOutCubic + }, + { + key: 'easeInQuart', + text: strings.EasingEaseInQuart, + selectedImageSrc: Assets.EaseInQuart, + imageSrc: Assets.EaseInQuart + }, + { + key: 'easeOutQuart', + text: strings.EasingEaseOutQuart, + selectedImageSrc: Assets.EaseOutQuart, + imageSrc: Assets.EaseOutQuart + }, + { + key: 'easeInOutQuart', + text: strings.EasingEaseInOutQuart, + selectedImageSrc: Assets.EaseInOutQuart, + imageSrc: Assets.EaseInOutQuart + }, + { + key: 'easeInQuint', + text: strings.EasingEaseInQuint, + selectedImageSrc: Assets.EaseInQuint, + imageSrc: Assets.EaseInQuint + }, + { + key: 'easeOutQuint', + text: strings.EasingEaseOutQuint, + selectedImageSrc: Assets.EaseOutQuint, + imageSrc: Assets.EaseOutQuint + }, + { + key: 'easeInOutQuint', + text: strings.EasingEaseInOutQuint, + selectedImageSrc: Assets.EaseInOutQuint, + imageSrc: Assets.EaseInOutQuint + }, + { + key: 'easeInSine', + text: strings.EasingEaseInSine, + selectedImageSrc: Assets.EaseInSine, + imageSrc: Assets.EaseInSine + }, + { + key: 'easeOutSine', + text: strings.EasingEaseOutSine, + selectedImageSrc: Assets.EaseOutSine, + imageSrc: Assets.EaseOutSine + }, + { + key: 'easeInOutSine', + text: strings.EasingEaseInOutSine, + selectedImageSrc: Assets.EaseInOutSine, + imageSrc: Assets.EaseInOutSine + }, + { + key: 'easeInExpo', + text: strings.EasingEaseInExpo, + selectedImageSrc: Assets.EaseInExpo, + imageSrc: Assets.EaseInExpo + }, + { + key: 'easeOutExpo', + text: strings.EasingEaseOutExpo, + selectedImageSrc: Assets.EaseOutExpo, + imageSrc: Assets.EaseOutExpo + }, + { + key: 'easeInOutExpo', + text: strings.EasingEaseInOutExpo, + selectedImageSrc: Assets.EaseInOutExpo, + imageSrc: Assets.EaseInOutExpo + }, + { + key: 'easeInCirc', + text: strings.EasingEaseInCirc, + selectedImageSrc: Assets.EaseInCirc, + imageSrc: Assets.EaseInCirc + }, + { + key: 'easeOutCirc', + text: strings.EasingEaseOutCirc, + selectedImageSrc: Assets.EaseOutCirc, + imageSrc: Assets.EaseOutCirc + }, + { + key: 'easeInOutCirc', + text: strings.EasingEaseInOutCirc, + selectedImageSrc: Assets.EaseInOutCirc, + imageSrc: Assets.EaseInOutCirc + }, + { + key: 'easeInElastic', + text: strings.EasingEaseInElastic, + selectedImageSrc: Assets.EaseInElastic, + imageSrc: Assets.EaseInElastic + }, + { + key: 'easeOutElastic', + text: strings.EasingEaseOutElastic, + selectedImageSrc: Assets.EaseOutElastic, + imageSrc: Assets.EaseOutElastic + }, + { + key: 'easeInOutElastic', + text: strings.EasingEaseInOutElastic, + selectedImageSrc: Assets.EaseInOutElastic, + imageSrc: Assets.EaseInOutElastic + }, + { + key: 'easeInBack', + text: strings.EasingEaseInBack, + selectedImageSrc: Assets.EaseInBack, + imageSrc: Assets.EaseInBack + }, + { + key: 'easeOutBack', + text: strings.EasingEaseOutBack, + selectedImageSrc: Assets.EaseOutBack, + imageSrc: Assets.EaseOutBack + }, + { + key: 'easeInOutBack', + text: strings.EasingEaseInOutBack, + selectedImageSrc: Assets.EaseInOutBack, + imageSrc: Assets.EaseInOutBack + }, + { + key: 'easeInBounce', + text: strings.EasingEaseInBounce, + selectedImageSrc: Assets.EaseInBounce, + imageSrc: Assets.EaseInBounce + }, + { + key: 'easeOutBounce', + text: strings.EasingEaseOutBounce, + selectedImageSrc: Assets.EaseOutBounce, + imageSrc: Assets.EaseOutBounce + }, + { + key: 'easeInOutBounce', + text: strings.EasingEaseInOutBounce, + selectedImageSrc: Assets.EaseInOutBounce, + imageSrc: Assets.EaseInOutBounce + }, + ] + }) + ] + }; + } + + /** + * Lists all palette choices for the palette property pane group + */ + private _getPaletteOptions = (): IDropdownOption[] => { + // Because I'm lazy, I am NOT going to list + // every single palette option manually, + // so I'll just loop through the enum values + + // Get all the palette key names + const names = Object.keys(ChartPalette) + .filter(k => typeof ChartPalette[k] === "number") as string[]; + + // Generate the palette options from palette names + const paletteOptions: IDropdownOption[] = names.filter(paletteName => strings.PaletteName[paletteName] !== undefined).map((paletteName: string) => { + const displayName: string = strings.PaletteName[paletteName]; + const description: string = strings.PaletteDescription[paletteName]; + return { + key: ChartPalette[paletteName], + text: displayName, + data: { + colors: PaletteGenerator.GetPalette(ChartPalette[paletteName], NUMCOLORS).slice(0, NUMCOLORS), + description: description + } + }; + }); + + return paletteOptions; + } + + /** + * Returns the list of dash styles + */ + private _getDashOptions = (): IDropdownOption[] => { + // Enums often return two copies of each value: one by numerical value, and one by text. + // we use the number enums so that we only get one instance of each type + const names = Object.keys(DashType) + .filter(k => typeof DashType[k] === "number") as string[]; + + // Generate the dash options from dash names + const dashOptions: IDropdownOption[] = names.map((dashName: string, index: number) => { + const displayName: string = strings.DashNames[index]; + const strokes: number[] = DashStrokes[DashType[dashName]]; + return { + key: DashType[dashName], + text: displayName, + data: { + strokes: strokes + } + }; + }); + + return dashOptions; + } + + /** + * Gets the list of fields + */ + private _getFields(): Promise { + // No list selected + if (!this.properties.dataSourceListId) { + return Promise.resolve(); + } + + // Call the list service + const service: IListService = new ListService(this.context); + return service.getFields(this.properties.dataSourceListId); + } + + /** + * Get the list of fields that can be used for labels + */ + private _getLabelFields(): IPropertyPaneDropdownOption[] { + if (this._fields === undefined) { + return undefined; + } + + // Fields that contain text or date can be used as labels + const labelFields = this._fields!.filter(f => f.TypeAsString === 'Text' || f.TypeAsString === 'DateTime').map(field => { + return { + key: field.InternalName, + text: `${field.Title}`, + }; + }); + return labelFields; + } + + /** + * Returns the list of fields that can be used for data + */ + private _getDataFields(): IPropertyPaneDropdownOption[] { + if (this._fields === undefined) { + return undefined; + } + const dataFields = this._fields!.filter(f => f.TypeAsString === 'Number' || f.TypeAsString === 'Currency').map(field => { + return { + key: field.InternalName, + text: `${field.Title}`, + }; + }); + return dataFields; + } + + /** + * Lists the possible chart choices + */ + private _getChartChoices = (): IPropertyPaneChoiceGroupOption[] => { + + const names = Object.keys(ChartType) as string[]; + + // Make sure we retrieve chart types that have a string resource for them. + const chartOptions: IPropertyPaneChoiceGroupOption[] = names.filter(type => strings.ChartTypeName[type] !== undefined).map((chartTypeName: string) => { + + const choice: IPropertyPaneChoiceGroupOption = { + key: ChartType[chartTypeName], + text: strings.ChartTypeName[chartTypeName] + }; + + // Only some of charts types have Office Fabric UI icon equivalents. + // This code finds the Office Fabric icon or the icon asset + switch (chartTypeName) { + case 'Bar': + choice.iconProps = { + officeFabricIconFontName: 'BarChartVertical' + }; + break; + case 'HorizontalBar': + choice.iconProps = { + officeFabricIconFontName: 'BarChartHorizontal' + }; + break; + case 'Doughnut': + choice.iconProps = { + officeFabricIconFontName: 'DonutChart' + }; + break; + case 'Line': + choice.iconProps = { + officeFabricIconFontName: 'LineChart' + }; + break; + case 'Pie': + choice.iconProps = { + officeFabricIconFontName: 'PieDouble' + }; + break; + default: + choice.imageSrc = Assets.ChartIcons[chartTypeName]; + choice.selectedImageSrc = Assets.ChartIcons[chartTypeName]; + } + return choice; + }); + return chartOptions; + } + + /** + * Returns true if the selected chart type is a radial chart + * (i.e.: Pie, Donut, etc.) + */ + private _isRadialChart = (): boolean => { + const { chartType } = this.properties; + return chartType === ChartType.Pie || chartType === ChartType.Doughnut || chartType === ChartType.PolarArea || chartType === ChartType.Radar; + } + + /** + * Notified when data is changed. + * Forces chart to re-render + */ + private _handleChangeData = (data: any) => { + this.properties.data = data; + this.render(); + } + + /** + * Notified when a property is changed. + * Forces chart to re-render. + */ + private _handlePropertyChange(propertyPath: string, newValue: any): void { + this.properties[propertyPath] = newValue; + + this.render(); + } + + /** + * Resets the data if chart changes to (or from) + * a type of data that is incompatible with another + * one. This prevents getting nasty error messages. + */ + private _initalizeData = () => { + const { chartType } = this.properties; + if (chartType === ChartType.Bubble) { + this.properties.data = [{ + id: Guid.newGuid().toString(), + name: '', + x: undefined, + y: undefined, + r: undefined + }]; + } else if (chartType === ChartType.Scatter) { + this.properties.data = [{ + id: Guid.newGuid().toString(), + name: '', + x: undefined, + y: undefined + }]; + } else { + this.properties.data = [{ + id: Guid.newGuid().toString(), + name: '', + value: undefined + }]; + } + } +} diff --git a/samples/react-chartcontrol/src/webparts/chartinator/ChartinatorWebPart.types.ts b/samples/react-chartcontrol/src/webparts/chartinator/ChartinatorWebPart.types.ts new file mode 100644 index 000000000..52693336d --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/chartinator/ChartinatorWebPart.types.ts @@ -0,0 +1,64 @@ +import { INumberChartData, IBubbleChartData, IScatterChartData } from './controls/PropertyFieldRepeatingData'; +import { ChartType, ChartPalette } from '@pnp/spfx-controls-react/lib/ChartControl'; +import { DashType } from './controls/PropertyPaneDashSelector/components/DashSelector.types'; +import { DataSourceType, EasingType, CapType, JoinType } from './components/Chartinator.types'; + +/** + * There are a LOT of options to store with this web part. + * I don't normally recommend doing this, but the goal of this + * sample is to demonstrate each chart setting individually. + */ +export interface IChartinatorWebPartProps { + animateRotate: boolean; + animateScale: boolean; + animationDuration: number; + animationEasing: EasingType; + borderCapStyle: CapType; + borderColor: string; + borderDash: DashType; + borderJoinStyle: JoinType; + borderWidth: number; + bottomPadding: number; + chartPalette: ChartPalette; + chartRotation: number; + chartType: ChartType; + circumference: number; + cutoutPercentage: number; + data: Array; + dataLabelField: string; + dataRValueField: string; + dataSetName: string; + dataSourceListId: string; + dataSourceType: DataSourceType; + dataValueField: string; + dataYValueField: string; + leftPadding: number; + legendPosition: Chart.PositionType | 'none'; + legendReversed: boolean; + lineCurved: boolean; + lineFill: string; + lineShowLine: boolean; + lineStepped: boolean; + offsetGridLines: boolean; + pointRadius: number; + pointRotation: number; + pointStyle: Chart.PointStyle; + rightPadding: number; + title: string; + tooltipEnabled: boolean; + tooltipIntersect: boolean; + tooltipMode: Chart.InteractionMode; + tooltipPosition: string; + topPadding: number; + xAxisLabelEnabled: boolean; + xAxisLabelText: string; + xAxisShowGridlines: boolean; + yAxisBeginAtZero: boolean; + yAxisLabelEnabled: boolean; + yAxisLabelText: string; + yAxisMax: number; + yAxisMaxTicksLimit: number; + yAxisMin: number; + yAxisStepSize: number; + yAxisShowGridlines: boolean; +} diff --git a/samples/react-chartcontrol/src/webparts/chartinator/LocalizedResources.ts b/samples/react-chartcontrol/src/webparts/chartinator/LocalizedResources.ts new file mode 100644 index 000000000..f1f48fa60 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/chartinator/LocalizedResources.ts @@ -0,0 +1,64 @@ +// legend icons +export const LegendLeft: string = require('./assets/LegendLeft.png'); +export const LegendRight: string = require('./assets/LegendRight.png'); +export const LegendTop: string = require('./assets/LegendTop.png'); +export const LegendBottom: string = require('./assets/LegendBottom.png'); +export const LegendNone: string = require('./assets/LegendNone.png'); + +// chart icons +export const ChartIcons = { + "Bubble": require('./assets/BubbleChart.png'), + "PolarArea": require('./assets/PolarArea.png'), + "Radar": require('./assets/RadarChart.png'), + "Scatter": require('./assets/ScatterChart.png'), +}; + +export const PointStyleCircle: string = require('./assets/PointStyleCircle.png'); +export const PointStyleCross: string = require('./assets/PointStyleCross.png'); +export const PointStyleCrossRot: string = require('./assets/PointStyleCrossRot.png'); +export const PointStyleDash: string = require('./assets/PointStyleDash.png'); +export const PointStyleLine: string = require('./assets/PointStyleLine.png'); +export const PointStyleRect: string = require('./assets/PointStyleRect.png'); +export const PointStyleRectRounded: string = require('./assets/PointStyleRectRounded.png'); +export const PointStyleRectRot: string = require('./assets/PointStyleRectRot.png'); +export const PointStyleStar: string = require('./assets/PointStyleStar.png'); +export const PointStyleTriangle: string = require('./assets/PointStyleTriangle.png'); + +// easing icons +export const Linear: string = require('./assets/Linear.png'); +export const EaseInQuad: string = require('./assets/EaseInQuad.png'); +export const EaseOutQuad: string = require('./assets/EaseOutQuad.png'); +export const EaseInOutQuad: string = require('./assets/EaseInOutQuad.png'); +export const EaseInCubic: string = require('./assets/EaseInCubic.png'); +export const EaseOutCubic: string = require('./assets/EaseOutCubic.png'); +export const EaseInOutCubic: string = require('./assets/EaseInOutCubic.png'); +export const EaseInQuart: string = require('./assets/EaseInQuart.png'); +export const EaseOutQuart: string = require('./assets/EaseOutQuart.png'); +export const EaseInOutQuart: string = require('./assets/EaseInOutQuart.png'); +export const EaseInQuint: string = require('./assets/EaseInQuint.png'); +export const EaseOutQuint: string = require('./assets/EaseOutQuint.png'); +export const EaseInOutQuint: string = require('./assets/EaseInOutQuint.png'); +export const EaseInSine: string = require('./assets/EaseInSine.png'); +export const EaseOutSine: string = require('./assets/EaseOutSine.png'); +export const EaseInOutSine: string = require('./assets/EaseInOutSine.png'); +export const EaseInExpo: string = require('./assets/EaseInExpo.png'); +export const EaseOutExpo: string = require('./assets/EaseOutExpo.png'); +export const EaseInOutExpo: string = require('./assets/EaseInOutExpo.png'); +export const EaseInCirc: string = require('./assets/EaseInCirc.png'); +export const EaseOutCirc: string = require('./assets/EaseOutCirc.png'); +export const EaseInOutCirc: string = require('./assets/EaseInOutCirc.png'); +export const EaseInElastic: string = require('./assets/EaseInElastic.png'); +export const EaseOutElastic: string = require('./assets/EaseOutElastic.png'); +export const EaseInOutElastic: string = require('./assets/EaseInOutElastic.png'); +export const EaseInBack: string = require('./assets/EaseInBack.png'); +export const EaseOutBack: string = require('./assets/EaseOutBack.png'); +export const EaseInOutBack: string = require('./assets/EaseInOutBack.png'); +export const EaseInBounce: string = require('./assets/EaseInBounce.png'); +export const EaseOutBounce: string = require('./assets/EaseOutBounce.png'); +export const EaseInOutBounce: string = require('./assets/EaseInOutBounce.png'); + +// fill icons +export const FillNone: string = require('./assets/FillNone.png'); +export const FillStart: string = require('./assets/FillStart.png'); +export const FillEnd: string = require('./assets/FillEnd.png'); +export const FillOrigin: string = require('./assets/FillOrigin.png'); diff --git a/samples/react-chartcontrol/src/webparts/chartinator/assets/BubbleChart.png b/samples/react-chartcontrol/src/webparts/chartinator/assets/BubbleChart.png new file mode 100644 index 000000000..5f97af6e5 Binary files /dev/null and b/samples/react-chartcontrol/src/webparts/chartinator/assets/BubbleChart.png differ diff --git a/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseInBack.png b/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseInBack.png new file mode 100644 index 000000000..562e9099f Binary files /dev/null and b/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseInBack.png differ diff --git a/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseInBounce.png b/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseInBounce.png new file mode 100644 index 000000000..d431b086c Binary files /dev/null and b/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseInBounce.png differ diff --git a/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseInCirc.png b/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseInCirc.png new file mode 100644 index 000000000..d22f40848 Binary files /dev/null and b/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseInCirc.png differ diff --git a/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseInCubic.png b/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseInCubic.png new file mode 100644 index 000000000..84ca6ed6e Binary files /dev/null and b/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseInCubic.png differ diff --git a/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseInElastic.png b/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseInElastic.png new file mode 100644 index 000000000..1578a9af3 Binary files /dev/null and b/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseInElastic.png differ diff --git a/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseInExpo.png b/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseInExpo.png new file mode 100644 index 000000000..7c4c81ac1 Binary files /dev/null and b/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseInExpo.png differ diff --git a/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseInOutBack.png b/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseInOutBack.png new file mode 100644 index 000000000..96f82b69a Binary files /dev/null and b/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseInOutBack.png differ diff --git a/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseInOutBounce.png b/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseInOutBounce.png new file mode 100644 index 000000000..db82d74b8 Binary files /dev/null and b/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseInOutBounce.png differ diff --git a/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseInOutCirc.png b/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseInOutCirc.png new file mode 100644 index 000000000..cf92299e7 Binary files /dev/null and b/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseInOutCirc.png differ diff --git a/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseInOutCubic.png b/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseInOutCubic.png new file mode 100644 index 000000000..73baeb242 Binary files /dev/null and b/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseInOutCubic.png differ diff --git a/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseInOutElastic.png b/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseInOutElastic.png new file mode 100644 index 000000000..9657bf23a Binary files /dev/null and b/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseInOutElastic.png differ diff --git a/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseInOutExpo.png b/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseInOutExpo.png new file mode 100644 index 000000000..44ff150ff Binary files /dev/null and b/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseInOutExpo.png differ diff --git a/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseInOutQuad.png b/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseInOutQuad.png new file mode 100644 index 000000000..ba0e9a054 Binary files /dev/null and b/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseInOutQuad.png differ diff --git a/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseInOutQuart.png b/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseInOutQuart.png new file mode 100644 index 000000000..6b8f99a69 Binary files /dev/null and b/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseInOutQuart.png differ diff --git a/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseInOutQuint.png b/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseInOutQuint.png new file mode 100644 index 000000000..a7d45e98b Binary files /dev/null and b/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseInOutQuint.png differ diff --git a/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseInOutSine.png b/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseInOutSine.png new file mode 100644 index 000000000..3e7b4c469 Binary files /dev/null and b/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseInOutSine.png differ diff --git a/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseInQuad.png b/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseInQuad.png new file mode 100644 index 000000000..4dd835aed Binary files /dev/null and b/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseInQuad.png differ diff --git a/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseInQuart.png b/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseInQuart.png new file mode 100644 index 000000000..ae6a7e6f5 Binary files /dev/null and b/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseInQuart.png differ diff --git a/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseInQuint.png b/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseInQuint.png new file mode 100644 index 000000000..0e133d036 Binary files /dev/null and b/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseInQuint.png differ diff --git a/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseInSine.png b/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseInSine.png new file mode 100644 index 000000000..e074d7a43 Binary files /dev/null and b/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseInSine.png differ diff --git a/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseOutBack.png b/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseOutBack.png new file mode 100644 index 000000000..c6a95e5b0 Binary files /dev/null and b/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseOutBack.png differ diff --git a/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseOutBounce.png b/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseOutBounce.png new file mode 100644 index 000000000..8e842dbfb Binary files /dev/null and b/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseOutBounce.png differ diff --git a/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseOutCirc.png b/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseOutCirc.png new file mode 100644 index 000000000..f3ad9e889 Binary files /dev/null and b/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseOutCirc.png differ diff --git a/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseOutCubic.png b/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseOutCubic.png new file mode 100644 index 000000000..cc47bcd2c Binary files /dev/null and b/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseOutCubic.png differ diff --git a/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseOutElastic.png b/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseOutElastic.png new file mode 100644 index 000000000..b333f2962 Binary files /dev/null and b/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseOutElastic.png differ diff --git a/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseOutExpo.png b/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseOutExpo.png new file mode 100644 index 000000000..10306af93 Binary files /dev/null and b/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseOutExpo.png differ diff --git a/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseOutQuad.png b/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseOutQuad.png new file mode 100644 index 000000000..0da2eb47f Binary files /dev/null and b/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseOutQuad.png differ diff --git a/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseOutQuart.png b/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseOutQuart.png new file mode 100644 index 000000000..dd88453fc Binary files /dev/null and b/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseOutQuart.png differ diff --git a/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseOutQuint.png b/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseOutQuint.png new file mode 100644 index 000000000..c0164aa04 Binary files /dev/null and b/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseOutQuint.png differ diff --git a/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseOutSine.png b/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseOutSine.png new file mode 100644 index 000000000..f70b44c06 Binary files /dev/null and b/samples/react-chartcontrol/src/webparts/chartinator/assets/EaseOutSine.png differ diff --git a/samples/react-chartcontrol/src/webparts/chartinator/assets/FIllNone.png b/samples/react-chartcontrol/src/webparts/chartinator/assets/FIllNone.png new file mode 100644 index 000000000..e5409c2f3 Binary files /dev/null and b/samples/react-chartcontrol/src/webparts/chartinator/assets/FIllNone.png differ diff --git a/samples/react-chartcontrol/src/webparts/chartinator/assets/FillEnd.png b/samples/react-chartcontrol/src/webparts/chartinator/assets/FillEnd.png new file mode 100644 index 000000000..e1ce1693f Binary files /dev/null and b/samples/react-chartcontrol/src/webparts/chartinator/assets/FillEnd.png differ diff --git a/samples/react-chartcontrol/src/webparts/chartinator/assets/FillOrigin.png b/samples/react-chartcontrol/src/webparts/chartinator/assets/FillOrigin.png new file mode 100644 index 000000000..f3ecbd0c4 Binary files /dev/null and b/samples/react-chartcontrol/src/webparts/chartinator/assets/FillOrigin.png differ diff --git a/samples/react-chartcontrol/src/webparts/chartinator/assets/FillStart.png b/samples/react-chartcontrol/src/webparts/chartinator/assets/FillStart.png new file mode 100644 index 000000000..1fcb69a2c Binary files /dev/null and b/samples/react-chartcontrol/src/webparts/chartinator/assets/FillStart.png differ diff --git a/samples/react-chartcontrol/src/webparts/chartinator/assets/LegendBottom.png b/samples/react-chartcontrol/src/webparts/chartinator/assets/LegendBottom.png new file mode 100644 index 000000000..bc4c2aeef Binary files /dev/null and b/samples/react-chartcontrol/src/webparts/chartinator/assets/LegendBottom.png differ diff --git a/samples/react-chartcontrol/src/webparts/chartinator/assets/LegendLeft.png b/samples/react-chartcontrol/src/webparts/chartinator/assets/LegendLeft.png new file mode 100644 index 000000000..a95d79bd0 Binary files /dev/null and b/samples/react-chartcontrol/src/webparts/chartinator/assets/LegendLeft.png differ diff --git a/samples/react-chartcontrol/src/webparts/chartinator/assets/LegendNone.png b/samples/react-chartcontrol/src/webparts/chartinator/assets/LegendNone.png new file mode 100644 index 000000000..85d619758 Binary files /dev/null and b/samples/react-chartcontrol/src/webparts/chartinator/assets/LegendNone.png differ diff --git a/samples/react-chartcontrol/src/webparts/chartinator/assets/LegendRight.png b/samples/react-chartcontrol/src/webparts/chartinator/assets/LegendRight.png new file mode 100644 index 000000000..63f428e3d Binary files /dev/null and b/samples/react-chartcontrol/src/webparts/chartinator/assets/LegendRight.png differ diff --git a/samples/react-chartcontrol/src/webparts/chartinator/assets/LegendTop.png b/samples/react-chartcontrol/src/webparts/chartinator/assets/LegendTop.png new file mode 100644 index 000000000..904a4730d Binary files /dev/null and b/samples/react-chartcontrol/src/webparts/chartinator/assets/LegendTop.png differ diff --git a/samples/react-chartcontrol/src/webparts/chartinator/assets/Linear.png b/samples/react-chartcontrol/src/webparts/chartinator/assets/Linear.png new file mode 100644 index 000000000..18f05913a Binary files /dev/null and b/samples/react-chartcontrol/src/webparts/chartinator/assets/Linear.png differ diff --git a/samples/react-chartcontrol/src/webparts/chartinator/assets/PointStyleCircle.png b/samples/react-chartcontrol/src/webparts/chartinator/assets/PointStyleCircle.png new file mode 100644 index 000000000..35cc28bc4 Binary files /dev/null and b/samples/react-chartcontrol/src/webparts/chartinator/assets/PointStyleCircle.png differ diff --git a/samples/react-chartcontrol/src/webparts/chartinator/assets/PointStyleCross.png b/samples/react-chartcontrol/src/webparts/chartinator/assets/PointStyleCross.png new file mode 100644 index 000000000..e57476d8b Binary files /dev/null and b/samples/react-chartcontrol/src/webparts/chartinator/assets/PointStyleCross.png differ diff --git a/samples/react-chartcontrol/src/webparts/chartinator/assets/PointStyleCrossRot.png b/samples/react-chartcontrol/src/webparts/chartinator/assets/PointStyleCrossRot.png new file mode 100644 index 000000000..faf345095 Binary files /dev/null and b/samples/react-chartcontrol/src/webparts/chartinator/assets/PointStyleCrossRot.png differ diff --git a/samples/react-chartcontrol/src/webparts/chartinator/assets/PointStyleDash.png b/samples/react-chartcontrol/src/webparts/chartinator/assets/PointStyleDash.png new file mode 100644 index 000000000..ebc1aebc7 Binary files /dev/null and b/samples/react-chartcontrol/src/webparts/chartinator/assets/PointStyleDash.png differ diff --git a/samples/react-chartcontrol/src/webparts/chartinator/assets/PointStyleLine.png b/samples/react-chartcontrol/src/webparts/chartinator/assets/PointStyleLine.png new file mode 100644 index 000000000..3509a4157 Binary files /dev/null and b/samples/react-chartcontrol/src/webparts/chartinator/assets/PointStyleLine.png differ diff --git a/samples/react-chartcontrol/src/webparts/chartinator/assets/PointStyleRect.png b/samples/react-chartcontrol/src/webparts/chartinator/assets/PointStyleRect.png new file mode 100644 index 000000000..543f94af0 Binary files /dev/null and b/samples/react-chartcontrol/src/webparts/chartinator/assets/PointStyleRect.png differ diff --git a/samples/react-chartcontrol/src/webparts/chartinator/assets/PointStyleRectRot.png b/samples/react-chartcontrol/src/webparts/chartinator/assets/PointStyleRectRot.png new file mode 100644 index 000000000..5ee56c005 Binary files /dev/null and b/samples/react-chartcontrol/src/webparts/chartinator/assets/PointStyleRectRot.png differ diff --git a/samples/react-chartcontrol/src/webparts/chartinator/assets/PointStyleRectRounded.png b/samples/react-chartcontrol/src/webparts/chartinator/assets/PointStyleRectRounded.png new file mode 100644 index 000000000..07d385eb7 Binary files /dev/null and b/samples/react-chartcontrol/src/webparts/chartinator/assets/PointStyleRectRounded.png differ diff --git a/samples/react-chartcontrol/src/webparts/chartinator/assets/PointStyleStar.png b/samples/react-chartcontrol/src/webparts/chartinator/assets/PointStyleStar.png new file mode 100644 index 000000000..b1e072fb9 Binary files /dev/null and b/samples/react-chartcontrol/src/webparts/chartinator/assets/PointStyleStar.png differ diff --git a/samples/react-chartcontrol/src/webparts/chartinator/assets/PointStyleTriangle.png b/samples/react-chartcontrol/src/webparts/chartinator/assets/PointStyleTriangle.png new file mode 100644 index 000000000..7fe245e93 Binary files /dev/null and b/samples/react-chartcontrol/src/webparts/chartinator/assets/PointStyleTriangle.png differ diff --git a/samples/react-chartcontrol/src/webparts/chartinator/assets/PolarArea.png b/samples/react-chartcontrol/src/webparts/chartinator/assets/PolarArea.png new file mode 100644 index 000000000..eda5edd26 Binary files /dev/null and b/samples/react-chartcontrol/src/webparts/chartinator/assets/PolarArea.png differ diff --git a/samples/react-chartcontrol/src/webparts/chartinator/assets/RadarChart.png b/samples/react-chartcontrol/src/webparts/chartinator/assets/RadarChart.png new file mode 100644 index 000000000..f07b7210f Binary files /dev/null and b/samples/react-chartcontrol/src/webparts/chartinator/assets/RadarChart.png differ diff --git a/samples/react-chartcontrol/src/webparts/chartinator/assets/ScatterChart.png b/samples/react-chartcontrol/src/webparts/chartinator/assets/ScatterChart.png new file mode 100644 index 000000000..9fd183bb3 Binary files /dev/null and b/samples/react-chartcontrol/src/webparts/chartinator/assets/ScatterChart.png differ diff --git a/samples/react-chartcontrol/src/webparts/chartinator/components/Chartinator.module.scss b/samples/react-chartcontrol/src/webparts/chartinator/components/Chartinator.module.scss new file mode 100644 index 000000000..7e2ca45b2 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/chartinator/components/Chartinator.module.scss @@ -0,0 +1,23 @@ +@import '~@microsoft/sp-office-ui-fabric-core/dist/sass/SPFabricCore.scss'; + +.chartinator { + color: inherit; +} + + +// .propertyPaneAddButtonWithText { +// display: -webkit-box; +// display: -ms-flexbox; +// display: flex; +// -webkit-box-pack: justify; +// -ms-flex-pack: justify; +// justify-content: space-between; +// -webkit-box-align: center; +// -ms-flex-align: center; +// align-items: center; +// width: 100%; +// } + +// .propertyPaneAddButton { +// text-align: left; +// } diff --git a/samples/react-chartcontrol/src/webparts/chartinator/components/Chartinator.tsx b/samples/react-chartcontrol/src/webparts/chartinator/components/Chartinator.tsx new file mode 100644 index 000000000..be04d799e --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/chartinator/components/Chartinator.tsx @@ -0,0 +1,359 @@ +import * as React from 'react'; +import styles from './Chartinator.module.scss'; +import { IChartinatorProps } from './Chartinator.types'; +import * as strings from 'ChartinatorWebPartStrings'; + +// used to add a chart control +import { ChartControl, ChartType, ChartPalette, PaletteGenerator } from '@pnp/spfx-controls-react/lib/ChartControl'; +import MockChartDataProvider from '../../../services/ChartDataProvider/MockChartDataProvider'; +import IChartDataProvider from '../../../services/ChartDataProvider/IChartDataProvider'; +import { IBubbleChartData, IScatterChartData, INumberChartData } from '../controls/PropertyFieldRepeatingData'; +import { ChartTitle } from '../controls/ChartTitle'; +import { DashStrokes } from '../controls/PropertyPaneDashSelector/components/DashSelector.types'; + +// List methods to retrieve data +import { IListService, ListService, IListItem, MockListService } from '../../../services/ListService'; + +export default class Chartinator extends React.Component { + /** +* The chart element +*/ + private _chartElem: ChartControl = undefined; + + public componentWillReceiveProps(nextProps: IChartinatorProps): void { + // Remove data before changing chart type + // -- prevents running into issues with different kinds of data required for each kind of chart + if (this._chartElem) { + const chart = this._chartElem.getChart(); + if (chart) { + chart.data!.datasets = []; + } + } + } + + /** + * Render the chart + */ + public render(): React.ReactElement { + const { chartType } = this.props; + const { radialChart } = this.props; + + // Scales should not be defined for radial charts. + const chartScales: Chart.ChartScales = radialChart ? undefined : { + yAxes: [{ + gridLines: { + display: this.props.yAxisShowGridlines + }, + ticks: { + beginAtZero: this.props.yAxisBeginAtZero, + }, + scaleLabel: { + display: this.props.yAxisLabelEnabled, + labelString: this.props.yAxisLabelText, + } + }], + xAxes: [{ + gridLines: { + display: this.props.xAxisShowGridlines + + }, + scaleLabel: { + display: this.props.xAxisLabelEnabled, + labelString: this.props.xAxisLabelText, + } + }] + }; + + // This option only applies to bar and horizontal bards + if (chartType === ChartType.Bar) { + chartScales.xAxes[0].gridLines.offsetGridLines = this.props.offsetGridLines; + } else if (chartType === ChartType.HorizontalBar) { + chartScales.yAxes[0].gridLines.offsetGridLines = this.props.offsetGridLines; + } + + // some of these settings should only be defined if there are values + + // set the minimum Y axis -- if available + if (chartScales && this.props.yAxisMin && !this.props.yAxisBeginAtZero) { + chartScales.yAxes[0].ticks.min = this.props.yAxisMin; + } + + // set the maximum Y axis -- if available + if (chartScales && this.props.yAxisMax) { + chartScales.yAxes[0].ticks.max = this.props.yAxisMax; + } + + // set the maximum number of lines + if (chartScales && this.props.yAxisMaxTicksLimit) { + chartScales.yAxes[0].ticks.maxTicksLimit = this.props.yAxisMaxTicksLimit; + } + + // set the step size + if (chartScales && this.props.yAxisStepSize) { + chartScales.yAxes[0].ticks.stepSize = this.props.yAxisStepSize; + } + + // set the legend position + const legendPosition: Chart.PositionType = this.props.legendPosition === 'none' ? 'top' : this.props.legendPosition as Chart.PositionType; + + // set the options + const options: Chart.ChartOptions = { + title: { + display: false + }, + animation: { + duration: this.props.animationDuration, + easing: this.props.animationEasing + }, + layout: { + padding: { + left: this.props.leftPadding, + right: this.props.rightPadding, + top: this.props.topPadding, + bottom: this.props.bottomPadding + } + }, + legend: { + position: legendPosition, + display: this.props.legendPosition !== 'none', + reverse: this.props.legendReversed + }, + tooltips: { + enabled: this.props.tooltipEnabled, + intersect: this.props.tooltipIntersect, + mode: this.props.tooltipMode as Chart.InteractionMode, + position: this.props.tooltipPosition + }, + scales: chartScales + }; + + if (chartType == ChartType.Doughnut) { + options.cutoutPercentage = this.props.cutoutPercentage; + } + + if (chartType === ChartType.Doughnut || chartType === ChartType.Pie) { + options.circumference = (this.props.circumference / 100) * 2 * Math.PI; + } + + // Only apply rotation to pie, doughnuts and polar area + if (chartType === ChartType.Doughnut || chartType === ChartType.Pie || chartType === ChartType.PolarArea) { + options.rotation = (this.props.chartRotation / 360) * Math.PI; + + // Add chart animation + if (options.animation === undefined) { + options.animation = {}; + } + options.animation.animateRotate = this.props.animateRotate; + options.animation.animateScale = this.props.animateScale; + } + + return ( +

+ + +
+ ); + } + + /** + * Links a reference to the chart so that we can + * refer to it later and change its data + */ + private _linkElement = (e: ChartControl) => { + this._chartElem = e; + } + + /** + * Loads data from a service. + * This is where you would replace for your own code + */ + private _loadAsyncData(): Promise { + + const { data } = this.props; + + // Check if we received data + if (data !== undefined && data.length > 0 && data[0].name !== '') { + // Yes, load the manual data + return this._loadManualData(); + } else { + return this._loadListData(); + } + } + + /** + * Loads data from a list or, if no data is provided, + * from a mock list. + */ + private _loadListData = (): Promise => { + const { chartType } = this.props; + return new Promise((resolve, _reject) => { + let service: IListService; + + // If the data source is configured, get the data from the list + if (this.props.dataSourceListId && this.props.dataLabelField && this.props.dataValueField) { + service = new ListService(this.props.context); + } else { + // no data provided, and no data source. Load bogus data + service = new MockListService(chartType, strings.SampleLabels); + } + + return service.getListItems(this.props.dataSourceListId, + this.props.dataLabelField, + this.props.dataValueField, + this.props.dataYValueField, + this.props.dataRValueField, + ).then((listItems: IListItem[]) => { + + let dataItems = []; + if (chartType === ChartType.Bubble) { + dataItems = listItems.map((listItem: IListItem) => { + const dataItem: Chart.ChartPoint = { + x: listItem.Value, + y: listItem.YValue, + r: listItem.RValue + }; + return dataItem; + }); + } else if (chartType === ChartType.Scatter) { + dataItems = listItems.map((listItem: IListItem) => { + const dataItem: Chart.ChartPoint = { + x: listItem.Value, + y: listItem.YValue + }; + return dataItem; + }); + } else { + dataItems = listItems.map((listItem: IListItem) => { + return listItem.Value; + }); + } + + const data: Chart.ChartData = + { + labels: listItems.map((listItem: IListItem) => { + return listItem.Label; + }), + datasets: [ + { + label: this.props.dataSetName, + data: dataItems + } + ] + }; + + // Line fill + this._addDataOptions(data); + resolve(data); + }); + }); + } + + private _loadManualData = (): Promise => { + const { chartType } = this.props; + return new Promise((resolve, _reject) => { + const labels: string[] = this.props.data.map(dataRow => { + return dataRow.name; + }); + + let dataItems: Array | Chart.ChartPoint[]; + + if (chartType === ChartType.Bubble) { + dataItems = this.props.data.map((dataRow: IBubbleChartData) => { + return { + x: dataRow.x, + y: dataRow.y, + r: dataRow.r + }; + }); + } else if (chartType === ChartType.Scatter) { + dataItems = this.props.data.map((dataRow: IScatterChartData) => { + return { + x: dataRow.x, + y: dataRow.y, + }; + }); + } else { + dataItems = this.props.data.map((dataRow: INumberChartData) => { + return dataRow.value; + }); + } + + + const data: Chart.ChartData = + { + labels: labels, + datasets: [ + { + label: this.props.dataSetName, + data: dataItems + } + ] + }; + + this._addDataOptions(data); + + resolve(data); + }); + } + + private _addDataOptions = (data: Chart.ChartData): void => { + const { chartType } = this.props; + const primaryDataSet: Chart.ChartDataSets = data.datasets[0]; + + if (primaryDataSet === undefined) { + return; + } + + if (chartType === ChartType.Line) { + primaryDataSet.showLine = this.props.lineShowLine === true; + primaryDataSet.steppedLine = this.props.lineStepped; + primaryDataSet.borderWidth = this.props.borderWidth; + + if (this.props.borderColor !== undefined) { + primaryDataSet.borderColor = this.props.borderColor; + } + + if (this.props.borderDash !== undefined) { + primaryDataSet.borderDash = DashStrokes[this.props.borderDash]; + } + + if (this.props.borderJoinStyle !== undefined) { + primaryDataSet.borderJoinStyle = this.props.borderJoinStyle; + } + + if (this.props.borderCapStyle !== undefined) { + primaryDataSet.borderCapStyle = this.props.borderCapStyle; + } + + if (!this.props.lineCurved) { + primaryDataSet.lineTension = 0; + } + + // Line fill + if (this.props.lineFill && chartType === ChartType.Line) { + primaryDataSet.fill = this.props.lineFill; + } + } + + if (chartType === ChartType.Line || chartType === ChartType.Scatter) { + primaryDataSet.pointRadius = this.props.pointRadius; + } + + if (chartType === ChartType.Line || chartType === ChartType.Scatter || chartType === ChartType.Bubble) { + primaryDataSet.pointStyle = this.props.pointStyle; + + // chart.js seems to not declare a point rotation, but it is a valid property + primaryDataSet["pointRotation"] = this.props.pointRotation; + } + } +} diff --git a/samples/react-chartcontrol/src/webparts/chartinator/components/Chartinator.types.ts b/samples/react-chartcontrol/src/webparts/chartinator/components/Chartinator.types.ts new file mode 100644 index 000000000..87a7a52d0 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/chartinator/components/Chartinator.types.ts @@ -0,0 +1,105 @@ +import { INumberChartData, IScatterChartData, IBubbleChartData } from "../controls/PropertyFieldRepeatingData"; +import { DisplayMode } from '@microsoft/sp-core-library'; +import { ChartType, ChartPalette } from '@pnp/spfx-controls-react/lib/ChartControl'; +import { DashType } from "../controls/PropertyPaneDashSelector/components/DashSelector.types"; +import { WebPartContext } from "@microsoft/sp-webpart-base"; + +export interface IChartinatorProps { + animateRotate: boolean; + animateScale: boolean; + animationDuration: number; + animationEasing: EasingType; + borderCapStyle: CapType; + borderColor: string; + borderDash: DashType; + borderJoinStyle: JoinType; + borderWidth: number; + bottomPadding: number; + chartPalette: ChartPalette; + chartRotation: number; + chartType: ChartType; + circumference: number; + context: WebPartContext; + cutoutPercentage: number; + data: Array; + dataLabelField: string; + dataRValueField: string; + dataSetName: string; + dataSourceListId: string; + dataSourceType: DataSourceType; + dataValueField: string; + dataYValueField: string; + displayMode: DisplayMode; + leftPadding: number; + legendPosition: Chart.PositionType | 'none'; + legendReversed: boolean; + lineCurved: boolean; + lineFill: string; + lineShowLine: boolean; + lineStepped: boolean; + offsetGridLines: boolean; + pointRadius: number; + pointRotation: number; + pointStyle: Chart.PointStyle; + radialChart: boolean; + rightPadding: number; + title: string; + tooltipEnabled: boolean; + tooltipIntersect: boolean; + tooltipMode: Chart.InteractionMode; + tooltipPosition: string; + topPadding: number; + xAxisLabelEnabled: boolean; + xAxisLabelText: string; + xAxisShowGridlines: boolean; + yAxisBeginAtZero: boolean; + yAxisLabelEnabled: boolean; + yAxisLabelText: string; + yAxisMax: number; + yAxisMaxTicksLimit: number; + yAxisMin: number; + yAxisStepSize: number; + yAxisShowGridlines: boolean; + updateTitle: (value: string) => void; +} + +export enum DataSourceType { + Static, + List +} + +export type EasingType = 'linear' | + 'easeInQuad' | + 'easeOutQuad' | + 'easeInOutQuad' | + 'easeInCubic' | + 'easeOutCubic' | + 'easeInOutCubic' | + 'easeInQuart' | + 'easeOutQuart' | + 'easeInOutQuart' | + 'easeInQuint' | + 'easeOutQuint' | + 'easeInOutQuint' | + 'easeInSine' | + 'easeOutSine' | + 'easeInOutSine' | + 'easeInExpo' | + 'easeOutExpo' | + 'easeInOutExpo' | + 'easeInCirc' | + 'easeOutCirc' | + 'easeInOutCirc' | + 'easeInElastic' | + 'easeOutElastic' | + 'easeInOutElastic' | + 'easeInBack' | + 'easeOutBack' | + 'easeInOutBack' | + 'easeInBounce' | + 'easeOutBounce' | + 'easeInOutBounce'; + + export type CapType = 'butt' | 'round' | 'square'; + + export type JoinType = 'bevel' | 'round' | 'miter'; diff --git a/samples/react-chartcontrol/src/webparts/chartinator/controls/ChartTitle/ChartTitle.module.scss b/samples/react-chartcontrol/src/webparts/chartinator/controls/ChartTitle/ChartTitle.module.scss new file mode 100644 index 000000000..213d02903 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/chartinator/controls/ChartTitle/ChartTitle.module.scss @@ -0,0 +1,62 @@ +@import "~@microsoft/sp-office-ui-fabric-core/dist/sass/SPFabricCore.scss"; + +.chartTitle { + font-size: 14px; + font-weight: 100; + // margin-bottom: 0; + color: $ms-color-neutralPrimary; + text-align: center; + + @media (min-width: 320px) { + font-size: 21px; + } + + @media (min-width: 480px) { + font-size: 24px; + } + + // Edit mode + textarea { + background-color: transparent; + border: none; + box-sizing: border-box; + color: inherit; + display: block; + font-family: inherit; + font-size: inherit; + font-weight: inherit; + height: 36px; + line-height: inherit; + margin: 0; + outline: 0; + overflow: hidden; + resize: none; + text-align: inherit; + white-space: pre; + width: 100%; + overflow-x: hidden; + text-overflow: ellipsis; + text-align: center; + } + + textarea::-webkit-input-placeholder { + color:$ms-color-neutralTertiaryAlt; + } + + textarea:-moz-placeholder { /* Firefox 18- */ + color:$ms-color-neutralTertiaryAlt; + } + + textarea::-moz-placeholder { /* Firefox 19+ */ + color:$ms-color-neutralTertiaryAlt; + } + + textarea:-ms-input-placeholder { + color:$ms-color-neutralTertiaryAlt; + } + + // View mode + span { + color: inherit; + } +} diff --git a/samples/react-chartcontrol/src/webparts/chartinator/controls/ChartTitle/ChartTitle.tsx b/samples/react-chartcontrol/src/webparts/chartinator/controls/ChartTitle/ChartTitle.tsx new file mode 100644 index 000000000..10d7eb2ab --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/chartinator/controls/ChartTitle/ChartTitle.tsx @@ -0,0 +1,39 @@ +import * as React from 'react'; +import { DisplayMode } from '@microsoft/sp-core-library'; +import styles from './ChartTitle.module.scss'; +import { IChartTitleProps } from './ChartTitle.types'; +import { css } from "office-ui-fabric-react/lib/Utilities"; + +/** + * Chart Title component -- designed to mimic the Quick Chart title component. + * Unfortunately, the PnP WebParttitle control doesn't allow you to specify a placeholder. + * PR is coming up! + */ +export class ChartTitle extends React.Component { + /** + * Process the text area change + */ + private _onChange = (event) => { + this.props.updateTitle(event.target.value); + } + + /** + * Default React component render method + */ + public render(): React.ReactElement { + if (this.props.title || this.props.displayMode === DisplayMode.Edit) { + return ( +
+ { + this.props.displayMode === DisplayMode.Edit && + } + { + this.props.displayMode !== DisplayMode.Edit && this.props.title && {this.props.title} + } +
+ ); + } + + return null; + } +} diff --git a/samples/react-chartcontrol/src/webparts/chartinator/controls/ChartTitle/ChartTitle.types.ts b/samples/react-chartcontrol/src/webparts/chartinator/controls/ChartTitle/ChartTitle.types.ts new file mode 100644 index 000000000..497c55611 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/chartinator/controls/ChartTitle/ChartTitle.types.ts @@ -0,0 +1,9 @@ +import { DisplayMode } from '@microsoft/sp-core-library'; + +export interface IChartTitleProps { + className?: string; + displayMode: DisplayMode; + placeholder?: string; + title: string; + updateTitle: (value: string) => void; +} diff --git a/samples/react-chartcontrol/src/webparts/chartinator/controls/ChartTitle/index.ts b/samples/react-chartcontrol/src/webparts/chartinator/controls/ChartTitle/index.ts new file mode 100644 index 000000000..b121b625f --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/chartinator/controls/ChartTitle/index.ts @@ -0,0 +1,2 @@ +export * from './ChartTitle'; +export * from './ChartTitle.types'; diff --git a/samples/react-chartcontrol/src/webparts/chartinator/controls/NumberTextField/NumberTextField.tsx b/samples/react-chartcontrol/src/webparts/chartinator/controls/NumberTextField/NumberTextField.tsx new file mode 100644 index 000000000..7e79bb22c --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/chartinator/controls/NumberTextField/NumberTextField.tsx @@ -0,0 +1,51 @@ +import * as React from 'react'; +import { TextField } from 'office-ui-fabric-react/lib/TextField'; +import * as strings from 'ChartinatorWebPartStrings'; +import { INumberTextFieldProps, INumberTextFieldState } from './NumberTextField.types'; + +/** + * Textbox for only signed numbers + */ +export class NumberTextField extends React.Component { + constructor(props: INumberTextFieldProps) { + super(props); + + this.state = { + value: props.value !== undefined ? props.value.toString() : undefined + }; + } + + /** + * Renders the textobx + */ + public render(): JSX.Element { + return ( + this._handleChange(newValue)} + onGetErrorMessage={(value: string) => this._validateNumber(value)} + /> + ); + } + + /** + * Validates a number as it is typed in + * @param value the value + */ + private _validateNumber(value: string): string { + return isNaN(Number(value)) ? strings.NumberErrorMessage : ''; + } + + /** + * Handles changes in the textbox + */ + private _handleChange(newValue: string): void { + this.setState({ + value: newValue + }); + + this.props.onChanged(newValue); + } +} diff --git a/samples/react-chartcontrol/src/webparts/chartinator/controls/NumberTextField/NumberTextField.types.ts b/samples/react-chartcontrol/src/webparts/chartinator/controls/NumberTextField/NumberTextField.types.ts new file mode 100644 index 000000000..d7681b45b --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/chartinator/controls/NumberTextField/NumberTextField.types.ts @@ -0,0 +1,10 @@ +export interface INumberTextFieldProps { + label: string; + placeholder: string; + value: number; + onChanged: (newValue: string) => void; +} + +export interface INumberTextFieldState { + value: string; +} diff --git a/samples/react-chartcontrol/src/webparts/chartinator/controls/NumberTextField/index.ts b/samples/react-chartcontrol/src/webparts/chartinator/controls/NumberTextField/index.ts new file mode 100644 index 000000000..ef64c8cbb --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/chartinator/controls/NumberTextField/index.ts @@ -0,0 +1,2 @@ +export * from './NumberTextField'; +export * from './NumberTextField.types'; diff --git a/samples/react-chartcontrol/src/webparts/chartinator/controls/PropertyFieldRepeatingData/IPropertyFieldRepeatingDataInternalProps.ts b/samples/react-chartcontrol/src/webparts/chartinator/controls/PropertyFieldRepeatingData/IPropertyFieldRepeatingDataInternalProps.ts new file mode 100644 index 000000000..65e121536 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/chartinator/controls/PropertyFieldRepeatingData/IPropertyFieldRepeatingDataInternalProps.ts @@ -0,0 +1,5 @@ +import { IPropertyPaneCustomFieldProps } from '@microsoft/sp-webpart-base'; +import { IPropertyFieldRepeatingDataProps } from '.'; + + +export interface IPropertyFieldRepeatingDataInternalProps extends IPropertyPaneCustomFieldProps, IPropertyFieldRepeatingDataProps {} diff --git a/samples/react-chartcontrol/src/webparts/chartinator/controls/PropertyFieldRepeatingData/PropertyFieldRepeatingData.module.scss b/samples/react-chartcontrol/src/webparts/chartinator/controls/PropertyFieldRepeatingData/PropertyFieldRepeatingData.module.scss new file mode 100644 index 000000000..0193a5641 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/chartinator/controls/PropertyFieldRepeatingData/PropertyFieldRepeatingData.module.scss @@ -0,0 +1,7 @@ +@import '~@microsoft/sp-office-ui-fabric-core/dist/sass/SPFabricCore.scss'; + +.propertyPaneGroupField { + padding-top : 4px; + color : $ms-color-neutralPrimary; + word-wrap : break-word; +} diff --git a/samples/react-chartcontrol/src/webparts/chartinator/controls/PropertyFieldRepeatingData/PropertyFieldRepeatingData.ts b/samples/react-chartcontrol/src/webparts/chartinator/controls/PropertyFieldRepeatingData/PropertyFieldRepeatingData.ts new file mode 100644 index 000000000..df63b9c10 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/chartinator/controls/PropertyFieldRepeatingData/PropertyFieldRepeatingData.ts @@ -0,0 +1,63 @@ +import * as React from 'react'; +import * as ReactDom from 'react-dom'; +import { + IPropertyPaneField, + PropertyPaneFieldType +} from '@microsoft/sp-webpart-base'; + +import { IPropertyFieldRepeatingDataProps } from "./PropertyFieldRepeatingData.types"; +import { IPropertyFieldRepeatingDataHostProps } from './PropertyFieldRepeatingData.types'; +import PropertyFieldRepeatingNumberDataHost from './PropertyFieldRepeatingDataHost'; +import { IPropertyFieldRepeatingDataInternalProps } from './IPropertyFieldRepeatingDataInternalProps'; + +/** + * Handles entering repeating rows of data + */ +class PropertyFieldRepeatingDataBuilder implements IPropertyPaneField { + + //Properties defined by IPropertyPaneField + public targetProperty: string; + public type: PropertyPaneFieldType = PropertyPaneFieldType.Custom; + public properties: IPropertyFieldRepeatingDataInternalProps; + + private elem: HTMLElement; + + public constructor(_properties: IPropertyFieldRepeatingDataProps) { + this.properties = { + key: _properties.key, + data: _properties.data, + chartType: _properties.chartType, + onRender: this.onRender.bind(this), + onDataChanged: (data: any) => _properties.onDataChanged(data) + }; + } + + public render(): void { + if (!this.elem) { + return; + } + this.onRender(this.elem); + } + + /** Renders the repeating data control */ + private onRender(elem: HTMLElement, _ctx?: any, _changeCallback?: (targetProperty?: string, newValue?: any) => void): void { + if (!this.elem) { + this.elem = elem; + } + + const element: React.ReactElement = React.createElement(PropertyFieldRepeatingNumberDataHost, { + data: this.properties.data, + chartType: this.properties.chartType, + onDataChanged: (data: any) => this.properties.onDataChanged(data) + }); + ReactDom.render(element, elem); + } +} + +/** + * Creates an instance of PropertyFieldRepeatingData + * @param properties The IPropertyFieldRepeatingDataProps to configure the control + */ +export function PropertyFieldRepeatingData(properties: IPropertyFieldRepeatingDataProps): IPropertyPaneField { + return new PropertyFieldRepeatingDataBuilder(properties); +} diff --git a/samples/react-chartcontrol/src/webparts/chartinator/controls/PropertyFieldRepeatingData/PropertyFieldRepeatingData.types.ts b/samples/react-chartcontrol/src/webparts/chartinator/controls/PropertyFieldRepeatingData/PropertyFieldRepeatingData.types.ts new file mode 100644 index 000000000..b5ca458c1 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/chartinator/controls/PropertyFieldRepeatingData/PropertyFieldRepeatingData.types.ts @@ -0,0 +1,58 @@ +import { IPropertyPaneCustomFieldProps } from '@microsoft/sp-webpart-base'; +import { ChartType } from '@pnp/spfx-controls-react/lib/ChartControl'; + +/** + * Configuration properties for the PropertyFieldRepeatingData control + */ +export interface IPropertyFieldRepeatingDataProps { + chartType: ChartType; + data: {}[]; + key: string; + onDataChanged: (any) => void; +} + +/** + * State for the PropertyFieldRepeatingData cotnrol + */ +export interface IPropertyFieldRepeatingDataState { + data: {}[]; +} + +/** + * Properties for the PropertyFieldRepeatingDataHost + */ +export interface IPropertyFieldRepeatingDataHostProps { + chartType: ChartType; + data: {}[]; + onDataChanged: (any) => void; +} + +/** + * Contains points for number charts + */ +export interface INumberChartData { + id: string; + name: string; + value: number; +} + +/** + * Contains points for bubble chart + */ +export interface IBubbleChartData { + id: string; + name: string; + x: number; + y: number; + r: number; +} + +/** + * Contains points for scatter charts + */ +export interface IScatterChartData { + id: string; + name: string; + x: number; + y: number; +} diff --git a/samples/react-chartcontrol/src/webparts/chartinator/controls/PropertyFieldRepeatingData/PropertyFieldRepeatingDataHost.tsx b/samples/react-chartcontrol/src/webparts/chartinator/controls/PropertyFieldRepeatingData/PropertyFieldRepeatingDataHost.tsx new file mode 100644 index 000000000..a1dcc2297 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/chartinator/controls/PropertyFieldRepeatingData/PropertyFieldRepeatingDataHost.tsx @@ -0,0 +1,241 @@ +import * as React from 'react'; +import { IPropertyFieldRepeatingDataHostProps, IPropertyFieldRepeatingDataState } from './PropertyFieldRepeatingData.types'; +import { IconButton } from 'office-ui-fabric-react/lib/Button'; +import { ActionButton } from 'office-ui-fabric-react/lib/Button'; +import styles from './PropertyFieldRepeatingData.module.scss'; +import { TextField } from 'office-ui-fabric-react/lib/TextField'; +import { NumberTextField } from '../NumberTextField/NumberTextField'; +import * as strings from 'ChartinatorWebPartStrings'; +import { Guid } from '@microsoft/sp-core-library'; +import { ChartType } from '@pnp/spfx-controls-react/lib/ChartControl'; + +/** + * Hosts the PropertyFieldRepeatingData control + */ +export default class IPropertyFieldRepeatingDataHost extends React.Component { + + constructor(props: IPropertyFieldRepeatingDataHostProps) { + super(props); + + this.state = { + data: props.data + }; + } + + /** + * Renders the control + */ + public render(): JSX.Element { + const { chartType } = this.props; + + // Get the datarows + let dataRows: JSX.Element[] = undefined; + switch (chartType) { + case ChartType.Bubble: + dataRows = this._renderBubbleRows(); + break; + case ChartType.Scatter: + dataRows = this._renderPointRows(); + break; + default: + dataRows = this._renderDataRows(); + } + + return ( +
+ {dataRows} + this._handleRowAdd()} + > + {strings.AddButtonLabel} + +
+ ); + } + + /** + * Renders each row of data + */ + private _renderDataRows = (): JSX.Element[] => { + return this.state.data.map((dataRow: { id: string, name: string, value: number }, index: number) => { + return
+ this._handleRowChange(dataRow.id, 'name', newValue)} + /> + this._handleRowChange(dataRow.id, 'value', newValue)} + /> + + {index > 0 && + this._handleRowDelete(dataRow.id)} />} +
+
+
+
; + }); + } + + /** + * Render rows of bubble data elements + */ + private _renderBubbleRows = (): JSX.Element[] => { + return this.state.data.map((dataRow: any, index: number) => { + return
+ this._handleRowChange(dataRow.key, 'name', newValue)} + /> + this._handleRowChange(dataRow.id, 'x', newValue)} + /> + this._handleRowChange(dataRow.id, 'y', newValue)} + /> + this._handleRowChange(dataRow.id, 'r', newValue)} + /> + {index > 0 && + this._handleRowDelete(dataRow.id)} />} +
+
+
+
; + }); + } + + /** + * Renders rows of point data elements + */ + private _renderPointRows = (): JSX.Element[] => { + return this.state.data.map((dataRow: { id: string, name: string, x: number, y: number }, index: number) => { + return
+ this._handleRowChange(dataRow.id, 'name', newValue)} + /> + this._handleRowChange(dataRow.id, 'x', newValue)} + /> + this._handleRowChange(dataRow.id, 'y', newValue)} + /> + {index > 0 && + this._handleRowDelete(dataRow.id)} />} +
+
+
+
; + }); + } + + /** + * Handle row changes + */ + private _handleRowChange = (id: string, dataElem: string, value: any) => { + // Find the data row with matching id + const { data } = this.state; + const row = data.filter((dataRow: { id: string }) => dataRow.id === id)![0]; + if (row !== undefined) { + row[dataElem] = value; + } else { + } + this.setState({ + data: data + }, () => { + this.props.onDataChanged(data); + }); + } + + /** + * Handles when a row is deleted + */ + private _handleRowDelete = (id: string) => { + const { data } = this.state; + + const row = data.filter((dataRow: { id: string }) => dataRow.id === id)![0]; + if (row !== undefined) { + const index = data.indexOf(row); + if (index > -1) { + data.splice(index, 1); + this.setState({ + data: data + }, () => { + this.props.onDataChanged(data); + }); + } + } + } + + /** + * Handles when a row is added + */ + private _handleRowAdd = () => { + const { chartType } = this.props; + const { data } = this.state; + + // Generate new empty data according to data type + switch (chartType) { + case ChartType.Bubble: + data.push({ + id: Guid.newGuid(), + name: '', + x: undefined, + y: undefined, + r: undefined + }); + break; + case ChartType.Scatter: + data.push({ + id: Guid.newGuid(), + name: '', + x: undefined, + y: undefined + }); + break; + default: + data.push({ + id: Guid.newGuid(), + name: '', + value: undefined + }); + } + + this.setState({ + data: data + }, () => { + this.props.onDataChanged(data); + }); + } +} diff --git a/samples/react-chartcontrol/src/webparts/chartinator/controls/PropertyFieldRepeatingData/index.ts b/samples/react-chartcontrol/src/webparts/chartinator/controls/PropertyFieldRepeatingData/index.ts new file mode 100644 index 000000000..3aceda348 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/chartinator/controls/PropertyFieldRepeatingData/index.ts @@ -0,0 +1,2 @@ +export * from './PropertyFieldRepeatingData'; +export * from './PropertyFieldRepeatingData.types'; diff --git a/samples/react-chartcontrol/src/webparts/chartinator/controls/PropertyPaneChartPaletteSelector/IPropertyPaneChartPaletteSelectorInternalProps.ts b/samples/react-chartcontrol/src/webparts/chartinator/controls/PropertyPaneChartPaletteSelector/IPropertyPaneChartPaletteSelectorInternalProps.ts new file mode 100644 index 000000000..8d80b941d --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/chartinator/controls/PropertyPaneChartPaletteSelector/IPropertyPaneChartPaletteSelectorInternalProps.ts @@ -0,0 +1,4 @@ +import { IPropertyPaneCustomFieldProps } from '@microsoft/sp-webpart-base'; +import { IPropertyPaneChartPaletteSelectorProps } from './IPropertyPaneChartPaletteSelectorProps'; + +export interface IPropertyPaneChartPaletteSelectorInternalProps extends IPropertyPaneCustomFieldProps, IPropertyPaneChartPaletteSelectorProps { } diff --git a/samples/react-chartcontrol/src/webparts/chartinator/controls/PropertyPaneChartPaletteSelector/IPropertyPaneChartPaletteSelectorProps.ts b/samples/react-chartcontrol/src/webparts/chartinator/controls/PropertyPaneChartPaletteSelector/IPropertyPaneChartPaletteSelectorProps.ts new file mode 100644 index 000000000..abcd9c408 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/chartinator/controls/PropertyPaneChartPaletteSelector/IPropertyPaneChartPaletteSelectorProps.ts @@ -0,0 +1,9 @@ +import { IDropdownOption } from 'office-ui-fabric-react/lib/components/Dropdown'; + +export interface IPropertyPaneChartPaletteSelectorProps { + disabled: boolean; + label: string; + options: IDropdownOption[]; + selectedKey: string | number; + onPropertyChange: (propertyPath: string, newValue: any) => void; +} diff --git a/samples/react-chartcontrol/src/webparts/chartinator/controls/PropertyPaneChartPaletteSelector/PropertyPaneChartPaletteSelector.ts b/samples/react-chartcontrol/src/webparts/chartinator/controls/PropertyPaneChartPaletteSelector/PropertyPaneChartPaletteSelector.ts new file mode 100644 index 000000000..a7c69da2a --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/chartinator/controls/PropertyPaneChartPaletteSelector/PropertyPaneChartPaletteSelector.ts @@ -0,0 +1,79 @@ +import * as React from 'react'; +import * as ReactDom from 'react-dom'; +import { + IPropertyPaneField, + PropertyPaneFieldType +} from '@microsoft/sp-webpart-base'; + +import { IDropdownOption } from 'office-ui-fabric-react/lib/components/Dropdown'; + +import { IChartPaletteSelectorProps } from './components/ChartPaletteSelector.types'; +import ChartPaletteSelector from './components/ChartPaletteSelector'; +import { + IPropertyPaneChartPaletteSelectorProps, + IPropertyPaneChartPaletteSelectorInternalProps, +} from '.'; + +/** + * Palette selector control for property panes + */ +export class PropertyPaneChartPaletteSelectorBuilder implements IPropertyPaneField { + public type: PropertyPaneFieldType = PropertyPaneFieldType.Custom; + public properties: IPropertyPaneChartPaletteSelectorInternalProps; + private element: HTMLElement; + + constructor(public targetProperty: string, properties: IPropertyPaneChartPaletteSelectorProps) { + this.properties = { + key: properties.label, + label: properties.label, + disabled: properties.disabled, + options: properties.options, + selectedKey: properties.selectedKey, + onPropertyChange: properties.onPropertyChange, + onRender: this.onRender.bind(this) + }; + } + + public render(): void { + if (!this.element) { + return; + } + } + + /** + * Render's the control + * @param element + */ + private onRender(element: HTMLElement): void { + if (!this.element) { + this.element = element; + } + + // render the palette selector + const reactElement: React.ReactElement = React.createElement(ChartPaletteSelector, { + label: this.properties.label, + onChanged: (option: IDropdownOption, index?: number) => this.onChanged(option, index), + options: this.properties.options, + selectedKey: this.properties.selectedKey, + disabled: this.properties.disabled, + stateKey: new Date().toString() // hack to allow for externally triggered re-rendering + }); + ReactDom.render(reactElement, element); + } + + /** + * On changed call handler + * @param option + * @param index + */ + private onChanged(option: IDropdownOption, index?: number): void { + this.properties.onPropertyChange(this.targetProperty, option.key); + } +} + +export function PropertyPaneChartPaletteSelector(targetProperty: string, properties: IPropertyPaneChartPaletteSelectorProps): IPropertyPaneField { + return new PropertyPaneChartPaletteSelectorBuilder(targetProperty, { + ...properties, + }); +} + diff --git a/samples/react-chartcontrol/src/webparts/chartinator/controls/PropertyPaneChartPaletteSelector/components/ChartPaletteSelector.module.scss b/samples/react-chartcontrol/src/webparts/chartinator/controls/PropertyPaneChartPaletteSelector/components/ChartPaletteSelector.module.scss new file mode 100644 index 000000000..2380bade2 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/chartinator/controls/PropertyPaneChartPaletteSelector/components/ChartPaletteSelector.module.scss @@ -0,0 +1,39 @@ +.chartPaletteSelector { + color: inherit; +} + +.colorChoice { + display: table-row; +} + +.colorCell { + position: relative; + box-sizing: border-box; + display: table-cell; + cursor: pointer; + vertical-align: top; + padding-top: 0px; + padding-right: 0px; + padding-bottom: 0px; + padding-left: 0px; + user-select: none; + outline: transparent; + border-width: 1px; + border-style: solid; + border-color: transparent; + border-image: initial; + text-decoration: none; + border-radius: 0px; + overflow: visible; + background: transparent; +} + +.svg { + width: 20px; + height: 20px; + padding-top: 4px; + padding-right: 4px; + padding-bottom: 4px; + padding-left: 4px; + box-sizing: content-box; +} diff --git a/samples/react-chartcontrol/src/webparts/chartinator/controls/PropertyPaneChartPaletteSelector/components/ChartPaletteSelector.tsx b/samples/react-chartcontrol/src/webparts/chartinator/controls/PropertyPaneChartPaletteSelector/components/ChartPaletteSelector.tsx new file mode 100644 index 000000000..e309d1e0a --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/chartinator/controls/PropertyPaneChartPaletteSelector/components/ChartPaletteSelector.tsx @@ -0,0 +1,102 @@ +import * as React from 'react'; +import { + Dropdown, + IDropdownOption +} from 'office-ui-fabric-react/lib/components/Dropdown'; +import { TooltipHost, DirectionalHint } from 'office-ui-fabric-react/lib/Tooltip'; + +import styles from './ChartPaletteSelector.module.scss'; +import { IChartPaletteSelectorProps, IChartPaletteSelectorState } from './ChartPaletteSelector.types'; + +/** + * Displays a list of palette colours + */ +export default class ChartPaletteSelector extends React.Component { + constructor(props: IChartPaletteSelectorProps) { + super(props); + this.state = { + selectedKey: this.props.selectedKey + }; + } + public render(): JSX.Element { + return ( +
+ this._onChanged(option, index)} /> +
+ ); + } + + /** + * Renders a drop down option + */ + private _onRenderOption = (option: IDropdownOption): JSX.Element => { + // Get the palette name + const paletteName: string = option.key as string; + + // Get the colors + const colors: string[] = option.data.colors; + + return ( + { + return ( +
+ {option.text} +
+ {option.data.description} +
+ ); + } + }} + id={`${paletteName}_tooltip`} + directionalHint={DirectionalHint.bottomCenter} + > +
+ {colors.map((colorValue: string, index: number) => { + return
+ +
; + })} + +
+
+ ); + } + + /** + * Render the palette that gets displayed when the drop down isn't expanded + */ + private _onRenderTitle = (options: IDropdownOption[]): JSX.Element => { + const option = options[0]; + + return this._onRenderOption(option); + } + + /** + * Selection has changed + * @param option Selected option + * @param index + */ + private _onChanged(option: IDropdownOption, index?: number): void { + this.setState({ + selectedKey: option.key + }); + if (this.props.onChanged) { + this.props.onChanged(option, index); + } + } +} diff --git a/samples/react-chartcontrol/src/webparts/chartinator/controls/PropertyPaneChartPaletteSelector/components/ChartPaletteSelector.types.ts b/samples/react-chartcontrol/src/webparts/chartinator/controls/PropertyPaneChartPaletteSelector/components/ChartPaletteSelector.types.ts new file mode 100644 index 000000000..79745f7e0 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/chartinator/controls/PropertyPaneChartPaletteSelector/components/ChartPaletteSelector.types.ts @@ -0,0 +1,17 @@ +import { IDropdownOption } from 'office-ui-fabric-react/lib/components/Dropdown'; + +/** + * Properties for the chart palette select + */ +export interface IChartPaletteSelectorProps { + disabled: boolean; + label: string; + options: IDropdownOption[]; + selectedKey: string | number; + stateKey: string; + onChanged: (option: IDropdownOption, index?: number) => void; +} + +export interface IChartPaletteSelectorState { + selectedKey: string | number; +} diff --git a/samples/react-chartcontrol/src/webparts/chartinator/controls/PropertyPaneChartPaletteSelector/index.ts b/samples/react-chartcontrol/src/webparts/chartinator/controls/PropertyPaneChartPaletteSelector/index.ts new file mode 100644 index 000000000..2a68643e0 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/chartinator/controls/PropertyPaneChartPaletteSelector/index.ts @@ -0,0 +1,3 @@ +export * from './IPropertyPaneChartPaletteSelectorProps'; +export * from './IPropertyPaneChartPaletteSelectorInternalProps'; +export * from './PropertyPaneChartPaletteSelector'; diff --git a/samples/react-chartcontrol/src/webparts/chartinator/controls/PropertyPaneDashSelector/IPropertyPaneDashSelectorInternalProps.ts b/samples/react-chartcontrol/src/webparts/chartinator/controls/PropertyPaneDashSelector/IPropertyPaneDashSelectorInternalProps.ts new file mode 100644 index 000000000..64942b766 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/chartinator/controls/PropertyPaneDashSelector/IPropertyPaneDashSelectorInternalProps.ts @@ -0,0 +1,4 @@ +import { IPropertyPaneCustomFieldProps } from '@microsoft/sp-webpart-base'; +import { IPropertyPaneDashSelectorProps } from './IPropertyPaneDashSelectorProps'; + +export interface IPropertyPaneDashSelectorInternalProps extends IPropertyPaneCustomFieldProps, IPropertyPaneDashSelectorProps { } diff --git a/samples/react-chartcontrol/src/webparts/chartinator/controls/PropertyPaneDashSelector/IPropertyPaneDashSelectorProps.ts b/samples/react-chartcontrol/src/webparts/chartinator/controls/PropertyPaneDashSelector/IPropertyPaneDashSelectorProps.ts new file mode 100644 index 000000000..6fc419ff2 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/chartinator/controls/PropertyPaneDashSelector/IPropertyPaneDashSelectorProps.ts @@ -0,0 +1,9 @@ +import { IDropdownOption } from 'office-ui-fabric-react/lib/components/Dropdown'; + +export interface IPropertyPaneDashSelectorProps { + disabled: boolean; + label: string; + options: IDropdownOption[]; // we pass the list of options in to make easier to define your own dashes + selectedKey: string | number; + onPropertyChange: (propertyPath: string, newValue: any) => void; +} diff --git a/samples/react-chartcontrol/src/webparts/chartinator/controls/PropertyPaneDashSelector/PropertyPaneDashSelector.ts b/samples/react-chartcontrol/src/webparts/chartinator/controls/PropertyPaneDashSelector/PropertyPaneDashSelector.ts new file mode 100644 index 000000000..8c23ea372 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/chartinator/controls/PropertyPaneDashSelector/PropertyPaneDashSelector.ts @@ -0,0 +1,79 @@ +import * as React from 'react'; +import * as ReactDom from 'react-dom'; +import { + IPropertyPaneField, + PropertyPaneFieldType +} from '@microsoft/sp-webpart-base'; + +import { IDropdownOption } from 'office-ui-fabric-react/lib/components/Dropdown'; + +import { IDashSelectorProps } from './components/DashSelector.types'; +import DashSelector from './components/DashSelector'; +import { + IPropertyPaneDashSelectorProps, + IPropertyPaneDashSelectorInternalProps, +} from '.'; + +/** + * Dash selector control for property panes + */ +class PropertyPaneDashSelectorBuilder implements IPropertyPaneField { + public type: PropertyPaneFieldType = PropertyPaneFieldType.Custom; + public properties: IPropertyPaneDashSelectorInternalProps; + private element: HTMLElement; + + constructor(public targetProperty: string, properties: IPropertyPaneDashSelectorProps) { + this.properties = { + key: properties.label, + label: properties.label, + disabled: properties.disabled, + selectedKey: properties.selectedKey, + onPropertyChange: properties.onPropertyChange, + onRender: this.onRender.bind(this), + options: properties.options + }; + } + + public render(): void { + if (!this.element) { + return; + } + } + + /** + * Render's the control + * @param element + */ + private onRender(element: HTMLElement): void { + if (!this.element) { + this.element = element; + } + + // render the palette selector + const reactElement: React.ReactElement = React.createElement(DashSelector, { + label: this.properties.label, + onChanged: (option: IDropdownOption, index?: number) => this.handleChange(option, index), + selectedKey: this.properties.selectedKey, + disabled: this.properties.disabled, + options: this.properties.options, + stateKey: new Date().toString() // hack to allow for externally triggered re-rendering + }); + + ReactDom.render(reactElement, element); + } + + /** + * On changed call handler + * @param option + * @param index + */ + private handleChange(option: IDropdownOption, index?: number): void { + this.properties.onPropertyChange(this.targetProperty, option.key); + } +} + +export function PropertyPaneDashSelector(targetProperty: string, properties: IPropertyPaneDashSelectorProps): IPropertyPaneField { + return new PropertyPaneDashSelectorBuilder(targetProperty, { + ...properties, + }); +} diff --git a/samples/react-chartcontrol/src/webparts/chartinator/controls/PropertyPaneDashSelector/components/DashSelector.module.scss b/samples/react-chartcontrol/src/webparts/chartinator/controls/PropertyPaneDashSelector/components/DashSelector.module.scss new file mode 100644 index 000000000..75e262bfc --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/chartinator/controls/PropertyPaneDashSelector/components/DashSelector.module.scss @@ -0,0 +1,45 @@ +@import "~@microsoft/sp-office-ui-fabric-core/dist/sass/SPFabricCore.scss"; + +.dashSelector { + color: inherit; +} + +.dashChoice { + display: table-row; +} + +.dashCell { + position: relative; + box-sizing: border-box; + display: table-cell; + cursor: pointer; + vertical-align: top; + padding-top: 0px; + padding-right: 0px; + padding-bottom: 0px; + padding-left: 0px; + user-select: none; + outline: transparent; + border-width: 1px; + border-style: solid; + border-color: transparent; + border-image: initial; + text-decoration: none; + border-radius: 0px; + overflow: visible; + background: transparent; +} + +.svg { + width: 100%; + height: 20px; + padding-top: 4px; + padding-right: 4px; + padding-bottom: 4px; + padding-left: 4px; + box-sizing: content-box; + line { + stroke: $ms-color-neutralPrimary; + stroke-width: 2; + } +} diff --git a/samples/react-chartcontrol/src/webparts/chartinator/controls/PropertyPaneDashSelector/components/DashSelector.tsx b/samples/react-chartcontrol/src/webparts/chartinator/controls/PropertyPaneDashSelector/components/DashSelector.tsx new file mode 100644 index 000000000..eeae18bef --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/chartinator/controls/PropertyPaneDashSelector/components/DashSelector.tsx @@ -0,0 +1,112 @@ +import * as React from 'react'; +import { + Dropdown, + IDropdownOption +} from 'office-ui-fabric-react/lib/components/Dropdown'; +import { TooltipHost, DirectionalHint } from 'office-ui-fabric-react/lib/Tooltip'; + +import styles from './DashSelector.module.scss'; +import { IDashSelectorProps, IDashSelectorState, DashType, DashStrokes } from './DashSelector.types'; + +/** + * Displays a list of dash options. + * + */ +export default class DashSelector extends React.Component { + /** + * + */ + constructor(props: IDashSelectorProps) { + super(props); + this.state = { + selectedKey: this.props.selectedKey + }; + } + + /** Renders the dash selector */ + public render(): JSX.Element { + return ( +
+ this._onChanged(option, index)} /> +
+ ); + } + + /** + * Renders a drop down option + */ + private _onRenderOption = (option: IDropdownOption): JSX.Element => { + // Get the palette name + const dashName: string = option.key as string; + + // Get the colors + const strokes: number[] = option.data.strokes; + + // Build a string describing the dash + // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/setLineDash + let dashString: string = ""; + strokes.forEach((dashValue: number, index: number) => { + if (index > 0) { + dashString = dashString + ', '; + } + dashString = dashString + `${dashValue}px`; + }); + + return ( + { + return ( +
{option.text}
+ ); + } + }} + id={`${dashName}_tooltip`} + directionalHint={DirectionalHint.bottomCenter} + > +
+
+ + + +
+
+
+ ); + } + + /** + * Render the palette that gets displayed when the drop down isn't expanded + */ + private _onRenderTitle = (options: IDropdownOption[]): JSX.Element => { + const option = options[0]; + + return this._onRenderOption(option); + } + + /** + * Selection has changed + * @param option Selected option + * @param index + */ + private _onChanged(option: IDropdownOption, index?: number): void { + this.setState({ + selectedKey: option.key + }); + if (this.props.onChanged) { + this.props.onChanged(option, index); + } + } +} diff --git a/samples/react-chartcontrol/src/webparts/chartinator/controls/PropertyPaneDashSelector/components/DashSelector.types.ts b/samples/react-chartcontrol/src/webparts/chartinator/controls/PropertyPaneDashSelector/components/DashSelector.types.ts new file mode 100644 index 000000000..3ea6ec09e --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/chartinator/controls/PropertyPaneDashSelector/components/DashSelector.types.ts @@ -0,0 +1,48 @@ +import { IDropdownOption } from 'office-ui-fabric-react/lib/components/Dropdown'; + +/** + * Properties for the dash selector + */ +export interface IDashSelectorProps { + disabled: boolean; + label: string; + options: IDropdownOption[]; + selectedKey: string | number; + stateKey: string; + onChanged: (option: IDropdownOption, index?: number) => void; +} + +/** + * Handles the dash selector state + */ +export interface IDashSelectorState { + selectedKey: string | number; +} + +/** + * The various types of dash supported. + * Feel free to add your own + */ +export enum DashType { + Solid, + Dot, + Dash, + DashDot, + LongDash, + LongDashDot, + LongDashDotDot +} + +/** + * Describes the dash strokes. + * https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/setLineDash + */ +export const DashStrokes = { + [DashType.Solid]: [], + [DashType.Dot]: [2], + [DashType.Dash]: [10, 5], + [DashType.DashDot]: [10, 5, 2, 5], + [DashType.LongDash]: [16, 5], + [DashType.LongDashDot]: [16, 5, 3, 5], + [DashType.LongDashDotDot]: [16, 5, 3, 5, 3, 5] +}; diff --git a/samples/react-chartcontrol/src/webparts/chartinator/controls/PropertyPaneDashSelector/index.ts b/samples/react-chartcontrol/src/webparts/chartinator/controls/PropertyPaneDashSelector/index.ts new file mode 100644 index 000000000..200be79cf --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/chartinator/controls/PropertyPaneDashSelector/index.ts @@ -0,0 +1,3 @@ +export * from './IPropertyPaneDashSelectorProps'; +export * from './IPropertyPaneDashSelectorInternalProps'; +export * from './PropertyPaneDashSelector'; diff --git a/samples/react-chartcontrol/src/webparts/chartinator/loc/en-us.js b/samples/react-chartcontrol/src/webparts/chartinator/loc/en-us.js new file mode 100644 index 000000000..df2b2e284 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/chartinator/loc/en-us.js @@ -0,0 +1,253 @@ +define([], function () { + return { + "AddButtonLabel": "Add", + "AnimateRotateFieldLabel": "Animate rotation", + "AnimateScaleFieldLabel": "Animate scale", + "AnimationGroupDescription": "Specify how the chart is animated when rendered. Set duration to 0 to disable animations.", + "AnimationGroupName": "Animation", + "AxisLabelText": "Label text", + "AxisShowLabel": "Show label", + "BarChartType": "Bar chart", + "BarSettingsGroupDescription": "By default, the chart will render the gridlines before the bars. If you disable 'Offset gridlines', the chart will render gridlines in the middle of each bar.", + "BarSettingsGroupName": "Bar settings", + "BorderColorFieldLabel": "Line color", + "BorderDashFieldLabel": "Dash type", + "BorderWidthFieldLabel": "Line width", + "Bottom": "Bottom", + "BottomPaddingFieldLabel": "Bottom padding", + "BubbleChartType": "Bubble chart", + "CapStyleButt": "Butt", + "CapStyleRound": "Round", + "CapStyleSquare": "Square", + "ChartDescription": { + "bubble": "A bubble chart is used to display three dimensions of data at the same time. The location of the bubble is determined by the first two dimensions and the corresponding horizontal and vertical axes. The third dimension is represented by the size of the individual bubbles.", + "doughnut": "A doughnut chart to show percentages of a whole. Best when used with fewer than seven categories.", + "horizontalbar": "A horizontal bar chart is a variation on a vertical bar chart. It is sometimes used to show trend data, and the comparison of multiple data sets side by side. ", + "line": "A line chart is a way of plotting data points on a line. Often, it is used to show trend data, or the comparison of two data sets.", + "pie": "Use a pie chart to show percentages of a whole. Best when used with fewer than seven categories.", + "polar": "Polar area charts are similar to pie charts, but each segment has the same angle - the radius of the segment differs depending on the value. This type of chart is often useful when we want to show a comparison data similar to a pie chart, but also show a scale of values for context.", + "radar": "A radar chart is a way of showing multiple data points and the variation between them. They are often useful for comparing the points of two or more different data sets.", + "scatter": "Scatter charts are based on basic line charts with the x axis changed to a linear axis", + "bar": "Use a bar chart to show data changes over time or comparisons among items. Categories are typically shown along the horizontal axis and values along the vertical axis." + }, + "ChartRotationFieldLabel": "Rotation (degrees)", + "ChartSettingsPrefix": "", + "ChartSettingsSuffix": " options", + "ChartTitlePlaceholder": "Name your chart", + "ChartTypeGroupName": "Chart type", + "ChartTypeLabel": "Chart type", + "ChartTypeName": { + "Bar": "Bar chart", + "Bubble": "Bubble chart", + "Doughnut": "Donut chart", + "HorizontalBar": "Horizontal bar chart", + "Line": "Line chart", + "Pie": "Pie chart", + "PolarArea": "Polar area chart", + "Radar": "Radar chart", + "Scatter": "Scatter chart", + }, + "CircumferenceFieldLabel": "Circumference (%)", + "ColorPaletteFieldLabel": "Color palette", + "DashNames": [ + "Solid", + "Dot", + "Dash", + "Dash Dot", + "Long Dash", + "Long Dash Dot", + "Long Dash Dot Dot", + ], + "DashTypeFieldLabel": "Dash type", + "DataGroupName": "Data", + "DataLabelFieldLabel": "Data label", + "DataLabelFieldPlaceholder": "Enter a name", + "DataRemoveButtonLabel": "Remove", + "DataSetDefault": "My first dataset", + "DataSetFieldName": "Dataset name", + "DataSourceDataLabelFieldLabel": "Column with labels for each data point", + "DataSourceDataRValueFieldLabel": "Column that has the radius values", + "DataSourceDataValueFieldLabel": "Column that has the data to display", + "DataSourceDataXValueFieldLabel": "Column that has the X values", + "DataSourceDataYValueFieldLabel": "Column that has the Y values", + "DataSourcListIdFieldLabel": "Select a list", + "DataValueFieldLabel": "Value", + "DataValueFieldPlaceholder": "Enter a number", + "DataValueRFieldLabel": "Radius value", + "DataValueRFieldPlaceholder": "Enter a number", + "DataValueXFieldLabel": "X value", + "DataValueXFieldPlaceholder": "Enter a number", + "DataValueYFieldLabel": "Y value", + "DataValueYFieldPlaceholder": "Enter a number", + "DonutChartType": "Donut chart", + "DonutCutoutPercentageFieldLabel": "Cutout percentage", + "DonutSettingsGroupName": "Doughnut settings", + "DurationFieldDescription": "The duration of the animation, in milliseconds", + "DurationFieldLabel": "Duration", + "EasingEaseInBack": "Ease In Back", + "EasingEaseInBounce": "Ease In Bounce", + "EasingEaseInCirc": "Ease In Circ", + "EasingEaseInCubic": "Ease In Cubic", + "EasingEaseInElastic": "Ease In Elastic", + "EasingEaseInExpo": "Ease In Expo", + "EasingEaseInOutBack": "Ease In Out Back", + "EasingEaseInOutBounce": "Ease In Out Bounce", + "EasingEaseInOutCirc": "Ease In Out Circ", + "EasingEaseInOutCubic": "Ease In Out Cubic", + "EasingEaseInOutElastic": "Ease In Out Elastic", + "EasingEaseInOutExpo": "Ease In Out Expo", + "EasingEaseInOutQuad": "Ease In Out Quad", + "EasingEaseInOutQuart": "Ease In Out Quart", + "EasingEaseInOutQuint": "Eease In Out Quint", + "EasingEaseInOutSine": "Ease In Out Sine", + "EasingEaseInQuad": "Ease In Quad", + "EasingEaseInQuart": "Ese In Quart", + "EasingEaseInQuint": "Ease In Quint", + "EasingEaseInSine": "Ease In Sine", + "EasingEaseOutBack": "Ease Out Back", + "EasingEaseOutBounce": "Ease Out Bounce", + "EasingEaseOutCirc": "Ease Out Circ", + "EasingEaseOutCubic": "Ease Out Cubic", + "EasingEaseOutElastic": "Ease Out Elastic", + "EasingEaseOutExpo": "Ease Out Expo", + "EasingEaseOutQuad": "Ease Out Quad", + "EasingEaseOutQuart": "Ease Out Quart", + "EasingEaseOutQuint": "Ease Out Quint", + "EasingEaseOutSine": "Ease Out Sine", + "EasingFieldLabel": "Easing", + "EasingLinear": "Linear", + "FillEnd": "End", + "FillFieldLabel": "Fill", + "FillNone": "None", + "FillOrigin": "Origin", + "FillStart": "Start", + "GroupNotAvailable": "This configuration setting is not available for the type of chart you selected.", + "Hide": "Hide", + "HorizontalBarChartType": "Horizontal bar chart", + "JoinTypeBevel": "Bevel", + "JoinTypeMiter": "Miter", + "JoinTypeRound": "Round", + "LayoutGroupDescription": "Specify the space around the chart", + "LayoutGroupName": "Layout", + "Left": "Left", + "LeftPaddingFieldLabel": "Left padding", + "LegendDisplayLabel": "Legend", + "LegendGroupDescription": "Show or hide the legend and control its appearance.", + "LegendGroupName": "Legend", + "LegendPositionFieldLabel": "Position", + "LegendReversedFieldLabel": "Show legend in reverse order", + "LineCapStyleFieldLabel": "Cap type", + "LineChartType": "Line chart", + "LineCurvedFieldName": "Smoothed lines", + "LineCurvedFieldTooltipDisabled": "This option is disabled when Show lines is set to 'Hide'.", + "LineCurvedFieldTooltipDisabledCozStepped": "This option is disabled when Stepped lines is set to 'Stepped'", + "LineCurvedFieldTooltipEnabled": "Indicates whether the chart will draw the lines between points as smoothed lines or straight lines.", + "LineCurvedOff": "Straight", + "LineCurvedOn": "Smoothed", + "LineJoinStyleFieldLabel": "Join type", + "LineSettingsGroupName": "Line settings", + "LineShowLinesFieldLabel": "Show lines", + "LineShowLinesFieldTooltip": "Indicates whether the chart should draw lines between points. Turning this feature off will disable the stepped lines and smoothed lines options.", + "LineShowLinesOff": "Hide", + "LineShowLinesOn": "Show", + "LineSteppedFieldLabel": "Stepped lines", + "LineSteppedFieldTooltipDisabled": "This option is disabled when Show lines is set to 'Hide'.", + "LineSteppedFieldTooltipEnabled": "Indicates whether the chart will draw the lines between points as steps or as angled lines (i.e.: No step).", + "LineSteppedOff": "No step", + "LineSteppedOn": "Stepped", + "ListDataSource": "Get data from a SharePoint list on this site", + "None": "None", + "NumberErrorMessage": "Please enter a number.", + "Off": "Off", + "OffsetGridLinesFieldName": "Offset gridlines", + "On": "On", + "PaletteDescription": { + "OfficeColorful1": "Blue, Orange, Grey, Gold, Blue, Green.", + "OfficeColorful2": "Blue, Grey, Blue, Dark Blue, Dark Grey, Dark Blue.", + "OfficeColorful3": "Orange, Gold, Green, Brown, Dark Yellow, Dark Green.", + "OfficeColorful4": "Green, Blue, Gold, Dark Green, Dark Blue, Dark Yellow.", + "OfficeMonochromatic1": "Blue gradient, dark to light.", + "OfficeMonochromatic2": "Orange gradient, dark to light.", + "OfficeMonochromatic3": "Grey gradient, dark to light.", + "OfficeMonochromatic4": "Gold gradient, dark to light.", + "OfficeMonochromatic5": "Blue gradient, dark to light.", + "OfficeMonochromatic6": "Green gradient, dark to light.", + "OfficeMonochromatic7": "Dark Grey, Light Grey, Grey, Dark Grey, Light Grey, Grey.", + "OfficeMonochromatic8": "Blue gradient, light to dark.", + "OfficeMonochromatic9": "Orange gradient, light to dark.", + "OfficeMonochromatic10": "Grey gradient, light to dark.", + }, + "PaletteGroupDescription": "Choose a color palette to change the chart's default colors. ", + "PaletteGroupName": "Palette", + "PaletteName": { + "OfficeColorful1": "Colorful Palette 1", + "OfficeColorful2": "Colorful Palette 2", + "OfficeColorful3": "Colorful Palette 3", + "OfficeColorful4": "Colorful Palette 4", + "OfficeMonochromatic1": "Monochromatic Palette 1", + "OfficeMonochromatic2": "Monochromatic Palette 2", + "OfficeMonochromatic3": "Monochromatic Palette 3", + "OfficeMonochromatic4": "Monochromatic Palette 4", + "OfficeMonochromatic5": "Monochromatic Palette 5", + "OfficeMonochromatic6": "Monochromatic Palette 6", + "OfficeMonochromatic7": "Monochromatic Palette 7", + "OfficeMonochromatic8": "Monochromatic Palette 8", + "OfficeMonochromatic9": "Monochromatic Palette 9", + "OfficeMonochromatic10": "Monochromatic Palette 10", + }, + "PieChartType": "Pie chart", + "PieSettingsGroupName": "Pie settings", + "PixelUnitSuffix": "px", + "PointRadiusFieldLabel": "Point radius", + "PointRotationFieldLabel": "Point rotation", + "PointSettingsGroup": "Point settings", + "PointStyleCircle": "Circle", + "PointStyleCross": "Cross", + "PointStyleCrossRot": "Rotated cross", + "PointStyleDash": "Dash", + "PointStyleFieldLabel": "Point style", + "PointStyleLine": "Line", + "PointStyleRect": "Rectangle", + "PointStyleRectRot": "Rotated rectangle", + "PointStyleRectRounded": "Rounded rectangle", + "PointStyleStar": "Star", + "PointStyleTriangle": "Triangle", + "PolarChartType": "Polar area chart", + "PolarSettingsGroupName": "Polar area settings", + "PropertyPaneDescription": "Select a chart type and then select a data source. You can enter data points, or use data from a SharePoint list on this site as the data source.", + "RadarChartType": "Radar chart", + "ResetDonutPieSettingsButtonLabel": "Reset", + "Right": "Right", + "RightPaddingFieldLabel": "Right padding", + "SampleLabels": ['January', 'February', 'March', 'April', 'May', 'June', 'July'], + "ScatterChartType": "Scatter chart", + "Show": "Show", + "ShowGridlinesFieldLabel": "Show gridlines", + "StaticDataSource": "Enter data", + "TooltipGroupDescription": "Show or hide tooltips and control its position.", + "TooltipModeDataset": "Dataset", + "TooltipModeFieldLabel": "Mode", + "TooltipModeIndex": "Index", + "TooltipModeNearest": "Nearest", + "TooltipModePoint": "Point", + "TooltipModeX": "X", + "TooltipModeY": "Y", + "TooltipsEnabledFieldLabel": "Tooltips", + "TooltipsGroupName": "Tooltips", + "TooltipsIntersectFieldLabel": "Intersect", + "TooltipsPositionAverage": "Average", + "TooltipsPositionFieldLabel": "Position", + "TooltipsPositionNearest": "Nearest", + "Top": "Top", + "TopPaddingFieldLabel": "Top padding", + "XAxisGroupDescription": "Controls whether the horizontal axis label should be shown, and other options", + "XAxisGroupName": "Horizontal axis", + "YAxisBeginAtZero": "Always begin at zero", + "YAxisGroupDescription": "Controls whether the vertical axis label should be shown. ", + "YAxisGroupName": "Vertical axis", + "YAxisMaxStepsFieldLabel": "Maximum number of lines", + "YAxisMaxValueFieldLabel": "Maximum value", + "YAxisMinValueFieldLabel": "Minimum value", + "YAxisStepSizeFieldLabel": "Step size", + } +}); diff --git a/samples/react-chartcontrol/src/webparts/chartinator/loc/mystrings.d.ts b/samples/react-chartcontrol/src/webparts/chartinator/loc/mystrings.d.ts new file mode 100644 index 000000000..a9208756c --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/chartinator/loc/mystrings.d.ts @@ -0,0 +1,198 @@ +declare interface IChartinatorWebPartStrings { + AddButtonLabel: string; + AnimateRotateFieldLabel: string; + AnimateScaleFieldLabel: string; + AnimationGroupDescription: string; + AnimationGroupName: string; + AxisLabelText: string; + AxisShowLabel: string; + BarChartType: string; + BarSettingsGroupDescription: string; + BarSettingsGroupName: string; + BorderColorFieldLabel: string; + BorderDashFieldLabel: string; + BorderWidthFieldLabel: string; + Bottom: string; + BottomPaddingFieldLabel: string; + BubbleChartType: string; + CapStyleButt: string; + CapStyleRound: string; + CapStyleSquare: string; + ChartDescription: { [key: string]: string }; + ChartRotationFieldLabel: string; + ChartSettingsPrefix: string; + ChartSettingsSuffix: string; + ChartTitlePlaceholder: string; + ChartTypeGroupName: string; + ChartTypeLabel: string; + ChartTypeName: string[]; + CircumferenceFieldLabel: string; + ColorPaletteFieldLabel: string; + DashNames: string[]; + DashTypeFieldLabel: string; + DataGroupName: string; + DataLabelFieldLabel: string; + DataLabelFieldPlaceholder: string; + DataRemoveButtonLabel: string; + DataSetDefault: string; + DataSetFieldName: string; + DataSourceDataLabelFieldLabel: string; + DataSourceDataRValueFieldLabel: string; + DataSourceDataValueFieldLabel: string; + DataSourceDataXValueFieldLabel: string; + DataSourceDataYValueFieldLabel: string; + DataSourcListIdFieldLabel: string; + DataValueFieldLabel: string; + DataValueFieldPlaceholder: string; + DataValueRFieldLabel: string; + DataValueRFieldPlaceholder: string; + DataValueXFieldLabel: string; + DataValueXFieldPlaceholder: string; + DataValueYFieldLabel: string; + DataValueYFieldPlaceholder: string; + DonutChartType: string; + DonutCutoutPercentageFieldLabel: string; + DonutSettingsGroupName: string; + DurationFieldDescription: string; + DurationFieldLabel: string; + EasingEaseInBack: string; + EasingEaseInBounce: string; + EasingEaseInCirc: string; + EasingEaseInCubic: string; + EasingEaseInElastic: string; + EasingEaseInExpo: string; + EasingEaseInOutBack: string; + EasingEaseInOutBounce: string; + EasingEaseInOutCirc: string; + EasingEaseInOutCubic: string; + EasingEaseInOutElastic: string; + EasingEaseInOutExpo: string; + EasingEaseInOutQuad: string; + EasingEaseInOutQuart: string; + EasingEaseInOutQuint: string; + EasingEaseInOutSine: string; + EasingEaseInQuad: string; + EasingEaseInQuart: string; + EasingEaseInQuint: string; + EasingEaseInSine: string; + EasingEaseOutBack: string; + EasingEaseOutBounce: string; + EasingEaseOutCirc: string; + EasingEaseOutCubic: string; + EasingEaseOutElastic: string; + EasingEaseOutExpo: string; + EasingEaseOutQuad: string; + EasingEaseOutQuart: string; + EasingEaseOutQuint: string; + EasingEaseOutSine: string; + EasingFieldLabel: string; + EasingLinear: string; + FillEnd: string; + FillFieldLabel: string; + FillNone: string; + FillOrigin: string; + FillStart: string; + GroupNotAvailable: string; + Hide: string; + HorizontalBarChartType: string; + JoinTypeBevel + JoinTypeMiter: string; + JoinTypeRound: string; + LayoutGroupDescription: string; + LayoutGroupName: string; + Left: string; + LeftPaddingFieldLabel: string; + LegendDisplayLabel: string; + LegendGroupDescription: string; + LegendGroupName: string; + LegendPositionFieldLabel: string; + LegendReversedFieldLabel: string; + LineCapStyleFieldLabel: string; + LineChartType: string; + LineCurvedFieldName: string; + LineCurvedFieldTooltipDisabled: string; + LineCurvedFieldTooltipDisabledCozStepped: string; + LineCurvedFieldTooltipEnabled: string; + LineCurvedOff: string; + LineCurvedOn: string; + LineJoinStyleFieldLabel: string; + LineSettingsGroupName: string; + LineShowLinesFieldLabel: string; + LineShowLinesFieldTooltip: string; + LineShowLinesOff: string; + LineShowLinesOn: string; + LineSteppedFieldLabel: string; + LineSteppedFieldTooltipDisabled: string; + LineSteppedFieldTooltipEnabled: string; + LineSteppedOff: string; + LineSteppedOn: string; + ListDataSource: string; + None: string; + NumberErrorMessage: string; + Off: string; + OffsetGridLinesFieldName: string; + On: string; + PaletteDescription: string[]; + PaletteGroupDescription: string; + PaletteGroupName: string; + PaletteName: string[]; + PieChartType: string; + PieSettingsGroupName: string; + PixelUnitSuffix: string; + PointRadiusFieldLabel: string; + PointRotationFieldLabel: string; + PointSettingsGroup: string; + PointStyleCircle: string; + PointStyleCross: string; + PointStyleCrossRot: string; + PointStyleDash: string; + PointStyleFieldLabel: string; + PointStyleLine: string; + PointStyleRect: string; + PointStyleRectRot: string; + PointStyleRectRounded: string; + PointStyleStar: string; + PointStyleTriangle: string; + PolarChartType: string; + PolarSettingsGroupName: string; + PropertyPaneDescription: string; + RadarChartType: string; + ResetDonutPieSettingsButtonLabel: string; + Right: string; + RightPaddingFieldLabel: string; + SampleLabels: string[]; + ScatterChartType: string; + Show: string; + ShowGridlinesFieldLabel: string; + StaticDataSource: string; + TooltipGroupDescription: string; + TooltipModeDataset: string; + TooltipModeFieldLabel: string; + TooltipModeIndex: string; + TooltipModeNearest: string; + TooltipModePoint: string; + TooltipModeX: string; + TooltipModeY: string; + TooltipsEnabledFieldLabel: string; + TooltipsGroupName: string; + TooltipsIntersectFieldLabel: string; + TooltipsPositionAverage: string; + TooltipsPositionFieldLabel: string; + TooltipsPositionNearest: string; + Top: string; + TopPaddingFieldLabel: string; + XAxisGroupDescription: string; + XAxisGroupName: string; + YAxisBeginAtZero: string; + YAxisGroupDescription: string; + YAxisGroupName: string; + YAxisMaxStepsFieldLabel: string; + YAxisMaxValueFieldLabel: string; + YAxisMinValueFieldLabel: string; + YAxisStepSizeFieldLabel: string; +} + +declare module 'ChartinatorWebPartStrings' { + const strings: IChartinatorWebPartStrings; + export = strings; +} diff --git a/samples/react-chartcontrol/src/webparts/comboChartDemo/ComboChartDemoWebPart.manifest.json b/samples/react-chartcontrol/src/webparts/comboChartDemo/ComboChartDemoWebPart.manifest.json new file mode 100644 index 000000000..503e1177f --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/comboChartDemo/ComboChartDemoWebPart.manifest.json @@ -0,0 +1,22 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx/client-side-web-part-manifest.schema.json", + "id": "849fad01-2cf4-4653-88ef-1fa9151a7b17", + "alias": "ComboChartDemoWebPart", + "componentType": "WebPart", + + "version": "*", + "manifestVersion": 2, + + "requiresCustomScript": false, + + "preconfiguredEntries": [{ + "groupId": "5c03119e-3074-46fd-976b-c60198311f70", + "group": { "default": "Other" }, + "title": { "default": "Combo Chart" }, + "description": { "default": "Demonstrates how to create combination charts" }, + "officeFabricIconFontName": "BIDashboard", + "properties": { + "description": "Combo Chart" + } + }] +} diff --git a/samples/react-chartcontrol/src/webparts/comboChartDemo/ComboChartDemoWebPart.ts b/samples/react-chartcontrol/src/webparts/comboChartDemo/ComboChartDemoWebPart.ts new file mode 100644 index 000000000..f0db308a2 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/comboChartDemo/ComboChartDemoWebPart.ts @@ -0,0 +1,58 @@ +import * as React from 'react'; +import * as ReactDom from 'react-dom'; +import { Version } from '@microsoft/sp-core-library'; +import { + BaseClientSideWebPart, + IPropertyPaneConfiguration, +} from '@microsoft/sp-webpart-base'; +import { PropertyPaneWebPartInformation } from '@pnp/spfx-property-controls/lib/PropertyPaneWebPartInformation'; + +import * as strings from 'ComboChartDemoWebPartStrings'; +import ComboChartDemo from './components/ComboChartDemo'; +import { IComboChartDemoProps } from './components/IComboChartDemo.types'; + +export interface IComboChartDemoWebPartProps { + description: string; +} + +export default class ComboChartDemoWebPart extends BaseClientSideWebPart { + + public render(): void { + const element: React.ReactElement = React.createElement( + ComboChartDemo, + { + } + ); + + ReactDom.render(element, this.domElement); + } + + protected onDispose(): void { + ReactDom.unmountComponentAtNode(this.domElement); + } + + protected get dataVersion(): Version { + return Version.parse('1.0'); + } + + protected getPropertyPaneConfiguration(): IPropertyPaneConfiguration { + return { + pages: [ + { + groups: [ + { + groupFields: [ + PropertyPaneWebPartInformation({ + description: strings.WebPartDescription, + moreInfoLink: strings.MoreInfoLinkUrl, + key: 'webPartInfoId' + }) + ] + } + ] + } + ] + }; + } +} + diff --git a/samples/react-chartcontrol/src/webparts/comboChartDemo/components/ComboChartDemo.module.scss b/samples/react-chartcontrol/src/webparts/comboChartDemo/components/ComboChartDemo.module.scss new file mode 100644 index 000000000..f105da527 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/comboChartDemo/components/ComboChartDemo.module.scss @@ -0,0 +1,12 @@ +@import "~@microsoft/sp-office-ui-fabric-core/dist/sass/SPFabricCore.scss"; + +.comboChartDemo { + color: inherit; +} + +:export { + border1: rgb(54, 162, 235); + background2: rgb(255, 99, 132); + border2: white; + background3: rgb(75, 192, 192); +} diff --git a/samples/react-chartcontrol/src/webparts/comboChartDemo/components/ComboChartDemo.tsx b/samples/react-chartcontrol/src/webparts/comboChartDemo/components/ComboChartDemo.tsx new file mode 100644 index 000000000..912e31ce4 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/comboChartDemo/components/ComboChartDemo.tsx @@ -0,0 +1,82 @@ +import * as React from 'react'; +import styles from './ComboChartDemo.module.scss'; +import { IComboChartDemoProps } from './IComboChartDemo.types'; +import * as strings from 'ComboChartDemoWebPartStrings'; +import { ChartControl, ChartType } from '@pnp/spfx-controls-react/lib/ChartControl'; + +import IChartDataProvider from '../../../services/ChartDataProvider/IChartDataProvider'; +import MockChartDataProvider from '../../../services/ChartDataProvider/MockChartDataProvider'; + +const DATA_LENGTH: number = 7; +const DATASET_LENGTH: number = 3; + +export default class ComboChartDemo extends React.Component { + + /** + * Renders the command bar and the chart + */ + public render(): React.ReactElement { + + return ( +
+ +
+ ); + } + + + /** + * Loads data from a service. + * This is where you would replace for your own code + */ + private _loadAsyncData(): Promise { + return new Promise((resolve, reject) => { + // we're using a mock service that returns random numbers. + const dataProvider: IChartDataProvider = new MockChartDataProvider(); + dataProvider.getMultiDataset(DATASET_LENGTH, DATA_LENGTH) // we only need 5 data elements for this demo + .then((numberArrays: Array) => { + + const data: Chart.ChartData = + { + labels: strings.ChartLabels, + datasets: [{ + type: 'line', + label: `${strings.DataSetLabel} 1`, + borderColor: styles.border1, + borderWidth: 2, + fill: false, + data: numberArrays[0] + }, + { + type: 'bar', + label: `${strings.DataSetLabel} 2`, + backgroundColor: styles.background2, + data: numberArrays[1], + borderColor: styles.border2, + borderWidth: 2 + }, + { + type: 'bar', + label: `${strings.DataSetLabel} 3`, + backgroundColor: styles.background3, + data: numberArrays[2] + }] + }; + resolve(data); + }); + }); + } +} diff --git a/samples/react-chartcontrol/src/webparts/comboChartDemo/components/IComboChartDemo.types.ts b/samples/react-chartcontrol/src/webparts/comboChartDemo/components/IComboChartDemo.types.ts new file mode 100644 index 000000000..369994e5f --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/comboChartDemo/components/IComboChartDemo.types.ts @@ -0,0 +1,3 @@ +export interface IComboChartDemoProps { + +} diff --git a/samples/react-chartcontrol/src/webparts/comboChartDemo/loc/en-us.js b/samples/react-chartcontrol/src/webparts/comboChartDemo/loc/en-us.js new file mode 100644 index 000000000..a2a3069db --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/comboChartDemo/loc/en-us.js @@ -0,0 +1,10 @@ +define([], function() { + return { + "ChartTitle": "Combo Bar Line Chart", + "DataSetLabel": "Dataset ", + "ChartLabels": ['January', 'February', 'March', 'April', 'May', 'June', 'July'], + "RandomizeCommandLabel": "Randomize data", + "WebPartDescription": `

This web part demonstrates how to use the PnP ChartControl to render a combination chart.

It is inspired by the combo bar-line chart sample from Chart.js.

`, + "MoreInfoLinkUrl": "https://sharepoint.github.io/sp-dev-fx-controls-react/controls/ChartControl/" + } +}); diff --git a/samples/react-chartcontrol/src/webparts/comboChartDemo/loc/mystrings.d.ts b/samples/react-chartcontrol/src/webparts/comboChartDemo/loc/mystrings.d.ts new file mode 100644 index 000000000..c3e1a353e --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/comboChartDemo/loc/mystrings.d.ts @@ -0,0 +1,13 @@ +declare interface IComboChartDemoWebPartStrings { + ChartTitle: string; + DataSetLabel: string; + ChartLabels: string[]; + RandomizeCommandLabel: string; + WebPartDescription: string; + MoreInfoLinkUrl: string; +} + +declare module 'ComboChartDemoWebPartStrings' { + const strings: IComboChartDemoWebPartStrings; + export = strings; +} diff --git a/samples/react-chartcontrol/src/webparts/customPluginDemo/CustomPluginDemoWebPart.manifest.json b/samples/react-chartcontrol/src/webparts/customPluginDemo/CustomPluginDemoWebPart.manifest.json new file mode 100644 index 000000000..2e6fa8dad --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/customPluginDemo/CustomPluginDemoWebPart.manifest.json @@ -0,0 +1,22 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx/client-side-web-part-manifest.schema.json", + "id": "3bc38cb3-d1b1-4572-8196-679445d39d58", + "alias": "CustomPluginDemoWebPart", + "componentType": "WebPart", + + "version": "*", + "manifestVersion": 2, + + "requiresCustomScript": false, + + "preconfiguredEntries": [{ + "groupId": "5c03119e-3074-46fd-976b-c60198311f70", + "group": { "default": "Other" }, + "title": { "default": "Custom Plugin" }, + "description": { "default": "Demonstrates how to create your own chart plugin." }, + "iconImageUrl": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJcAAABqCAYAAACxk8O+AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAACAASURBVHic7Z1peBzVlff/p6o3tdRSr1otybIlL/K+4RVsA2ZfBgiBQEISAjOZJCRhnizMzDvJJEMySSYhyUwCWcgQDwQCAQMxYMDGeMG7vMmWLUu29rU3dbd676o67wfZjEPUVS2rtZDM73n8xXXq3lOl0/feOvfccwh/ZbS2tpry8/OnKUTTCCiHojiYyCYAys1dqY1uJXWHXiEpT6cbDMryKYmU9vtEi2wTjdKA29Tzr+tJYmYiIp7oZ5ns0EQrMJZ4PJ5SIlpBRCuZeRmIagCUppP/eq/0/V3J5NeHuZQSQa15RG4bCe5qQRdfoDN5phiVthqLfKZASe4qLi6OjN2TfDj5izKunp4es8Fg2ACiWwFcDaB8JPd/v5dfeiUZuyNDcckAOl1MOu8cvS6yWC+2zTPz/gqTvN3lcvWOWPm/QHQTrcBoaW1tNeUVFNxBwJ1g3gDAfKlt5RCZRiCuS4LndXAKHckU3kwiaI+KC5fqjfe+0BRsWmyV3pzusm8jIulS9fmw86EdufoDgek6Wf47Bfg0Ac5stPnLfmHrb+PhDaNthxh9laK+/uYck2+NmfdPs9DTVqt1IBs6fpj40I1cXq93GRF9k2X5egaEbP469FlqhwnFbUqq+L8iqdRvo1R6Y9C0fHdnoL5GH3+quLjYnaVuJj0fGuPy+/1zFeDfwHwrj9GIKxJn+wtQP8i89vfJGF7x0Ky/MZpWHekZeMclh39dXl4ey3Jfk45Jb1x9fX2FOoPhhwrzvQCEsewrRy8oGKM/eRy8+PeJ2OLX+qnkk6bclad7vH+YXercNDa9TQ4m7ZqLmcnn830SRD8CYM9y8xKAHgLaGegjIMBA7HSUKp70y2ISKAgzK0GWhUFIOXGQVVK4FITcLPUfny7o9n/WYmy43MrfczgcXVlqd1IxKY0rEAhUSbL8Kwy5E0ZLGMABMB8CcIaIosxsBlBKRHYG7CCyASjv6OxveebJTRGFlRwhJ0fIsdkk5/QaL5v0Rbq8/LI+s8XQajIlOiDBB7lUZkwbjWICqO1jJvPx223C7+aXWP+QhWedVEw64/J6vbeC6LcArKNoppmBzQJwmplNIFoKYCWAGWo3HTxwcuOvf/L0ffjAe2GgQxCEboPZELY4bNHC6dP9RXPn2AcKbK6jFkusWUk5k+D5H7wvQ6SZomHnlwv0R+abpW8XFhaGL6GNScmkMS5m1vl8vkdB9DVcml4hBl4g5j1MNA3ArQTMH0kDW7fuf/aF/375nkxkidBnyDHUl9VM6yhZuKA4PHVG8Z5cY7hdSc5n0Iin8RwIdQ/n5zVc7+RvFVutrSO9fzIyKYwrFAo5kpL0IpjXXcLtnQz85/np7h4CVl+qHlve2Pnipqff+MiIb2QOmC159VPmVceLlq8x1pWU0lElWSoRqkfSjACc+7Qx79jdDnp8arF1+4j1mGRM+Nei1+stS6ZSbwGYM8Jb28D8IwAWIvoymMtG+0tRlEv8GiWyRsORK5r2Hce5uhMNpdXT+j6zennf0Zo5nQeRrAVzUUb9A9OfTITtHm+O8US3zzWvzPH8JekzSZhQ43K73TUgehvA1BHcFmHghwIQYKJ/BlCcLX30Br0y2jbklDKn8/TZOV3NLY2VtdUdD65df2rHlPKzzUpyMYhytO4nwPbHZOyasM8kHenwC4sr7M+NVqeJYsKMy+/3z1eY3waQ0a8aAED0R2J+FsA3GKjNtk6iIXuvgyVlVlt906zOxpb6BcvmeVZtuKnhRZNIEShLMrjdsF2K35QMGpX6noBlfqn1V1lTbBwZU6dkOtxud/UIDSsE5i9BUXoYeBZjYFgAYDGbjYIgnAFR1vYB5aQ0v3HP0dXNj/8seN/ZZt88Qb8dQCKDW3XvpRK3PuZJ3F7f4783W/qMJ+O+oPd4PKUQhPcIqMroBqIjxPzvDHwXQE0WVEgycFoATgPoUoA+YvYCOCjLymtHT7Vs9gViiAVD/W3tXUWDHn9+yBe0DgbCNllKLQTRJbtIRFE4MWPNklZ5w02Fr+qVwgz9ZMp6vXHLVwoNP51RZN16qX1PBONqXIFAwCbJ8i4AczORZ+B5AHUEfAeA4RK7TTFwgIAdIOoFwMS8gIHpGIr3cp1vO68nIRzZ4dOV8VCUhQiABaBBJyfN5lB/jyES8DXVHY12tXSL/n5frSLJczDCd8jgSOn0yq3T7/io81lHvj7E8vIMbkvcZsjZ+oUi3bcqXNa6ET7/hDFuxsXMgtfvf42A6zOSB/6NmB0g+twldUh0hJmfAxAkojXMfINWaE7joHDs8KBuoWqzgKyX4g05vq7+0NnG7sM7j9hDvoHlGMnaEeBcW96bi+76qPhS1VSTh+UrNB8HCD1oznv370rFB/Lz870j6GvCGDfj8vh83yLgGxmIMhN9XWBey8CNI+xGBtHvoCjbAKwA0T0Ygae/MSweOxwSVY3rYgQgmJ8cbIydOR49uuNA1NPePZeZKzO9X2fS7116x83BbfMX5bSxtE6zP4E6v52bt+2j1QUPENGov2zHGnE8OvH4/TcR8AS0jVkG88ME3ATg2hF0wQBeBPOPwLwYRF8H0WUARhJZCneC+vuSQsauDQZMcdE4RS6qqKq4bKlcVWrtGfB6T8YGI3ZkEBGrSEp5X2PzwAqrOZAqLe/1QJmq2h+j4HhKjs5PyflP/vj7+zPVc6IYc+Nyu93FAtFWZPCyGfgaCcItAK4cQRcnCXiIgdlE9E8gmolLHJF9KaGvN5G5cV2MRKJLLiqvrFm22GPLpVZ3e0+vLMmao5iiKGX9Z85Gl9nyvP7S8t6ghoHFwBVeWZBf+KdHWv/rsR9M6miKMXdFCDrdE8ggZIaAHxKwGszrM2xaAvP3wfwcAxsJuAujnOYJow8WDOlyV5suv2nDtQ9/TiitqXiVM3BryJKy8MimLfZrm06HbRB3a8nvSsTXbh7EV5n5Uj9yxoUxHbk8fv/HiPmfteQIeI6JkgA+mWHT3QT8HRHdDqL7kaUI5UCKeroTQtqjZyNASJoLKkoXLc6zIbK3r61HYGbVjwlFUcrdTc09G2ZWSydzcyMyqX4gGE5JijQnpZif+sn39mRB3zFhzEauUCjkAPN/ZiB6ipn3g/mhjBomOgyiR5j5ZwxofmVlCAMImXQkEpA1B2pCNE6xXHfn2g1333RIbzQe1JSPxNedfO754D0RKSww+tRko5DnPROW1/X0eGdnS99sM2Zfix6f78cEfFlDLAKiz0JRngSRMYNmXyZgJwM/xKVvXQ0y8B6AOmI+zMynA05new1Rwu125+l0ussHJarpTYklnqhcFJaFMr9E5RLTDFziSE+EkLG7qfndJ54KJ6LxtRriqYp5NZvlez7teosSa6DyNyKmzu/kWzbfWVPw+UvRa6wZE+PqDwSmibJ8GlqOT+YvgeizADL59W0C0SEwfxcj19vHwNNQlFedTudeGpqCM4KZye/3zx6Q6PIzYWF5T0KYF5VpEUZuaEpR36nNrz7xjDUejqkbmEDdi2/dsO/tFWsK+zR8YHN1+q3fLzY+OqPQtmuE+ow5Y2JcHp/v9+cX2Co90w4ADWDO5Ff3Nph3gug7I9GDgeMg+o9wMPhSVVVVfCT3pqM/EJjui8qfOjqoW+FNiisBzjiunkDRgr6mQ1se/w0nIol1arI6o+GdpQ99Fk857TUyuCJ9ozT4tbzcVx+ssX0i86cYH7JuXH6/f67CXK/RdhxED4J5I7TXffvA/ByIfqrR5sV0gvlfHA7H02PlbAyFQs7+mPz5fQO6dQMpXIHM16+x3NYTx9785cYcOSWrOmxLayr/oPvMg2VvILVKTa5a1G//abHu32cUObdlqv94kPUFvcL8D9AyAqLHoCj/oNk/swdEj4PoMc02//eeZwmY63Q6N46lFzs/P99bU2T71o2u5H3L81O/FoDODG/NiVfNm7L2tqvaCNShJtjT3LGq8NhBTx7RITW5c3Jq0cGQ7qMZKz9OZNW4PB5PCZjVY9CZPcTsBtEijeYUIvqn89Gm2ot35gSYP+V0Ou91OByhzLUeHQ6Ho3NFpf2zN7vij+QKnJFbQAbKdZdtWDZnxdzDAFTWf1zW+NYOXJ/kGIC0PxQGbFuiifKOPn9GAQHjRVaNi0TxC5pffYLwIwb+Qbsx+j6ATwAozKDrIDNf53Q6N2ak6Bgwtdj17C2l8kMlBuXVTOSTpCubeuvtM/OdBW+ryUUGQlcb9r3Xa4Oout1TJydm1kd1HxuJzmNN1oyLmUUw368h1sPMEoD0C1QAIDoLIJihH8utCMI6l8u1IzNNx45Cm+3o1S75i1Um+SUM+c5UCRustavvvNUu6IST6WQYyG1+b3/B9UlJApBKJ6eAqnbGpDmdnZ2aodTjRdaMy+/3XwWNeHYCfiUAmYTQ/BjMmURQBBVBuK7QZjuWkZLjgN1u71hlk740NUd+ORP55PQFNbOW1J6ByrQXDUWu0B/cO2AlQTWWa08ybnWz+ZYRqjxmZG/kIvq4hkiciTwM9ehLAt6AoqyG9kZ3nAXh1kKb7eiIFB0HnE5n96qC1D86jHhLS1YmwTV9w7UOo9m0Q0XM3Lz/kHiZRKruFC/keWfiYqZ7s2NOVoyrp6fHDOa/0RB7HsxaWfsYwEsg0lw7EPAFl822M2MlxxmXy9V0jVX6rlHAES3ZQfuUJbWrFgWhsrgP+UOLKs6dDopA2i9MZtgPSZIrGAxmO7fGJZEV49KbTOsBWNRkCNgJYJ2aDANvMtEt0HI7MD/rcDh+M0I1x53CQtuuNdbU8wQEVQUZlrLllzsMZmP6iAiFy7r2H5CmC/pzak3tiyftHRFl3SUpnGWyYlw0lC5SjT4AU7T6I+Y3wKy1Zuhh5s+ORL+JZE6p7bGaXGWzllzYXrK8Zm61amK4/nNdeSsjcQWAnE7Gz/K8M1FacQmqZp1srbmuUb1K9AceSoKrRh0EYRa0R61HXC7X4MjUmziISLqsQHpcTzilIWqctnKFVRCFhnQCqURytaW3u9dIdDqdDBMcLSllyiUrnEVGbVw+n68cWhvPilIH5sWqMswbway11qpzOBzPjEzDicfhcOybl6+8qSWXLJtR6Sx1tamIWNr27TWXQ6d6QON4MpXr8XhUM/qMB9kYuVT3vTC0SM2H+ogksyBI0IhYZaIffViLC8zJkzfqCfVqMgnRULtw9ZIQhpLTDYunvUueFU+knRYB4Jys5Ham9PMuUdWsMWrjYmbVbRwCDoBI9Qg7A/uI+TKNrnqdNttLI1ZwkmC32+urcuR9WnLmqdWFgkgH0l2PDkZml3e3mwCk3eIKQKroi2PmJaqaNUY/cmnsESrADminNXoVwA2qEsxPE1FaD/WHgUX5yg6tSNeEo9Rmc9nTJoBjRm24rzeaT2LadZcMVLtTSsZH3MaK0WfeYF4ESj/jCUN5R1WP4RNzP4hUD5WyKL6hdr2Z2Wjz+a4noipmThLRObvdvpWI3p9C+gOB6UIq9f45RlEUcxRFMWFob1IBAEEQYg6H4xQAuN3uvHA4+mWPL1ibm2MaKClxbnY4HH+2durs6b9tMBi63lnkeLrQbk/rThAhv16g09UHJEobLJgUjVNKp5Y1+Pp86USEaK87VATBEEr/0UjdCvLTXRwvRmVcvYODLiSTLjUZZk6pGR8ABYJg0Th4E3RarXvTXXS73Wv2vb7ji3XHGkzhSNQqCAK7HI7UqpULP94fCHyzyGo95/F4lu7YceBrHZ39feFYXIonk2IymWKFiEwGnSgwxXJzjMo1V66c1tfX96mioqL4noNHf/zyq9tnxRPJKUSULC5yFHV19eZNmVLy4oW+A4FA1auv73qwtaNH/vwDd6jW/3G5XINvtQYaA2ExrXHJjMLZy5fgxP76KNLsUkR8XrmISWhW6atbkgSfz5c/nhEiH2RUxmVMpYo0AqZkFgRZI737OWiHOW9NNyV6PJ4lm/747lePNzRdqTcYGqaUuPoi0Zixo7tnQdem3pI777j+G8x8v3dgoKTf47cPBIKFkiyzJMmiJKVMssx5yQg7mNk1MAC5p8+9raqiWPT7/be/tW1voawo4n0fu2Vnf587560d+694Z+ehkNvtfvNC7tK2jt6/rW9osq5fu/SYy+XS9MZXmeSzjWH1COmkMacSjHbQ8O8l6Atai5MpUgsi71OUHCJdBYC0m+JjzaiMS1GUQo1RyQOVKmHnOUnMVarmpxIsd+pM66ePn2pelms2H7z/E7cec7hsrxCQv+2d/Z95b//Rtdve2euaU12+zulwvH73bRsiAwOhqmhKylNSEkWjccVkNk2rP36m9tDxU1cVWPJ2LJwzY7PD4QgdP3G61j8wOGve7GmnqqtKvlhdVfLwngPHrI1nW0pvuH7NWgCve73eZc88/+ZMo1GfXLp4juq0fQGHAfUCoUfh9O+FDKakIIo9iiIPa1yxWFznSMQIhvQHyr3MeQkZlfiwGhcROTT8AkmBuVBDplMB1qpPnMrZ4f67PxCY9szTr9oIMF61fvm5WTOmfe3CGsvtdsuJZEKJxVJmZnadj0r9szyj5861PtLQ1LKQgL5r16/oKC8v/RUA+AdCTmalNCfXvMfhcIQ8Pl/YYDLG4rGEPRwMuwCgqbn9vrNtnbNu3LD6QJHT+br6Yw4hieJZo0jdMYnTGlcytyBPb9J1JKLDr6nklOwQI+EgLOmNK8xynj/JmcTCjRmjG7mIDKpTHnOKAbPq6EYUJlZ/CbIoDrufJicSq3r7fYUmk7F+/tzqXR6PJ8fn860EAL1eX3fjNWs8RFTucDheG+5+j8cz849v7lkQjcUvn1ld9eKc2mmPX6gyptfpUgDiUjxuOV9wwSSnJEEQiI1mY9Dn8133xG82Vdqtlq4lC2f9IVP/W2FBQUdO32A0puL2Y1Fv0On08USaHHHM7NCT4lfrJ8UQQ/KIqrBlndGNXIqi1zCcJACt4LVBLRlBklqG+3+vP1Qoyal8a36+O+APPXD0RPMtHZ29AglMFaVl0mXLZh+cXlX503Rl6bp7ffcfrW+sNugNhzZcdVm9y+U6fOFaeUVJh8lobGzv9uT2ezyPBAKD00LRePnUKUXdOqKTR+ubvt7n8dTedsPad10u1xaNZ3wfIpJebApG1HzKCumMeqMh7SlyAmx6ZlW3jMxMkqKdg3UsGZVxsSCojlw8FDlp1pjywlqh0U6nc9iKPIOBwcKUpBT4A0Hxlxs3pSRZXm7Q6doVhqmjq3/hsYYzjjvuuc0F4JEP3uvz+WqffuHN6YoiL5m/YPYr9vy8X198Pceg+/3SRXOW7zlw9Iqf/+oFKRKNFZhN+oENV65qVhRlybu7D5a5HPbGhfNnvej3+2d3dPVcJyWTxbmW3OOFTudzaodDdAKrnpsUdWIKrKQ1HgYEVpDC0Psd1giZYGBCnlo/Y83oRi6Ng6HELINI9WAsEcVZO9fDsPYpKbINzDmSpMwsdNjeuvGaK/ZWTS1uiURiea9v3es+efrsVe+89vaAz+fb4HA4/iTlo8czcPe5lvaZer2+btmSWXUfLFVXWFjY19/f/zN7QR43t3bm260F/sULZ5xz2q3feu9g/c+Dg5GaO25ZsS2QVHRvvLbzG83N56oUlh0FlrxFt1y/bgkzfyWdgSmcfnsHGApJFURRTUZMJeMChraJhn93DKOsTGydgdGNXMySqvZEOgLiaosRZjaDKKGhy7DdCCSkaCj8JLRyxaKOpUvmfOXC2qe1tb2vtb07r6vXs7S313MOwPvG1dPTY9538ORsWeE5M6aVv1leUjRsOu6ioqI9zLx/UTBYqVcUn91uD3Z09X5q34HjpeVlJSfmzJ3x7KFDJz5x+kzTDXNmTts+b1b1wCtb3s3dtPmd6oopro8AeGH410LqPybmlCxLajKCPscsQeWdMZGeiaKq/Ywxo9r+IVYf3gEYFEDrAS0A1MN3vd5hp029TkgxkBJE8ez0iqJDFy+qLZbcA65Cpxfgqb1u75/UujYajdcfb2g2guCdPbOy06pSDoWI5CKrtcVutwdbW1tNh442XB2LJVxXrVnawUDweH1ToUGnP3nTdZc3LVww4+ML59b0D0aiVzaf7Uqb6zSmqCelk2RJpyiC2qwQoiEvV1oDFEARQwaHRMaSURkXC4LqopIAPRFpVTDMA9SrHCo63bBx96Vlhd1Gvd5DBPrgol0RxRxhaIZho17/J9/07d39C/wDwRqzydQ4o7pSNVLhYvR6/X179h2vqJ0xrWnatLLf6BSlaDAcNRlN+rjZbHLn5+d7rTbrAIBct3dg2J2Lzs7OnLhMqlszLCteRUqmnRYJCCSJVUc/PTiSq+MJra89upFLUVRHHAb0UBStkSsfgGo1e52iDBublGsy1dsdBQOSJM863dS2vJn5/REuGYkt7+/3FQgCGqeUFTVefF97W2+VwjyzuNgVMJuNGdXY6evry91z8NQ6WZFo9epFLXa7vR4AE4EVSSFijgMAyUMLcTFNaLPZbJ6WUEg1JFyJxWKSJBWku04khGSIqsZlIiFpMWQvHdSlMCrjUkRRNWiNh1wM3aqNEFVD4yg8Mw9rXHa7fdvqFYu9RDSwbVfd4p49hzZ6vd7Pt7R1fOX1t/dcGYlG11ROKT1aUGDZceGeQCBg6/f4DQBQPX1KwOl0po0uuBgFeODA4fqyZQvm9pSXuJ44r9cpl9MWiyfizt5eX6nX673tbHuXnQThTFl5ybCOXwCzUor6QV9LIhRPJZJpk8UJOsGXzMlXXS+bQHKBfmKNa1QLekGW3Wp+LgKcLAhejb3FOQQ8q7E4GHb9QkSK1+v9Qd9l8/PfO1S/8IVXtpWYjabCFMv6ZDy52G6z7LrlpnUnHA7H+5veiqLUBgZDBlGgM9MrSjKaEjs7O3MOHWlYazIYYsuXzjlgs9nagKEjZHV1J1vOtXbOeualLZcVOuzzWtq75s+sqdw5bWrJsCepu5LCXNY4Ra4kkwUsc0m666Zc0+BAjtGoctQRFpFSkKSeTJ5vrBiVcYmi2Ccr6lvXpCg6jf3HMoXorKoBEl3V2dmZM1zRcafTedrn8/1LRXnJPx4+3mhx+wbIotfJM6sq31q2bM7eqsryxy6WZ+aO5YvnIjq7ek9JkUv1JM0FTLm5V/oHBnU3XXdF0mQSn7j42tSpxY996mO3mHbtqSsMx+Pi+jVL3lu7evHz6UbE9qigWSbPFAs2sUrSYavTGujV6x1Q0ld5KROFhE6nSzd6jgujMi6bzRbw+nwdUDmeT0QGHnIXpP36IUWJaRig2Zibux7AsJvDDofjFDPfN3tm1TxmnglgUBCE/TabLTCMbCcz3zkwMJBrt9vVj3ydJx6JbL/52jVGAAc+6NB1Op3dzPyFqqklKxQip45o93D9AoDf7694tZ9UDwWLQPeR3QdtUPkStJQUm5uhqIY6Vwo6KZ0e48XogwWJjoLTJydTgNnEXK8asTp06ucsmNP+qsWhQ7dpIw/OuyHqz//TUJkkaJ0lvIjzI+Ymjb41Q5gHknzboESq1WtzEoNdfV1uNc961FpZkdfDklrxBqVSFNJGG44Xow5zJubDqteJ1oFIPf01863MrHq2j4F7ewcHVQMTJzPMLBwfFNcw1LdkDIMefyQQSvsjI5GOCoWlrhhz2hg4PVFbkR6N6a6PF6M2LkVRtAxnAQHHNZqZIwAnNGTMumTyCyNSbhLR6wvc0p0QtU5KoftIXT9UCm/lF1jaW52FIoC0+7FWiF1Tc9F+aZpmj1EbVzgc3g91D7vIzCkwq9YYZKJCAoaNfrgAAZ/v6+vLOAfpZIGZhUNB4SNqAYIAkCdFD54+0qiar76opkpqFEn1XdaIYtSh57QniMaLURtXVVVVHKzxIIKw4XyC3fQw/70CPK3RnUOv139zZBpOPIe7A59oiwpaaQqY2k66Q76ASnZAbpuyemV+D8uqroy5BkPkgrtkIsnWcX71VEHMN0NjTQWgkpg90NiLZOBhj8ezdIT6TRhut7u4Lqh7EFqJWlgZqN99IAiFp6aTybHkHem3FVdJ4OnpZASBOmfpWWuJMS5kxbgEQdAK8bWyIAxAY4MaRPeCSCt7jQ6C8CSz+t7aZICZha0D+kd3pBKaOetNHWfqOxvbVX1gpbXV2KcXVfdhS1hsqTVLk6LgZ1aM6/w+m2pmYhrKzaU1eq1k4AA0Ri8CFvgGBn48Mi3Hn7fbQl946oxg2N0gpj3kCgCsKN6zu3b1K5Kc9tQ5EZ0uXLLM1gFpllpbyw36kBAPv3OpOmeT7GUWVPEDnecWEP1RuyH+Koh+koHc530+n3bi3gniYFfgo080YXldD90dCYsL2iQp7Rczd5xpOHeieSpUYp+dFcXNpyunmqFanJTcy0yGs9kq6DBaspfNWVG0ss/oANSCSPVsHwELMOTg1MzrzsB/+Hw+rWyF486ujuC1vzjLN+1opVsB6MFwPV0nGnpTyp+dY6VEYvDc21sHFDl9rWsi+KddcbnpMGTVcPByUTy90ByfNEXWR++hP4/L5Trs9flOAahNK8T8JTA/CiKtdEqPMNFDxPw01LPjCMz8O5/PJzocjmGjPseb3e3+m3/Vpnxmc6N4FYD33SaSjNm/PESeMquyeZ5NCHshmaY7MGXq4Z3hnqZW1UQt1kL7wd7Zc4pirKhW3FinM/inF9tVU4+PJ1kzLgAA8y9A9H4ZPAaUtqh4uDclRAxQhBqzUlGgx1IGvBrFzG3EfDsBv2bgb1X7JDIy8JzP5ytxOBw/zdajjBRmpp1twc8+1iCufreDr8EwJ5qY4eoaoJu7BhiiIJ69jjs667a8S8woH6bJC/TXXLWWnxUU1VHLQMLRNWbaf3FujIkmq8ZFRBsZ+A4AS4oRfqXf0JpUsGzoqogzEVGekyd3LMyXNUsSA7idib4ORTmaQbUNgYGf+Hy+OalU6uHi4mLVnA3Zpr+/v+j3jcGvfK+ek3QAEAAADLVJREFUZrcP8A3QLiUT/lhNrLX1pVcC8Wj8TjVBR2nR4bZ5iy1xSOlnBACX6/V9C/J52LMAE0VWK2g4HI4QiDYCwG6//nBSwQcTkIkNYfHyszExsyPmivJtIvougIw2YRl4UKfXH/V6vWnXL9mEmXXHewIPPNVp+sFD7wlXtA/QjdA2rOQNU+W3C/a8InU1taoWiSdRaJ5543W5OwV1p6kAdF1jNNU7HI5M6w+NC9mvFKsoPwfA7iTK0kjQAb9QHZHRr9nW0HnG74P5MwAyHY1qQLTH6/P95nxKzTGhpd93zTMNwSce2EVXf6+ObpdkaCWvAwB52RTltdqWd/Snd9fNIqjG0svTls5tOVhdrchDYURpWSYaTq7ITf52RA8wDmTduJxOZyOArTILaSMpQWTf4jH0sFoo5XkYmMZE32aiB6FahOlPEAHcz0CTx+f7scfjyVqWPa/Xu3xra+Dxrxw23PfFPcJ1zQG6CxqRDudRZk+RX1vfvzP/8Oat05m5Sk3YXGDZkXftzfZjLKkaLYE678wznCktdU54FMQHGZMa1wLRT3SkqA7RCQWL9gd0GVX5ImA+MT8M5r+FSr7QYTAR8GUShEaPz7fb4/M9GAgEVP+ow8HMontg4Ip2j//3T7XrvnrvVmHx9g6+lxkZZU1mIL54Cr/2N75DpqMvbrFDllXXT4IgNM677Tp+yaw34qIvzuG4Qm86tdgi/HwEjzNujNmJ3G2twY0NYeE+DTHpSkfqbImRVb3OF3GSga0EPDxK9drBvIeJzgpAG4DuC5kFgaHsPQowhYAKEM0D81IAlmc69K/86wGsQmaV1C7Q/5EaZXv1ue3mQy9vqVJkVg0WZHBk3voV+05cdzMaOHW1mqyJ6OR/OQs2rSu3TMrN/Oy6Ii5ioSX1dHPUuGiYRf2f9L/Dp7fcVpj0mXRwpBOKRGJdp8+0nk0kpZTTWbBkWmVZVK/XZfLFmY5KEFUSLjo1elGYNeOiX9352P6ITG3/cwY6jMCwBMKJe2bHe227X8k/uPvQLFbSbzifRy6bOX138uqbbA2cUjVCAMptxpzmhRZZezdjghgz43I6nduO9wT27/CJM6AS2KYAZZu9hhO3F6csIvjP8kqca+l6d/feIzlNp1vkYK/PBICLy0u23XzbVXkLFsxYS0QjLWR+SQRSNBCRSJ/hIWapxMwvPVDhz2nb9Jxy8nTrWjDbtG6ylzjfLLnzLtfTolQBjcw/U0Rx+x028Vmr1Tqhx8fUGNNEFR6Pp2RPQP94e1zUKjoFq4EP3OhM/YkLIRKJNb/w8jv9R/cdE2P+wRW4SF9BFOprly9oufPOqytLi51afrBRE5TI88nduj0nvVB/FuKmj1QrB6e37bY2vP1uTmRgcB00ErYAQJ61YNu8++8zPlVoL5Y0EhQLoK7vWvPeur2q4MHJnJd/TBb0F3C5XL1rbNLTBoEPaskGkrR8t1/ccfH/HT95tvNsU6sS8w9ehg/8EBRZmX9y79Gbv/eNn3leenn7pmgsrn74dpQU6Nh1xwwYkc7nxvDMdfAL/1TRecby1m8MB1/cPD0yMHgVMjAsc4HlnUX33pXzuyKHUcuwAEgfMeacXFcgf2syGxaQwYOPlh/84Aenf/rNr9Y0R8TZ0Bjqg5IwNSZj1xQTVwLA6TOtvQ1HTympWDLdF54gJaXp5061OOqONOxTBKGltMRl1ut1Y5Ime3ouW1og17V4RQH/W+2jf5qV3v77sr7eopNbdA1/3Gz0dfbfDM5sbWYuyNuy8BP3Gp6rmGIMs6Lp/K0VDe9+0UG/mFrknPAwZi3GJX9Ta2urqZ1svzk+KKoXVz/PNLOye6VVunz/gZN7nn3qpVgsGFX9aroAEbpsJc6jazasiq5aWjvP4bSpfvJfCilG6FhI3Lulm0KSRPqaVLfZfWBXpO3oSWs8HFsFqGewuQjZWuJ8Y85H78p7usTljII1y6lYIBz+oc38+pVVtkn5dfhBxi05mMfjKdnuNzzZlxTUK2Wcp9iobF1pjtT+6LHfHuo42XILRjCFE8FjysvZu3D53JYVqxaXlpUVLizIz8uKI1VRFO5z+xpa2vrqd23dO9jR3DFPTkkrRqIfgMHSWVN3Vt55Z8HG3FxrMgPD0hFav2HJe+/u6dYHaCgd6KRnXDPPeb3eZa95DD8MSpRJYXQYRZywdZ959c3fvVAb6PHfikuZxgVqshTknZs6s7KndsEsfWmxs7jQZSu12/KnCoKg6VmPxxNery/Y7/MH2zs6un0nD50ydrb1OZOJ+FKN7Zs0+ginZq9e2MAbbq7YpGeXQuonsAGAAO9Dubn777JJDxYWFvaNuM8JYtzTGvb0+67d7NE9Gmdh2EMWDCjHOLH/mJQwymDDUtEYXBgabD236fdi16mWKzL1iqchKhBO6405XbmWnIDFZgnkmgyUZ7UYWB5aDzKxDKZYdDCSCoQGjUFv0BSNRouYuRqM0ZSZY7Ml9+2FN1+lHF6wPP+wklgCyiDbMtHg3UbzO5+z8f8rKXGkrcU4GZmQnJndntAtm/v5XxIfMDAGUhulwLEwXwjTGcLIOHGdYAzbD73nadi60xgNRtYDavUjJhdE1Fw+r+Zk2XU3Ov9gt+oCUFZmeGvkzhzLew+66JtVzoJJv4D/IBOWkLXPH7xncz99OSrR+4Z0SInvOiDH002ZiovEvTdGYxzetrXr7MFjFVJK0qqGNrEwwvmFBTvmXH2l3Dx/sWMnSVMZGY+8kdv1Ofs+59J9r7LYOikOXIyUCc322+3x3/2GR//FqIyVAPA/cmh/SFFU6zMTEJojmOrWdHckO7Zvi3edOjdbkZUJry34AaLmgtzdNSuWJhIr19jeMOmtmXwNXoAYvnvMuYfud+C7FYXpq6BNdibUuACgx+277m2f/mtBidb/txQ8GtUoDnoBHXBuKRt6Fva0Rbt27Ap2NZ0rlhLSSminHR9DyJ1nsxycftlCSbd4ZcEWay7cLF+BEXyICERd9xvNdXe7hEcrXVbVJC+TnQk3LgDwer2Xbffrv/27WMJwSk6sH8m9BOqaJ+hbV/j9ymDdvkDb4ZN54UBohkZcejaRBL142DmlxDttxWIxPmtezvYck9KjSCugXT3kT8ghOvlQXn7jR5zyV2w224QnEhktk8K4gKE6PO8FxP/3r6FoTZR4xGHKxPCVCrqTy1KywdV2Luw709jV39CkC/qDlRiqw53NTfoACcL+wvKicPnCebq8qhrbsZKS5GGWLDHwZRj5thpPFXQ7v1ZgblycL319ImskZpNJY1zAUMbk05Lx0W/74vO7ZGk9LlE/kdBSRfqOWlkxTHX7ksGOs/2eprMcdvtS4UDIkEymqjGUxFc1f8N5/CQI7aYcY4fFnq+zlZcpRQvnJbjAZTtZUECnAZ2PpLnM6sXf00Eg942GnGOfsAnPLy6z/feltDFZmVTGdYHTvQOf+oVXvntLKr6QwarlibUgIJRLYuN0QRcrVaAvDoeT+ZFgihLxwUF3H1KxWDgVTiSS0UGTLCk6Y26emww6MuTlWHPzC3JNdoeYMJisvrwCnTvHJJyDEu9VUvbU0PnMUblD7ALt/1xuXseVFuXR8mL7pEgekk0mpXEBQHe3r3xnTHj0yUi8qlOWViGLm+wEhASCV2QhAQBEiizw+S0VBsnnnZsMhSTAwkARsjitCqDOG/TGE/fYjTuXllp+8mHZzhkpk9a4LnCqL3j3S37lrk3xaFUYyoKJ1mdUEA3WCrqDn7QYG9c4hJ8UFhRMaLblsWbSGxcwVAjqXCrnwdci8k1vxGMlcWDOROs0QmKVpDv4cbPp7HoHPVfp/HA6RUfKh8K4LhAKhZx1fuXTWyPSqrcSifJBKIswxgGPo4GYPDWi7tgdZpPnSju/VOmwvjzZA/yyyYfKuC7gdrvz2uLCfftj4jWvx+L5LSzXgke38M8iSg7o2CqDMXBtjnhmhV3/fInNsnOilZoIPpTGdQFmFvoC4cv3eaW1BxLygj1S0uVWlFkMHu+U4pIBODVbp+9fbzD0X2bR1dfkKi+qldr7a+BDbVwX09PTY47ojDc1RcWlhyPStIOpVF6XrBRGBa5m5kz8WSNBEonOOSH0LTTokotF3cBMMzVV5dDLpS6rav6xvyb+YozrYpiZvF7voo4YrexI6GqbZJ7SKqWM7TLneFnOizHnplgpUAAH0u9FygQOiSR4zRD8eSQEpwicmqE3YpogRooM3FaZiyNFBrw9mY93TSR/kcY1HIFAwKYoSq03QTUDilgYSsrFEVm0uCXZChJyZFbyZUDSEUI5EAYLRI4bRRq06qjPISa6HEbBJ4pi01/7VPd//B+Tgv8PHrQH4+sgNE4AAAAASUVORK5CYII=", + "properties": { + "description": "Custom Plugin" + } + }] +} diff --git a/samples/react-chartcontrol/src/webparts/customPluginDemo/CustomPluginDemoWebPart.ts b/samples/react-chartcontrol/src/webparts/customPluginDemo/CustomPluginDemoWebPart.ts new file mode 100644 index 000000000..b6d0e2738 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/customPluginDemo/CustomPluginDemoWebPart.ts @@ -0,0 +1,58 @@ +import * as React from 'react'; +import * as ReactDom from 'react-dom'; +import { Version } from '@microsoft/sp-core-library'; +import { + BaseClientSideWebPart, + IPropertyPaneConfiguration, +} from '@microsoft/sp-webpart-base'; +import { PropertyPaneWebPartInformation } from '@pnp/spfx-property-controls/lib/PropertyPaneWebPartInformation'; + +import * as strings from 'CustomPluginDemoWebPartStrings'; +import CustomPluginDemo from './components/CustomPluginDemo'; +import { ICustomPluginDemoProps } from './components/ICustomPluginDemo,types'; + +export interface ICustomPluginDemoWebPartProps { + description: string; +} + +export default class CustomPluginDemoWebPart extends BaseClientSideWebPart { + + public render(): void { + const element: React.ReactElement = React.createElement( + CustomPluginDemo, + { + + } + ); + + ReactDom.render(element, this.domElement); + } + + protected onDispose(): void { + ReactDom.unmountComponentAtNode(this.domElement); + } + + protected get dataVersion(): Version { + return Version.parse('1.0'); + } + + protected getPropertyPaneConfiguration(): IPropertyPaneConfiguration { + return { + pages: [ + { + groups: [ + { + groupFields: [ + PropertyPaneWebPartInformation({ + description: strings.WebPartDescription, + moreInfoLink: strings.MoreInfoLinkUrl, + key: 'webPartInfoId' + }) + ] + } + ] + } + ] + }; + } +} diff --git a/samples/react-chartcontrol/src/webparts/customPluginDemo/components/CustomPluginDemo.module.scss b/samples/react-chartcontrol/src/webparts/customPluginDemo/components/CustomPluginDemo.module.scss new file mode 100644 index 000000000..c3daba59c --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/customPluginDemo/components/CustomPluginDemo.module.scss @@ -0,0 +1,19 @@ +@import "~@microsoft/sp-office-ui-fabric-core/dist/sass/SPFabricCore.scss"; + +.customPluginDemo { + color: inherit; +} + +// this is a neat trick to export styles from SCSS without hard-coding them in the code +:export { + bugBackground1: #25cfe4; + bugBackground2: #92e7f1; + bugBackground3: #eeeeee; + fixesBackground1: #514463; + fixesBackground2: #8c75ab; + fixesBackground3: #eeeeee; + redesignsBackground1: #88CCF9; + redesignsBackground2: #0E98F3; + redesignsBackground3: #eeeeee; + fontColor: #526E7A; +} diff --git a/samples/react-chartcontrol/src/webparts/customPluginDemo/components/CustomPluginDemo.tsx b/samples/react-chartcontrol/src/webparts/customPluginDemo/components/CustomPluginDemo.tsx new file mode 100644 index 000000000..9a2c40742 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/customPluginDemo/components/CustomPluginDemo.tsx @@ -0,0 +1,183 @@ +import * as React from 'react'; +import styles from './CustomPluginDemo.module.scss'; +import { ICustomPluginDemoProps } from './ICustomPluginDemo,types'; +import * as strings from 'CustomPluginDemoWebPartStrings'; + +// used to add a chart control +import { ChartControl, ChartType, IChartPlugin } from "@pnp/spfx-controls-react/lib/ChartControl"; + +// Import the chart.js helpers +import * as Chart from 'chart.js'; + +/** + * Declare the plugins before adding them. + * Custom plugins should implement portions of the IChartPlugin interface + */ +const donutPlugins: IChartPlugin[] = [ + // This plugin renders the "rounded line" donut chart + { + afterUpdate: (chart: any) => { + var a = chart.config.data.datasets.length - 1; + for (let i in chart.config.data.datasets) { + for (var j = chart.config.data.datasets[i].data.length - 1; j >= 0; --j) { + if (Number(j) == (chart.config.data.datasets[i].data.length - 1)) + continue; + var arc = chart.getDatasetMeta(i).data[j]; + arc.round = { + x: (chart.chartArea.left + chart.chartArea.right) / 2, + y: (chart.chartArea.top + chart.chartArea.bottom) / 2, + radius: chart.innerRadius + chart.radiusLength / 2 + (a * chart.radiusLength), + thickness: chart.radiusLength / 2 - 1, + backgroundColor: arc._model.backgroundColor + }; + } + a--; + } + }, + afterDraw: (chart: any) => { + var ctx = chart.chart.ctx; + for (let i in chart.config.data.datasets) { + for (var j = chart.config.data.datasets[i].data.length - 1; j >= 0; --j) { + if (Number(j) == (chart.config.data.datasets[i].data.length - 1)) + continue; + var arc = chart.getDatasetMeta(i).data[j]; + var startAngle = Math.PI / 2 - arc._view.startAngle; + var endAngle = Math.PI / 2 - arc._view.endAngle; + + ctx.save(); + ctx.translate(arc.round.x, arc.round.y); + ctx.fillStyle = arc.round.backgroundColor; + ctx.beginPath(); + ctx.arc(arc.round.radius * Math.sin(endAngle), arc.round.radius * Math.cos(endAngle), arc.round.thickness, 0, 2 * Math.PI); + ctx.closePath(); + ctx.fill(); + ctx.restore(); + } + } + } + }, + // This plugin renders text in the middle of the chart. + { + afterUpdate: (chart: any) => { + if (chart.config.options.elements.center) { + var helpers = Chart.helpers; + var centerConfig = chart.config.options.elements.center; + var globalConfig = Chart.defaults.global; + var ctx = chart.chart.ctx; + + var fontStyle = helpers.getValueOrDefault(centerConfig.fontStyle, globalConfig.defaultFontStyle); + var fontFamily = helpers.getValueOrDefault(centerConfig.fontFamily, globalConfig.defaultFontFamily); + + var fontSize = undefined; + if (centerConfig.fontSize) + fontSize = centerConfig.fontSize; + // figure out the best font size, if one is not specified + else { + ctx.save(); + fontSize = helpers.getValueOrDefault(centerConfig.minFontSize, 1); + var maxFontSize = helpers.getValueOrDefault(centerConfig.maxFontSize, 256); + var maxText = helpers.getValueOrDefault(centerConfig.maxText, centerConfig.text); + + do { + ctx.font = helpers.fontString(fontSize, fontStyle, fontFamily); + var textWidth = ctx.measureText(maxText).width; + + // check if it fits, is within configured limits and that we are not simply toggling back and forth + if (textWidth < chart.innerRadius * 2 && fontSize < maxFontSize) + fontSize += 1; + else { + // reverse last step + fontSize -= 1; + break; + } + } while (true); + ctx.restore(); + } + + // save properties + chart.center = { + font: helpers.fontString(fontSize, fontStyle, fontFamily), + fillStyle: helpers.getValueOrDefault(centerConfig.fontColor, globalConfig.defaultFontColor) + }; + } + }, + afterDraw: (chart: any) => { + if (chart.center) { + var centerConfig = chart.config.options.elements.center; + var ctx = chart.chart.ctx; + + ctx.save(); + ctx.font = chart.center.font; + ctx.fillStyle = chart.center.fillStyle; + ctx.textAlign = 'center'; + ctx.textBaseline = 'middle'; + var centerX = (chart.chartArea.left + chart.chartArea.right) / 2; + var centerY = (chart.chartArea.top + chart.chartArea.bottom) / 2; + ctx.fillText(centerConfig.text, centerX, centerY); + ctx.restore(); + } + } + }]; + +/** + * Chart.js accepts options for the plugins as well. + * To prevent the compiler from complaining, + * we defined the options as "any" and pass them on. + */ +const chartOptions: any = { + elements: { + center: { + // the longest text that could appear in the center + maxText: '100%', + text: '67%', + fontColor: styles.fontColor, + fontFamily: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif", + fontStyle: 'normal', + // fontSize: 12, + // if a fontSize is NOT specified, we will scale (within the below limits) maxText to take up the maximum space in the center + // if these are not specified either, we default to 1 and 256 + minFontSize: 1, + maxFontSize: 256, + } + }, + legend: { + display: false + } +}; + +export default class CustomPluginDemo extends React.Component { + + /** + * Renders the (static) donut chart with the plugins passed in + */ + public render(): React.ReactElement { + return ( +
+ +
+ ); + } +} diff --git a/samples/react-chartcontrol/src/webparts/customPluginDemo/components/ICustomPluginDemo,types.ts b/samples/react-chartcontrol/src/webparts/customPluginDemo/components/ICustomPluginDemo,types.ts new file mode 100644 index 000000000..6c0c85b55 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/customPluginDemo/components/ICustomPluginDemo,types.ts @@ -0,0 +1,3 @@ +export interface ICustomPluginDemoProps { + +} diff --git a/samples/react-chartcontrol/src/webparts/customPluginDemo/loc/en-us.js b/samples/react-chartcontrol/src/webparts/customPluginDemo/loc/en-us.js new file mode 100644 index 000000000..20d8dd023 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/customPluginDemo/loc/en-us.js @@ -0,0 +1,11 @@ +define([], function() { + return { + "Bugs": "Bugs", + "Fixes": "Fixes", + "Redesigns": "Redesigns", + "WebPartDescription": `

This web part demonstrates how to use the PnP ChartControl with a custom chart plugin to render doughnut chart.

+

The concept for the chart's look and feel came from a StackOverflow question from fsenna.

+

The custom plugin code is inspired from JSFiddle from user8296539 in response to fsenna's question.

`, + "MoreInfoLinkUrl": "https://sharepoint.github.io/sp-dev-fx-controls-react/controls/ChartControl/" + } +}); diff --git a/samples/react-chartcontrol/src/webparts/customPluginDemo/loc/mystrings.d.ts b/samples/react-chartcontrol/src/webparts/customPluginDemo/loc/mystrings.d.ts new file mode 100644 index 000000000..b6b54e8df --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/customPluginDemo/loc/mystrings.d.ts @@ -0,0 +1,12 @@ +declare interface ICustomPluginDemoWebPartStrings { + WebPartDescription: string; + MoreInfoLinkUrl: string; + Bugs: string; + Fixes: string; + Redesigns: string; +} + +declare module 'CustomPluginDemoWebPartStrings' { + const strings: ICustomPluginDemoWebPartStrings; + export = strings; +} diff --git a/samples/react-chartcontrol/src/webparts/donutPatternsDemo/DonutPatternsDemoWebPart.manifest.json b/samples/react-chartcontrol/src/webparts/donutPatternsDemo/DonutPatternsDemoWebPart.manifest.json new file mode 100644 index 000000000..ba18b06cb --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/donutPatternsDemo/DonutPatternsDemoWebPart.manifest.json @@ -0,0 +1,23 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx/client-side-web-part-manifest.schema.json", + "id": "907cfe87-fffe-4d9c-8fac-3ea23c3f2c09", + "alias": "DonutPatternsDemoWebPart", + "componentType": "WebPart", + + "version": "*", + "manifestVersion": 2, + + "requiresCustomScript": false, + + "preconfiguredEntries": [{ + "groupId": "5c03119e-3074-46fd-976b-c60198311f70", + "group": { "default": "Other" }, + + "title": { "default": "Donut with Patterns" }, + "description": { "default": "Demonstrates how to render a donut chart and use patterns instead of colors" }, + "officeFabricIconFontName": "DonutChart", + "properties": { + "description": "DonutPatternsDemo" + } + }] +} diff --git a/samples/react-chartcontrol/src/webparts/donutPatternsDemo/DonutPatternsDemoWebPart.ts b/samples/react-chartcontrol/src/webparts/donutPatternsDemo/DonutPatternsDemoWebPart.ts new file mode 100644 index 000000000..ed0a123f1 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/donutPatternsDemo/DonutPatternsDemoWebPart.ts @@ -0,0 +1,58 @@ +import * as React from 'react'; +import * as ReactDom from 'react-dom'; +import * as strings from 'DonutPatternsDemoWebPartStrings'; + +import { Version } from '@microsoft/sp-core-library'; +import { + BaseClientSideWebPart, + IPropertyPaneConfiguration, +} from '@microsoft/sp-webpart-base'; +import { PropertyPaneWebPartInformation } from '@pnp/spfx-property-controls/lib/PropertyPaneWebPartInformation'; + +import DonutPatternsDemo from './components/DonutPatternsDemo'; +import { IDonutPatternsDemoProps } from './components/IDonutPatternsDemo.types'; + +export interface IDonutPatternsDemoWebPartProps { + description: string; +} + +export default class DonutPatternsDemoWebPart extends BaseClientSideWebPart { + + public render(): void { + const element: React.ReactElement = React.createElement( + DonutPatternsDemo, + { + } + ); + + ReactDom.render(element, this.domElement); + } + + protected onDispose(): void { + ReactDom.unmountComponentAtNode(this.domElement); + } + + protected get dataVersion(): Version { + return Version.parse('1.0'); + } + + protected getPropertyPaneConfiguration(): IPropertyPaneConfiguration { + return { + pages: [ + { + groups: [ + { + groupFields: [ + PropertyPaneWebPartInformation({ + description: strings.WebPartDescription, + moreInfoLink: strings.MoreInfoLinkUrl, + key: 'webPartInfoId' + }) + ] + } + ] + } + ] + }; + } +} diff --git a/samples/react-chartcontrol/src/webparts/donutPatternsDemo/components/DonutPatternsDemo.module.scss b/samples/react-chartcontrol/src/webparts/donutPatternsDemo/components/DonutPatternsDemo.module.scss new file mode 100644 index 000000000..a6cff15c3 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/donutPatternsDemo/components/DonutPatternsDemo.module.scss @@ -0,0 +1,5 @@ +@import '~@microsoft/sp-office-ui-fabric-core/dist/sass/SPFabricCore.scss'; + +.donutPatternsDemo { + color:inherit; +} diff --git a/samples/react-chartcontrol/src/webparts/donutPatternsDemo/components/DonutPatternsDemo.tsx b/samples/react-chartcontrol/src/webparts/donutPatternsDemo/components/DonutPatternsDemo.tsx new file mode 100644 index 000000000..640f66438 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/donutPatternsDemo/components/DonutPatternsDemo.tsx @@ -0,0 +1,143 @@ +import * as React from 'react'; +import styles from './DonutPatternsDemo.module.scss'; +import { IDonutPatternsDemoProps, IDonutPatternsDemoState } from './IDonutPatternsDemo.types'; +import * as strings from 'DonutPatternsDemoWebPartStrings'; +import IChartDataProvider from '../../../services/ChartDataProvider/IChartDataProvider'; +import MockChartDataProvider from '../../../services/ChartDataProvider/MockChartDataProvider'; +import { Checkbox } from 'office-ui-fabric-react/lib/Checkbox'; + +// Patternomaly is used to render patterns +import * as pattern from 'patternomaly'; + +import { ChartControl, ChartType, PaletteGenerator, ChartPalette } from "@pnp/spfx-controls-react/lib/ChartControl"; + +// There are 21 different patterns +const NUM_PATTERNS: number = 21; + +const colors: string[] = PaletteGenerator.GetPalette(ChartPalette.OfficeColorful1, NUM_PATTERNS); +/** + * The patterns generated using the colors above. + * You could also just generate the patterns randomly by writing: + * const patterns: CanvasPattern[] = pattern.generate(colors); + */ +const patterns: CanvasPattern[] = [ + pattern.draw('plus', colors[0]), + pattern.draw('cross', colors[1]), + pattern.draw('dash', colors[2]), + pattern.draw('cross-dash', colors[3]), + pattern.draw('dot', colors[4]), + pattern.draw('dot-dash', colors[5]), + pattern.draw('disc', colors[6]), + pattern.draw('ring', colors[7]), + pattern.draw('line', colors[8]), + pattern.draw('line-vertical', colors[9]), + pattern.draw('weave', colors[10]), + pattern.draw('zigzag', colors[11]), + pattern.draw('zigzag-vertical', colors[12]), + pattern.draw('diagonal', colors[13]), + pattern.draw('diagonal-right-left', colors[14]), + pattern.draw('square', colors[15]), + pattern.draw('box', colors[16]), + pattern.draw('triangle', colors[17]), + pattern.draw('triangle-inverted', colors[18]), + pattern.draw('diamond', colors[19]), + pattern.draw('diamond-box', colors[20]) +]; + +/** + * This sample demonstrates how you can use + * patternomaly to render a chart that uses patterns instead + * of (only) colours. + * @see https://github.com/ashiguruma/patternomaly + * @see https://github.com/ashiguruma/patternomaly/blob/master/examples/optional.html + * @see https://www.chartjs.org/docs/latest/general/colors.html + * + * This sample also demonstrates how you can use get the chart's data and + * call the update methods to get access to and modified the data without + * refreshing the entire web part + */ +export default class DonutPatternsDemo extends React.Component { + private _chartElem: ChartControl = undefined; + + /** + * Renders the "Loading" spinner if the state is currently loading, + * or the chart once data is loladed + */ + public render(): React.ReactElement { + return ( +
+ { + + } + + , checked: boolean) => this._onCheckboxChange(ev, checked)} + defaultChecked={true} /> +
+ ); + } + + // tslint:disable-next-line no-any + private _linkElement = (e: any) => { + this._chartElem = e; + } + + /** + * Toggles between displaying patterns and not + * @param ev + * @param checked + */ + private _onCheckboxChange(ev: React.FormEvent, checked: boolean): void { + // Use a pattern if checked, colors if not + var fill = (checked) ? patterns : colors; + + const { data } = this._chartElem.getChart(); + + // Get access to the chart's dataset + data.datasets[0].backgroundColor = fill; + + // Update the chart (without updating the entire web part) + this._chartElem.update(); + } + + /** +* Loads data from a service. +* This is where you would replace for your own code +*/ + private _loadAsyncData(): Promise { + return new Promise((resolve, _reject) => { + // we're using a mock service that returns random numbers. + const dataProvider: IChartDataProvider = new MockChartDataProvider(); + dataProvider.getNumberArray(NUM_PATTERNS).then((dataSet: number[]) => { + const data: Chart.ChartData = + { + labels: strings.ChartLabels, + datasets: [ + { + label: strings.DataSetLabel, + data: dataSet, + backgroundColor: patterns + } + ] + }; + resolve(data); + }); + }); + } +} + + diff --git a/samples/react-chartcontrol/src/webparts/donutPatternsDemo/components/IDonutPatternsDemo.types.ts b/samples/react-chartcontrol/src/webparts/donutPatternsDemo/components/IDonutPatternsDemo.types.ts new file mode 100644 index 000000000..a62f37da0 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/donutPatternsDemo/components/IDonutPatternsDemo.types.ts @@ -0,0 +1,7 @@ +export interface IDonutPatternsDemoProps { + +} + +export interface IDonutPatternsDemoState { + +} diff --git a/samples/react-chartcontrol/src/webparts/donutPatternsDemo/loc/en-us.js b/samples/react-chartcontrol/src/webparts/donutPatternsDemo/loc/en-us.js new file mode 100644 index 000000000..9a7e53295 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/donutPatternsDemo/loc/en-us.js @@ -0,0 +1,33 @@ +define([], function () { + return { + "UsePatternsLabel": "Use patterns", + "Loading": "Loading...", + "DataSetLabel": "Patterns", + "ChartLabels": [ + "Plus", + "Cross", + "Dash", + "Cross-dash", + "Dot", + "Dot-dash", + "Disc", + "Ring", + "Line", + "Line-vertical", + "Weave", + "Zigzag", + "Zigzag Vertical", + "Diagonal", + "Diagonal-right-left", + "Square", + "Box", + "Triangle", + "Triangle-inverted", + "Diamond", + "Diamond-box", + + ], + "WebPartDescription": `

This web part demonstrates how to use the PnP ChartControl to render a donut chart with patterns instead of colors.

It is inspired by the patternomaly sample referred by the Chart.js documentation

`, + "MoreInfoLinkUrl": "https://sharepoint.github.io/sp-dev-fx-controls-react/controls/ChartControl/" + } +}); diff --git a/samples/react-chartcontrol/src/webparts/donutPatternsDemo/loc/mystrings.d.ts b/samples/react-chartcontrol/src/webparts/donutPatternsDemo/loc/mystrings.d.ts new file mode 100644 index 000000000..9cda22346 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/donutPatternsDemo/loc/mystrings.d.ts @@ -0,0 +1,13 @@ +declare interface IDonutPatternsDemoWebPartStrings { + UsePatternsLabel: string; + Loading: string; + DataSetLabel: string; + ChartLabels: string[]; + WebPartDescription: string; + MoreInfoLinkUrl: string; +} + +declare module 'DonutPatternsDemoWebPartStrings' { + const strings: IDonutPatternsDemoWebPartStrings; + export = strings; +} diff --git a/samples/react-chartcontrol/src/webparts/dynamicDataCallable/DynamicDataCallableWebPart.manifest.json b/samples/react-chartcontrol/src/webparts/dynamicDataCallable/DynamicDataCallableWebPart.manifest.json new file mode 100644 index 000000000..ed57b69c1 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/dynamicDataCallable/DynamicDataCallableWebPart.manifest.json @@ -0,0 +1,23 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx/client-side-web-part-manifest.schema.json", + "id": "eeadd4a5-4787-4d86-a606-17271bcfe81b", + "alias": "DynamicDataCallableWebPart", + "componentType": "WebPart", + + "version": "*", + "manifestVersion": 2, + + "requiresCustomScript": false, + + "preconfiguredEntries": [{ + "groupId": "5c03119e-3074-46fd-976b-c60198311f70", + "group": { "default": "Other" }, + "title": { "default": "Dynamic Data Callable" }, + "description": { "default": "Demonstrates how to create a dynamic data callable web part with a chart" }, + "iconImageUrl": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFwAAABcCAYAAADj79JYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAHYcAAB2HAY/l8WUAAAAYdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjEuNWRHWFIAAASXSURBVHhe7ZxJqB1FFIafBlw44MaFCIoLiYqoGxEcgkNC1EV04Yw4gSIKGlSSjUiCLpIoDiQxEnBAUMEJdKEiTiGKIooQUCMuRBxAd84gKvr/8R0oD+ferq6uern9+D/4eLzb3ae7/wt1q6ure04IIYQQQgghhBCLnWvgk/Az+BP8GX4On4ZXQVGJk+EH8J8Od8IToBjAGhiFO82boSjgDhgFmuNqKHpwCoyC7KOalx58CKMQ+/g2FBmwNxIFWOLlUHTwFIzCK/FZKDpgPzsKr8RvoeiAFzVReKWKDr6HUXAl/gZFB6/BKLwS34Oig00wCq/Eh6Ho4DIYhVfi9VBk8CaMAuwjB7xEJmfCKMQ+roKiB0Pa8gehKOBWGAU6TY0UDoTjIbtgFG4qb0CcD0UlzobPQR/0Y/AkKBrhAz8Riob4wC+FoiE+8PVQNMQH/gwU/3Hw/N+q+MD/gPvDMWDHfNSe/+pyBPwBPrLnv4qkYZtjGTOx420R+G3Q6m/nB7Wwoqk74Biw420ROLkF2j628YMaWEHv6XDWsWNtFTi5Edp+tvCDoVgx7xtw1rFjbRk4uQHavgaPK1mhyKvhLGPHaYHv11COKdn+7oPFWJHIr+ABcFax47TA02Nv7T2wiKhY6gtwVrFj3BuBPwqL8IVeDj4r/jancCHcAF+B30HOT/8UPgGvhDnY8VngSxrKttv2Vxw2sSImr64+cp9R/nDU4FT4KvT1vTnz023d1j+aD0Db16CwiRUy7XL2S+iX8a7REDhO42t2OW1+uq3TMvD0TlmVq04rZlrgx8IfoV/ONv1A2Je0a9XXSXedbHmrwNdB20e1S3wraKYDNitgNFXua5jbzpILoK9BefV2CTwGLoUXwfthtG7UvNiyFoGvhVa/6niKFTX9CNnR8F3o16MvweNgF+/DdLs/Ib+ESZwD/STUaH66LWsR+OGQ0wSbD175wA3OuvLrmuxpXAujpoZDBH79aWEby6HfbqHnpx80/7cq/qQmBU5ugn791L8gw+eYAwd+zoKcU56u02cQ6F6Ybrso5qenJ0SnBU6Wwejmc65ss3M5D6bbLor56ekJ0a7ADbbdW+Hf0NeYJn8gczkM+u1Hjz+h3MCNQ+Cd8Avoa0WyN5LLodBvvy8cNf6E+gaeciTkY+Ob4aSrSXb9clkJ0205BDBazoUvwvSEKLt6XFaLx2Fan/3sXO6G6bbPw9HBrtUnMD2RyN2QXb2hRDN32c/uIupOjm7OTMlkTm4zFH55aU1e1LCfPYnT4K8w3WYMd6D+x5DpynfBIVwBo7rsZ7P5Ym+EP5Bss30zYo7q0fMaE/LZ/x7C7TCqmyPfgjEqajxyUmPqhL9yzHF0Ydd8qOo6OJQz4Fswqp/6Ojwejg7eHotOqMSajw1yRsBDkCORv0DW/wbyFVAXw9Eylgdj95n/O3pqPvr9OxQd6OUGC4xe37HA8N2EUXgl6gU1GegVTHuBj2EUYB/fgSKTGpf2fKOn6MFGGAWZI+/oiAJKQtdjhANh85LTpnPyDt/oKSqh11kLIYQQQgghhBBCCCGEEELMLnNz/wIB5HIsRa7e4QAAAABJRU5ErkJggg==", + "properties": { + "repoOwner": "SharePoint", + "repo": "sp-dev-fx-webparts" + } + }] +} diff --git a/samples/react-chartcontrol/src/webparts/dynamicDataCallable/DynamicDataCallableWebPart.ts b/samples/react-chartcontrol/src/webparts/dynamicDataCallable/DynamicDataCallableWebPart.ts new file mode 100644 index 000000000..dd39ac50b --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/dynamicDataCallable/DynamicDataCallableWebPart.ts @@ -0,0 +1,144 @@ +import * as React from 'react'; +import * as ReactDom from 'react-dom'; +import { Version } from '@microsoft/sp-core-library'; +import { + BaseClientSideWebPart, + IPropertyPaneConfiguration, + PropertyPaneTextField +} from '@microsoft/sp-webpart-base'; + +import * as strings from 'DynamicDataCallableWebPartStrings'; +import DynamicDataCallable from './components/DynamicDataCallable'; +import { IDynamicDataCallableProps } from './components/IDynamicDataCallableProps'; +import { IDynamicDataPropertyDefinition, IDynamicDataCallables } from '@microsoft/sp-dynamic-data'; +import { IContributor } from '../../services/GitHubService'; + +/** + * The id of the dynamic data property we'll pass around + */ +const contributorProperty = 'contributor'; + +export interface IDynamicDataCallableWebPartProps { + repoOwner: string; + repo: string; +} + +export default class DynamicDataCallableWebPart extends BaseClientSideWebPart implements IDynamicDataCallables { + /** the last selected contributor */ + private _selectedContributor: IContributor; + + protected onInit(): Promise { + // register this web part as dynamic data source + this.context.dynamicDataSourceManager.initializeSource(this); + return Promise.resolve(); + } + + + public render(): void { + const element: React.ReactElement = React.createElement( + DynamicDataCallable, + { + repoOwner: this.properties.repoOwner, + repo: this.properties.repo, + httpClient: this.context.httpClient, + onSelectionChange: (alias: string) => { + this._onContributorSelected(alias); + }, + onConfigure: this._onConfigure, + } + ); + + ReactDom.render(element, this.domElement); + } + + protected onDispose(): void { + ReactDom.unmountComponentAtNode(this.domElement); + } + + protected get dataVersion(): Version { + return Version.parse('1.0'); + } + + /** + * We're disabling reactive property panes here because we don't want the web part to try to fetch + * statistics until both the repo owner and repo name have been filled it + */ + protected get disableReactivePropertyChanges(): boolean { + // require an apply button on the property pane + return true; + } + + protected getPropertyPaneConfiguration(): IPropertyPaneConfiguration { + return { + pages: [ + { + header: { + description: strings.PropertyPaneDescription + }, + groups: [ + { + groupName: strings.BasicGroupName, + groupFields: [ + PropertyPaneTextField('repoOwner', { + label: strings.RepoOwnerFieldLabel, + description: strings.RepoOwnerFieldDescription + }), + PropertyPaneTextField('repo', { + label: strings.RepoFieldLabel, + description: strings.RepoFieldDescription + }) + ] + } + ] + } + ] + }; + } + + /** + * Return list of dynamic data properties that this dynamic data source + * returns + */ + public getPropertyDefinitions(): ReadonlyArray { + return [ + { + id: contributorProperty, + title: strings.ContributorProperty + } + ]; + } + + /** + * Return the current value of the specified dynamic data set + * @param propertyId ID of the dynamic data set to retrieve the value for + */ + public getPropertyValue(propertyId: string): IContributor { + switch (propertyId) { + case contributorProperty: + return this._selectedContributor; + } + + throw new Error(strings.BadPropertyIdErrorMessage); + } + + /** + * Event handler for selecting a contributor from a donut + */ + private _onContributorSelected = (alias: string): void => { + const contributor: IContributor = { + alias: alias, + repo: this.properties.repo, + repoOwner: this.properties.repoOwner + }; + this._selectedContributor = contributor; + console.log('Data Callable Contributor selected', JSON.stringify(contributor)); + + // notify subscribers that the selected event has changed + this.context.dynamicDataSourceManager.notifyPropertyChanged(contributorProperty); + } + + private _onConfigure = (): void => { + this.context.propertyPane.open(); + } +} + diff --git a/samples/react-chartcontrol/src/webparts/dynamicDataCallable/components/DynamicDataCallable.module.scss b/samples/react-chartcontrol/src/webparts/dynamicDataCallable/components/DynamicDataCallable.module.scss new file mode 100644 index 000000000..ff51e8fc5 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/dynamicDataCallable/components/DynamicDataCallable.module.scss @@ -0,0 +1,47 @@ +@import "~@microsoft/sp-office-ui-fabric-core/dist/sass/SPFabricCore.scss"; + +.dynamicDataCallable { + color: inherit; +} + +.tooltip { + position: absolute; + pointer-events: none; + height: 64px; + overflow-y: hidden; +} + +.tooltipTitle { + color: inherit; +} + +.tooltipLegend { + width: 16px; + height: 16px; + display: table-cell; +} + +.tooltipValue { + display: table-cell; +} + +.tooltipThumb { + float: left; +} + +.tooltipContent { + margin-left: 64px; +} + +.avatarImg { + width: 60px; + height: 60px; + display: block; +} + +:export { + vesaChromaticStart: #ffa500; + vesaChromaticEnd: #fff6e5; + borderColor: #fff; +} + diff --git a/samples/react-chartcontrol/src/webparts/dynamicDataCallable/components/DynamicDataCallable.tsx b/samples/react-chartcontrol/src/webparts/dynamicDataCallable/components/DynamicDataCallable.tsx new file mode 100644 index 000000000..c33ded385 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/dynamicDataCallable/components/DynamicDataCallable.tsx @@ -0,0 +1,240 @@ +import * as React from 'react'; +import styles from './DynamicDataCallable.module.scss'; +import { IDynamicDataCallableProps } from './IDynamicDataCallableProps'; +import * as strings from 'DynamicDataCallableWebPartStrings'; +import { Placeholder } from '@pnp/spfx-controls-react/lib/Placeholder'; +import { Spinner, SpinnerSize } from 'office-ui-fabric-react/lib/Spinner'; +import { MessageBar, MessageBarType } from 'office-ui-fabric-react/lib/MessageBar'; + +// used to add a chart control +import { ChartControl, ChartType, PaletteGenerator } from '@pnp/spfx-controls-react/lib/ChartControl'; + +// used to call GitHub +import GitHubService from '../../../services/GitHubService/GitHubService'; +import { IGitHubService, IGitHubContributor } from '../../../services/GitHubService'; + +export default class DynamicDataCallable extends React.Component { + /** +* The chart element +*/ +private _chartElem: ChartControl = undefined; +private _tooltipElem: HTMLElement = undefined; +private _tooltipImg: HTMLImageElement = undefined; +private _avatarTitleElem: HTMLElement = undefined; +private _contributionsElem: HTMLElement = undefined; +private _contributionsLegendElem: HTMLElement = undefined; + + public render(): React.ReactElement { + const { + repoOwner, + repo, + onConfigure + } = this.props; + // if we're not configured, show the placeholder + if (!repoOwner || !repo) { + return ; + } + + + return ( +
+ } + rejectedtemplate={(error: string) => + {strings.Error}: {error} + } + options={ + { + legend: { + display: false + }, + title: { + display: true, + text: strings.ChartTitle + }, + tooltips: { + enabled: false, + custom: (tooltip => { + // get the custom tooltip element + const elem = this._tooltipElem; + + // if chart.js wants to hide the tooltip, don't bother showing it + // who are we to argume + if (tooltip!.opacity === 0) { + elem.style.opacity = '0'; + return; + } + + // if there are no data points, don't do anything + if (tooltip!.dataPoints!.length < 1) { + return; + } + + // get the data from the chart + const data = this._chartElem!.getChart()!.data as any; + const avatars = data!.avatars; + const dataPoint = tooltip!.dataPoints![0]; + const alias = data!.labels[dataPoint!.index]; + const contributions = data!.datasets[0].data[dataPoint!.index]; + const avatarUrl = avatars[dataPoint!.index]; + if (avatarUrl) { + // set the tooltip position and size + const positionX = this._chartElem.getCanvas().offsetLeft; + const positionY = this._chartElem.getCanvas().offsetTop; + elem.style.opacity = '1'; + elem.style.left = positionX + tooltip.caretX + 'px'; + elem.style.top = positionY + tooltip.caretY + 'px'; + elem.style.fontFamily = tooltip._bodyFontFamily; + elem.style.fontSize = tooltip.bodyFontSize; + elem.style.fontStyle = tooltip._bodyFontStyle; + elem.style.padding = tooltip.yPadding + 'px ' + tooltip.xPadding + 'px'; + elem.style.backgroundColor = tooltip.backgroundColor; + elem.style.borderRadius = tooltip.cornerRadius; + elem.style.width = tooltip.width + 64 + 'px'; + elem.style.borderColor = tooltip.borderColor; + elem.style.borderWidth = tooltip.borderwidth; + + // set the avatar img + this._tooltipImg.src = avatarUrl; + this._tooltipImg.alt = alias; + this._tooltipImg.style.borderColor = tooltip.titleFontColor; + this._tooltipImg.style.borderWidth = '1px'; + + // set the alias + this._avatarTitleElem.innerText = alias; + this._avatarTitleElem.style.color = tooltip.titleFontColor; + this._avatarTitleElem.style.fontSize = tooltip.titleFontSize; + this._avatarTitleElem.style.fontFamily = tooltip._titleFontFamily; + this._avatarTitleElem.style.fontWeight = tooltip._titleFontStyle; + this._avatarTitleElem.style.marginBottom = tooltip.titleMarginBottom + 'px'; + + // set the number of contributions + this._contributionsElem.innerText = contributions.toString(); + this._contributionsElem.style.color = tooltip.bodyFontColor; + this._contributionsElem.style.fontSize = tooltip.bodyFontSize; + this._contributionsElem.style.fontFamily = tooltip._bodyFontFamily; + this._contributionsElem.style.fontWeight = tooltip._bodyFontStyle; + this._contributionsElem.style.paddingLeft = tooltip.bodySpacing + 'px'; + + // set the contribution legend + this._contributionsLegendElem.style.backgroundColor = tooltip.labelColors[0].backgroundColor; + this._contributionsLegendElem.style.borderColor = tooltip.labelColors[0].borderColor; + } + }) + } + } + } + onClick={(_ignored?: MouseEvent, activeElements?: Array<{}>) => { + try { + const clickedElement = activeElements![0]; + const clickedIndex: number = clickedElement!['_index']; + const clickedContributor: string = clickedElement!['_chart'].chart.data.labels[clickedIndex]; + console.log('Data Callable Contributor', clickedContributor); + this.props.onSelectionChange(clickedContributor); + } catch (error) { + + } + + return {}; + }} + /> +
+
+ +
+
+
+
+
+
+
+
+ ); + } + + /** + * Links a reference to the chart so that we can + * refer to it later and change its data + */ + private _linkElement = (e: any) => { + this._chartElem = e; + } + + private _linkTooltip = (e: any) => { + this._tooltipElem = e; + } + + private _linkImg = (e: any) => { + this._tooltipImg = e; + } + + private _linkAvatarTitle = (e: any) => { + this._avatarTitleElem = e; + } + + private _linkContributions = (e: any) => { + this._contributionsElem = e; + } + + private _linkContributionLegend = (e: any) => { + this._contributionsLegendElem = e; + } + + /** + * Loads data from a service. + * This is where you would replace for your own code + */ + private _loadAsyncData(): Promise { + return new Promise((resolve, reject) => { + const { httpClient, + repoOwner, + repo } = this.props; + + // Get the GitHub data provider + const dataProvider: IGitHubService = new GitHubService(); + + // Create an async request + dataProvider.getContributors(httpClient, repoOwner, repo) + .then((contributors: IGitHubContributor[]) => { + const authors: string[] = contributors.map((contributor) => { + return contributor.login; + }); + + const totalContributions: number[] = contributors.map((contributor) => { + return contributor.contributions; + }); + + // We're storing custom data in the chart's data for later retrieval + const avatars: string[] = contributors.map((contributor: IGitHubContributor) => { + return contributor.avatar_url; + }); + + // Generate a cool gradient with as many steps as there are data elements + const backgroundColor = PaletteGenerator.generateNonRepeatingGradient( + [styles.vesaChromaticStart, styles.vesaChromaticEnd], + totalContributions.length); + + const data = { + labels: authors, + avatars: avatars, + datasets: [{ + label: strings.DatasetLabel, + data: totalContributions, + backgroundColor: backgroundColor, + borderWidth: 1, + borderColor: styles.borderColor + }] + }; + resolve(data); + }, (error) => { reject(error); }); + }); + } +} diff --git a/samples/react-chartcontrol/src/webparts/dynamicDataCallable/components/IDynamicDataCallableProps.ts b/samples/react-chartcontrol/src/webparts/dynamicDataCallable/components/IDynamicDataCallableProps.ts new file mode 100644 index 000000000..238b52590 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/dynamicDataCallable/components/IDynamicDataCallableProps.ts @@ -0,0 +1,16 @@ +import { HttpClient } from "@microsoft/sp-http"; + +export interface IDynamicDataCallableProps { + repoOwner: string; + repo: string; + /** + * Instance of the HttpClient. Used to communicate with the GitHub API + */ + httpClient: HttpClient; + onSelectionChange: (alias: string) => void; + + /** + * Event handler for clicking the Configure button on the Placeholder + */ + onConfigure: () => void; +} diff --git a/samples/react-chartcontrol/src/webparts/dynamicDataCallable/loc/en-us.js b/samples/react-chartcontrol/src/webparts/dynamicDataCallable/loc/en-us.js new file mode 100644 index 000000000..97f16674d --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/dynamicDataCallable/loc/en-us.js @@ -0,0 +1,19 @@ +define([], function() { + return { + "ChartTitle": "GitHub Contributors", + "PropertyPaneDescription": "Provide a GitHub repository owner and repo to see commits by authors.", + "BasicGroupName": "Repository Settings", + "RepoOwnerFieldLabel": "Repository Owner", + "RepoOwnerFieldDescription": "The repository owner. E.g.: SharePoint", + "RepoFieldLabel": "Repository", + "RepoFieldDescription": "The repository name. E.g.: sp-dev-fx-webparts", + "PlaceholderTitle": "Hold on a minute!", + "PlaceholderDescription": "Before we can show you commit statistics, we need you to configure a GitHub repository owner and repository name. Duh!", + "ConfigureButton": "Configure", + "ContributorProperty": "Contributor", + "BadPropertyIdErrorMessage": "Bad property id", + "Loading": "Loading contributors...", + "Error": "There was an error loading data from GitHub", + "DatasetLabel": "Contributions" + } +}); diff --git a/samples/react-chartcontrol/src/webparts/dynamicDataCallable/loc/mystrings.d.ts b/samples/react-chartcontrol/src/webparts/dynamicDataCallable/loc/mystrings.d.ts new file mode 100644 index 000000000..dce38f433 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/dynamicDataCallable/loc/mystrings.d.ts @@ -0,0 +1,22 @@ +declare interface IDynamicDataCallableWebPartStrings { + ChartTitle: string; + PropertyPaneDescription: string; + BasicGroupName: string; + RepoOwnerFieldLabel: string; + RepoFieldLabel: string; + RepoOwnerFieldDescription: string; + RepoFieldDescription: string; + PlaceholderTitle: string; + PlaceholderDescription: string; + ConfigureButton: string; + ContributorProperty: string; + BadPropertyIdErrorMessage: string; + Loading: string; + Error: string; + DatasetLabel: string; +} + +declare module 'DynamicDataCallableWebPartStrings' { + const strings: IDynamicDataCallableWebPartStrings; + export = strings; +} diff --git a/samples/react-chartcontrol/src/webparts/dynamicDataConsumer/DynamicDataConsumerWebPart.manifest.json b/samples/react-chartcontrol/src/webparts/dynamicDataConsumer/DynamicDataConsumerWebPart.manifest.json new file mode 100644 index 000000000..1de026804 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/dynamicDataConsumer/DynamicDataConsumerWebPart.manifest.json @@ -0,0 +1,22 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx/client-side-web-part-manifest.schema.json", + "id": "d5db1f38-c34b-4083-b2b0-99b09d9161b1", + "alias": "DynamicDataConsumerWebPart", + "componentType": "WebPart", + + "version": "*", + "manifestVersion": 2, + + "requiresCustomScript": false, + + "preconfiguredEntries": [{ + "groupId": "5c03119e-3074-46fd-976b-c60198311f70", + "group": { "default": "Other" }, + "title": { "default": "Dynamic Data Consumer" }, + "description": { "default": "Demonstrates how to create a dynamic data consumer web part that renders a chart upon receiving dynamic data" }, + "iconImageUrl": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFwAAABcCAYAAADj79JYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAHYcAAB2HAY/l8WUAAAAYdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjEuNWRHWFIAAASISURBVHhe7ZxZyH1TGIc/lAtDblxIkQsZEm6kTBkzXODCnExFohDiRiIuTBkypgwplKm4QDKGSKSUKReSobgzlxDP79/31rJ6z9lrrb3397e+3qeeTuecvdbe6/f1rbP22mvvlSAIgiAIgiAIgiAIgrXjbHwUP8Wf8Gf8HB/HMzGYiH3xPfxnwDdxLwxGcAV64S7zIgwauAq9QEu8BIMK9kMvyBqje6ngffRCrPF1DArQaMQLsMXTMBjgMfTCa/FJDAbQONsLr8VvMRhAJzVeeK0GA3yPXnAt/obBAC+hF16L72AwwE3ohdfifRgMcCp64bV4HgYFvIpegDVqwiso5BD0QqzxWAwqGNOX34FBA5eiF+gyY6ZwJJoP+Qi9cFN1AeI4DCbiMHwK86Afwn0wmIk88L0xmJE88FMwmJE88GsxWMA2q69jyAN/ArvFGrHzhnfTsiP+gA9seNdOGrb8A7fALrFGzBH4ZWj1368PGrE6UrudM7EGzBG4uBhtH/fqgwasfOob2CXWgLkCFxeg7ecufVCJlc09ELvDDn7OwMX5aPuqnfewcrmvYHfYwVvgm8+o5jxsf7diKVbG8yzsCjtwCzxtzNzejCV4Zc2vcEvsBjvwjRH4g1iCVzb1GewGO2gLfLMZVd9t+ysNW1gZ83nns9L/lhpOwBvwBfwOtT79E3wEz8Am7IDn/tG8HW1fNWELK2fq7PWD7DOpH+Yp2B9fxLz+3Kb16VZ4zsDTKzktZ51W1rTpgi8x/077GoPmafI6h6xan26F5gr8GrR9tJ7iW3nTAt8df8T8e/XpW2Et6dC11uKrTlZgjsCvRKt/zHyK1WGmE2JHoLdU7mus6WePx7wOqbPjk3E33AVPxNvQ27aoe7GN5wh8B9Qytqknr/IZyF3xbcy3k8/hHjjEu5iW+xP1R1jEUZgvQv1frE/fevV1DGmjZB64oVVX+bamRhrnoNfVaIog335Z2MbhmJdbF+vT80YtClxciPn2qX+hwtecjibWDkWtKU+3qZlkuwXTsutifXraILkscHEQehefS1WfXcoxmJZdF+vT0wbJocAN9d1349+Y17FM/UCWsj3m5bsnb1Bp4Ma2eDV+gXldnhqNlLId5uU3xa7JG1QbeMpOqNvG78RFZ5Ma+pVyJKZlNQXQLUfjs5g2SGqop++m4mFM69c4u5TrMS37NHaHhlYfY9oQz89QQ72xeCt3Nc4ewhtOdrdmpmUxp8qMRX+8tE6d1GicvYgD8FdMy3R3BWrMcuXrcAyno1evxtnqvjQa0Q+k+uy8GzG7uvV8igX5Gn+P4XL06i1RT8HoiiluOZli6UR+5lhid2FPeVPVuTiWg/E19OpPfRn3xO7Q5TGvQS1OedugVgTcg5qJ/AVV/zeoR0CdhN3Sy42xm6y+ds+Ut37/jsEA8XCDNSYe37HG6NmEXngtxgNqCohHMG0EPkQvwBrfwqCQKU7t9UTPoIIb0QuyRF3RCRpoCT1uIxyJupeSPl2Ld/REz2Ai4nHWQRAEQRAEQRAEQRAEQRAEQRAE/2Vl5V//q3IsGyKfUAAAAABJRU5ErkJggg==", + "properties": { + "contributor": {} + } + }] +} diff --git a/samples/react-chartcontrol/src/webparts/dynamicDataConsumer/DynamicDataConsumerWebPart.ts b/samples/react-chartcontrol/src/webparts/dynamicDataConsumer/DynamicDataConsumerWebPart.ts new file mode 100644 index 000000000..9e35dce18 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/dynamicDataConsumer/DynamicDataConsumerWebPart.ts @@ -0,0 +1,309 @@ +import * as React from 'react'; +import * as ReactDom from 'react-dom'; +import { Version } from '@microsoft/sp-core-library'; + +// standard web part stuff +import { + BaseClientSideWebPart, + IPropertyPaneConfiguration, + PropertyPaneTextField, + PropertyPaneDynamicFieldSet, + PropertyPaneDynamicField, + IPropertyPaneConditionalGroup, + DynamicDataSharedDepth, + IWebPartPropertiesMetadata +} from '@microsoft/sp-webpart-base'; + +// dynamic data web parts +import { DynamicProperty } from '@microsoft/sp-component-base'; + +// localization +import * as strings from 'DynamicDataConsumerWebPartStrings'; + +// component rendering +import DynamicDataConsumer from './components/DynamicDataConsumer'; +import { IDynamicDataConsumerProps } from './components/IDynamicDataConsumerProps'; +import { IContributor, IGitHubService, IAuthorCommit } from '../../services/GitHubService'; + +// Needed to retrieve GitHub data +import GitHubService from '../../services/GitHubService/GitHubService'; + +// used to group GitHub results by date +import { groupBy, toPairs } from '@microsoft/sp-lodash-subset'; +import * as moment from 'moment'; + +// used to add a chart control +import { PaletteGenerator } from '@pnp/spfx-controls-react/lib/ChartControl'; + +// Used to render placeholders and error messages +import { Placeholder, IPlaceholderProps } from '@pnp/spfx-controls-react/lib/Placeholder'; +import { MessageBar, MessageBarType, IMessageBarProps } from 'office-ui-fabric-react/lib/MessageBar'; + +//Orange color +const CHARTCOLOR: string = "#ffa500"; +const CHARTALPHA: number = 0.2; + +export interface IDynamicDataConsumerWebPartProps { + contributor: DynamicProperty; + alias: string; + repo: string; + repoOwner: string; +} + +export default class DynamicDataConsumerWebPart extends BaseClientSideWebPart { + + public render(): void { + const { repo, + repoOwner, + alias, + contributor + } = this.properties; + + // we need to configure this if we didn't specify static or dynamic properties + const contributorSource = contributor.tryGetSource(); + const needsConfiguration: boolean = + (!repo // no static repo + || !repoOwner // no static repo owner + || !alias) // no static alias + && (!contributorSource); // no dynamic data and no dynamic data source configured + if (needsConfiguration) { + this._renderPlaceholder(); + } else { + if (contributor.tryGetValue() === undefined) { + this._renderPrompt(); + } else { + this._renderChart(); + } + } + } + + protected get propertiesMetadata(): IWebPartPropertiesMetadata { + return { + 'contributor': { + dynamicPropertyType: 'object' + } + }; + } + + protected onDispose(): void { + ReactDom.unmountComponentAtNode(this.domElement); + } + + protected get dataVersion(): Version { + return Version.parse('1.0'); + } + + protected getPropertyPaneConfiguration(): IPropertyPaneConfiguration { + return { + pages: [ + { + header: { + description: strings.PaneDescription + }, + groups: [ + // Web part properties group for specifying the information about + // the contributor + { + // Primary group is used to provide GitHub information + // in a text field in the web part properties + primaryGroup: { + groupName: strings.StaticGroupName, + groupFields: [ + PropertyPaneTextField('repoOwner', { + label: strings.RepoOwnerFieldLabel + }), + PropertyPaneTextField('repo', { + label: strings.RepoFieldLabel + }), + + PropertyPaneTextField('alias', { + label: strings.AliasFieldLabel + }) + ] + }, + // Secondary group is used to retrieve the contributor from the + // connected dynamic data source + secondaryGroup: { + groupName: strings.DynamicGroupName, + groupFields: [ + PropertyPaneDynamicFieldSet({ + label: strings.ContributorDynamicFieldLabel, + fields: [ + PropertyPaneDynamicField('contributor', { + label: strings.ContributorDynamicFieldLabel, + propertyValueDepth: DynamicDataSharedDepth.None + })] + }) + ] + }, + // Show the secondary group only if the web part has been + // connected to a dynamic data source + showSecondaryGroup: !!this.properties.contributor.tryGetSource() + } as IPropertyPaneConditionalGroup + ] + } + ] + }; + } + + protected get disableReactivePropertyChanges(): boolean { + // set property changes mode to reactive, so that GitHub is not + // called on each keystroke when typing in the repo, owner, and alias + // in web part properties. We don't want to exceed GitHub's rate limit. + return true; + } + + /** + * Renders the chart with contributions + */ + private _renderChart = (): void => { + const { + contributor + } = this.properties; + const contributorData: IContributor | undefined = contributor.tryGetValue(); + + let repoOwner: string = undefined; + let repo: string = undefined; + let alias: string = undefined; + try { + repoOwner = contributorData.repoOwner; + repo = contributorData.repo; + alias = contributorData.alias; + } catch (error) { + } + + if (!repoOwner || !repo || !alias) { + // this shouldn't happen + return undefined; + } + + this._loadAsyncData(contributorData).then((data: Chart.ChartData) => { + const element: React.ReactElement = React.createElement( + DynamicDataConsumer, + { + data, + alias + } + ); + + ReactDom.render(element, this.domElement); + }, ((error: any) => { + const element: React.ReactElement = React.createElement( + MessageBar, + { + messageBarType: MessageBarType.error, + isMultiline: false, + }, [ + strings.Error + ":" + error + ] + ); + ReactDom.render(element, this.domElement); + })); + } + + /** + * Renders a placeholder prompting users to pick a contributor + */ + private _renderPrompt = (): void => { + const element: React.ReactElement = React.createElement( + Placeholder, + { + iconName: 'GitGraph', + iconText: strings.PlaceHolderDynamicDataTitle, + description: strings.PlaceHolderDynamicDataDescription + } + ); + + ReactDom.render(element, this.domElement); + } + + /** + * Renders a placeholder prompting users to configure the web part + */ + private _renderPlaceholder = (): void => { + const element: React.ReactElement = React.createElement( + Placeholder, + { + iconName: 'Edit', + iconText: strings.PlaceHolderConfigureTitle, + description: strings.PlaceHolderConfigureDescription, + buttonLabel: strings.ConfigureButtonLabel, + onConfigure: () => { this.context.propertyPane.open(); } + } + ); + + ReactDom.render(element, this.domElement); + } + + /** + * Loads data from a service. + * This is where you would replace for your own code + */ + private _loadAsyncData = (contributorData: IContributor): Promise => { + const { + repoOwner, + repo, + alias + } = contributorData; + + return new Promise((resolve, reject) => { + // Get the GitHub data provider + const dataProvider: IGitHubService = new GitHubService(); + + // Create an async request + dataProvider.getCommits(this.context.httpClient, repoOwner, repo, alias) + .then((commits: IAuthorCommit[]) => { + + // Group them by month + var groupedOccurences: [string, IAuthorCommit[]][] = toPairs(groupBy(commits, (commit) => moment(commit.commit.author.date).startOf('month'))); + + // Create time series structures so that Chart.js can display them + const uniqueDateList: { "t": string, "y": number }[] = []; + groupedOccurences.forEach(group => { + uniqueDateList.push({ "t": group[0], "y": group[1].length }); + }); + + // sort that list so that we don't get overlapped bars on the chart + uniqueDateList.sort((leftSide, rightSide): number => { + // convert to moments so that we can sort them as dates + const leftMoment = moment(leftSide.t); + const rightMoment = moment(rightSide.t); + if (leftMoment.isBefore(rightMoment)) { + return -1; + } + if (leftMoment.isAfter(rightMoment)) { + return 1; + } + return 0; + }); + + // Generate an orange semi transparent color + const backgroundColor = PaletteGenerator.alpha(CHARTCOLOR, CHARTALPHA); + + const data: Chart.ChartData = { + datasets: [{ + label: strings.SeriesLabel, + data: uniqueDateList, + //backgroundColor: backgroundColor, + // make lines thicker than usual + borderWidth: 2, + borderColor: CHARTCOLOR, + // make a small empty point + pointBorderWidth: 2, + pointBackgroundColor: "#fff", + // make a big semi-transparent border on hover + pointHoverBorderWidth: 15, + pointHoverBackgroundColor: CHARTCOLOR, + pointHoverBorderColor: backgroundColor, + pointHitRadius: 30, + fill: false, + lineTension: 0.000001 // make lines straight + }] + }; + resolve(data); + }, (error) => { + reject(error); + }); + }); + } +} diff --git a/samples/react-chartcontrol/src/webparts/dynamicDataConsumer/components/DynamicDataConsumer.module.scss b/samples/react-chartcontrol/src/webparts/dynamicDataConsumer/components/DynamicDataConsumer.module.scss new file mode 100644 index 000000000..36f4b729a --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/dynamicDataConsumer/components/DynamicDataConsumer.module.scss @@ -0,0 +1,74 @@ +@import '~@microsoft/sp-office-ui-fabric-core/dist/sass/SPFabricCore.scss'; + +.dynamicDataConsumer { + .container { + max-width: 700px; + margin: 0px auto; + box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2), 0 25px 50px 0 rgba(0, 0, 0, 0.1); + } + + .row { + @include ms-Grid-row; + @include ms-fontColor-white; + background-color: $ms-color-themeDark; + padding: 20px; + } + + .column { + @include ms-Grid-col; + @include ms-lg10; + @include ms-xl8; + @include ms-xlPush2; + @include ms-lgPush1; + } + + .title { + @include ms-font-xl; + @include ms-fontColor-white; + } + + .subTitle { + @include ms-font-l; + @include ms-fontColor-white; + } + + .description { + @include ms-font-l; + @include ms-fontColor-white; + } + + .button { + // Our button + text-decoration: none; + height: 32px; + + // Primary Button + min-width: 80px; + background-color: $ms-color-themePrimary; + border-color: $ms-color-themePrimary; + color: $ms-color-white; + + // Basic Button + outline: transparent; + position: relative; + font-family: "Segoe UI WestEuropean","Segoe UI",-apple-system,BlinkMacSystemFont,Roboto,"Helvetica Neue",sans-serif; + -webkit-font-smoothing: antialiased; + font-size: $ms-font-size-m; + font-weight: $ms-font-weight-regular; + border-width: 0; + text-align: center; + cursor: pointer; + display: inline-block; + padding: 0 16px; + + .label { + font-weight: $ms-font-weight-semibold; + font-size: $ms-font-size-m; + height: 32px; + line-height: 32px; + margin: 0 4px; + vertical-align: top; + display: inline-block; + } + } +} \ No newline at end of file diff --git a/samples/react-chartcontrol/src/webparts/dynamicDataConsumer/components/DynamicDataConsumer.tsx b/samples/react-chartcontrol/src/webparts/dynamicDataConsumer/components/DynamicDataConsumer.tsx new file mode 100644 index 000000000..f8e94de45 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/dynamicDataConsumer/components/DynamicDataConsumer.tsx @@ -0,0 +1,86 @@ +import * as React from 'react'; +import styles from './DynamicDataConsumer.module.scss'; +import { IDynamicDataConsumerProps } from './IDynamicDataConsumerProps'; + +// localization +import * as strings from 'DynamicDataConsumerWebPartStrings'; + +// used to add a chart control +import { ChartControl, ChartType } from '@pnp/spfx-controls-react/lib/ChartControl'; + +// used to format date +import * as moment from 'moment'; + +/** + * This component is designed to render a line chart that looks and behave like the + * Office 365 Admin center dashboards. + * Unlike most samples in this solution, most of the business logic/data retrieval isn't here, but + * in the web part. + */ +export default class DynamicDataConsumer extends React.Component { + + public render(): React.ReactElement { + const { alias, data } = this.props; + const options: Chart.ChartOptions = { + legend: { + display: false // don't display a legend -- there's only one data point + }, + title: { + display: true, + text: [alias, strings.ChartTitle] // when title is a string array, it spans over multiple lines + }, + hover: { + mode: 'nearest', // will automatically select the nearest point + intersect: false + }, + tooltips: { + mode: 'label', // work with label + intersect: false, + callbacks: { + // custom tooltip logic for title + title: ((tooltipItems, _tooltipData) => { + // format the date as 'AbbreviatedMonth Year' e.g.: Nov 2018 + return moment(tooltipItems[0].xLabel).format(strings.TooltipDateFormat); + }) + } + }, + scales: { + xAxes: [{ + type: 'time', // Format as a time series + gridLines: { + display: false + }, + time: { + displayFormats: { + // Pass the same format so that it is always consistent, regardless of the scale + 'millisecond': strings.MonthLabel, + 'second': strings.MonthLabel, + 'minute': strings.MonthLabel, + 'hour': strings.MonthLabel, + 'day': strings.MonthLabel, + 'week': strings.MonthLabel, + 'month': strings.MonthLabel, + 'quarter': strings.MonthLabel, + 'year': strings.MonthLabel, + } + } + }], + yAxes: [{ + ticks: { + beginAtZero: true + } + }] + } + }; + + return ( +
+ +
+ ); + } +} diff --git a/samples/react-chartcontrol/src/webparts/dynamicDataConsumer/components/IDynamicDataConsumerProps.ts b/samples/react-chartcontrol/src/webparts/dynamicDataConsumer/components/IDynamicDataConsumerProps.ts new file mode 100644 index 000000000..e8154517d --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/dynamicDataConsumer/components/IDynamicDataConsumerProps.ts @@ -0,0 +1,4 @@ +export interface IDynamicDataConsumerProps { + alias: string; + data: Chart.ChartData; +} diff --git a/samples/react-chartcontrol/src/webparts/dynamicDataConsumer/loc/en-us.js b/samples/react-chartcontrol/src/webparts/dynamicDataConsumer/loc/en-us.js new file mode 100644 index 000000000..3cb53f24f --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/dynamicDataConsumer/loc/en-us.js @@ -0,0 +1,25 @@ +define([], function () { + return { + "PropertyPaneDescription": "Description", + "BasicGroupName": "Group Name", + "DescriptionFieldLabel": "Description Field", + "Loading": "Loading", + "Error": "Something went wrong", + "ChartTitle": "Commits by month", + "MonthLabel": "MMM YYYY", + "SeriesLabel": "Commits", + "PaneDescription": "Connect to a dynamic data source, or provide static contributor information.", + "StaticGroupName": "Static Contributor Information", + "DynamicGroupName": "Dynamic Data Source", + "RepoOwnerFieldLabel": "Repo Owner", + "RepoFieldLabel": "Repo", + "AliasFieldLabel": "Contributor Alias", + "ContributorDynamicFieldLabel": "Contributor", + "PlaceHolderDynamicDataTitle": "Select a contributor", + "PlaceHolderDynamicDataDescription": "In order to see a contributor's commits, you need to select a contributor from the GitHub Contributors web part", + "PlaceHolderConfigureTitle":"Configure your web part", + "PlaceHolderConfigureDescription":"Please configure the web part.", + "ConfigureButtonLabel":"Configure", + "TooltipDateFormat": "MMM YYYY" + } +}); diff --git a/samples/react-chartcontrol/src/webparts/dynamicDataConsumer/loc/mystrings.d.ts b/samples/react-chartcontrol/src/webparts/dynamicDataConsumer/loc/mystrings.d.ts new file mode 100644 index 000000000..e104cbc06 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/dynamicDataConsumer/loc/mystrings.d.ts @@ -0,0 +1,28 @@ +declare interface IDynamicDataConsumerWebPartStrings { + PropertyPaneDescription: string; + BasicGroupName: string; + DescriptionFieldLabel: string; + Error: string; + Loading: string; + ChartTitle: string; + MonthLabel: string; + SeriesLabel: string; + PaneDescription: string; + StaticGroupName: string; + DynamicGroupName: string; + RepoOwnerFieldLabel: string; + RepoFieldLabel: string; + AliasFieldLabel: string; + ContributorDynamicFieldLabel: string; + PlaceHolderDynamicDataTitle: string; + PlaceHolderDynamicDataDescription: string; + PlaceHolderConfigureTitle: string; + PlaceHolderConfigureDescription: string; + ConfigureButtonLabel: string; + TooltipDateFormat: string; +} + +declare module 'DynamicDataConsumerWebPartStrings' { + const strings: IDynamicDataConsumerWebPartStrings; + export = strings; +} diff --git a/samples/react-chartcontrol/src/webparts/horizontalBarDemo/HorizontalBarDemoWebPart.manifest.json b/samples/react-chartcontrol/src/webparts/horizontalBarDemo/HorizontalBarDemoWebPart.manifest.json new file mode 100644 index 000000000..32ad97abf --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/horizontalBarDemo/HorizontalBarDemoWebPart.manifest.json @@ -0,0 +1,23 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx/client-side-web-part-manifest.schema.json", + "id": "a63646aa-098e-4c3f-b1f4-f32e9eed4013", + "alias": "HorizontalBarDemoWebPart", + "componentType": "WebPart", + + "version": "*", + "manifestVersion": 2, + + "requiresCustomScript": false, + + "preconfiguredEntries": [{ + "groupId": "5c03119e-3074-46fd-976b-c60198311f70", + "group": { "default": "Other" }, + + "title": { "default": "Horizontal Bar" }, + "description": { "default": "Demonstrates how to create a horizontal bar chart" }, + "officeFabricIconFontName": "BarChartHorizontal", + "properties": { + "description": "HorizontalBarDemo" + } + }] +} diff --git a/samples/react-chartcontrol/src/webparts/horizontalBarDemo/HorizontalBarDemoWebPart.ts b/samples/react-chartcontrol/src/webparts/horizontalBarDemo/HorizontalBarDemoWebPart.ts new file mode 100644 index 000000000..a9f50e1ef --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/horizontalBarDemo/HorizontalBarDemoWebPart.ts @@ -0,0 +1,57 @@ +import * as React from 'react'; +import * as ReactDom from 'react-dom'; +import { Version } from '@microsoft/sp-core-library'; +import { + BaseClientSideWebPart, + IPropertyPaneConfiguration, +} from '@microsoft/sp-webpart-base'; +import { PropertyPaneWebPartInformation } from '@pnp/spfx-property-controls/lib/PropertyPaneWebPartInformation'; +import * as strings from 'HorizontalBarDemoWebPartStrings'; +import HorizontalBarDemo from './components/HorizontalBarDemo'; +import { IHorizontalBarDemoProps } from './components/IHorizontalBarDemo.types'; + +export interface IHorizontalBarDemoWebPartProps { + description: string; +} + +export default class HorizontalBarDemoWebPart extends BaseClientSideWebPart { + + public render(): void { + const element: React.ReactElement = React.createElement( + HorizontalBarDemo, + { + description: this.properties.description + } + ); + + ReactDom.render(element, this.domElement); + } + + protected onDispose(): void { + ReactDom.unmountComponentAtNode(this.domElement); + } + + protected get dataVersion(): Version { + return Version.parse('1.0'); + } + + protected getPropertyPaneConfiguration(): IPropertyPaneConfiguration { + return { + pages: [ + { + groups: [ + { + groupFields: [ + PropertyPaneWebPartInformation({ + description: strings.WebPartDescription, + moreInfoLink: strings.MoreInfoLinkUrl, + key: 'webPartInfoId' + }) + ] + } + ] + } + ] + }; + } +} diff --git a/samples/react-chartcontrol/src/webparts/horizontalBarDemo/components/HorizontalBarDemo.module.scss b/samples/react-chartcontrol/src/webparts/horizontalBarDemo/components/HorizontalBarDemo.module.scss new file mode 100644 index 000000000..a9508bb17 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/horizontalBarDemo/components/HorizontalBarDemo.module.scss @@ -0,0 +1,5 @@ +@import "~@microsoft/sp-office-ui-fabric-core/dist/sass/SPFabricCore.scss"; + +.horizontalBarDemo { + color: inherit; +} diff --git a/samples/react-chartcontrol/src/webparts/horizontalBarDemo/components/HorizontalBarDemo.tsx b/samples/react-chartcontrol/src/webparts/horizontalBarDemo/components/HorizontalBarDemo.tsx new file mode 100644 index 000000000..a3ff16d88 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/horizontalBarDemo/components/HorizontalBarDemo.tsx @@ -0,0 +1,252 @@ +import * as React from 'react'; +import styles from './HorizontalBarDemo.module.scss'; +import { IHorizontalBarDemoProps } from './IHorizontalBarDemo.types'; +import IChartDataProvider from '../../../services/ChartDataProvider/IChartDataProvider'; +import MockChartDataProvider from '../../../services/ChartDataProvider/MockChartDataProvider'; +import * as strings from 'HorizontalBarDemoWebPartStrings'; +import * as Color from 'color'; + +import { + CommandBar +} from 'office-ui-fabric-react'; + +import { ChartControl, ChartType,OFFICE_COLORFUL1, PaletteGenerator } from '@pnp/spfx-controls-react/lib/ChartControl'; + + +/** + * The standard office colors + */ +const chartColors: string[] = OFFICE_COLORFUL1; +const backgroundColors: string[] = PaletteGenerator.alpha(OFFICE_COLORFUL1, 0.2) as string[]; +/** + * Demonstrates how to use a horizontal bar chart. + * Also shows how to use an Office Fabric CommandBar to change + * data and settings. + * This sample uses the state to store the entire chart's + */ +export default class HorizontalBarDemo extends React.Component { + private _chartElem: ChartControl = undefined; + + public render(): React.ReactElement { + // Get the command bar control + const commandBar: JSX.Element = this._renderCommandBar(); + + return ( +
+ {commandBar} + +
+ ); + } + + /** + * Renders the command bar control. + * The dataMenuItems and dataSetMenuItems are + * in separate arrays in case we want to hide/show + * some menu options + */ + private _renderCommandBar(): JSX.Element { + return ( + { this._addData(); }, + ['data-automation-id']: 'addDataItemMenu' + }, + { + key: 'removeData', + name: strings.RemoveDataButton, + iconProps: { + iconName: 'InsertColumnsLeft' + }, + ariaLabel: strings.AddDataButton, + onClick: () => { this._removeData(); }, + ['data-automation-id']: 'editButton' + }, + { + key: 'addDataSet', + name: strings.AddDatasetButton, + icon: 'Table', + ariaLabel: strings.AddDatasetButton, + onClick: () => { this._handleAddDataset(); }, + ['data-automation-id']: 'addDataItemMenu' + }, + { + key: 'deleteDataSet', + name: strings.RemoveDatasetButton, + icon: 'DeleteTable', + onClick: () => { this._handleRemoveDataset(); }, + ['data-automation-id']: 'deleteDatasetButton' + } + ]} + /> + ); + } + + // tslint:disable-next-line no-any + private _linkElement = (e: any) => { + this._chartElem = e; + } + + /** + * Loads data from a service. + * This is where you would replace for your own code + */ + private _loadAsyncData(): Promise { + return new Promise((resolve, reject) => { + const dataProvider: IChartDataProvider = new MockChartDataProvider(); + dataProvider.getMultiDataset(1, 7).then((dataSets: Array) => { + const data: Chart.ChartData = + { + labels: strings.ChartLabels, + datasets: [ + { + backgroundColor: backgroundColors[0], + borderColor: chartColors[0], + label: strings.DataSetLabel + '1', + data: dataSets[0], + borderWidth: 1 + } + ] + }; + resolve(data); + }); + }); + } + + /** + * Removes a data item from a dataset + */ + private _removeData = (): void => { + // Get a reference to the chart's data + const data: Chart.ChartData = this._chartElem.getChart().data; + + // Don't allow people to remove the last data + if (data.datasets.length > 0) { + if (data.labels.length < 2) { + return; + } + + // Remove the label + data.labels.splice(-1, 1); + + // Remove the data from the dataset + data.datasets.forEach((dataset) => { + dataset.data.pop(); + }); + + this._chartElem.update(); + } + + } + + /** + * Adds a data item to a dataset + */ + private _addData = (): void => { + // Get a reference to chart's data + const data: any = this._chartElem.getChart().data; + + // Don't let people add data if there are no datasets + // or if we've added all the months + if (data.datasets.length > 0) { + if (data.labels.length > 11) { + return; + } + + // Get the name of the next month to add + var month: string = strings.Months[data.labels.length % strings.Months.length]; + + // Add it to the month labels + data.labels.push(month); + + // Add a new data item to every dataset + for (var index = 0; index < data.datasets.length; ++index) { + data.datasets[index].data.push(MockChartDataProvider.getRandomNumber()); + } + + this._chartElem.update(); + } + } + + /** + * Removes a dataset from the chart + */ + private _handleRemoveDataset = (): void => { + // Get a reference to the chart + const data: any = this._chartElem.getChart().data; + + // Don't let them remove the last dataset + if (data.datasets.length > 1) { + // Pop the dataset off the dataset array + data.datasets.pop(); + } + + this._chartElem.update(); + } + + /** + * Adds a dataset to the chart + */ + private _handleAddDataset = (): void => { + // Get a reference to the chart's data + const data: any = this._chartElem.getChart().data; + + // Create a new dataset + const newDataset = { + label: strings.DataSetLabel + (data.datasets.length + 1), + // Create a 20 percent opaque background + backgroundColor: backgroundColors[data.datasets.length % chartColors.length], + borderColor: chartColors[data.datasets.length % chartColors.length], + borderWidth: 1, + // Start with blank data, we'll add some next + data: [] + }; + + // Add data for every month + for (var index = 0; index < data.labels.length; ++index) { + newDataset.data.push(MockChartDataProvider.getRandomNumber()); + } + + // Add the new dataset + data.datasets.push(newDataset); + + this._chartElem.update(); + } +} diff --git a/samples/react-chartcontrol/src/webparts/horizontalBarDemo/components/IHorizontalBarDemo.types.ts b/samples/react-chartcontrol/src/webparts/horizontalBarDemo/components/IHorizontalBarDemo.types.ts new file mode 100644 index 000000000..ad79f0e47 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/horizontalBarDemo/components/IHorizontalBarDemo.types.ts @@ -0,0 +1,3 @@ +export interface IHorizontalBarDemoProps { + description: string; +} diff --git a/samples/react-chartcontrol/src/webparts/horizontalBarDemo/loc/en-us.js b/samples/react-chartcontrol/src/webparts/horizontalBarDemo/loc/en-us.js new file mode 100644 index 000000000..effcfb3d1 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/horizontalBarDemo/loc/en-us.js @@ -0,0 +1,17 @@ +define([], function () { + return { + "Loading": "Loading", + "DataSetLabel": "Dataset ", + "ChartLabels": [ + 'January', 'February', 'March', 'April', 'May', 'June', 'July' + ], + "Months": + ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], + "AddDataButton": "Add data", + "AddDatasetButton": "Add dataset", + "RemoveDataButton": "Remove data", + "RemoveDatasetButton": "Remove dataset", + "WebPartDescription": `

This web part demonstrates how to use the PnP ChartControl to render a stacked horizontal bar chart.

It uses the horizontal bar chart sample code from Chart.js

`, + "MoreInfoLinkUrl": "https://sharepoint.github.io/sp-dev-fx-controls-react/controls/ChartControl/" + } +}); diff --git a/samples/react-chartcontrol/src/webparts/horizontalBarDemo/loc/mystrings.d.ts b/samples/react-chartcontrol/src/webparts/horizontalBarDemo/loc/mystrings.d.ts new file mode 100644 index 000000000..e34d00b63 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/horizontalBarDemo/loc/mystrings.d.ts @@ -0,0 +1,17 @@ +declare interface IHorizontalBarDemoWebPartStrings { + Loading: string; + DataSetLabel: string; + ChartLabels: string[]; + Months: string[]; + AddDataButton: string; + AddDatasetButton: string; + RemoveDataButton: string; + RemoveDatasetButton: string; + WebPartDescription: string; + MoreInfoLinkUrl: string; +} + +declare module 'HorizontalBarDemoWebPartStrings' { + const strings: IHorizontalBarDemoWebPartStrings; + export = strings; +} diff --git a/samples/react-chartcontrol/src/webparts/lineChartDemo/LineChartDemoWebPart.manifest.json b/samples/react-chartcontrol/src/webparts/lineChartDemo/LineChartDemoWebPart.manifest.json new file mode 100644 index 000000000..14b00f27f --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/lineChartDemo/LineChartDemoWebPart.manifest.json @@ -0,0 +1,23 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx/client-side-web-part-manifest.schema.json", + "id": "3b06de0f-5762-4160-8a2c-405f34a7d55d", + "alias": "LineChartDemoWebPart", + "componentType": "WebPart", + + "version": "*", + "manifestVersion": 2, + + "requiresCustomScript": false, + + "preconfiguredEntries": [{ + "groupId": "5c03119e-3074-46fd-976b-c60198311f70", + "group": { "default": "Other" }, + + "title": { "default": "Line Chart" }, + "description": { "default": "Demonstrates how to render a line chart" }, + "officeFabricIconFontName": "LineChart", + "properties": { + "description": "LineChartDemo" + } + }] +} diff --git a/samples/react-chartcontrol/src/webparts/lineChartDemo/LineChartDemoWebPart.ts b/samples/react-chartcontrol/src/webparts/lineChartDemo/LineChartDemoWebPart.ts new file mode 100644 index 000000000..73714c48c --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/lineChartDemo/LineChartDemoWebPart.ts @@ -0,0 +1,57 @@ +import * as React from 'react'; +import * as ReactDom from 'react-dom'; +import * as strings from 'LineChartDemoWebPartStrings'; +import { Version } from '@microsoft/sp-core-library'; +import { + BaseClientSideWebPart, + IPropertyPaneConfiguration, +} from '@microsoft/sp-webpart-base'; +import { PropertyPaneWebPartInformation } from '@pnp/spfx-property-controls/lib/PropertyPaneWebPartInformation'; +import LineChartDemo from './components/LineChartDemo'; +import { ILineChartDemoProps } from './components/ILineChartDemo.types'; + +export interface ILineChartDemoWebPartProps { + description: string; +} + +export default class LineChartDemoWebPart extends BaseClientSideWebPart { + + public render(): void { + const element: React.ReactElement = React.createElement( + LineChartDemo, + { + } + ); + + ReactDom.render(element, this.domElement); + } + + protected onDispose(): void { + ReactDom.unmountComponentAtNode(this.domElement); + } + + protected get dataVersion(): Version { + return Version.parse('1.0'); + } + + protected getPropertyPaneConfiguration(): IPropertyPaneConfiguration { + return { + pages: [ + { + groups: [ + { + groupFields: [ + PropertyPaneWebPartInformation({ + description: strings.WebPartDescription, + moreInfoLink: strings.MoreInfoLinkUrl, + key: 'webPartInfoId' + }) + ] + } + ] + } + ] + }; + } +} + diff --git a/samples/react-chartcontrol/src/webparts/lineChartDemo/components/ILineChartDemo.types.ts b/samples/react-chartcontrol/src/webparts/lineChartDemo/components/ILineChartDemo.types.ts new file mode 100644 index 000000000..caed8f66d --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/lineChartDemo/components/ILineChartDemo.types.ts @@ -0,0 +1,7 @@ +export interface ILineChartDemoProps { + +} + +export interface ILineChartDemoState { + +} diff --git a/samples/react-chartcontrol/src/webparts/lineChartDemo/components/LineChartDemo.module.scss b/samples/react-chartcontrol/src/webparts/lineChartDemo/components/LineChartDemo.module.scss new file mode 100644 index 000000000..b4aef41ed --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/lineChartDemo/components/LineChartDemo.module.scss @@ -0,0 +1,21 @@ +@import '~@microsoft/sp-office-ui-fabric-core/dist/sass/SPFabricCore.scss'; + +.lineChartDemo { + color: inherit; +} + +:export { + backgroundColor1: rgba(75,192,192,0.4); + borderColor1: rgba(75,192,192,1); + pointBorderColor1: rgba(75,192,192,1); + pointBackgroundColor1: rgba(75,192,192,1);; + pointHoverBackgroundColor1: rgba(75,192,192,1); + pointHoverBorderColor1: rgba(220,220,220,1); + + backgroundColor2: rgba(192,75,192,0.4); + borderColor2: rgba(192,75, 192,1); + pointBorderColor2:rgba(192,75, 192,1); + pointBackgroundColor2: rgba(192,75, 192,1); + pointHoverBackgroundColor2: rgba(192,75,192,1); + pointHoverBorderColor2: rgba(220,220,220,1); +} diff --git a/samples/react-chartcontrol/src/webparts/lineChartDemo/components/LineChartDemo.tsx b/samples/react-chartcontrol/src/webparts/lineChartDemo/components/LineChartDemo.tsx new file mode 100644 index 000000000..41bcd0dcf --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/lineChartDemo/components/LineChartDemo.tsx @@ -0,0 +1,132 @@ +import * as React from 'react'; +import styles from './LineChartDemo.module.scss'; +import { ILineChartDemoProps, ILineChartDemoState } from './ILineChartDemo.types'; +import * as strings from 'LineChartDemoWebPartStrings'; +import IChartDataProvider from '../../../services/ChartDataProvider/IChartDataProvider'; +import MockChartDataProvider from '../../../services/ChartDataProvider/MockChartDataProvider'; + +import { ChartControl, ChartType } from "@pnp/spfx-controls-react/lib/ChartControl"; + + +/** + * Demonstrates how to render line charts, using multiple datasets + * Also demonstrates customizing axis labels and + * custom tooltip providers. + */ +export default class LineChartDemo extends React.Component { + + public render(): React.ReactElement { + return ( +
+ { + var sum = 0; + + tooltipItems.forEach((tooltipItem) => { + sum += data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index] as number; + }); + return strings.SumLabel + sum; + }, + }, + footerFontStyle: 'normal' + }, + hover: { + mode: 'index', + intersect: true + }, + scales: { + xAxes: [{ + display: true, + scaleLabel: { + display: true, + labelString: strings.XAxisLabel + } + }], + yAxes: [ + { + stacked: true, + display: true, + scaleLabel: { + display: true, + labelString: strings.YAxisLabel + } + } + ] + } + }} + /> +
+ ); + } + + + /** + * Loads data from a service. + * This is where you would replace for your own code + */ + private _loadAsyncData(): Promise { + return new Promise((resolve, reject) => { + // we're using a mock service that returns random numbers. + const dataProvider: IChartDataProvider = new MockChartDataProvider(); + dataProvider.getMultiDataset(2, 7).then((dataSets: Array) => { + const data: Chart.ChartData = + { + labels: strings.ChartLabels, + datasets: [{ + label: strings.DataSet1Label, + fill: false, + lineTension: 0, + backgroundColor: styles.backgroundColor1, + borderColor: styles.borderColor1, + borderCapStyle: 'butt', + borderDash: [], + borderDashOffset: 0.0, + borderJoinStyle: 'miter', + pointBorderColor: styles.pointBorderColor1, + pointBackgroundColor: styles.pointBackgroundColor1, + pointBorderWidth: 0, + pointHoverRadius: 8, + pointHoverBackgroundColor: styles.pointHoverBackgroundColor1, + pointHoverBorderColor: styles.pointHoverBorderColor1, + pointHoverBorderWidth: 1, + pointRadius: 5, + pointHitRadius: 10, + data: dataSets[0], + }, + { + label: strings.DataSet2Label, + fill: false, + lineTension: 0, + backgroundColor: styles.backgroundColor2, + borderColor: styles.borderColor2, + borderCapStyle: 'butt', + borderDash: [], + borderDashOffset: 0.0, + borderJoinStyle: 'miter', + pointBorderColor: styles.pointBorderColor2, + pointBackgroundColor: styles.pointBackgroundColor2, + pointBorderWidth: 0, + pointHoverRadius: 8, + pointHoverBackgroundColor: styles.pointHoverBackgroundColor2, + pointHoverBorderColor: styles.pointHoverBorderColor2, + pointHoverBorderWidth: 1, + pointRadius: 5, + pointHitRadius: 10, + data: dataSets[1], + pointStyle: "triangle" + } + ] + }; + resolve(data); + }); + }); + } +} + diff --git a/samples/react-chartcontrol/src/webparts/lineChartDemo/loc/en-us.js b/samples/react-chartcontrol/src/webparts/lineChartDemo/loc/en-us.js new file mode 100644 index 000000000..cdaa0f596 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/lineChartDemo/loc/en-us.js @@ -0,0 +1,15 @@ +define([], function() { + return { + "Loading": "Loading...", + "DataSet1Label": "Cars", + "DataSet2Label": "Trucks", + "SumLabel": "Sum:", + "XAxisLabel": "Month", + "YAxisLabel": "Number (thousands)", + "ChartLabels": [ + 'January', 'February', 'March', 'April', 'May', 'June', 'July' + ], + "WebPartDescription": `

This web part demonstrates how to use the PnP ChartControl to render a line chart as per the Chart.js documentation

`, + "MoreInfoLinkUrl": "https://sharepoint.github.io/sp-dev-fx-controls-react/controls/ChartControl/" + } +}); diff --git a/samples/react-chartcontrol/src/webparts/lineChartDemo/loc/mystrings.d.ts b/samples/react-chartcontrol/src/webparts/lineChartDemo/loc/mystrings.d.ts new file mode 100644 index 000000000..8aee619f9 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/lineChartDemo/loc/mystrings.d.ts @@ -0,0 +1,16 @@ +declare interface ILineChartDemoWebPartStrings { + Loading: string; + DataSet1Label: string; + DataSet2Label: string; + SumLabel: string; + XAxisLabel: string; + YAxisLabel: string; + ChartLabels: string[]; + WebPartDescription: string; + MoreInfoLinkUrl: string; +} + +declare module 'LineChartDemoWebPartStrings' { + const strings: ILineChartDemoWebPartStrings; + export = strings; +} diff --git a/samples/react-chartcontrol/src/webparts/pieChartDemo/PieChartDemoWebPart.manifest.json b/samples/react-chartcontrol/src/webparts/pieChartDemo/PieChartDemoWebPart.manifest.json new file mode 100644 index 000000000..300d061f7 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/pieChartDemo/PieChartDemoWebPart.manifest.json @@ -0,0 +1,23 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx/client-side-web-part-manifest.schema.json", + "id": "0ccdae4a-e8b0-4bd8-aba3-30d54444ee10", + "alias": "PieChartDemoWebPart", + "componentType": "WebPart", + + "version": "*", + "manifestVersion": 2, + + "requiresCustomScript": false, + + "preconfiguredEntries": [{ + "groupId": "5c03119e-3074-46fd-976b-c60198311f70", + "group": { "default": "Other" }, + + "title": { "default": "Pie Chart" }, + "description": { "default": "Demonstrates how to render a pie chart" }, + "officeFabricIconFontName": "PieDouble", + "properties": { + "description": "Pie Chart" + } + }] +} diff --git a/samples/react-chartcontrol/src/webparts/pieChartDemo/PieChartDemoWebPart.ts b/samples/react-chartcontrol/src/webparts/pieChartDemo/PieChartDemoWebPart.ts new file mode 100644 index 000000000..d823792d3 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/pieChartDemo/PieChartDemoWebPart.ts @@ -0,0 +1,56 @@ +import * as React from 'react'; +import * as ReactDom from 'react-dom'; +import { Version } from '@microsoft/sp-core-library'; +import { + BaseClientSideWebPart, + IPropertyPaneConfiguration, +} from '@microsoft/sp-webpart-base'; +import { PropertyPaneWebPartInformation } from '@pnp/spfx-property-controls/lib/PropertyPaneWebPartInformation'; + +import * as strings from 'PieChartDemoWebPartStrings'; +import PieChartDemo from './components/PieChartDemo'; +import { IPieChartDemoProps } from './components/IPieChartDemo.types'; + +export interface IPieChartDemoWebPartProps { + description: string; +} + +export default class PieChartDemoWebPart extends BaseClientSideWebPart { + + public render(): void { + const element: React.ReactElement = React.createElement( + PieChartDemo + ); + + ReactDom.render(element, this.domElement); + } + + protected onDispose(): void { + ReactDom.unmountComponentAtNode(this.domElement); + } + + protected get dataVersion(): Version { + return Version.parse('1.0'); + } + + protected getPropertyPaneConfiguration(): IPropertyPaneConfiguration { + return { + pages: [ + { + groups: [ + { + groupFields: [ + PropertyPaneWebPartInformation({ + description: strings.WebPartDescription, + moreInfoLink: strings.MoreInfoLinkUrl, + key: 'webPartInfoId' + }) + ] + } + ] + } + ] + }; + } +} + diff --git a/samples/react-chartcontrol/src/webparts/pieChartDemo/components/IPieChartDemo.types.ts b/samples/react-chartcontrol/src/webparts/pieChartDemo/components/IPieChartDemo.types.ts new file mode 100644 index 000000000..dfadbed82 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/pieChartDemo/components/IPieChartDemo.types.ts @@ -0,0 +1,3 @@ +export interface IPieChartDemoProps { + +} diff --git a/samples/react-chartcontrol/src/webparts/pieChartDemo/components/PieChartDemo.module.scss b/samples/react-chartcontrol/src/webparts/pieChartDemo/components/PieChartDemo.module.scss new file mode 100644 index 000000000..d2f721025 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/pieChartDemo/components/PieChartDemo.module.scss @@ -0,0 +1,13 @@ +@import '~@microsoft/sp-office-ui-fabric-core/dist/sass/SPFabricCore.scss'; + +.pieChartDemo { + color:inherit; +} + +:export { + color1: rgb(255, 99, 132); + color2: rgb(255, 159, 64); + color3: rgb(255, 205, 86); + color4: rgb(75, 192, 192); + color5: rgb(54, 162, 235); +} diff --git a/samples/react-chartcontrol/src/webparts/pieChartDemo/components/PieChartDemo.tsx b/samples/react-chartcontrol/src/webparts/pieChartDemo/components/PieChartDemo.tsx new file mode 100644 index 000000000..6d13f4216 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/pieChartDemo/components/PieChartDemo.tsx @@ -0,0 +1,251 @@ +import * as React from 'react'; +import styles from './PieChartDemo.module.scss'; +import { IPieChartDemoProps } from './IPieChartDemo.types'; +import * as strings from 'PieChartDemoWebPartStrings'; + +// used to add a chart control +import { ChartControl, ChartType } from '@pnp/spfx-controls-react/lib/ChartControl'; + + +// used to retrieve (fake) data from a (fake) service +import IChartDataProvider from '../../../services/ChartDataProvider/IChartDataProvider'; +import MockChartDataProvider from '../../../services/ChartDataProvider/MockChartDataProvider'; + +// used to render the toolbar above the chart +import { + CommandBar +} from 'office-ui-fabric-react'; + +/** + * Define the chart colors: + * Red, + * Orange, + * Yellow, + * Green, + * Blue + */ +const chartColors: string[] = [ + styles.color1, + styles.color2, + styles.color3, + styles.color4, + styles.color5 +]; + +const DATA_LENGTH: number = 5; +/** + * This sample demonstrates add and modifying the data in a pie chart + */ +export default class PieChartDemo extends React.Component { + /** + * The chart element + */ + private _chartElem: ChartControl = undefined; + + /** + * Handle to async requests + */ + private _asyncRequest = undefined; + + /** + * When component is mounted, get the data + * It is better to use componentDidMount than + * componentWillMount to prevent calling the service + * more than once. + */ + public componentDidMount(): void { + // by default, load only one dataset + this._loadAsyncData(1); + } + + /** + * Before we unmount, cancel any pending requests + */ + public componentWillUnmount(): void { + // any outstading requests? + if (this._asyncRequest) { + // cancel them! + this._asyncRequest.cancel(); + } + } + + /** + * Renders the pie chart with a toolbar above it + */ + public render(): React.ReactElement { + return ( +
+ {this._renderCommandBar()} + +
+ ); + } + + /** + * Renders the command bar control. + */ + private _renderCommandBar(): JSX.Element { + return ( + { this._handleRandomizeData(); }, + ['data-automation-id']: 'randomizeData' + }, + { + key: 'addDataSet', + name: strings.AddDatasetCommandLabel, + iconProps: { + iconName: 'Table' + }, + onClick: () => { this._handleAddDataset(); }, + ['data-automation-id']: 'addDataset' + }, + { + key: 'removeDataSet', + name: strings.RemoveDatasetCommandLabel, + icon: 'DeleteTable', + onClick: () => { this._handleRemoveDataset(); }, + ['data-automation-id']: 'removeDataset' + }, + ]} + /> + ); + } + + /** + * Links a reference to the chart so that we can + * refer to it later and change its data + */ + // tslint:disable-next-line no-any + private _linkElement = (e: any) => { + this._chartElem = e; + } + + /** + * Loads data from a service. + * This is where you would replace for your own code + */ + private _loadAsyncData = (numDatasets: number) => { + // Get the mock data provider + const dataProvider: IChartDataProvider = new MockChartDataProvider(); + + // Create an async request + this._asyncRequest = dataProvider + .getMultiDataset(numDatasets, DATA_LENGTH) // we only need 5 data elements for this demo + .then((dataSets: Array) => { + // we got the data back + + // mark the request as done + this._asyncRequest = undefined; + + // get the chart's data + const { data } = this._chartElem.props; + + // iterate through all the datasets we have received + dataSets.forEach((returnedData: number[], dsIndex: number) => { + // if we already have that dataset, simply replace the data + if (data.datasets.length > dsIndex) { + // replace the data + data.datasets[dsIndex].data = returnedData; + } else { + // this is a new dataset! + const newDataset = { + backgroundColor: [], + data: [], + // create a dataset label (e.g.: Dataset 1) + label: strings.DataSetLabel + (dsIndex + 1).toString(), + }; + + // get the retrieved data + newDataset.data = returnedData; + + // map the colors + for (var index = 0; index < data.labels.length; ++index) { + //newDataset.data.push(returnedData[index]); + var newColor = chartColors[index % chartColors.length]; + newDataset.backgroundColor.push(newColor); + } + + // add the dataset + data.datasets.push(newDataset); + } + }); + + // update the chart without refreshing the entire web part + this._chartElem.update(); + }); + } + + /** + * Called when user clicks on Randomize Data. + * Reloads the entire dataset with newly retrieved randomized numbers + */ + private _handleRandomizeData = () => { + this._loadAsyncData(this._chartElem.getChart().data.datasets.length); + } + + /** + * Handles requests to add a new dataset. + */ + private _handleAddDataset = () => { + // get the chart's data + const data: Chart.ChartData = this._chartElem.getChart().data; + + // create a new dataset + var newDataset = { + backgroundColor: [], + data: [], + // give it a label (e.g.: Dataset 1) + label: strings.DataSetLabel + data.datasets.length.toString(), + }; + + // add new numbers and background colors + for (var index = 0; index < data.labels.length; ++index) { + // add a random number + newDataset.data.push(MockChartDataProvider.getRandomNumber()); + + // add the background color + var newColor = chartColors[index % chartColors.length]; + newDataset.backgroundColor.push(newColor); + } + + // add the new dataset + data.datasets.push(newDataset); + + // update that chart + this._chartElem.update(); + } + + /** + * Removes the oldset dataset + */ + private _handleRemoveDataset = () => { + // get the data from the chart + const data: Chart.ChartData = this._chartElem.getChart().data; + + // splice the array and remove a dataset + data.datasets.splice(0, 1); + + // update the chart. + this._chartElem.update(); + + // that's all there is to it! + } +} diff --git a/samples/react-chartcontrol/src/webparts/pieChartDemo/loc/en-us.js b/samples/react-chartcontrol/src/webparts/pieChartDemo/loc/en-us.js new file mode 100644 index 000000000..5351f7545 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/pieChartDemo/loc/en-us.js @@ -0,0 +1,16 @@ +define([], function() { + return { + "DataSetLabel": "Dataset ", + "ChartLabels": ['Red', + 'Orange', + 'Yellow', + 'Green', + 'Blue' + ], + "RandomizeCommandLabel": "Randomize data", + "AddDatasetCommandLabel": "Add dataset", + "RemoveDatasetCommandLabel": "Remove dataset", + "WebPartDescription": `

This web part demonstrates how to use the PnP ChartControl to render a pie chart.

It is inspired by the pie chart sample from Chart.js.

`, + "MoreInfoLinkUrl": "https://sharepoint.github.io/sp-dev-fx-controls-react/controls/ChartControl/" + } +}); diff --git a/samples/react-chartcontrol/src/webparts/pieChartDemo/loc/mystrings.d.ts b/samples/react-chartcontrol/src/webparts/pieChartDemo/loc/mystrings.d.ts new file mode 100644 index 000000000..86ce0db7d --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/pieChartDemo/loc/mystrings.d.ts @@ -0,0 +1,14 @@ +declare interface IPieChartDemoWebPartStrings { + DataSetLabel: string; + ChartLabels: string[]; + RandomizeCommandLabel: string; + AddDatasetCommandLabel: string; + RemoveDatasetCommandLabel: string; + WebPartDescription: string; + MoreInfoLinkUrl: string; +} + +declare module 'PieChartDemoWebPartStrings' { + const strings: IPieChartDemoWebPartStrings; + export = strings; +} diff --git a/samples/react-chartcontrol/src/webparts/polarAreaDemo/PolarAreaDemoWebPart.manifest.json b/samples/react-chartcontrol/src/webparts/polarAreaDemo/PolarAreaDemoWebPart.manifest.json new file mode 100644 index 000000000..7c9bc0484 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/polarAreaDemo/PolarAreaDemoWebPart.manifest.json @@ -0,0 +1,23 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx/client-side-web-part-manifest.schema.json", + "id": "75942037-254d-4c8d-a5d1-44031c957ebf", + "alias": "PolarAreaDemoWebPart", + "componentType": "WebPart", + + "version": "*", + "manifestVersion": 2, + + "requiresCustomScript": false, + + "preconfiguredEntries": [{ + "groupId": "5c03119e-3074-46fd-976b-c60198311f70", + "group": { "default": "Other" }, + + "title": { "default": "Polar Area" }, + "description": { "default": "Demonstrates how to render a polar area chart" }, + "iconImageUrl": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAcCAYAAAATFf3WAAACUmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS41LjAiPgogPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICB4bWxuczpleGlmRVg9Imh0dHA6Ly9jaXBhLmpwL2V4aWYvMS4wLyIKICAgIHhtbG5zOmF1eD0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC9hdXgvIgogICB0aWZmOkltYWdlTGVuZ3RoPSIzMSIKICAgdGlmZjpJbWFnZVdpZHRoPSI0MCIKICAgeG1wOkNyZWF0b3JUb29sPSJ3d3cuaW5rc2NhcGUub3JnIgogICBleGlmRVg6TGVuc01vZGVsPSIiCiAgIGF1eDpMZW5zPSIiLz4KIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+Cjw/eHBhY2tldCBlbmQ9InIiPz4IAY9JAAABgWlDQ1BzUkdCIElFQzYxOTY2LTIuMQAAKJF1kb9LQlEUxz9qoZRhUENQg4Q1aVhB1NKglAXVoAZZLfryR6D2eE8JaQ1ahYKopV9D/QW1Bs1BUBRBNDQ1F7WUvM7LwIg8l3PP537vPYd7zwVrNKvk9AY/5PIFLRwKuOdi8277E04cWOnEHld0dToyHqWuvd9iMeO1z6xV/9y/1ryU1BWwOIRHFVUrCE8IT60WVJO3hNuVTHxJ+ETYq8kFhW9MPVHlZ5PTVf40WYuGg2BtFXanf3HiFysZLScsL8eTyxaVn/uYL3Em87MRid3iXeiECRHAzSRjBBminxGZh/AxQJ+sqJPv/86fYUVyFZlVSmgskyZDAa+oRamelJgSPSkjS8ns/9++6qnBgWp1ZwAaHw3jtQfsm1ApG8bHgWFUDsH2AOf5Wv7KPgy/iV6uaZ49cK3D6UVNS2zD2QZ03KtxLf4t2cStqRS8HENLDNquoGmh2rOffY7uILomX3UJO7vQK+ddi18GdWe6DGczlQAAAAlwSFlzAAAQTQAAEE0BZ4wB4AAABFlJREFUWIWt2MlvVWUYBvBf7y2lVCi1ZRCtWlTKECSKWiGCC4c4RHGhMUGj0X/AxJ07E1cuNBITVy7UxJUGo7hwRhaaiEZjoBEDSkAQZSzBWmhpe12835HT23NuL8YnOcm55/2G53vn71b9/2jDFRjFeO77A7gBm3ECPek5g1m4A69jDIPZpNYmNmxHPzpxFqdxKa5J8m9wBNdiAn1YhT2ooIbeROCjJPsTx+r2+TSRuzeNOy0tUIZZabE5JfI2XI6lifDs9P08fhMabMmR+x134u06cjfj9vS+A8PY1IAX6MAarBUaLCO4BMuE1tpKxjwhtNKHF4Ql8ngcL+f2WZ1+P4I51YJF+xO509iLcyUEJ8RpexKRowVjOrEQn2NEWGWwbsxokv0qfPY4nsWDqNSbeDXWpwk/NSCXx/X4q0RWxU7hW7WSMXvxQSKa4YDQ+DN5ggOJ3H581QSxDJP4o0TWKzRM+OYvDdaZjQ3CZd4Xhz6WRfFVuAdf4NuLIEeYpFcERj3GsQI/p99/C7N34nBuXBvW4UbhBosxhC1VEcl3pQ22C41cDGpYgFPCL/M4KTRyMpGrpvHLEoleYdqlIlsswm1C21/jjarwoYXYptxPGuGM0NRoAcGa8OfrRHI+m54WzBNpbDQ9u4Ryjoug2iHlwsdEcPxXdM8gbxFm7haOn6GCF2faOwuSwyXyBQ3mtgrt989AsCZ8cCSRbRPmXCU0X19RphHsEPmsCMtFtSjCrCRvVI3yOCeqSYuoLIvwVoO9/yXYbrrvZKiJalKEcXRpnDrqMYaVwicHsU9otiHBNtPLT4Z9mFsiO48rRYQ2g4o47GZ8aQbT5icN4+4S+aiItjJcrVz7GaoiQDaJtNKOg82QywjuEqcqwiQ2lshaxOEa+WCH6A370rgfRCu1vlmCRCnaVSJrFb5yn+KIflpUoTIMpLm3uNB7LsJW5a4zjUCLKM5F6BJ+9rxI5NtFzbwkzRnCw3ilZH4/Donkm3XXWcPbFCqiYXyzRL5WBNCteFKkFkKb/aJF2qg8yNqxOxHMMCY6pYbpJUNrIrGlRP5o7n2J0NzHiWC36HyOKPbDeYngqQLZWDPkuBDFZbloIPfeiecSsROij5sUPnqmYO5yUWmKMF7yvZBgUaueof70G0RdzdAtSBZ1QH2Yb2r9zXBUHH7GS1tFlLKuEvm7pnbLk+J+kR2qQ+S5enQJ8/4ocl89PsFlaa0ZCe4WSbTIj7biJdEiHRRm3Z8b26o4UbeJ6D8gGtH6tQfxHe4XZa8UVVFynhLp45xIHRmG8b24Lr4mOu53RJmrpTkP4TNTe8nzosr0CG12iga1R9TixcJdVgor7GxEMDNhl0gdC0SuGhGX85uEs3+YnokcmRHxj8GQyHcZJkTnskZUj4oom2PC5PPT4XYLf9xbRjBz0m3plAOJ4LpEfFU64R5Tb10ZJvGeSNZjou8bFsl/biK6Aq/m5hwS/WDRHWYa/gG+KPgywPse4AAAAABJRU5ErkJggg==", + "properties": { + "description": "Polar Area" + } + }] +} diff --git a/samples/react-chartcontrol/src/webparts/polarAreaDemo/PolarAreaDemoWebPart.ts b/samples/react-chartcontrol/src/webparts/polarAreaDemo/PolarAreaDemoWebPart.ts new file mode 100644 index 000000000..c7d811ef2 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/polarAreaDemo/PolarAreaDemoWebPart.ts @@ -0,0 +1,55 @@ +import * as React from 'react'; +import * as ReactDom from 'react-dom'; +import { Version } from '@microsoft/sp-core-library'; +import { + BaseClientSideWebPart, + IPropertyPaneConfiguration, +} from '@microsoft/sp-webpart-base'; +import { PropertyPaneWebPartInformation } from '@pnp/spfx-property-controls/lib/PropertyPaneWebPartInformation'; + +import * as strings from 'PolarAreaDemoWebPartStrings'; +import PolarAreaDemo from './components/PolarAreaDemo'; +import { IPolarAreaDemoProps } from './components/IPolarAreaDemo.types'; + +export interface IPolarAreaDemoWebPartProps { + description: string; +} + +export default class PolarAreaDemoWebPart extends BaseClientSideWebPart { + + public render(): void { + const element: React.ReactElement = React.createElement( + PolarAreaDemo + ); + + ReactDom.render(element, this.domElement); + } + + protected onDispose(): void { + ReactDom.unmountComponentAtNode(this.domElement); + } + + protected get dataVersion(): Version { + return Version.parse('1.0'); + } + + protected getPropertyPaneConfiguration(): IPropertyPaneConfiguration { + return { + pages: [ + { + groups: [ + { + groupFields: [ + PropertyPaneWebPartInformation({ + description: strings.WebPartDescription, + moreInfoLink: strings.MoreInfoLinkUrl, + key: 'webPartInfoId' + }) + ] + } + ] + } + ] + }; + } +} diff --git a/samples/react-chartcontrol/src/webparts/polarAreaDemo/components/IPolarAreaDemo.types.ts b/samples/react-chartcontrol/src/webparts/polarAreaDemo/components/IPolarAreaDemo.types.ts new file mode 100644 index 000000000..502eea814 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/polarAreaDemo/components/IPolarAreaDemo.types.ts @@ -0,0 +1,3 @@ +export interface IPolarAreaDemoProps { + +} diff --git a/samples/react-chartcontrol/src/webparts/polarAreaDemo/components/PolarAreaDemo.module.scss b/samples/react-chartcontrol/src/webparts/polarAreaDemo/components/PolarAreaDemo.module.scss new file mode 100644 index 000000000..3cb7f70d7 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/polarAreaDemo/components/PolarAreaDemo.module.scss @@ -0,0 +1,18 @@ +@import '~@microsoft/sp-office-ui-fabric-core/dist/sass/SPFabricCore.scss'; + +.polarAreaDemo { + color: inherit; +} + +:export { + color1: rgba(255, 99, 132, 0.5); + color2: rgba(255, 159, 64, 0.5); + color3: rgba(255, 205, 86, 0.5); + color4: rgba(75, 192, 192, 0.5); + color5: rgba(54, 162, 235, 0.5); + borderColor1: rgb(255, 99, 132); + borderColor2: rgb(255, 159, 64); + borderColor3: rgb(255, 205, 86); + borderColor4: rgb(75, 192, 192); + borderColor5: rgb(54, 162, 235); +} diff --git a/samples/react-chartcontrol/src/webparts/polarAreaDemo/components/PolarAreaDemo.tsx b/samples/react-chartcontrol/src/webparts/polarAreaDemo/components/PolarAreaDemo.tsx new file mode 100644 index 000000000..77adffa07 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/polarAreaDemo/components/PolarAreaDemo.tsx @@ -0,0 +1,226 @@ +import * as React from 'react'; +import styles from './PolarAreaDemo.module.scss'; +import { IPolarAreaDemoProps } from './IPolarAreaDemo.types'; +import * as strings from 'PolarAreaDemoWebPartStrings'; + +// used to add a chart control +import { ChartControl, ChartType } from '@pnp/spfx-controls-react/lib/ChartControl'; + + +// used to retrieve (fake) data from a (fake) service +import IChartDataProvider from '../../../services/ChartDataProvider/IChartDataProvider'; +import MockChartDataProvider from '../../../services/ChartDataProvider/MockChartDataProvider'; + +// used to render the toolbar above the chart +import { + CommandBar +} from 'office-ui-fabric-react'; + +/** + * Define the chart colors: + * Red, + * Orange, + * Yellow, + * Green, + * Blue + */ +const chartColors: string[] = [ + styles.color1, + styles.color2, + styles.color3, + styles.color4, + styles.color5 +]; + +const borderColors: string[] = [ + styles.borderColor1, + styles.borderColor2, + styles.borderColor3, + styles.borderColor4, + styles.borderColor5 +]; + +const DATA_LENGTH: number = 5; + +export default class PolarAreaDemo extends React.Component { + /** + * The chart element + */ + private _chartElem: ChartControl = undefined; + + public render(): React.ReactElement { + return ( +
+ {this._renderCommandBar()} + +
+ ); + } + + /** + * Renders the command bar control. + */ + private _renderCommandBar(): JSX.Element { + return ( + { this._handleRandomizeData(); }, + ['data-automation-id']: 'randomizeData' + }, + { + key: 'addData', + name: strings.AddDataCommandLabel, + iconProps: { + iconName: 'InsertColumnsRight' + }, + onClick: () => { this._handleAddData(); }, + ['data-automation-id']: 'addDataset' + }, + { + key: 'removeData', + name: strings.RemoveDataCommandLabel, + icon: 'InsertColumnsLeft', + onClick: () => { this._handleRemoveData(); }, + ['data-automation-id']: 'removeData' + }, + ]} + /> + ); + } + + /** + * Links a reference to the chart so that we can + * refer to it later and change its data + */ + // tslint:disable-next-line no-any + private _linkElement = (e: any) => { + this._chartElem = e; + } + + /** + * Loads data from a service. + * This is where you would replace for your own code + */ + private _loadAsyncData(): Promise { + return new Promise((resolve, reject) => { + // Get the mock data provider + const dataProvider: IChartDataProvider = new MockChartDataProvider(); + + // Create an async request + dataProvider + .getNumberArray(DATA_LENGTH) // we only need 5 data elements for this demo + .then((numbers: number[]) => { + // get the chart's data + const data: Chart.ChartData = { + labels: strings.ChartLabels, + datasets: [ + { + backgroundColor: [...chartColors], // we use the spread (...) notation to copy the colors + borderColor: [...borderColors], // we use the spread (...) notation to copy the colors + borderWidth:1, + data: numbers, + label: strings.DataSetLabel + } + ] + }; + resolve(data); + }); + }); + } + + /** + * Called when user clicks on Randomize Data. + * Reloads the entire dataset with newly retrieved randomized numbers + */ + private _handleRandomizeData = () => { + const data = this._chartElem.getChart().data; + data.datasets.forEach((piece, i) => { + const dataElements: number[] = piece.data as number[]; + dataElements.forEach((value, j) => { + data.datasets[i].data[j] = MockChartDataProvider.getRandomNumber(); + }); + }); + + this._chartElem.update(); + + } + + /** + * Handles requests to add a new dataset. + */ + private _handleAddData = () => { + // get the chart's data + const data: Chart.ChartData = this._chartElem.getChart().data; + + const dataSet = data.datasets[0]; + + const labels: string[] = data.labels as string[]; + labels.push('data #' + labels.length.toString()); + + const colorName = chartColors[labels.length % 5]; + const backgroundColors: string[] = dataSet.backgroundColor as string[]; + backgroundColors.push(colorName); + + const borderColor: string[] = dataSet.borderColor as string[]; + borderColor.push(borderColors[labels.length % 5]); + + const dataElements: number[] = dataSet.data as number[]; + dataElements.push(MockChartDataProvider.getRandomNumber()); + + // update that chart + this._chartElem.update(); + } + + /** + * Removes the oldset dataset + */ + private _handleRemoveData = () => { + const data: Chart.ChartData = this._chartElem.getChart().data; + + data.labels.pop(); + + const backgroundColors: string[] = data.datasets[0].backgroundColor as string[]; + backgroundColors.pop(); + + const borderColor: string[] = data.datasets[0].borderColor as string[]; + borderColor.pop(); + + const dataElements: number[] = data.datasets[0].data as number[]; + dataElements.pop(); + + // update that chart + this._chartElem.update(); + } +} diff --git a/samples/react-chartcontrol/src/webparts/polarAreaDemo/loc/en-us.js b/samples/react-chartcontrol/src/webparts/polarAreaDemo/loc/en-us.js new file mode 100644 index 000000000..46faed4f8 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/polarAreaDemo/loc/en-us.js @@ -0,0 +1,18 @@ +define([], function () { + return { + "ChartTitle": "Polar Area Chart", + "DataSetLabel": "My dataset", + "ChartLabels": [ + 'Red', + 'Orange', + 'Yellow', + 'Green', + 'Blue' + ], + "RandomizeCommandLabel": "Randomize data", + "AddDataCommandLabel": "Add data", + "RemoveDataCommandLabel": "Remove data", + "WebPartDescription": `

This web part demonstrates how to use the PnP ChartControl to render a polar area chart as per the Chart.js sample

`, + "MoreInfoLinkUrl": "https://sharepoint.github.io/sp-dev-fx-controls-react/controls/ChartControl/" + } +}); diff --git a/samples/react-chartcontrol/src/webparts/polarAreaDemo/loc/mystrings.d.ts b/samples/react-chartcontrol/src/webparts/polarAreaDemo/loc/mystrings.d.ts new file mode 100644 index 000000000..f9abb054c --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/polarAreaDemo/loc/mystrings.d.ts @@ -0,0 +1,15 @@ +declare interface IPolarAreaDemoWebPartStrings { + ChartTitle: string; + DataSetLabel: string; + ChartLabels: string[]; + RandomizeCommandLabel: string; + AddDataCommandLabel: string; + RemoveDataCommandLabel: string; + WebPartDescription: string; + MoreInfoLinkUrl: string; +} + +declare module 'PolarAreaDemoWebPartStrings' { + const strings: IPolarAreaDemoWebPartStrings; + export = strings; +} diff --git a/samples/react-chartcontrol/src/webparts/radarDemo/RadarDemoWebPart.manifest.json b/samples/react-chartcontrol/src/webparts/radarDemo/RadarDemoWebPart.manifest.json new file mode 100644 index 000000000..67c0cf09a --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/radarDemo/RadarDemoWebPart.manifest.json @@ -0,0 +1,23 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx/client-side-web-part-manifest.schema.json", + "id": "510b8ccc-c873-4a41-87ca-b43d94bb6d20", + "alias": "RadarDemoWebPart", + "componentType": "WebPart", + + "version": "*", + "manifestVersion": 2, + + "requiresCustomScript": false, + + "preconfiguredEntries": [{ + "groupId": "5c03119e-3074-46fd-976b-c60198311f70", + "group": { "default": "Other" }, + + "title": { "default": "Radar Chart" }, + "description": { "default": "Demonstrates how to use a radar chart" }, + "iconImageUrl": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKUAAAClCAYAAAA9Kz3aAAACAWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS41LjAiPgogPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICB4bWxuczpleGlmRVg9Imh0dHA6Ly9jaXBhLmpwL2V4aWYvMS4wLyIKICAgIHhtbG5zOmF1eD0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC9hdXgvIgogICB0aWZmOkltYWdlTGVuZ3RoPSIyMDAiCiAgIHRpZmY6SW1hZ2VXaWR0aD0iMjAwIgogICBleGlmRVg6TGVuc01vZGVsPSIiCiAgIGF1eDpMZW5zPSIiLz4KIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+Cjw/eHBhY2tldCBlbmQ9InIiPz5VJmbdAAABgWlDQ1BzUkdCIElFQzYxOTY2LTIuMQAAKJF1kc8rRFEUxz8eIkajzIKyeGlYGQ1qYmMxYigsxii/NjPPmxk1b+b13kiyVbaKEhu/FvwFbJW1UkRKFlbWxIbpOc+okcy5nXs+93vvOd17LiixjGbYVUEwsnkrGgmr0zOzas0THmpR8NES12xzfHI4Rll7v6XCjdcBt1b5c/9a/YJua1BRKzygmVZeeER4bDlvurwl7NPS8QXhE+FOSy4ofOPqiSI/u5wq8qfLViw6CEqjsJr6xYlfrKUtQ1hejt/ILGk/93Ff4tGzU5MS28RbsYkSIYzKKEMMEqKbfplDBOihS1aUyQ9+50+Qk1xNZpMVLBZJkSZPp6hLUl2XmBRdl5Fhxe3/377ayd6eYnVPGKofHee1HWo2obDhOB8HjlM4hMoHOM+W8nP70Pcm+kZJ8++Bdw1OL0paYhvO1qH53oxb8W+pUlxJJuHlGBpmoOkK6uaKPfvZ5+gOYqvyVZewswsdct47/wUegmfFgvYzDgAAAAlwSFlzAAALEwAACxMBAJqcGAAAIABJREFUeJztnXucVVX5/98zDOMwTgiIiOQFERWRkJDwgtlkaIqICmimQKiYlxStr1+/ZWbzMzNFvqZY6tevGRF5A0nJW2Q2Gan1VUPylhdAUFJEBERFbvP747OWe589+7L22fvMDMP5vF7ndWbO2Xufvdd61rOe5/M861lQRhlllFFGGWWUUUYZZbQF7GReZeSADq19A1s5OgLHAt8z7x8Di4EtrXlTWzvKQlk8dgbOACYD+wK7Al8AapBgfth6t7Z1oyyUxWEocAEwHngGWGJe7wInAz2B94C3Wuf2tm6UhTIdaoGTkHY8EJgJTAN2B943f28BjgcGAk3AImBja9zs1oqyULqjN3A28C1gLfBz4HZgBVBvjvkt8DTSmIOAUUAdsBRY3aJ3uxWjLJTJqAS+DFwInAg8CtwAPAxsMMfUm/dGpBX/CbwG7ICm897AB8AbSHuWEYOq1r6BNo4uSKjGIY13I3An8O+E85qAp5AQvg6cBvQxr9mUtWYsypoyGgOA84CzkGBNA+4A1oQcW2/eGwOfr0OO0HKgLzAW6Gb+fzfvG24vKAtlc1QjznEy8BVgDpqu/wJsjjin3rw3hny3GXgZeMlcewyikD5B1FHUNbdZlIWyED2BMxHdUw3cDPwPclTiUG/eG2OOWYGcoDXAMGA44jSXII1ahkFZKD0chIRxHPB3NF3PQVGaJNSb98aE49YD/0BCvguyV3cBVlLmND9FWSgLucfPI+7xRuBZ3D3levPe6HCs5S4XIk5zFKKPmpDtus1zmtu6UO4JnIscmtXAz/C4xzSoN++NKc55H/g/5PAcQJnT/BTbqlBWAkcg7Xg8MA85M49QnKaqN++NKc+znObrQGc0ne+JyPltltPcFoWyC4pZTwY+C9wG3AT8K8M16817Y5Hnv4nMhY+BI4FDEYf8OrJDtylsa0I5AIUJzwJexSPDw7jHNPgyUEHxQgkep/km4jTHADsCb5PenChjK0A1mqZno/Df1cD+OV27CzDXvLrkdM0BwDXoXmche7M6p2u3eWwLmtJyj5PRlHgzcCuwLIdr90ea90SUKVSDQpBZozWW01yNpvKj8PI02z2n2d6F8mCac4+/xY17jIPNOL8QkeBLENc4FEVr8shAt5zmEjSwTkKcZrvP02yvQrk98mQvRHTLDCSQ/yC7R9sTL+O8E3AL8paXAg9RGK3JmoHeZK7xHApHbhOcZnsUyj7AOYh7XIW4x+nkkwBhM87HIafkBuBeJIibgJ8iKqcX+Wagr0bT+QqUPDwKUUjLEN/ZrtCehLISJVBY7vH3SDv+nuwaxR/1GYyXcf4M0lr15rg/URityTMD3XKaryKBPIl2mqfZXoSyG+IeL0Ra6n8R9/hKDtfuTXTGuUW9eW807+9Tugz0txCn+REyE4bRzjjN9iCUn0MCMwkJ4Q2Ie1yb8bouGecW9ea90fdZKTPQ1yHBfAuZK2NpR5zm1iyU1cBxaEqtRxzkNOCvZF937Y/67IaiPj9HeZFhqDfvjSHfBaM1hyDNtohsmm0zikK9iNiAsUA/2kGe5tYqlL2QZjwfPcPNaMrOg3tMk3FuUW/eGyO+L2UG+rvIVHgfCfxWz2lubUJZgRr+AuDraB3MDcB9ZOcei8k4t6g3740xx5QyA309sACZBTsjU6EXYh/ezHDdVsHWJJR1qLEnIzvyV4juWUA+3KON+qTJOLeoN++NDseWKgM9yGmOREzBVrf2fGsRyr1Q3uO5iPez3OPKHK6dJePcot68NzoeX8oMdMtpvoMG71bHabZ1oeyANMlk5NQ8gqbUeYiszoI8Ms4t6s17Y4pzSpmBvhF4Hnn+n8HL01yHNHKb5jTbslB2AyYgodkZJVHchMjjrPBHfbJknFvUm/fGIs4Ny0D/DNJseXKaXwG+iDz/xWS3wUuGtiqUA5FnfQZyDqYBdyGOLwts1OcC4ASkcadRfMa5Rb15byzy/GAG+tcQp5lHBvqHeHmaWwWn2daEshppigvRqJ6Fpusnyc49dsXTvLvicY9ZMs4t6s17Y8brWE7zI/LNQN+CAgsvoD4fDeyHggCL2Io5zVKjF3Ax8qYfQ1qyc07XHgBMQTbWPeSfNHsLMi3ygh2cNin5GvQMeWAHxPE2ogHwH8jJKsOHCqQRbkGj9jbgS2iqzYpqNE2XIuMcYDvEN76EIivHk6+wlyoDvRJp99tRm9+E+N+KHK6dGa09fdcBp6ApdX/EPd6IPNKsHuIuSCNcgMJwlnvMI+oDMgHOMtffHgnLQeRb9aJUGehN6B4XIBbDcpogIQ3G9lsUrSmUfZEHfC7i1G5E3ON7Ga9bgTLOJyPu8W/ILk3LPcZd/zAkjKcA85Ggv4Gew0ZT3iOfaEowAz3PaM0avDzNAUjT74D401bjNFtDKDsgI/5CNEIfRB7wo2TnHm3G+WREr/yK/DLOoVCz90eD6GeIA1wNXI+chuMQ9wn5ZIgHozXHkR+nuQlxmq8gKuok5KWvo5XyNFtaKLsB30ACuRMe9/haDtfug1ftIu+Mc4C9zbXPwdPsv0Iasd4ccx+e5ilFNKWUGejLEXW0DhVq+CIyexbRhjnNrDgAmIoE8E5gBPkUbbVRnxlIm9yIli3khSrgaBTxWYS04eDAMQ3m5cdQcy+Lzb0NJ18lMBQNvEVo8A0nH+ewCiWm3IX6aioaAC2GltCU2yFbZTIafXejzsqDe/RHfXYh34xzgO5Is082f9+KHKbXA8fVm/dG32c2mvIhIuwPI1/NE5aBbq+fldN8FU3pVSjBuUU5zVIL5WeRh3o+etibEOWTxxLRgWg6PZN8M84tBuFFlV5AtundhHu99ea9MfB5MJpiq168Y15ZEZaB3h2tPc8arVmJwp+rEKtwNMoXWEL2yFosSiWUFWjkXoBCZvNRp/6O7OtISplxDqJcTjDXH4amsSTNXm/eG0O+80dTqpBg5ql5ghnoY1AGeh7X/wQ5V4uRD3AyUjTvU8I8zVIIpd9D3Q/PQ/0n2T05m3F+AbKf8sw4h0LucRPumr3evDfGHPMu0prvI8rqq+SrecIy0DuRT57mG3ic5rFoDyFoA5ymC/YGrkBJFPejkVWTw3Vt1Odm1Mi3I0HIw7DHXOcwZDMuQYJ+eIrrN9Dc0Yn7rXr0DIvRMx1KftEUW+ZwOnqWm9AgyOP6NahP56I+bkB8c67IS1NWIe5xMvKqHyI/7rEOmQCTEcE7A02neWScg7i5r5vr9wN+SXrNXm/eGx2OtdGU5/A0z2AkNK+TXfNYTtNqtjw5003IDHkFbyVAH2Q7LyEnTjMPodwRz0PdEY97DHqoxcBGfc5Dhnfe3OM+5trnIp7uZ4h7XJXyOvXmvTHFOavRdP4OXjSlM7LV0v5+1PVLxZn+GzlYbZLTHAT8NxLAO5CHlhf3eBTwa/Sg04AhOVzXwnKPdxDNPbqgEk3zc1EYc48i72cIesZF6JmPIn9OsxScaRWaGe8kR06z2BsL81CnoThzHtyj1bw743GPeWScgyiTieb6XVGSRrGafRTwXWQT7gb0QB31WTRr1CENsoX4adNGUz5EmudwSsNp5s2ZWk7zBTRAR6Pw60YyeP7FGL+7Aqeird3eRZGOe8nHgzwAFQEYjRZxzSSfWkAWg1GSxgloee4MirN7d0fa578o1OBbUAetMa+15pX0/2rz3oS88nFo7/DfIs35XMr7i0K1uf541BZzUBsvzOHanRFPOg4plt+Y1/K0F0ojlJZ7HI+cmkdRpz5Bdu24HTL4xyH7ZxbqjJcyXteiBhn84xBNdQ+69zSRnyo0NQ31vfrj3oYbcRPQNYj6OgolesxHMfV5yK7O6jhi7ns8EqKFqK0fIruTZVmMCUjjz0Pt/CQpnCDXBv0M0l7j0RRlR0EeBGovpHVPQwb4TESIZ61DbrGbufapyOifiTSEa+SnC9KGB+EJY8+c7i2I9XgCuh7dexc0Fc5DM9NawgXa/r0ONyXRBU+zdUHtcgdFaLYQ7I7a/OtoLZBtcye+1EUo90E3fjLipmYCD5A9MmO5x/FoSnkMjdjHyScyY0et1ex21Lpq9j0pFMTBiIwOYi0atJuQVuuH4vBNyIvegnIU88gYb0Kx7iiBTBJY+50VjkqU5T8BFfN6CPVvKs0WgRpkc49DMnQ36t/EjLA4oaxCXtoE1Dn3o05dkPFmQQ7AaHTDvdAInYl7RYokdEbhtnEoPOaq2aspnKIPQqVVwtrp38AfkL13HJqer0TmwZHIbl2N+Lu5KHrTGQnoDubv4P95eMRNyL6PEsiw/7siL3oIClneiWarPLLnByMZGoUUwgykgCLNkCj6pjsirMejh7wOSXoeFSn6mps8GXluP0Kdlhe/tS+675NRPPhmkjV7NwptxaFImMPwMRpATyO7ehHeArfHzesJpBG+aa7ThCI4a4gWyKT/d0AaOWl2q/CdH4XNNBfQj/GouL2R3bkc9XmU9nVxQJ9FyuY1pCQakAzcTcQqg7AHtB7qKOShziSfyEwVoiPGo2n7d0idP53xuv7rH4Xu/WDkHCRp9r54GnEoinxsF3FsE6JtZqP79tteDYF30GxwhrmfgagdZyE2IQp1RAtoF9/fe6C23AFp7LW+72rJJ6TYZK5rhTKKMYgzFz7Ao4Vs1G88auv7UTs26x+/pqxByxPGI21zhzkpD35wR6R5x5nfvB5xm3ktht8JJYGMQzbcfxOt2bdDwvcFPGHsS/OOtNzidsgr/Q0y1h9wvKd1iLt9HS0xGI+0z94olBlWoH+deUU5G5VIcHsjhXESoujeRgNwA24a1yUfocJ3XhQ+Jr3AzsPLluqDaK/VaCZ7FlhphXJX1KGnmge8ihTeUgIGoQ45EXGPM8inFpCF32Z5Eg2kMM3enUJb8QtosATxIZpubKLBMpQpNAPZh2nxIOIuF6MMpx+i9p6BzIs02II6dqE59wXUtgeh55uBknM7Ey2QOzh+39HhfjqZ184R3zeh9gzasBvwlj8fgFiXT9BAm1qF4q4XoqnvYdSpT5CP9zUSCXt/PGcmqhpuMde33t2+5tozKeQeK5Dn5/eiDyDcE34LDZrd0RRYiWLZd6POzkLgL0ED/S00Y/wH0hKzkDlQTFtvQt7yIjx2pA8eOxIXP68mncDujJygzkjINiGNneSYVZjj6lCUKwx7mhfmN5ZVoQ49E02lbyPKoSPZiFQb9RmHptCrUePnlRVueTC/Zr8XT7PXIA3q14x9Qq6zGWmcv6HO3R+tiNwNhR7vQgM0D2xEGvdl5OFORIO1N3KCil1a/DKq/mGF83JUOjGObdiA+iXOce2EJ6Q9UTuORLmUq1DbrCPc5rXCXEc6+7YjcGyVeaiNyPapQ529Gs3vNsvEFf6oz1fxoj7zyY97/KK5/nDkNPwaZZ03oRHt14pDEN0RxAfo2f5uXh3MdU9AU/cVSFDyYBuCmI+EchkSTDud34mmr2KwFmVPvYba5lwkmFkibh+b19to9pmP2sxGa0Bm2IuIFXA1EXqgQd+VcIFdWYGMzr8hQ3MScgIGIBW/BTXgM8h+iZvC/FGfndF0/Rvy5R5tBKI7hRGIfhRqxc8RbhMtwxPEvyGOcQya+o5AHvss80ozpTYE3l1QaX53LEpb+yMKf/6abKaCjWCdhtLi8sxNAHn+dpZaTny0phLJRVfEiHwZ9c16wkvz/Au4qAMSPLv3388Qz2bX/3ZB08tApHVqkaH6UeBi++BV2n0bLy8xa7ULi37m2mcjwfoZauh9UafaThiOoil+W2cTEr65eCT6/Ujozga+gxr65yi9609F3F+9eW9McU4TckpeQm09Es0y2yOnqNgw61q8Sr79kKLoguzZPPrDX1Vjf+LzQLsiuTkSae5P0DPvgcwpv6Z8ALX/g7bz1qAOWoS0yHrUME+i9RmVyFDdG63/2B3ZY2vwKu0eizzNG8iH1wRp8WOQI3Y0EqbZ5n5OwouvDqb5tsZr0LQ+C08Y/4Ia82iU3HseorymmfsudpVlvXlvLOLcFWjaXoM66iRE5m+g+CIN/gxxW7G4L16GeFZTyl9Vo85cfy80uJYhZXEMckT3RrTai3h1QL+JBp//eqeb77dYSa1G0r8SkbJhU1cXZOQeiOwCkOR/BT34rcj4zcsO64HHPW7Gq6djCe8BhHt/i/Gm6L/jrY0GNeDpSJgHoen/HtQYWXCVeb8043VG4Gn+Z9FAiuI0XdEdrx1B020p+mkSEspH8XjQVeg5nkFaujdq80N859sBNIQQRXYlsjuSsqcrkdc4AfFlm5BGnYTshTwyz4cgzbXE/MYfEMm6DA2Y4GsDGlQ3oQTh/WhurwxALMBKZOdeTvGZ4n7sgzRkI9IKWdEbOT/L8JiL/hmvGcy0/ynFZdoHUYna+nSk7TehCM1E1N5+Wag2v7sFr9/WIs15edQPWEn9ZoqbutSccxtKhZ8KfA9xnmHEdBI6IR7vAUSofoCE8gPChXEV0nJXIJusR/NLUoFG8mwkvL9H4T8XcjgO/o5eZV4zyWdJSEc0yOehTrsHOUVZw4f7oFyDV8i22rQLcgwvQfUzpyDvf5P5LAxjUJ/avtuCZrKNaNb6FP6H3A5vG42jHW+uHxoZP0SCdCAa1VXmBl9CqvslklPj++AlauyHpoJONJ+i7a4Kfi/6H4QnXOyERvHpyCv9BSLDs3KP/ilxC95CrG7mfSb5JLAMQ4P0DGTbTycbpwnyhm0G1c549nbS2vlKJNRD8PrYFkJ4Bjk8lyKnOGgL90Umw4G+z5401+hkPv+UFw+OvClIU+6Pm9HfwVx8E8pd3II05IFoeuhujluJptdn8Ty03RGT/6F5kHpkT9WE3BfIfl1Aob34KtHUzTDkBE0kvw4FL2HleLyw5jDz3ROIEjuY/FL9uiOhnIja7Hayk/qVKClmAprV/oCeI4xP7oKe+UC8jKc1SBCfQX1bZe7HLwcWNWjaPsf32bvAD4Brkcf9/bibPdRccEKKB7wUORJBe8qGMCciu2iqeZ+A4uC/QHl1v8Orgxj2WonCaQ3Io+tOPEo19dmF+PejgMMVeM/cgMdR7oNXkOE+vIGWBRVIY85Gz5SXCbIrWme0kMI685VoFjwNOXFTUN+djhRI0Dzph2aqi0N+4zS89UdNSLteidieTSgHIRa1SPXOTfFgA5DqnRxzTHcU4bkUZQjZQgJRry2oU2egIlNDccvc7k3+TgJo6v8u6rx5aGDV+b5voHna2jeQJ7oQdfyuOdxHKZy1GjRw7kMzzzXILpxiXpcicy4qvxQkjOuR2eVHf7xS4fb1GErsfhj1sdOAvQFNca7rUKrQtNxIcpkTyzv6PTD/6yM0DVyPpt69HO8BRKdMR9P8k0iYt487wQF2Xff/Ijv2FjRVB7VuA82jObYM9a3m3FvN/1lLzdShZ7NRuNtx9wHCUIl4xSmo/Tcg3vYMwrVi2Pl/ReaU/9g61B/+/l2OKMReKJQ91fUmv4SE5hTXE1CHrMPL9ohDL/TwQYH8EBHJVyON54o6pKUt6f8LsnWSRWfUMY8hzX4J0ZkuDUSHGHc15z6HNOdE5GxkxQgkkOsRHZN2EHZGdvzFeB7022gA7Z7iOn1RfwY52kmoT23/bgIuQ0I8AcnYoa4/Uof4wdkpbuzzyNY5J+lANJpuRyPSL5SPo4a5FtkxpyJbJU6zDERCvArZpT8gXYNGoR+ye15Bcd0xRGekQ3KBK/8U+TKiZfbJ4T57oyl8KZ65ErffjvWgT0XPd4055wzk8NjSOGkwGfWlvzLGIPSc/v59GI+yux+ZibVpfugWpLWSnAqLahR2+gNuDsW+yNvz3/Rd6KZHoBF1LVLvF6MR7V9zUok0+Rw0GB5BDZuVH7RlSO5CWVNTUf5lEhpwS8YYhNY75VnmpiNKPbSO3SyaO3ad0Qz4HTyt+H1kSllBGYu01xG4w+acLsBzujqj9vP37VJkuoDMwveQiZAKR5qLjU5xzlXIy9rN8fh6Cm/8777vqlEHTkINOBVPew5FTsfLiFS/AVEwWdEDzwx4AsXFu8We4aEB9wyh7ubaT+BNu66DPw6Hoo5eh+LMlyAa5xQKteKZqG2DnvtdaLapwx29ze9d4fvsfGRS+KNtF+MNklOQ8Nen+B3Ay/qYmeKcochuOMPx+N0oFMoVhGvZnijZ43IknHORrfIOaoxiIkdB2LBmsQWmGkiXtlaF2IiZSGteRz5hv+6oTVYgYbkPCeNlaAaIWrbQDdmTt6b8vW+iPrf3PhQ9j79f76NwcN+DzMM0wv8pbkfeUliSbBhqkPZyXVhVjRrObwgHM32Cxw/Goxj+irTnKcjYLsar7WTOf4BsRUAbSCeUFsEisydRHKdZie7bakVbTGAB0opJdNooc3waB7ECmQzPm+t3QwLoF8jXKdypozsaMLckPUwUZqPcxGExx/ixHnXuocjDTsIGClftdSDeSdmAqKdfmP/Xmd8cghysixB94zoC9wC+jbRIR+DHeFuqtBReRebJVWiA/AA9h6sJVIee+SKktT6P2sRmFd2KBDNpacsYFMF7MsW9fxYlVD+AbNkzkDa2+ARFcvxm2eGI75yT4ncK0AUJze0pzrEhpnFJBxo8QuHIcqGheqEHfhmNUCuU1va8Ehn6exFuDpSivHMDxWlKC7uMxG6aGlfeugJpxa9RaCuehWaSajSw1hM9XfthE4Cnp7zniSg6czDq96U0d1yDBRFmIrMwrlBCrOe3GnF0R5mLuCz6ehY16mjc7NFFgf+/iB4mDssRVbMvEtCnzasXElD/grE3zXcL8DLp7ZKKHVC2eV5FnbLAmiNLUJuchrcy8V7U9nVIEx6IZrAK5Og9hZ7xbXOtvdAs8Dxu26IcjNourfYai6bn5ajGp1+7/wsNFL/MdEWe/SMkyFISHTEHNdBBiO5JwkfmR09B3mzSorPFgf9dTYXfAD9BUZ+fmM+WIydoHsrrHILI/OORrbQYcXRjkF16PfmUv8sTb+E5XKehNMC9kebbE3GlW5AwPI0EL3j/41G//trxN0cj4Z2f4j57otllBiLCj/R99xGasYKJKIeiwVT01G3hZJgGcARquLEOx46lUOWvwy0qsQfqjH8mHLcrEsoGFFFZj57nHFIStwloINv0HYQNJb6L7vkZxD6MJHnD+JeQeeMSa/8MooHuTHl/p6I+vhQpA38f/pJwuz6t4xyLtC68jQglTcOgqTYYbjzc8XdeRo3v4lTVoGl6C0pIvhZ5vWNJF9KMQgPZhbICb43OFchWvA3d8+24JaTYwfq842+mUSB+zEam0V8o7LuFhCfAdEZJMk4UowuNMgd5xa6F8NehKbSeZPJ5Cc3z91wJ+7tRR33N4dj1yJCvQNOeXSd+EPAttJnTIeSrPV2xPd7ubGfjrQCYj2x00L27mBlfR0zCHY6/PRpFV/7sfrvshBTHhxTGrj9AAymsFM1BSHNnnrotigkLfRV1+qiE4ypRvNU/2l7Djavrizrv2aQDDWxAYIb5vxMy8s9HmtNqz9GkTwdrIL2m3BNpKKsVr0ZmxRC8OPtdyL50TbRYiIS3t8OxtebaxTg4TTRfonIz0f2WKmztEnd9G2mWESi8F1zzHYankNE+lvjczC3IpvFHZfogwjepWsRrSNP2x82pshW/jkZe+GrzG0/hzQSD0Og/xNzX08gWzat2Zq35jSF4GUcf4jEIfhagG5pt5uC2mrEXcuQW41aIazAS3sscjvXD0nZ+c+4ZVOkubElKHWrzx3FcHuIaBZmNJywuWIPStL5CfJQGmnvgn6DMdBfMQVrFdcqfgxyFQwKfLzXfXY0omDeQthyLBuKJZMs+6u271igkQItR8sQ1aOAGaanDEM/oqsnGoraY5Xj8aDQw/+R4PGjwfznw2fuIAYkKOgxBbZcm68wJn0UPcG2Kc1xDV1MonAYWIbskLlXMYn80hbvW4OmKOv82h2N7402v15r7PA/xn8FpqoHm03ct0roXIMG7BnnQo4jOy/RjBhossUSzD0+jtnBJiatBXK9rSNjiUpqvELiOeCdsGumSxp3Tpt5CHX8cCoW5FOGfj/ivMcQv9g8S6CvQ6PocyVV+X0R24kA03cWVvwONateAwBLzeghvyu2NbMERiId7muaVzXqjqfEA1PlNeKbAQtzarguaZR5OuEeL7miALsVtG5ZBiGS/KulAH/qiQenHU0joopywWtRWf8Uj9xORJpdvNjJYP4c2J0/CKjQ1fBXxYVEFloJC2QHZcKNIFsomtPDsfHP8dIf7sgGBocjESIJdovEkErgDkcANQ5pwMfIsK8x92Oynj805YYKbhENIF2U5EQ2A3zoefwJeNQsX1KCamn4NvxIJ9ZKY8wYhs++KmGMyYXc0aq9McY711OISR/emcEp4E28Jggs3NwjFYB93vCcbELjJ8fgwbI9svotQ9OI5pAWvJXqKT4PbkJmRZI9b2GXOcVnnFjYhex7u8f5TKfS2tyCBTFJqU5DZ52KuFIUKJCwLcd8TZicUlYhLsa8lPCl0A25Z3xVIkG0BTxfMQho6Ky9ZgXjOhYiaOjfj9UDPsBT3XNYuSJu/gZuQDUYCfLbj9fej+YrERpKDFjUoupS1TlMivoWExdULB01BSQIQzDA5CjW0K11xK+5ZRuBlP3/R8fgoDESV5r6JUres/ZkFw9GznOB4/ARzvOvamivQAO7tcOz2KJrk75t/m3tMwheQ8E9yvK+i0QdxZpEFiUJg46SHxRzTSOGDj8CrHOti9w41v+FqI9mAwHWOx0ddYyYyZzohzXAFiqa4hD6jcBPp1kc9jp7dJXO9IzKLGnGjA8+geSL25Y7nXonMvTwW8sWiEsU7n8XdSdoFOT1xAvBLCoXyPLTIaT1uxQQqkXe3Fvfox1zkqRZj+9UiTnM6hUW1dkKaZSrFpftvj2aVexyPr8Pb4sRl6h5IcuEIiwPQ9Ovvl3mEFxELohqv6kYee/qg9LQpAAAPS0lEQVQk4juI4N4/xTkPEC8AP6Dw4afilQKJquIVhF0dmWbas0mqaVCJwoEPEN4G/ZDAn0/6JRqHk27N/cnomX+RdKCBLbGTtOSjM9L4/j5Zi3uyzCAk/N9yPD4z9kXC8t0U50wkXgDGUdgA9yJqyK4sdOlc26EPOd6TDQhc7Xi8xTFIYxwVc8wRKP90ZMprX086onkeemaXgVWFe3uehygtf5/c6nCexeXIzAvbkaMk6IBKhjyF+4q/XVHoMUoADqWwAWySxffQyHaJUlQh7ux93KfkR1AVWVc2wTo2ZxHfQRWkd3xslOV+x+Nt/fl3cOuH/YguQuXHEBQy9PfHR2gGcIEt4/MXspeoSYXvopHkWuUhuPItiF0orC+0Cj2QLZ51kePvzDLXGZF0oMEkCpeIxmEXCh2bJKR1fA5Gs4lrxbvjUVu5pqnZIlRxwtUNsSXBUKKrAwkyaT5BZl6Lwv7wt1Occw7RAlBFYbm4Lcj7tKPuz7iNuuHm3Psc78kGBJIiDrUodj0dN0Pfwjo+U0h2wK5B5oSr5/4A7ov6K9G0HSxC5UcFitr4y+lsML/hupYfPIW1b4pzckExKro38hT/X8T3L1A4Qm1ScQPuxbOqkZZ9D7fajRVo/xp/2ZEg/I5NMWUF90OOz7eIbiu7e8LDjtfcDj3nStyeM6oIlR/DaF4ndCnpaJ0OeOmAeexdnhppjdmwujN+PEBhg5xkPrfFs1yjJXNJVxPnPJoXaPLDxbFJwnDk+Bwb8b3NNnclmr+KntE1HSysCJUfOyH719/+ryChfBR3WqcYJzhXDELCEswciUNc40yjsFEsFVSNFoi5Ns5IvHXHLrABgTAt4urYJKES1fB5iPDQ6Y9Ip5HuRULpMlCSlEElKna1iULH5jrcK+lZFEMX5gorLH/EfSTFTSMXUSiU/hWUtniWS6d1QrbZCtymEBsQCNpbaR2bJNQg4ZtJod2YlmjuiKbtVbjlnPZG5k9DxPdH0HxF4q8QU+JqNkFxgZWS4MekG+FxBrf1Jv3RA4u0xbMeIV1Rzm9TWB65WMcmCT1Q9GoKXi7AAWj2ON/xGvXo2VwTdOMczF5oMPjb/Xk0C6ZxMKG4EHRJUEzQPYqaGEjzBWQWtniWKzE+xlxjuuPx+yCP8WLUCedRvGOThP4oB/Q881uXodnDtZS2jbQkLcqDeCquCs0CmymM2ownPRUHxSXrlARWWFy9RogmcbvQ3K7xT09TETHuQpnUofy/5biNdOs1PoE4zj9QWPUhbwxHwjISJZ3Mx/0+30GkuUva3W5EBy2OQSZO0GTqRLqgBRSX1hiJrHO/rbQ2CQmLS02eV9HNj0bGtF33vQbZSrYoUyfz91Lz/33IkD6C5FzDdaizv4SmraQM9s3m+pcjB+tFcz+ua93TYi3ybv8TZfJ/D7dNPA9CnvKjuK0qPRLxo0Hednfk3Ph3fPgH6o8NKJN9Ae4V6HZDbRW3NMIZeRikc5CwDMdbUx2HTaiRLkN2iH3wJpRa768U1gdPKG3xrLG4JcDehuyvSSQLJWiJRw3q+E8ovW1UhWzljrivXZ+EtJJrcdPRqH39dX2qEQvit7fXIGfyFWRWDUTP7zJQQCxALe4h0ljkIZQLkLCMwU0oQdq1AU2V/iIHi5FQWPTB2674I2RTnorbOu8HkeF9LOrIpphja9F0NpeWrU/5PGIkRiLnL077VaKVoetwy+beBQnedAoXq41ADqP19K3tPdf3PaRb6TgWCXRSbacWRdpllFHJpldRaOME1wPVo9F7suPv/BVNzVGkMRQ6Np9H9mhLvgaZ37aOTxQONM/e6PjsYcnVeyHh97fxU3hZ6JWkS64GL9tqiuPxLYZ60u+9E5aWP4nCBvtN4BxbPOtux98401zn+phjRiCno5SOTRKORM7VMTHH3ISeZbzjNYPLUGrQkgl/+65Ey6YtLI+cpmpG6j1xWgpWWFwzpsFbwOSPGBxBYaOFbYr5P8gDdSnAvyNq5MWEE9MDkUkwiRZOswqgEkWNHiRcq1cg2/pD3FY49qD5njhfR7ajP+nlago14vm4L9izsCZPaxQHS0Sxe+/4l3r2pvkipSCOIl2G+f8h4Q/uG+iP2GTd0DMPdEL3MpPmZtBAZIa47lwb3BPHboHtb9s/U1jD0tI6z+FO69i1Tjc4Ht/iSCssoJG6Bq9xaijcIm8jzZfNBqunJeF8cy0/V1eqiE1W9ED3dDWFmuc69AxnOV7HvydOLWIi/AL5Ns3j5nsgbjdN4QC7KvRLKc5pURSz945NbJ3o+2wRhQ0YtsB+Ou6L9Xsi7/NV83+pIzZZ0R/d2zl4JsUiFHFymYWCe+KcTvMViQ00zwuwe+Kk4WZnk2FPnJZCMXvvBAstPUqhUB4Xcp7NBHLNMF+AtG4f2oZjkwS7MfzRKKqyCTeuFQoLiw1EgYBgTkEYS/II7oXFoLjS460CKyxReYNhuA5lvNha3rawgH2FLQe12sClehoopNmEQpVtwbFJQiXSXA8i5qAJVW9zwQxUkGw3mq9IfJPwFYm7kp7WGW2umfvgzjvFyFbXGoMa1AW/RYH/L6NGXBz4PiyJeBXptlO5C3Ggdn+fp2nFRFRH1KCp9At4G4EmwVZrexTNMP46nxuRNx62C8RwVITMtUAWSCjfRIsIc0XeQvk+qrR2JO577zyD7JKxSCiDVdiiMttnI5rDpXraKkR1dEH2pavWaW1UIOH8BLe2tHvi/AuFfv2swiN4hf2DGI22QQluMxIF5z1xikEpkjHTCAt44cOvoQSBoKaMSjJ9HBXPGp3wO5XIkfqbOW6zwz21JXRAg3wCMm3i4tFjED95OIWpcEvQTBFW3rknivrMwL2M9jBkbuVenbdUKKbUniXNxyJaxL/cdg3Rg2c2yYXqtwbHJgl+xycKn0EE+2tIs9r2W098XqSldVyrX4Dn0LqWKmwTmI00nitVYBv0DqQZVlMYeYjaY9DGd6MatK1EbLLC7/hE1aC0A9vfdk3IFo0THpeB7Ucx1F+bQDGk6m3ISeqGogr+ho0qS9IT2Ythse22FrHJik5oCp5BOKVjp/bgisS4QgvFzGrFBEnaBOKEJQrH4KX5B/eNPjXmPFs9zb+4q61GbLKiJxLKYMSnDmkvv1B+RHJhVEvruNSbtEgbTm5TCBOWOPi3+LVhNfv6fsx5E5HzYrchaesRm6wYgKbxs/FMkrMobK8mJLxJ5tMdpNuBopjEmzaFb1AoLC6YgUb8JRQ2cFypuyDx2x4cmyQcjZiEs5ET8zLNVyQm1T/vihJeXAMQUFyKYptCMcmfNkTWQGEjP5Zw3u9RiOxA2odjE4XOKOfxMESJvYm4Yf+0/QFuRbLShmpBydwrSbEnTjEo5aJxu/fOSFQU9ROHc+zeO8GcwqTSMPciY/0y9EzLcSv81FZRjWzGWuQVb2/+7oZs5J1Qml/Yrgt34sYfjkGa0jUdzu6JM58Ue+IUg1JXMpiDhMVloyaQc9SINMEmvPvriWzTKHLXLlE9FkUlXKv/tiVU+N474gmiXzCTKn4sRvH9pJWOnZF58xiazVxQ8j1xLEotlL9HgnQC7lkuc9AanNV42UbbofDZ6yHHV6K4+V9QCZm2iGqk4fyvnRA/G0SWGuGzcNtx7GCkZdNEZEajkGKaWpVFodRCuRRlfo9CI8xlTXAj0pibAp/3IVwoj0ZC/yNaoMESUIUncP73HmjwVCKh87/S4BNEx9hXV5RRb9s1LFM/DKPN+WHJGWGoQWbYE7it7c+EUgtlE9J816HGe87hnBXIiA9mRofFwAeizPK7SXaG8kQHxNP5hS5KGHsAO6S8/kYU11/he18R8n9XtNRhA5reh6OB+XzMte1Wx3/GcatjZH71RaZBydES1bEeRh74KNyEEiTIwYhB0NnZBdmOz6LIjevC+TSoxHMu/IIXFDr76kI67bcZCcYKmgteUBhXEJ6RY9eA16KFcv+J2uWdiN+0Wx2nsbtPQHbqvKQD80BL7HFSiTRfJ1RoIDgth6EXso388dhZeOu9a4Efopj4JSQXJnBBN6I1XVAL7kg6ymkLWmAV1HRRWvD9Ip+hJ1IAbyJzJswxnIYiZPsTLbh+VKP0wneQcxRX1CEXtISm3II0309Qav+LDucsR170MN9ndvq2qWj9gf8ivUDugPu02510ZZKbkEDFCZz/81Xkq+HfRpuWXo3WhwfzJ/20jotAgtq5H3AzLSCQ0HLFLR9CyQQjcRNKEPfoF8reeKVLTkSx7bhr1eE+7XbHrXa4hS2b5zrtvkfL5XH+E7gRFdVfQuGUWwytMwo5WCXf+NOiRbYoQ9rmCTRqh+GmHWzxK3uPm1GK2mVI895urlNLvLYLfu66MMriA9yn3XdxM09KDZvqNhLNJi+Yz6eiaFd/3LxouyHUOrwQY8nRUkIJWhNzORqtLlxaBUrw9XN5v0OdPgMRwHHCmLYk9Ee4T7sryKHkXYlRi9q7J7K71+IVI3MNLQ5AjuQlpMv4yoSWFMq0D9gRWEZhgu9GpHFr8AQx7ZrjINcXN+2uoLBi2daGnsjGfAOxIH9G68ldkzC+ixzKA3BTJLmgJYUy7VQwGHntrhnRQWxGmnZt4N06IkEtuK7I32nrGIgyiZYie3wAXs3POFiTqwmZXC22tqklq/hvQjmWFyOnJbhqMYiBFC+QcahBPF3J96FuQ+iK2nOZebmgL9KQl9PCi+1aemuJ+1HC7tEkp+AvRY3hp2Q2ms9X+V6uCQXbMv6IBuOhKLLmwoDYYrNpiqfmgpacviEdEdvPHLsZOTur0GL5RgqF0pa3KyMeNSgk24PkgEMxAY+tGi4bNdWiyMQMtKj+x6h8S+9S31w7h+tiur0QG9Hqe+K0FOxGTWdGfG/X2PwOb41N5m0wyvgULsuObfHUVt8Tp6WQtFGTXWOTZoVdGekwAhU3CGvjXPfE2ZowlfC9rdtL8YC2jrDZyMIWTw1ugtDucRjiKcf5PutF+yoe0NaxPbLbf0nh2vhiiqe2C9SiuPZ9vv/DGqiM0sIqgh/hKYK0xVPbFfzLNdtz8YC2Dr/JVEzx1NyRJlcwb3yM4rBrEJn+UxSGDK5hKb9K+1ph+mASSl4+CvGYb0Z3XWnR0uS5H3XICwcJ6F2USfDWQiWy7zsgKmgA7rUqc0dr7mC/DvgVXlmXYTHHllF62FyERlpRIKF1NSVooVXalX5llBar0XReRhlllFFGGWWUUUYZWy3+P88mapxz2onBAAAAAElFTkSuQmCC", + "properties": { + "description": "Radar Chart" + } + }] +} diff --git a/samples/react-chartcontrol/src/webparts/radarDemo/RadarDemoWebPart.ts b/samples/react-chartcontrol/src/webparts/radarDemo/RadarDemoWebPart.ts new file mode 100644 index 000000000..8daf3f2a3 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/radarDemo/RadarDemoWebPart.ts @@ -0,0 +1,55 @@ +import * as React from 'react'; +import * as ReactDom from 'react-dom'; +import { Version } from '@microsoft/sp-core-library'; +import { + BaseClientSideWebPart, + IPropertyPaneConfiguration, +} from '@microsoft/sp-webpart-base'; +import { PropertyPaneWebPartInformation } from '@pnp/spfx-property-controls/lib/PropertyPaneWebPartInformation'; + +import * as strings from 'RadarDemoWebPartStrings'; +import RadarDemo from './components/RadarDemo'; +import { IRadarDemoProps } from './components/IRadarDemo.types'; + +export interface IRadarDemoWebPartProps { + description: string; +} + +export default class RadarDemoWebPart extends BaseClientSideWebPart { + + public render(): void { + const element: React.ReactElement = React.createElement( + RadarDemo + ); + + ReactDom.render(element, this.domElement); + } + + protected onDispose(): void { + ReactDom.unmountComponentAtNode(this.domElement); + } + + protected get dataVersion(): Version { + return Version.parse('1.0'); + } + + protected getPropertyPaneConfiguration(): IPropertyPaneConfiguration { + return { + pages: [ + { + groups: [ + { + groupFields: [ + PropertyPaneWebPartInformation({ + description: strings.WebPartDescription, + moreInfoLink: strings.MoreInfoLinkUrl, + key: 'webPartInfoId' + }) + ] + } + ] + } + ] + }; + } +} diff --git a/samples/react-chartcontrol/src/webparts/radarDemo/components/IRadarDemo.types.ts b/samples/react-chartcontrol/src/webparts/radarDemo/components/IRadarDemo.types.ts new file mode 100644 index 000000000..ab881d61d --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/radarDemo/components/IRadarDemo.types.ts @@ -0,0 +1,7 @@ +export interface IRadarDemoProps { + +} + +export interface IRadarDemoState { + +} diff --git a/samples/react-chartcontrol/src/webparts/radarDemo/components/RadarDemo.module.scss b/samples/react-chartcontrol/src/webparts/radarDemo/components/RadarDemo.module.scss new file mode 100644 index 000000000..6ea8b2804 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/radarDemo/components/RadarDemo.module.scss @@ -0,0 +1,13 @@ +@import '~@microsoft/sp-office-ui-fabric-core/dist/sass/SPFabricCore.scss'; + +.radarDemo { + color: inherit; +} + +:export { + menBackground: rgba(54, 162, 235, 0.2); + menBorder: rgba(54, 162, 235, 1); + pointBorder: #fff; + womenBackground: rgba(255, 99, 132, 0.2); + womenBorder: rgba(255, 99, 132, 1); +} diff --git a/samples/react-chartcontrol/src/webparts/radarDemo/components/RadarDemo.tsx b/samples/react-chartcontrol/src/webparts/radarDemo/components/RadarDemo.tsx new file mode 100644 index 000000000..d2c2e4457 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/radarDemo/components/RadarDemo.tsx @@ -0,0 +1,68 @@ +import * as React from 'react'; +import * as strings from 'RadarDemoWebPartStrings'; +import styles from './RadarDemo.module.scss'; +import { IRadarDemoProps, IRadarDemoState } from './IRadarDemo.types'; +import IChartDataProvider from '../../../services/ChartDataProvider/IChartDataProvider'; +import MockChartDataProvider from '../../../services/ChartDataProvider/MockChartDataProvider'; + +import { ChartControl, ChartType } from "@pnp/spfx-controls-react/lib/ChartControl"; + + +const DATASET_LENGTH: number = 2; +const DATA_LENGTH: number = 7; +export default class RadarDemo extends React.Component { + + public render(): React.ReactElement { + + return ( +
+ +
+ ); + } + + private _loadAsyncData(): Promise { + return new Promise((resolve, reject) => { + // Get the mock data provider + const dataProvider: IChartDataProvider = new MockChartDataProvider(); + + // Create an async request + dataProvider + .getMultiDataset(DATASET_LENGTH, DATA_LENGTH) + .then((numbersArrays: Array) => { + + const data: Chart.ChartData = { + labels: strings.ChartLabels, + datasets: [{ + label: strings.DataSet1Label, + backgroundColor: styles.menBackground, + borderColor: styles.menBorder, + pointBackgroundColor: styles.menBackground, + pointBorderColor: styles.pointBorder, + pointHoverBackgroundColor: styles.pointBorder, + pointHoverBorderColor: styles.menBorder, + data: numbersArrays[0] + }, { + label: strings.DataSet2Label, + backgroundColor: styles.womenBackground, + borderColor: styles.womenBorder, + pointBackgroundColor: styles.womenBackground, + pointBorderColor: styles.pointBorder, + pointHoverBackgroundColor: styles.pointBorder, + pointHoverBorderColor: styles.womenBorder, + data: numbersArrays[1] + }], + }; + resolve(data); + }); + }); + } +} diff --git a/samples/react-chartcontrol/src/webparts/radarDemo/loc/en-us.js b/samples/react-chartcontrol/src/webparts/radarDemo/loc/en-us.js new file mode 100644 index 000000000..dcd7adf68 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/radarDemo/loc/en-us.js @@ -0,0 +1,18 @@ +define([], function() { + return { + "Loading": "Loading...", + "DataSet1Label": "Men", + "DataSet2Label": "Women", + "ChartLabels": [ + 'Eating', + 'Drinking', + 'Sleeping', + 'Designing', + 'Coding', + 'Cycling', + 'Running' + ], + "WebPartDescription": `

This web part demonstrates how to use the PnP ChartControl to render a radar chart as per the Chart.js sample

`, + "MoreInfoLinkUrl": "https://sharepoint.github.io/sp-dev-fx-controls-react/controls/ChartControl/" + } +}); diff --git a/samples/react-chartcontrol/src/webparts/radarDemo/loc/mystrings.d.ts b/samples/react-chartcontrol/src/webparts/radarDemo/loc/mystrings.d.ts new file mode 100644 index 000000000..421dfdc33 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/radarDemo/loc/mystrings.d.ts @@ -0,0 +1,13 @@ +declare interface IRadarDemoWebPartStrings { + Loading: string; + DataSet1Label: string; + DataSet2Label: string; + ChartLabels: string[]; + WebPartDescription: string; + MoreInfoLinkUrl: string; +} + +declare module 'RadarDemoWebPartStrings' { + const strings: IRadarDemoWebPartStrings; + export = strings; +} diff --git a/samples/react-chartcontrol/src/webparts/realtimePluginDemo/RealtimePluginDemoWebPart.manifest.json b/samples/react-chartcontrol/src/webparts/realtimePluginDemo/RealtimePluginDemoWebPart.manifest.json new file mode 100644 index 000000000..53bf04651 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/realtimePluginDemo/RealtimePluginDemoWebPart.manifest.json @@ -0,0 +1,22 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx/client-side-web-part-manifest.schema.json", + "id": "98c90b31-f355-4c24-9997-a7c25e0ff016", + "alias": "RealtimePluginDemoWebPart", + "componentType": "WebPart", + + "version": "*", + "manifestVersion": 2, + + "requiresCustomScript": false, + + "preconfiguredEntries": [{ + "groupId": "5c03119e-3074-46fd-976b-c60198311f70", + "group": { "default": "Other" }, + "title": { "default": "Realtime Plugin" }, + "description": { "default": "Demonstrates using a plugin to render real-time charts." }, + "officeFabricIconFontName": "Streaming", + "properties": { + "description": "Realtime Plugin" + } + }] +} diff --git a/samples/react-chartcontrol/src/webparts/realtimePluginDemo/RealtimePluginDemoWebPart.ts b/samples/react-chartcontrol/src/webparts/realtimePluginDemo/RealtimePluginDemoWebPart.ts new file mode 100644 index 000000000..67587a768 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/realtimePluginDemo/RealtimePluginDemoWebPart.ts @@ -0,0 +1,57 @@ +import * as React from 'react'; +import * as ReactDom from 'react-dom'; +import { Version } from '@microsoft/sp-core-library'; +import { + BaseClientSideWebPart, + IPropertyPaneConfiguration, +} from '@microsoft/sp-webpart-base'; +import { PropertyPaneWebPartInformation } from '@pnp/spfx-property-controls/lib/PropertyPaneWebPartInformation'; + +import * as strings from 'RealtimePluginDemoWebPartStrings'; +import RealtimePluginDemo from './components/RealtimePluginDemo'; +import { IRealtimePluginDemoProps } from './components/IRealtimePluginDemo.types'; + +export interface IRealtimePluginDemoWebPartProps { + description: string; +} + +export default class RealtimePluginDemoWebPart extends BaseClientSideWebPart { + + public render(): void { + const element: React.ReactElement = React.createElement( + RealtimePluginDemo, + { + } + ); + + ReactDom.render(element, this.domElement); + } + + protected onDispose(): void { + ReactDom.unmountComponentAtNode(this.domElement); + } + + protected get dataVersion(): Version { + return Version.parse('1.0'); + } + + protected getPropertyPaneConfiguration(): IPropertyPaneConfiguration { + return { + pages: [ + { + groups: [ + { + groupFields: [ + PropertyPaneWebPartInformation({ + description: strings.WebPartDescription, + moreInfoLink: strings.MoreInfoLinkUrl, + key: 'webPartInfoId' + }) + ] + } + ] + } + ] + }; + } +} diff --git a/samples/react-chartcontrol/src/webparts/realtimePluginDemo/components/IRealtimePluginDemo.types.ts b/samples/react-chartcontrol/src/webparts/realtimePluginDemo/components/IRealtimePluginDemo.types.ts new file mode 100644 index 000000000..ea0621efe --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/realtimePluginDemo/components/IRealtimePluginDemo.types.ts @@ -0,0 +1,3 @@ +export interface IRealtimePluginDemoProps { + +} diff --git a/samples/react-chartcontrol/src/webparts/realtimePluginDemo/components/RealtimePluginDemo.module.scss b/samples/react-chartcontrol/src/webparts/realtimePluginDemo/components/RealtimePluginDemo.module.scss new file mode 100644 index 000000000..9592b3539 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/realtimePluginDemo/components/RealtimePluginDemo.module.scss @@ -0,0 +1,16 @@ +@import '~@microsoft/sp-office-ui-fabric-core/dist/sass/SPFabricCore.scss'; + +.realtimePluginDemo { + color: inherit; + +} + +:export { +red: rgb(255, 99, 132); +orange: rgb(255, 159, 64); +yellow: rgb(255, 205, 86); +green: rgb(75, 192, 192); +blue: rgb(54, 162, 235); +purple: rgb(153, 102, 255); +grey: rgb(201, 203, 207); +} diff --git a/samples/react-chartcontrol/src/webparts/realtimePluginDemo/components/RealtimePluginDemo.tsx b/samples/react-chartcontrol/src/webparts/realtimePluginDemo/components/RealtimePluginDemo.tsx new file mode 100644 index 000000000..4ab56d9cb --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/realtimePluginDemo/components/RealtimePluginDemo.tsx @@ -0,0 +1,235 @@ +import * as React from 'react'; +import styles from './RealtimePluginDemo.module.scss'; +import { IRealtimePluginDemoProps } from './IRealtimePluginDemo.types'; +import * as Color from 'color'; +import * as strings from 'RealtimePluginDemoWebPartStrings'; + +// used to add a chart control +import { ChartControl, ChartType } from '@pnp/spfx-controls-react/lib/ChartControl'; + +// used to import the real-time plugin +import * as realTime from 'chartjs-plugin-streaming'; + +// used to render the toolbar above the chart +import { + CommandBar +} from 'office-ui-fabric-react'; + +const chartColors = { + red: styles.red, + orange: styles.orange, + yellow: styles.yellow, + green: styles.green, + blue: styles.blue, + purple: styles.purple, + grey: styles.grey +}; + + +export default class RealtimePluginDemo extends React.Component { + /** + * The chart element + */ + private _chartElem: ChartControl = undefined; + + public render(): React.ReactElement { + const options: any = { + title: { + display: true, + text: strings.ChartTitle + }, + scales: { + xAxes: [{ + type: 'realtime', + realtime: { + duration: 20000, + refresh: 1000, + delay: 2000, + onRefresh: (chart) => this._onRefresh(chart) + } + }], + yAxes: [{ + scaleLabel: { + display: true, + labelString: 'value' + } + }] + }, + tooltips: { + mode: 'nearest', + intersect: false + }, + hover: { + mode: 'nearest', + intersect: false + } + }; + return ( +
+ {this._renderCommandBar()} + +
+ ); + } + + private _randomScalingFactor() { + return (Math.random() > 0.5 ? 1.0 : -1.0) * Math.round(Math.random() * 100); + } + + private _onRefresh(chart) { + chart.config.data.datasets.forEach((dataset) => { + dataset.data.push({ + x: Date.now(), + y: this._randomScalingFactor() + }); + }); + } + + /** +* Renders the command bar control. +*/ + private _renderCommandBar(): JSX.Element { + return ( + { this._handleRandomizeData(); }, + ['data-automation-id']: 'randomizeData' + }, + { + key: 'addDataset', + name: strings.AddDatasetCommandLabel, + iconProps: { + iconName: 'Table' + }, + onClick: () => { this._handleAddDataset(); }, + ['data-automation-id']: 'addDataset' + }, + { + key: 'removeDataset', + name: strings.RemoveDatasetCommandLabel, + icon: 'DeleteTable', + onClick: () => { this._handleRemoveDataset(); }, + ['data-automation-id']: 'removeDataset' + }, + { + key: 'addData', + name: strings.AddDataCommandLabel, + iconProps: { + iconName: 'InsertColumnsRight' + }, + onClick: () => { this._handleAddData(); }, + ['data-automation-id']: 'addDataset' + }, + ]} + /> + ); + } + + /** + * Links a reference to the chart so that we can + * refer to it later and change its data + */ + // tslint:disable-next-line no-any + private _linkElement = (e: any) => { + this._chartElem = e; + } + + + /** + * Called when user clicks on Randomize Data. + * Reloads the entire dataset with newly retrieved randomized numbers + */ + private _handleRandomizeData = () => { + const data = this._chartElem.getChart().data; + + data.datasets.forEach((dataset) => { + (dataset.data as any[]).forEach((dataObj: any) => { + dataObj.y = this._randomScalingFactor(); + }); + }); + + this._chartElem.update(); + } + + /** + * Handles requests to add a new dataset. + */ + private _handleAddDataset = () => { + // get the chart's data + const data: Chart.ChartData = this._chartElem.getChart().data; + + var colorNames = Object.keys(chartColors); + var colorName = colorNames[data.datasets.length % colorNames.length]; + var newColor = chartColors[colorName]; + var newDataset = { + label: `${strings.DatasetPrefix} ${data.datasets.length + 1}`, + backgroundColor: Color(newColor).alpha(0.5).toString(), + borderColor: newColor, + fill: false, + lineTension: 0, + data: [] + }; + + data.datasets.push(newDataset); + + // update that chart + this._chartElem.update(); + } + + /** + * Removes the oldset dataset + */ + private _handleRemoveDataset = () => { + const data: Chart.ChartData = this._chartElem.getChart().data; + + data.datasets.pop(); + + // update that chart + this._chartElem.update(); + } + + /** + * Handles requests to add a new data point + */ + private _handleAddData = () => { + // get the chart + const myChart = this._chartElem.getChart(); + + this._onRefresh(myChart); + + // update that chart + this._chartElem.update(); + } + +} + diff --git a/samples/react-chartcontrol/src/webparts/realtimePluginDemo/components/chartjs-plugin-streaming.d.ts b/samples/react-chartcontrol/src/webparts/realtimePluginDemo/components/chartjs-plugin-streaming.d.ts new file mode 100644 index 000000000..76f7321db --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/realtimePluginDemo/components/chartjs-plugin-streaming.d.ts @@ -0,0 +1,68 @@ +/** Declaration file generated by dts-gen */ + +export const id: string; + +export function afterDatasetDraw(chart: any): void; + +export function afterInit(chart: any): void; + +export function afterUpdate(chart: any, options: any): void; + +export function beforeDatasetDraw(chart: any, args: any): any; + +export function beforeEvent(chart: any, event: any): any; + +export function beforeInit(chart: any): void; + +export function beforeUpdate(chart: any): any; + +export function destroy(chart: any): void; + +export namespace afterDatasetDraw { + const prototype: { + }; + +} + +export namespace afterInit { + const prototype: { + }; + +} + +export namespace afterUpdate { + const prototype: { + }; + +} + +export namespace beforeDatasetDraw { + const prototype: { + }; + +} + +export namespace beforeEvent { + const prototype: { + }; + +} + +export namespace beforeInit { + const prototype: { + }; + +} + +export namespace beforeUpdate { + const prototype: { + }; + +} + +export namespace destroy { + const prototype: { + }; + +} + diff --git a/samples/react-chartcontrol/src/webparts/realtimePluginDemo/loc/en-us.js b/samples/react-chartcontrol/src/webparts/realtimePluginDemo/loc/en-us.js new file mode 100644 index 000000000..c7b40fe50 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/realtimePluginDemo/loc/en-us.js @@ -0,0 +1,16 @@ +define([], function () { + return { + "ChartTitle": "Real-Time Line chart", + "DatasetPrefix": "Dataset", + "Dataset1Label": "Dataset 1 (linear interpolation)", + "Dataset2Label": "Dataset 2 (cubic interpolation)", + "RandomizeCommandLabel": "Randomize data", + "AddDatasetCommandLabel": "Add dataset", + "RemoveDatasetCommandLabel": "Remove dataset", + "AddDataCommandLabel": "Add data", + "WebPartDescription": `

This web part demonstrates how to use the PnP ChartControl + to render a real-time chart using the real-time plugin.

+

The code sample is inspired from the horizontal scroll sample from chartjs-plugin-streaming.

`, + "MoreInfoLinkUrl": "https://sharepoint.github.io/sp-dev-fx-controls-react/controls/ChartControl/" + } +}); diff --git a/samples/react-chartcontrol/src/webparts/realtimePluginDemo/loc/mystrings.d.ts b/samples/react-chartcontrol/src/webparts/realtimePluginDemo/loc/mystrings.d.ts new file mode 100644 index 000000000..ca1d0b2c3 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/realtimePluginDemo/loc/mystrings.d.ts @@ -0,0 +1,17 @@ +declare interface IRealtimePluginDemoWebPartStrings { + ChartTitle: string; + DatasetPrefix: string; + Dataset1Label: string; + Dataset2Label: string; + RandomizeCommandLabel: string; + AddDatasetCommandLabel: string; + RemoveDatasetCommandLabel: string; + AddDataCommandLabel: string; + WebPartDescription: string; + MoreInfoLinkUrl: string; +} + +declare module 'RealtimePluginDemoWebPartStrings' { + const strings: IRealtimePluginDemoWebPartStrings; + export = strings; +} diff --git a/samples/react-chartcontrol/src/webparts/scatterChartDemo/ScatterChartDemoWebPart.manifest.json b/samples/react-chartcontrol/src/webparts/scatterChartDemo/ScatterChartDemoWebPart.manifest.json new file mode 100644 index 000000000..8ee149212 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/scatterChartDemo/ScatterChartDemoWebPart.manifest.json @@ -0,0 +1,27 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx/client-side-web-part-manifest.schema.json", + "id": "612ed0fa-453a-480a-81bf-2d3cb872d938", + "alias": "ScatterChartDemoWebPart", + "componentType": "WebPart", + "version": "*", + "manifestVersion": 2, + "requiresCustomScript": false, + "preconfiguredEntries": [ + { + "groupId": "5c03119e-3074-46fd-976b-c60198311f70", + "group": { + "default": "Other" + }, + "title": { + "default": "Scatter Chart" + }, + "description": { + "default": "Demonstrates how to render a scatter chart using a logarithmic scale" + }, + "iconImageUrl": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAcCAYAAAATFf3WAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAAvdEVYdFRpdGxlAENoYXJ0cyBTVkcgRXhhbXBsZSAtIFNpbXBsZSBTY2F0dGVyIENoYXJ0s5lgbwAABNZJREFUWIW9139sVeUZB/DP6a39QVtCKS3YijgzmX9sYyYmKhAJ4g+MRNwEE2OYiZK5hWRTQuKvGBMTUSPRGGPU+Cvxxz8WIzoimToLi5WxLIGxwX4E0g0n4i2ISGspvbfHP845vefenltFq09ycu/5vs/7PM/7Pu/zPc8biKQLTTiA6b5fCRBm4AP4PHlpxkzVg+uYBPxUbbRDTfzSiR+itory5Mv7OvU431ynVdEIpAI6jCJyaM1QnoaRb4mXsG7XKHhKoM7j/uYBS201XKHfkA5wBMPx74kMhycmAS9hbdaiDtSbZ63FttpUoT8lHeB0nIV/YqiKw1PHt7pM4F6hQTs86HYHQI2jZdrN8hl2RojzjDa04Ascy3DYjv5Twu83YoF9ogKk4IBLzQUb/cwML+JMx7xieeFMyY6C44/S+hd8nOxgoFQwzRkOmzJWWI4/bK4u5+rV6wmBBm1ltmqdYYE2vYatsA/ztQgc10bNboJUgIObsCualkxnFvbhSEYguQnxbX4h9CpyVuo3xeVm24E/40IwZJPecDbmjM0+7mOCfxNU8GDXQLLwJMAiPpRNmF8toVviYKHdfMv93C4fuMRJKwQGrbIdD+OG1Mw/4JcTmU4HmIvfOzP0ZqjkyHXmONtSx/QadFhTamy/AXSaD/44FrjjjdFRT2SoHrP4rJsgxYe7jogU84nTUVEV70U+I8BCGd7jxwLviqhgVOAmoUbME+p2r5fxyXgbLRXnuHEYh2hdleGzg1JhDOFfvm6KAyvj4CIboeXq3CCwXmC/CyKSnQxJF8k0EcV8dYo/1G92avSYjzR4R70FYJ1dtltmqGzBM+i6k9a7StDRUFScWZ/YRuQTHmzAPPQpT2WtxQqi7c7rcasaK4R2C3yu4Co5HyhaL+e/FUufY2FMzJF0yD4+E+JJ5AXsHxv6qykGdGOpbXbabLVlzhd6NN6TBUY9ZoklyHtVToePRG0boX6tDkXGwul4iRN1NJyMPdxJsDsjqHGSUENTbPwkplpijWa/EhF4p+naDWrQ5OKxmSMKXvIn5HRrdo73tZulqM/vrXejfrTQ0MXCDdSejXOiZ3sPz30WjeuI42ipeJpwNH0GZ4g+W3kzFcuW0Synzsu4LZ5IvRdwSJKeux1UopRU2u7I2JeLjuBg/FLOECUpq+Kj2COiGwqeU0r5p/Z6Ws6FQk8K3SOwyCLPZxiddEl2sEWU4jw6XYqfusz1fmSbPqvdL3StAEV5j9jIUxdx3YbUucKzt/Pb/yur+lumsuGNiJQb455vS6jEFuM/ApGMq+LzsF+PT/FrgXkCr1vkLe85oiZ1HQhdaXF4CDsrjP6E4B+yK/MbVXGS4qKoUSjiDoHHsVpos23mK/h7auIJNfZkGPxOJNna03A6DhtxRaozC+Qt84z7/M7Nctr1ed5vFHmznasrzHV3iFKXlbZqqZwwxcnAsKhgCupswcIYH9XmDW/r83ZZF4KraxnYSHOqtV/5H1F1ZlVmtWqdsIrT3cz/UCPvITMdxnlGveYSO2ReDYMDWFPF+KRJkPr/AxEPTpPQTUnqGXfrIiqurEtTFl4rakaKFXidaBcrfTbIuE7MqQRiaauCz8rAcuJLd4W0YmoGXs1nJt5YRTlXBZ+SgdWcop0sG2P4l/rcYKEmuvdjAAAAAElFTkSuQmCC", + "properties": { + "description": "Scatter Chart" + } + } + ] +} diff --git a/samples/react-chartcontrol/src/webparts/scatterChartDemo/ScatterChartDemoWebPart.ts b/samples/react-chartcontrol/src/webparts/scatterChartDemo/ScatterChartDemoWebPart.ts new file mode 100644 index 000000000..40875b16e --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/scatterChartDemo/ScatterChartDemoWebPart.ts @@ -0,0 +1,58 @@ +import * as React from 'react'; +import * as ReactDom from 'react-dom'; +import { Version } from '@microsoft/sp-core-library'; +import { + BaseClientSideWebPart, + IPropertyPaneConfiguration, +} from '@microsoft/sp-webpart-base'; +import { PropertyPaneWebPartInformation } from '@pnp/spfx-property-controls/lib/PropertyPaneWebPartInformation'; + + +import * as strings from 'ScatterChartDemoWebPartStrings'; +import ScatterChartDemo from './components/ScatterChartDemo'; +import { IScatterChartDemoProps } from './components/IScatterChartDemo.types'; + +export interface IScatterChartDemoWebPartProps { + description: string; +} + +export default class ScatterChartDemoWebPart extends BaseClientSideWebPart { + + public render(): void { + const element: React.ReactElement = React.createElement( + ScatterChartDemo, + { + } + ); + + ReactDom.render(element, this.domElement); + } + + protected onDispose(): void { + ReactDom.unmountComponentAtNode(this.domElement); + } + + protected get dataVersion(): Version { + return Version.parse('1.0'); + } + + protected getPropertyPaneConfiguration(): IPropertyPaneConfiguration { + return { + pages: [ + { + groups: [ + { + groupFields: [ + PropertyPaneWebPartInformation({ + description: strings.WebPartDescription, + moreInfoLink: strings.MoreInfoLinkUrl, + key: 'webPartInfoId' + }) + ] + } + ] + } + ] + }; + } +} diff --git a/samples/react-chartcontrol/src/webparts/scatterChartDemo/components/IScatterChartDemo.types.ts b/samples/react-chartcontrol/src/webparts/scatterChartDemo/components/IScatterChartDemo.types.ts new file mode 100644 index 000000000..ca606f1f7 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/scatterChartDemo/components/IScatterChartDemo.types.ts @@ -0,0 +1,3 @@ +export interface IScatterChartDemoProps { + +} diff --git a/samples/react-chartcontrol/src/webparts/scatterChartDemo/components/ScatterChartDemo.module.scss b/samples/react-chartcontrol/src/webparts/scatterChartDemo/components/ScatterChartDemo.module.scss new file mode 100644 index 000000000..66dba08b3 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/scatterChartDemo/components/ScatterChartDemo.module.scss @@ -0,0 +1,10 @@ +@import "~@microsoft/sp-office-ui-fabric-core/dist/sass/SPFabricCore.scss"; + +.scatterChartDemo { + color: inherit; +} + +:export { + color1: rgb(255, 99, 132); + color2: rgba(255, 99, 132, 0.5); +} diff --git a/samples/react-chartcontrol/src/webparts/scatterChartDemo/components/ScatterChartDemo.tsx b/samples/react-chartcontrol/src/webparts/scatterChartDemo/components/ScatterChartDemo.tsx new file mode 100644 index 000000000..512355eed --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/scatterChartDemo/components/ScatterChartDemo.tsx @@ -0,0 +1,172 @@ +import * as React from 'react'; +import styles from './ScatterChartDemo.module.scss'; +import { IScatterChartDemoProps } from './IScatterChartDemo.types'; + +// used to add a chart control +import { ChartControl, ChartType } from '@pnp/spfx-controls-react/lib/ChartControl'; + +import * as strings from 'ScatterChartDemoWebPartStrings'; + + +export default class ScatterChartDemo extends React.Component { + public render(): React.ReactElement { + return ( +
+ { + var remain = tick / (Math.pow(10, Math.floor(this._log10(tick)))); + if (remain === 1 || remain === 2 || remain === 5) { + return tick.toString() + strings.xAxisUnit; + } + return ''; + }, + }, + scaleLabel: { + labelString: strings.xAxisLabel, + display: true, + } + }], + yAxes: [{ + type: 'linear', + ticks: { + callback: (tick) => { + return tick.toString() + strings.yAxisUnit; + } + }, + scaleLabel: { + labelString: strings.yAxisLabel, + display: true + } + }] + } + }} + /> +
+ ); + } + + private _log10 = (x: number): number => { + const exponent = Math.log(x) * Math.LOG10E; // Math.LOG10E = 1 / Math.LN10. + + // Check for whole powers of 10, + + // which due to floating point rounding error should be corrected. + const powerOf10 = Math.round(exponent); + const isPowerOf10 = x === Math.pow(10, powerOf10); + return isPowerOf10 ? powerOf10 : exponent; + } +} diff --git a/samples/react-chartcontrol/src/webparts/scatterChartDemo/loc/en-us.js b/samples/react-chartcontrol/src/webparts/scatterChartDemo/loc/en-us.js new file mode 100644 index 000000000..72cb7f517 --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/scatterChartDemo/loc/en-us.js @@ -0,0 +1,15 @@ +define([], function() { + return { + "ChartTitle": "Scatter Chart - Logarithmic X-Axis", + "DataSetLabel": "V(node2)", + "xAxisLabel": "Frequency", + "xAxisUnit": "Hz", + "yAxisLabel": "Voltage", + "yAxisUnit": "dB", + "WebPartDescription": `

This web part demonstrates how to use the PnP ChartControl + to render a scatter chart on a logarithmic scale as per the + Chart.js samp

+

Note that scatter charts only accepts data in a point format, using x and y values.`, + "MoreInfoLinkUrl": "https://sharepoint.github.io/sp-dev-fx-controls-react/controls/ChartControl/" + } +}); diff --git a/samples/react-chartcontrol/src/webparts/scatterChartDemo/loc/mystrings.d.ts b/samples/react-chartcontrol/src/webparts/scatterChartDemo/loc/mystrings.d.ts new file mode 100644 index 000000000..a6bd8063b --- /dev/null +++ b/samples/react-chartcontrol/src/webparts/scatterChartDemo/loc/mystrings.d.ts @@ -0,0 +1,15 @@ +declare interface IScatterChartDemoWebPartStrings { + ChartTitle: string; + DataSetLabel: string; + xAxisLabel: string; + xAxisUnit: string; + yAxisLabel: string; + yAxisUnit: string; + WebPartDescription: string; + MoreInfoLinkUrl: string; +} + +declare module 'ScatterChartDemoWebPartStrings' { + const strings: IScatterChartDemoWebPartStrings; + export = strings; +} diff --git a/samples/react-chartcontrol/tsconfig.json b/samples/react-chartcontrol/tsconfig.json new file mode 100644 index 000000000..f13ec27a6 --- /dev/null +++ b/samples/react-chartcontrol/tsconfig.json @@ -0,0 +1,34 @@ +{ + "compilerOptions": { + "target": "es5", + "forceConsistentCasingInFileNames": true, + "module": "esnext", + "moduleResolution": "node", + "jsx": "react", + "declaration": true, + "sourceMap": true, + "experimentalDecorators": true, + "skipLibCheck": true, + "outDir": "lib", + "typeRoots": [ + "./node_modules/@types", + "./node_modules/@microsoft" + ], + "types": [ + "es6-promise", + "webpack-env" + ], + "lib": [ + "es5", + "dom", + "es2015.collection" + ] + }, + "include": [ + "src/**/*.ts" + ], + "exclude": [ + "node_modules", + "lib" + ] +} diff --git a/samples/react-chartcontrol/tslint.json b/samples/react-chartcontrol/tslint.json new file mode 100644 index 000000000..23fa2aa43 --- /dev/null +++ b/samples/react-chartcontrol/tslint.json @@ -0,0 +1,30 @@ +{ + "extends": "@microsoft/sp-tslint-rules/base-tslint.json", + "rules": { + "class-name": false, + "export-name": false, + "forin": false, + "label-position": false, + "member-access": true, + "no-arg": false, + "no-console": false, + "no-construct": false, + "no-duplicate-variable": true, + "no-eval": false, + "no-function-expression": true, + "no-internal-module": true, + "no-shadowed-variable": true, + "no-switch-case-fall-through": true, + "no-unnecessary-semicolons": true, + "no-unused-expression": true, + "no-use-before-declare": true, + "no-with-statement": true, + "semicolon": true, + "trailing-comma": false, + "typedef": false, + "typedef-whitespace": false, + "use-named-parameter": true, + "variable-name": false, + "whitespace": false + } +} \ No newline at end of file diff --git a/samples/readme.md b/samples/readme.md index 1d6bdee6e..9925d1557 100644 --- a/samples/readme.md +++ b/samples/readme.md @@ -6,108 +6,109 @@ Samples around the SharePoint Framework client-side web parts to demonstrate dif Title|Description| Preview | Drop ----|----|-------|------ +Angular2 Web Part Prototype
[angular2-prototype](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/angular2-prototype)|Sample To Do Web Part built with Angular2. This sample illustrates how you can use Angular2 with the SharePoint Framework.|![angular2-prototype](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/angular2-prototype/assets/preview.png)|![drop](https://img.shields.io/badge/drop-RC0-green.svg) +Angular MS Graph Web Part Built with Angular v1.x
[angular-msgraph](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/angular-msgraph)|This is a sample MS Graph web part that connects to Microsoft Graph and pulls SharePoint information from yourtenant. It will first pull the root site collection (currently a limitation by Microsoft Graph), then it willdisplay all the lists associated with the site followed by all the items inside the list.||![drop](https://img.shields.io/badge/drop-ga-green.svg) +Angular & ngOfficeUIFabric Client-Side Web Part
[angular-ngofficeuifabric-todo](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/angular-ngofficeuifabric-todo)|This s a sample web part that illustrates the use of Angular and ngOfficeUIFabric with the SharePoint Framework.You can find a video recording walk-through this sample from SharePoint PnP YouTube channel.||![drop](https://img.shields.io/badge/drop-drop2-red.svg) +Angular client-side web part
[angular-todo](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/angular-todo)|Sample Web Part illustrating using Angular with the SharePoint Framework.|![angular-todo](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/angular-todo/assets/preview.png)|![drop](https://img.shields.io/badge/drop-GA-green.svg) +Angular Elements in SharePoint Framework
[angularelements-helloworld](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/angularelements-helloworld)|Set of sample web parts illustrating how to use Angular Elements in the SharePoint Framework.||![drop](https://img.shields.io/badge/drop-1.4.1-green.svg) +Angular multi-page client-side web part
[angular-multipage](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/angular-multipage)|This is a sample SharePoint Framework client-side web part built using Angular, illustrating building multi-page web parts.|![angular-multipage](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/angular-multipage/assets/poll-preview.gif)|![drop](https://img.shields.io/badge/drop-drop5-red.svg) +Azure Active Directory implicit flow authentication samples
[react-aad-implicitflow](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-aad-implicitflow)|Sample SharePoint Framework web parts built using React illustrating different scenarios using implicit OAuth flow with Azure Active Directory.|![react-aad-implicitflow](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-aad-implicitflow/assets/upcoming-meetings-preview.png)|![drop](https://img.shields.io/badge/drop-GA-green.svg) +Azure Active Directory invitation manager Graph API samples
[react-invitation-manager](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-invitation-manager)|Sample SharePoint Framework web parts built using React illustrating the possibility to use Graph API to invite external users into the Azure Active Directory.|![react-invitation-manager](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-invitation-manager/assets/SPFx-Invitation-Manager.gif)|![drop](https://img.shields.io/badge/drop-1.3.0-green.svg) +Bootstrap Slider Built with jQueryr v1.x and Boostrap v3.x
[bootstrap-slider](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/bootstrap-slider)|Sample bootstrap slider which pulls the slides from a list inside the SharePoint site. The list is automatically deployed once the app is installed in the SharePoint site.|![bootstrap-slider](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/bootstrap-slider/assets/slider_image_1.png)|![drop](https://img.shields.io/badge/drop-ga-green.svg) Call custom APIs secured with Azure Active Directory without ADAL JS
[aad-api-spo-cookie](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/aad-api-spo-cookie)|Sample SharePoint Framework client-side web part showing how to access a custom API secured with Azure Active Directory (AAD) without using ADAL JS.|![aad-api-spo-cookie](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/aad-api-spo-cookie/assets/preview-orders.png)|![drop](https://img.shields.io/badge/drop-GA-green.svg) Call custom Web API secured with AAD from SharePoint Framework client-side web part using Angular v1.x
[angular-aad-webapi](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/angular-aad-webapi)|Sample SharePoint Framework client-side web part illustrating communication with a custom Web API secured with Azue Active Directory using Angular v1.x|![angular-aad-webapi](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/angular-aad-webapi/assets/preview.jpg)|![drop](https://img.shields.io/badge/drop-ga-green.svg) -Migrating existing Angular applications to SharePoint Framework sample
[angular-migration](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/angular-migration)|This is a sample Angular application before and after it has been migrated to a SharePoint Framework client-side web part.|![angular-migration](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/angular-migration/assets/angular-todo-preview.png)| -#Angular MS Graph Web Part Built with Angular v1.x
[angular-msgraph](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/angular-msgraph)|This is a sample MS Graph web part that connects to Microsoft Graph and pulls SharePoint information from yourtenant. It will first pull the root site collection (currently a limitation by Microsoft Graph), then it willdisplay all the lists associated with the site followed by all the items inside the list.||![drop](https://img.shields.io/badge/drop-ga-green.svg) -Angular multi-page client-side web part
[angular-multipage](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/angular-multipage)|This is a sample SharePoint Framework client-side web part built using Angular, illustrating building multi-page web parts.|![angular-multipage](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/angular-multipage/assets/poll-preview.gif)|![drop](https://img.shields.io/badge/drop-drop5-red.svg) -Spfx Webpart: File Upload using AngularJs
[angular-ngofficeuifabric-file-upload](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/angular-ngofficeuifabric-file-upload)|File Update/Delete webpart using AngularJs and ngOfficeUIFabric with the SharePoint Framework.|![angular-ngofficeuifabric-file-upload](http://i.imgur.com/U5qg4II.png)|![drop](https://img.shields.io/badge/version-GA-green.svg) -Angular & ngOfficeUIFabric Client-Side Web Part
[angular-ngofficeuifabric-todo](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/angular-ngofficeuifabric-todo)|This s a sample web part that illustrates the use of Angular and ngOfficeUIFabric with the SharePoint Framework.You can find a video recording walk-through this sample from SharePoint PnP YouTube channel.||![drop](https://img.shields.io/badge/drop-drop2-red.svg) -Search Client-Side Web Part Built with Angular v1.x
[angular-search](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/angular-search)|This is a sample search web part that illustrates how you can use Angular within the new SharePoint Framework|![angular-search](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/angular-search/assets/angularSearch.png)|![drop](https://img.shields.io/badge/drop-rc0-green.svg) -Angular client-side web part
[angular-todo](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/angular-todo)|Sample Web Part illustrating using Angular with the SharePoint Framework.|![angular-todo](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/angular-todo/assets/preview.png)|![drop](https://img.shields.io/badge/drop-GA-green.svg) - Angular2 Web Part Prototype
[angular2-prototype](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/angular2-prototype)|Sample To Do Web Part built with Angular2. This sample illustrates how you can use Angular2 with the SharePoint Framework.|![angular2-prototype](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/angular2-prototype/assets/preview.png)|![drop](https://img.shields.io/badge/drop-RC0-green.svg) -Angular Elements in SharePoint Framework
[angularelements-helloworld](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/angularelements-helloworld)|Set of sample web parts illustrating how to use Angular Elements in the SharePoint Framework.||![drop](https://img.shields.io/badge/drop-1.4.1-green.svg) -Bootstrap Slider Built with jQueryr v1.x and Boostrap v3.x
[bootstrap-slider](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/bootstrap-slider)|Sample bootstrap slider which pulls the slides from a list inside the SharePoint site. The list is automatically deployed once the app is installed in the SharePoint site.|![bootstrap-slider](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/bootstrap-slider/assets/slider_image_1.png)|![drop](https://img.shields.io/badge/drop-ga-green.svg) -SPFx Sample with Handlebars.js
[handlebarsjs-webpack-loader](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/handlebarsjs-webpack-loader)|This sample demonstrate how to set up SPFX to use Handlebars through webpack loader.||![drop](https://img.shields.io/badge/drop-1.4.1-green.svg) -Using jQuery loaded from CDN
[jquery-cdn](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/jquery-cdn)|This is a sample web Part that illustrates the use of jQuery and its plugins loaded from CDN for building SharePoint Framework client-side web parts.|![jquery-cdn](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/jquery-cdn/assets/preview_weather.png)|![drop](https://img.shields.io/badge/drop-drop2-red.svg) -JQuery, Photopile.JS & Office UI Fabric Client-Side Web Part
[jquery-photopile](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/jquery-photopile)|This is a sample web part that illustrated the use of JQuery and Photopile.Jswith the SharePoint Framework.|![jquery-photopile](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/jquery-photopile/assets/photopileoverview.gif)|![drop](https://img.shields.io/badge/drop-drop1-red.svg) -Display List JavaScript Client-Side Web Part
[js-display-list](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/js-display-list)|This simplistic sample Web Part demonstrates the use of JavaScript in a SharePoint Framework web part. The properties pane for this web part display a drop down list of lists in the current web. Once the user selects one of the lists, the web part display the contents of the list.|![js-display-list](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/js-display-list/assets/display-list-preview.png)|![drop](https://img.shields.io/badge/drop-GA-green.svg) -title of the sample
[js-dynamic-bundling-libraries](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/js-dynamic-bundling-libraries)|This sample illustrates how SPFx functionality and packages can be bundled in multiple '.js' files then be dynamically & asynchronously loaded into the page at execution time, such as with a button click.|![js-dynamic-bundling-libraries](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/js-dynamic-bundling-libraries/assets/WebPart-Preview-PreClick.jpg)|![drop](https://img.shields.io/badge/drop-1.7.0-orange.svg) -Display Employee Spotlight JavaScript Client-Side Web Part
[js-employee-spotlight](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/js-employee-spotlight)|Simple Web Part that demonstrates the use of SharePoint Framework for show casing Employee Spotlight. The web part pulls data from a configured list and User Profile service.The properties pane for this web part has 5 canscading dropdowns.|![js-employee-spotlight](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/js-employee-spotlight/assets/Employee-spotlight-options.png)|![drop](https://img.shields.io/badge/drop-GA-green.svg) -Integrating custom gulp tasks to SharePoint Framwork toolchain
[js-extend-gulp](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/js-extend-gulp)|SharePoint client-side development tools use gulp as the build process task runner to:||![drop](https://img.shields.io/badge/drop-RC0-green.svg) -Extending webpack in the SharePoint Framework toolchain
[js-extend-webpack](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/js-extend-webpack)|Webpack is a JavaScript module bundler that takes your JavaScript files and its dependencies and generates one or more JavaScript bundles so you can load different bundles for different scenarios.||![drop](https://img.shields.io/badge/drop-GA-green.svg) -Modern Calendar
[js-modern-calendar](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/js-modern-calendar)|This is a modern webpart built on the GA version of the SharePoint Framework demonstrating how to build a custom web part with a calendar capabilities in it.|![js-modern-calendar](https://cloud.githubusercontent.com/assets/13068139/23584809/14c4333e-0121-11e7-9bf1-3117651222d3.png)|![drop](https://img.shields.io/badge/version-GA-green.svg) -Embed a PowerBI report in a Client-Side Web Part
[js-powerbi-embedded](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/js-powerbi-embedded)|This sample SharePoint Framework client-side web part embedding a PowerBI report using PowerBI Embedded without any server-side code.|![js-powerbi-embedded](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/js-powerbi-embedded/assets/screenshot_powerbi_embedded_spfx.png)|![drop](https://img.shields.io/badge/drop-drop2-red.svg) -JS Property Controls SVG
[js-propertycontrols-svg](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/js-propertycontrols-svg)|An SPFx webpart that displays a Scalable Vector Graphics (SVG) image using properties to customize how it is rendered. The webpart utilizes the PnP SPFx Property Controls package (specifially the SpinButton and ColorPicker) to set these properties.|![js-propertycontrols-svg](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/js-propertycontrols-svg/assets/js-propertycontrols-svg.gif)|![drop](https://img.shields.io/badge/version-1.3.4-green.svg) -JavaScript Skype Status WebPart
[js-skype-status](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/js-skype-status)|This sample demonstrates how to use the UCWA JS Sdk for skype in the SharePoint Framework. It shows how to subscribe to status change of the different people of the organization but you can get much more information, checkout the documentationThe goal is to demonstrate how you can leverage the SDK and to have the simplest approach, hence the usage of JQuery. No Framework (React, Angular, Knockout...) is used here but you can use that SDK in conjuction with any framwork.No branding has been applied to keep it simple but you could perfectly leverage Office Ui Fabric to display persona cards.|![js-skype-status](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/js-skype-status/images/demo.gif)|![drop](https://img.shields.io/badge/drop-GA-green.svg) -Handling Multiple Editions of SPFx Solution
[js-solution-editions](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/js-solution-editions)|This sample shows possible approach of handling multiple editions (e.g. trial, lite, full) of SharePoint Framework solution.||![drop](https://img.shields.io/badge/drop-ga-green.svg) -title of the sample
[knockout-dependent-properties](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/knockout-dependent-properties)|Sample Web Part illustrating

  • requesting Lists and Views data from SharePoint REST API
  • creating Knockout dropdown custom component with Fabric UI styling
  • creating dependent properties (dropdowns) in Client-Side Web Part Property Pane
|![knockout-dependent-properties](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/knockout-dependent-properties/assets/dep-props.png)|![drop](https://img.shields.io/badge/drop-ga-green.svg) -Sample showing the use of @pnp/sp library with Knockoutjs
[knockout-sp-pnp-js](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/knockout-sp-pnp-js)|This webpart demonstrates how to integrate the @pnp/sp library into the SharePoint Framework as well as including mock data and simple list I/O.|![knockout-sp-pnp-js](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/knockout-sp-pnp-js/assets/screenshot.png)|![drop](https://img.shields.io/badge/drop-1.7.0-green.svg) -Taxonomy Web Part
[knockout-taxonomy](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/knockout-taxonomy)|Sample Web Part illustrating
  • Reading taxonomy term stores' hierarchy from SharePoint
  • Loading JavaScript Object Model scripts
  • creating Knockout components
|![knockout-taxonomy](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/knockout-taxonomy/assets/Taxonomy.png)|![drop](https://img.shields.io/badge/drop-ga-green.svg) -SharePoint Framework PnP Controls Sample
[pnp-controls](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/pnp-controls)|This is a sample project that contains a web part which makes use of the PnP SPFx Controls:|![pnp-controls](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/pnp-controls/assets/webpart-outcome.gif)|![drop](https://img.shields.io/badge/drop-1.4.1-green.svg) -Consuming Third Party APIs secured with Azure Active Directory within SharePoint Framework
[react-3rd-party-api](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-3rd-party-api)|This sub folders contains a client-side project that shows how to consume a 3rd party API within SharePoint Framework.|![react-3rd-party-api](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-3rd-party-api/images/react-3rd-party-api-ui-sample.gif)| -react-relay-service
[react-RelayService](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-RelayService)|This is where you include your WebPart documentation.|| -Azure Active Directory implicit flow authentication samples
[react-aad-implicitflow](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-aad-implicitflow)|Sample SharePoint Framework web parts built using React illustrating different scenarios using implicit OAuth flow with Azure Active Directory.|![react-aad-implicitflow](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-aad-implicitflow/assets/upcoming-meetings-preview.png)|![drop](https://img.shields.io/badge/drop-GA-green.svg) Call custom Web API secured with AAD from SharePoint Framework client-side web part
[react-aad-webapi](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-aad-webapi)|Sample SharePoint Framework client-side web part illustrating communication with a custom Web API secured with Azure Active Directory.|![react-aad-webapi](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-aad-webapi/assets/preview.png)|![drop](https://img.shields.io/badge/drop-drop4-red.svg) -Using React Accordion plugin with SPFx
[react-accordion](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-accordion)|This is a sample web Part that illustrates the use of React Accessible Accordion plugin for building SharePoint Framework client-side web parts to show SharePoint list data in Accordion format.|![react-accordion](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-accordion/assets/previewAccordion.PNG)|![drop](https://img.shields.io/badge/drop-1.5.1-green.svg) -Image Gallery Web Part Built with Adaptive Cards
[react-adaptive-cards-image-gallery](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-adaptive-cards-image-gallery)|This sample demonstrates the capability of using [Adaptive Cards] (https://adaptivecards.io/) with SharePoint Framework. Adaptive cards are great fit for Bot, however they can be effectively used with SPFx to render the content. This web part helps to display the image gallery from SharePoint list.|![react-adaptive-cards-image-gallery](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-adaptive-cards-image-gallery/assets/webpart-preview.png)|![drop](https://img.shields.io/badge/drop-1.7-green.svg) -React Aggregated Calendar Webpart
[react-aggregated-calendar](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-aggregated-calendar)|This is a sample webpart developed using React Framework to gather the aggregated events from the multiple calendars from multiple sites using Full Calendar from fullcalendar.io|![react-aggregated-calendar](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-aggregated-calendar/assets/react-aggregated-calendar.gif)|![drop](https://img.shields.io/badge/version-GA-green.svg) -SPFx React app settings webpart
[react-app-settings](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-app-settings)|This sample shows how appSettings.json file can be added and used within SharePoint Framewrok webparts similar to the Web.config / App.config key value app settings in .NET Framework projects.That allows better DevOps and Continious Integration automation. Typescript module appSettings.d.ts is also added so it allows the json app settings to be imported to any webpart or react component with intellisense support.|![react-app-settings](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-app-settings/assets/spfx-appSettings-json.PNG)|![drop](https://img.shields.io/badge/drop-1.4.1-green.svg) -React sample showing the use of @pnp/js with Async / Await
[react-async-await-sp-pnp-js](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-async-await-sp-pnp-js)|This webpart demonstrates how to use PnPJS with Async functions into the SharePoint Framework as well as integrating PnP JS and SPFx Logging systems. Real example querying SharePoint library to show document sizes.|![react-async-await-sp-pnp-js](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-async-await-sp-pnp-js/assets/async-await-sp-pnp-js.png)|![drop](https://img.shields.io/badge/drop-1.4.1-green.svg) -Local Azure Function and SPFx Web Part Development to consume third party APIs
[react-azfunc-vimeo](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-azfunc-vimeo)|This sample shows how to consume third-party APIs through an Azure Functions by a Web Part. In this scenario, Vimeo is the representative third party API.||![drop](https://img.shields.io/badge/drop-1.4.1-green.svg) -Microsoft Bot Framework Web Chat
[react-bot-framework](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-bot-framework)|A web part that acts as a web chat component for bot's built on the Microsoft Bot Framework using the Direct Line API. When sending messagesthe web part uses the username of the currently logged in user. The web part has settings for color for branding purposes.|![react-bot-framework](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-bot-framework/assets/bot-framework-webpart-preview.png)|![drop](https://img.shields.io/badge/drop-GA-green.svg) -React Calendar Feed Web Part
[react-calendar-feed](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-calendar-feed)|This web part uses RSS event feeds, iCal feeds, or WordPress calendar feeds and renders events using a look and feel that is consistent with the SharePoint out-of-the-box Group calendar/events web part.|![react-calendar-feed](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-calendar-feed/assets/react-calendar-feed-demo.gif)| Code Splitting in SharePoint Framework
[react-components-dynamicloading](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-components-dynamicloading)|Load React components and third party packages on demand in SPFx|![react-components-dynamicloading](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-components-dynamicloading/assets/cs3.gif)| -React Content Query WebPart
[react-content-query-webpart](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-content-query-webpart)|The React Content Query WebPart is a modern version of the good old Content by Query WebPart that was introduced in SharePoint 2007. Built for SharePoint 2016 and Office 365, this modern version is built against the new SharePoint Framework (SPFx) and uses the latest Web Stack practices. While the original WebPart was based on a XSLT templating engine, this React WebPart is based on the well known Handlebars templating engine, which empowers users to create simple, yet powerfull HTML templates for rendering the queried content. This new version also lets the user query any site collections which resides on the same domain url, add unlimited filters, query DateTime fields to the nearest minute rather than being limited to a day, and much more.|![react-content-query-webpart](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-content-query-webpart/Misc/toolpart.gif)|![drop](https://img.shields.io/badge/drop-GA-green.svg) +Communicate using elevated privileges with SharePoint
[react-sp-elevatedprivileges](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-sp-elevatedprivileges)|Sample SharePoint Framework client-side web part illustrating communication with SharePoint using elevated privileges through a custom Web API.|![react-sp-elevatedprivileges](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-sp-elevatedprivileges/assets/preview.png)|![drop](https://img.shields.io/badge/drop-drop4-red.svg) +Consuming Third Party APIs secured with Azure Active Directory within SharePoint Framework
[react-3rd-party-api](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-3rd-party-api)|This sub folders contains a client-side project that shows how to consume a 3rd party API within SharePoint Framework.|![react-3rd-party-api](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-3rd-party-api/images/react-3rd-party-api-ui-sample.gif)| Custom property pane controls built in React
[react-custompropertypanecontrols](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-custompropertypanecontrols)|Sample custom property pane controls built in React for use with SharePoint Framework client-side web parts.|![react-custompropertypanecontrols](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-custompropertypanecontrols/assets/async-dropdown-preview.gif)|![drop](https://img.shields.io/badge/drop-drop4-red.svg) -Web part displaying hierarchical information from SharePoint list
[react-display-hierarchy](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-display-hierarchy)|At the time of developing this sample, the Office 365 UI fabric does not have any control for displaying hierarchical information. This web part helps to display the hierarchical information from SharePoint list.|![react-display-hierarchy](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-display-hierarchy/assets/webpart-preview.png)|![drop](https://img.shields.io/badge/drop-1.6-green.svg) -Documents Web Part
[react-documents-detailslist](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-documents-detailslist)|This sample shows how to build web parts that display documents in accordance with the SharePoint Online modern experience. The code uses Office UI Fabric components on the top of SharePoint framework. The web parts implement filtering and sorting. Two data source approaches are demonstrated: items retrieved from the search index and real-time query to a document library.|![react-documents-detailslist](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-documents-detailslist/assets/Preview.gif)|![drop](https://img.shields.io/badge/version-GA-green.svg) -SPFx Event Aggregator Sample
[react-events-aggregator](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-events-aggregator)|This sample shows how we can use the SPFx Event Aggregator to communicate between web parts through broadcasting events utilizing the Publish–subscribe pattern. It enables a webpart or component to raise event (broadcast message) through the SPFx event aggregator and that event is received by other web parts or components that have been subscribed to receive it.|![react-events-aggregator](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-events-aggregator/assets/spfx-event-aggregator.gif)|![drop](https://img.shields.io/badge/drop-1.4.1-green.svg) -Dynamic data
[react-events-dynamicdata](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-events-dynamicdata)|Used SharePoint Framework Version|![react-events-dynamicdata](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-events-dynamicdata/assets/dynamic-data-webparts.png)|![drop](https://img.shields.io/badge/drop-1.7.0-green.svg) -SharePoint Framework Facebook Page Social Plugin web part sample
[react-facebook-plugin](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-facebook-plugin)|This sample shows how to implement iFrame-based web parts with a dynamic responsive behavior on the example of Facebook Page Social Plugin.|![react-facebook-plugin](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-facebook-plugin/assets/preview.png)|![drop](https://img.shields.io/badge/drop-1.5.1-blue.svg) Deployment of SharePoint assets as part of SPFx package
[react-feature-framework](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-feature-framework)|Simplistic solution demonstrating how to provision SharePoint assets using Feature Framework elements when SharePoint Framework solution is being deployed to a SharePoint site.|![react-feature-framework](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-feature-framework/assets/screenshot.png)|![drop](https://img.shields.io/badge/version-GA-green.svg) -React File Upload WebPart
[react-file-upload](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-file-upload)|The file upload web part allowing users to upload multiple files to a document library or as item attachments.|![react-file-upload](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-file-upload/assets/SPFileUploadPreview.gif)|![drop](https://img.shields.io/badge/version-GA-green.svg) -Webpart showing Url validation for SharePoint using Office Graph
[react-graph-evalurl](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-graph-evalurl)|This sample contains a class that evaluates the url input of a text field against the Microsoft Graph. It is possible to evalute the existance of the following three SharePoint Elements:|![react-graph-evalurl](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-graph-evalurl/assets/evaluation-client-searching-for-site-collection.png)|![drop](https://img.shields.io/badge/drop-1.4.1-green.svg) -Personal e-mail
[react-graph-personalemail](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-graph-personalemail)|Sample React web part showing how to retrieve and display personal e-mail retrieved using the Microsoft Graph.|![react-graph-personalemail](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-graph-personalemail/assets/preview.png)|![drop](https://img.shields.io/badge/drop-1.6.0-green.svg) -PnPJS with MS Graph
[react-graph-pnpjs](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-graph-pnpjs)|Sample React webpart showing PnPJS with MS Graph integration|![react-graph-pnpjs](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-graph-pnpjs/assets/summary.png)|![drop](https://img.shields.io/badge/drop-1.7.1-green.svg) -Spfx Webpart read / update MS Graph Custom Schema Extensions
[react-graph-schema-extensions](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-graph-schema-extensions)|This sample shows how read and update a custom Schema extension in MS Graph. It shows how to create acustom Schema extension in Graph to store custom data related to an Office 365 Group, and how we can read and updatethat data using an spfx webpart.|![react-graph-schema-extensions](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-graph-schema-extensions/assets/webpart.png)| +Display Employee Spotlight JavaScript Client-Side Web Part
[js-employee-spotlight](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/js-employee-spotlight)|Simple Web Part that demonstrates the use of SharePoint Framework for show casing Employee Spotlight. The web part pulls data from a configured list and User Profile service.The properties pane for this web part has 5 canscading dropdowns.|![js-employee-spotlight](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/js-employee-spotlight/assets/Employee-spotlight-options.png)|![drop](https://img.shields.io/badge/drop-GA-green.svg) +Display List JavaScript Client-Side Web Part
[js-display-list](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/js-display-list)|This simplistic sample Web Part demonstrates the use of JavaScript in a SharePoint Framework web part. The properties pane for this web part display a drop down list of lists in the current web. Once the user selects one of the lists, the web part display the contents of the list.|![js-display-list](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/js-display-list/assets/display-list-preview.png)|![drop](https://img.shields.io/badge/drop-GA-green.svg) +Documents Web Part
[react-documents-detailslist](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-documents-detailslist)|This sample shows how to build web parts that display documents in accordance with the SharePoint Online modern experience. The code uses Office UI Fabric components on the top of SharePoint framework. The web parts implement filtering and sorting. Two data source approaches are demonstrated: items retrieved from the search index and real-time query to a document library.|![react-documents-detailslist](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-documents-detailslist/assets/Preview.gif)|![drop](https://img.shields.io/badge/version-GA-green.svg) +Dynamic data
[react-events-dynamicdata](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-events-dynamicdata)|Used SharePoint Framework Version|![react-events-dynamicdata](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-events-dynamicdata/assets/dynamic-data-webparts.png)|![drop](https://img.shields.io/badge/drop-1.7.0-green.svg) +Embed a PowerBI report in a Client-Side Web Part
[js-powerbi-embedded](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/js-powerbi-embedded)|This sample SharePoint Framework client-side web part embedding a PowerBI report using PowerBI Embedded without any server-side code.|![js-powerbi-embedded](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/js-powerbi-embedded/assets/screenshot_powerbi_embedded_spfx.png)|![drop](https://img.shields.io/badge/drop-drop2-red.svg) +Extending webpack in the SharePoint Framework toolchain
[js-extend-webpack](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/js-extend-webpack)|Webpack is a JavaScript module bundler that takes your JavaScript files and its dependencies and generates one or more JavaScript bundles so you can load different bundles for different scenarios.||![drop](https://img.shields.io/badge/drop-GA-green.svg) +Handling Multiple Editions of SPFx Solution
[js-solution-editions](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/js-solution-editions)|This sample shows possible approach of handling multiple editions (e.g. trial, lite, full) of SharePoint Framework solution.||![drop](https://img.shields.io/badge/drop-ga-green.svg) +Image Gallery Web Part Built with Adaptive Cards
[react-adaptive-cards-image-gallery](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-adaptive-cards-image-gallery)|This sample demonstrates the capability of using [Adaptive Cards] (https://adaptivecards.io/) with SharePoint Framework. Adaptive cards are great fit for Bot, however they can be effectively used with SPFx to render the content. This web part helps to display the image gallery from SharePoint list.|![react-adaptive-cards-image-gallery](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-adaptive-cards-image-gallery/assets/webpart-preview.png)|![drop](https://img.shields.io/badge/drop-1.7-green.svg) Image Magnifier
[react-image-magnifier](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-image-magnifier)|This web part allow to magnify an image, displaying a resolution more detailed through a lens.|![react-image-magnifier](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-image-magnifier/assets/spfx-react-image-magnifier.gif)|![drop](https://img.shields.io/badge/version-GA-green.svg) -Azure Active Directory invitation manager Graph API samples
[react-invitation-manager](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-invitation-manager)|Sample SharePoint Framework web parts built using React illustrating the possibility to use Graph API to invite external users into the Azure Active Directory.|![react-invitation-manager](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-invitation-manager/assets/SPFx-Invitation-Manager.gif)|![drop](https://img.shields.io/badge/drop-1.3.0-green.svg) -react-item-history
[react-item-History](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-item-History)|This listview command is used to show the past versions of the selected list item in a grid.|![react-item-History](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-item-History/Capture.PNG)|![drop](https://img.shields.io/badge/version-GA-green.svg) -SharePoint Framework React Jest Testing sample
[react-jest-testing](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-jest-testing)|This sample uses the popular Jest Testing Framework with a SPFx client side solution. It is a SPFx-Jest-Enzyme-Sinon starter kit so you can start writing and debugging unit tests in typescript for your SPFx solution.The setup includes unit tests examples, code coverage reports in different formats, visual studio code unit test debug configurations for typescript, setting a coverage threshold (gates) for continuous integration and continuous deployment scenarios.|![react-jest-testing](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-jest-testing/assets/Jest-Typescript-VSCode-debugging.png)|![drop](https://img.shields.io/badge/drop-1.6.0-green.svg) -React List Form WebPart
[react-list-form](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-list-form)|The React List Form web part is a web part for adding a list form to any page. It provides a working example of implementing generic SharePoint list forms using the SharePoint Framework (SPFx) and the React and Office UI Fabric libraries.|![react-list-form](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-list-form/assets/React-ListForm-Overview.gif)|![drop](https://img.shields.io/badge/version-GA-green.svg) -Webpart with React and Mobx
[react-mobx](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-mobx)|Sample webpart implementation that uses Mobx to keep track of its state.|![react-mobx](https://i.gyazo.com/e6f1903b9a9c8201985cd25cc1fe28bc.gif)|![drop](https://img.shields.io/badge/drop-drop5-red.svg) -Modern Charts
[react-modern-charts](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-modern-charts)|This webpart uses the Chart.js library to visualize SharePoint list data.|![react-modern-charts](https://raw.githubusercontent.com/jcoleman-pcprofessional/Modern-Charts/master/assets/modern-chart2.png)| +Integrating custom gulp tasks to SharePoint Framwork toolchain
[js-extend-gulp](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/js-extend-gulp)|SharePoint client-side development tools use gulp as the build process task runner to:||![drop](https://img.shields.io/badge/drop-RC0-green.svg) +JavaScript Skype Status WebPart
[js-skype-status](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/js-skype-status)|This sample demonstrates how to use the UCWA JS Sdk for skype in the SharePoint Framework. It shows how to subscribe to status change of the different people of the organization but you can get much more information, checkout the documentationThe goal is to demonstrate how you can leverage the SDK and to have the simplest approach, hence the usage of JQuery. No Framework (React, Angular, Knockout...) is used here but you can use that SDK in conjuction with any framwork.No branding has been applied to keep it simple but you could perfectly leverage Office Ui Fabric to display persona cards.|![js-skype-status](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/js-skype-status/images/demo.gif)|![drop](https://img.shields.io/badge/drop-GA-green.svg) +JQuery, Photopile.JS & Office UI Fabric Client-Side Web Part
[jquery-photopile](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/jquery-photopile)|This is a sample web part that illustrated the use of JQuery and Photopile.Jswith the SharePoint Framework.|![jquery-photopile](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/jquery-photopile/assets/photopileoverview.gif)|![drop](https://img.shields.io/badge/drop-drop1-red.svg) +JS Property Controls SVG
[js-propertycontrols-svg](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/js-propertycontrols-svg)|An SPFx webpart that displays a Scalable Vector Graphics (SVG) image using properties to customize how it is rendered. The webpart utilizes the PnP SPFx Property Controls package (specifially the SpinButton and ColorPicker) to set these properties.|![js-propertycontrols-svg](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/js-propertycontrols-svg/assets/js-propertycontrols-svg.gif)|![drop](https://img.shields.io/badge/version-1.3.4-green.svg) +List RiotJS Client-Side Web Part
[riot-list](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/riot-list)|Simplistic sample Web Part that demonstrates the use of RiotJS in creating a SharePoint Framework web part. The properties pane for this web part display a drop down list of lists in the current web. Once the user selects one of the lists, the web part display the contents of the list.|![riot-list](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/riot-list/assets/riot-list-preview.gif)|![drop](https://img.shields.io/badge/drop-ga-green.svg) +List subscription
[react-realtime-documents](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-realtime-documents)|Used SharePoint Framework Version|![react-realtime-documents](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-realtime-documents/assets/list-subscription-webpart.png)|![drop](https://img.shields.io/badge/drop-1.7.0-green.svg) +Local Azure Function and SPFx Web Part Development to consume third party APIs
[react-azfunc-vimeo](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-azfunc-vimeo)|This sample shows how to consume third-party APIs through an Azure Functions by a Web Part. In this scenario, Vimeo is the representative third party API.||![drop](https://img.shields.io/badge/drop-1.4.1-green.svg) Microsoft Authentication Library (MSAL JS) authentication sample
[react-msal-msgraph](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-msal-msgraph)|Sample SharePoint Framework web part which makes use of the Microsoft Authentication Library (MSAL JS) to call the Microsoft Graph.|![react-msal-msgraph](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-msal-msgraph/assets/permission-scopes.png)|![drop](https://img.shields.io/badge/drop-GA-green.svg) -SPFX React Grid
[react-multilist-grid](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-multilist-grid)|React-multilist-grid is an SPFX webpart that uses React, Office-UI-Fabric, and Redux to let users edit list data from lists that reside in multiple webs and multiple sites in a single grid, similar to Quick Edit mode. The lists do not to be of the same type – you just need to create column mappings to tell the webpart which fields to show in which columns of the grid.|![react-multilist-grid](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-multilist-grid/src/images/Configuration.PNG)|![drop](https://img.shields.io/badge/drop-RC0-green.svg) -React multi-page client-side web part
[react-multipage](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-multipage)|Sample SharePoint Framework client-side web parts built using React illustrating building multi-page web parts.|![react-multipage](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-multipage/assets/poll-preview.gif)|![drop](https://img.shields.io/badge/drop-GA-green.svg) -React & Office Graph Web Part samples
[react-officegraph](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-officegraph)|Sample SharePoint Framework Client-Side Web Parts built using React showing interacting with the Office Graph.|![react-officegraph](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-officegraph/assets/trendinginthissite-preview.png)|![drop](https://img.shields.io/badge/drop-ga-green.svg) +Microsoft Bot Framework Web Chat
[react-bot-framework](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-bot-framework)|A web part that acts as a web chat component for bot's built on the Microsoft Bot Framework using the Direct Line API. When sending messagesthe web part uses the username of the currently logged in user. The web part has settings for color for branding purposes.|![react-bot-framework](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-bot-framework/assets/bot-framework-webpart-preview.png)|![drop](https://img.shields.io/badge/drop-GA-green.svg) +Migrating existing Angular applications to SharePoint Framework sample
[angular-migration](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/angular-migration)|This is a sample Angular application before and after it has been migrated to a SharePoint Framework client-side web part.|![angular-migration](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/angular-migration/assets/angular-todo-preview.png)| +Modern Calendar
[js-modern-calendar](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/js-modern-calendar)|This is a modern webpart built on the GA version of the SharePoint Framework demonstrating how to build a custom web part with a calendar capabilities in it.|![js-modern-calendar](https://cloud.githubusercontent.com/assets/13068139/23584809/14c4333e-0121-11e7-9bf1-3117651222d3.png)|![drop](https://img.shields.io/badge/version-GA-green.svg) +Modern Charts
[react-modern-charts](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-modern-charts)|This webpart uses the Chart.js library to visualize SharePoint list data.|![react-modern-charts](https://raw.githubusercontent.com/jcoleman-pcprofessional/Modern-Charts/master/assets/modern-chart2.png)| Offline First React Webpart built using LocalForage, Whatwg-Fetch, ES6-Promise
[react-offline-first](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-offline-first)|Sample Webpart that demonstrates how to use offline storage in a way that is moreoffline first.|![react-offline-first](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-offline-first/assets/preview.gif)|![drop](https://img.shields.io/badge/drop-GA-green.svg) Organisation Chart
[react-organisationchart](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-organisationchart)|A simple Organisation Chart webpart using Office UI Fabric, React, REST API batching and ServiceScope plumbing.|![react-organisationchart](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-organisationchart/assets/orgchart.png)|![drop](https://img.shields.io/badge/version-GA-green.svg) Page Contributors Web Part
[react-pagecontributors](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-pagecontributors)|Displays page contributors in reverse chronological order.|![react-pagecontributors](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-pagecontributors/assets/pagecontributors_inaction.PNG)|![drop](https://img.shields.io/badge/version-GA-green.svg) People Picker (React)
[react-peoplepicker](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-peoplepicker)|SharePoint Framework solution with the Office UI Fabric People Picker, the client web part across the SharePoint Rest API is able to retrieve people and groups.|![react-peoplepicker](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-peoplepicker/assets/Preview.gif)|![drop](https://img.shields.io/badge/version-GA-green.svg) -React Project Online
[react-project-online](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-project-online)|This sample shows how to use SPFx to consume data from the Project Online REST API. The code uses Placeholder and ListView reusable controls to create a better experience to the end user.The web part is intended to be used on a project site within PWA site collection, as the web url used for the rest calls is being taken from the web part context object. To use this web part outside of the PWA site collection, just add a new property to the web part to allow the PWA site collection url to be configured (or when provisioning through a provisioning mechanist).The web part is currently returning project tasks as a simple proof of concept.|![react-project-online](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-project-online/assets/Preview.gif)|![drop](https://img.shields.io/badge/drop-1.6.0-green.svg) +Personal e-mail
[react-graph-personalemail](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-graph-personalemail)|Sample React web part showing how to retrieve and display personal e-mail retrieved using the Microsoft Graph.|![react-graph-personalemail](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-graph-personalemail/assets/preview.png)|![drop](https://img.shields.io/badge/drop-1.6.0-green.svg) +PnPJS with MS Graph
[react-graph-pnpjs](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-graph-pnpjs)|Sample React webpart showing PnPJS with MS Graph integration|![react-graph-pnpjs](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-graph-pnpjs/assets/summary.png)|![drop](https://img.shields.io/badge/drop-1.7.1-green.svg) Property Bag Navigation Webparts
[react-property-bag-editor](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-property-bag-editor)|A set of webparts that lets you set property bag settings on site collections and enable navigation using those properties.||![drop](https://img.shields.io/badge/version-GA-green.svg) Provision SharePoint Assets with the SPFx solution package
[react-provision-assets](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-provision-assets)|This sample shows how we can provision Document Library, Custom List, Web and List PropertyBag properties, Site Columns, Content Types, Images, Site Page with the SFPx Client side webpart and even prepopulated list and library items along with the SPFx solution package. All of the components can be deployed at once with the SPFx webpart when the app is added to a SharePoint site. It also contains custom list and document library xml schemas.|![react-provision-assets](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-provision-assets/assets/spfx-provision-assets.gif)|![drop](https://img.shields.io/badge/drop-GA-green.svg) -Real Time News Feed using Azure Logic Apps, Node.js and socket.io
[react-real-time](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-real-time)|This sample shows you how to implement real time web parts using the SPFx, Azure Logic Apps, Node.js and socket.io.|![react-real-time](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-real-time/assets/animated-demo.gif)|![drop](https://img.shields.io/badge/drop-drop4-red.svg) -List subscription
[react-realtime-documents](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-realtime-documents)|Used SharePoint Framework Version|![react-realtime-documents](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-realtime-documents/assets/list-subscription-webpart.png)|![drop](https://img.shields.io/badge/drop-1.7.0-green.svg) -SharePoint Framework webpart sample using React, Redux and ImmutableJS
[react-redux-async-immutablejs](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-redux-async-immutablejs)|SharePoint Framework webpart which uses Redux to maintain a single state for the entire application and ImmutableJS to create performant state trees.|![react-redux-async-immutablejs](https://raw.githubusercontent.com/vman/sp-dev-fx-webparts/master/samples/react-redux-async-immutablejs/assets/react-redux-immutable.gif)|![drop](https://img.shields.io/badge/version-GA-green.svg) -Webpart with React and Redux
[react-redux](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-redux)|Sample webpart implementation that uses Redux to keep track of its state.|![react-redux](https://i.gyazo.com/729c4addf6c992513f8eb91a3fa0e302.gif)|![drop](https://img.shields.io/badge/drop-drop5-red.svg) -SPFx webpart using Redux-Form library and React
[react-reduxform](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-reduxform)|Sample webpart to demonstrate the use of Redux-Form library with SPFx, React and Typescript. Demonstrates how to easily build a dynamic grid using redux-form.|![react-reduxform](https://github.com/vipulkelkar/sp-dev-fx-webparts/blob/ReduxFormSample/samples/react-reduxform/assets/ReduxFormWebpart.gif)|![drop](https://img.shields.io/badge/version-GA-green.svg) -react-related-items
[react-related-items](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-related-items)|This is where you include your WebPart documentation.|| -SPFx ReactiveX (RxJs) Event Emitter Sample
[react-rxjs-event-emitter](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-rxjs-event-emitter)|This sample shows how we can use the ReactiveX (RxJs) library with the SharePoint Framework to communicate between web parts through broadcasting events utilizing the Publish–subscribe pattern. It enables a webpart or component to emit event (broadcast message) and that event is received by other web parts or components that have been subscribed to receive it. Please note this is custom implementation of the Publish–subscribe pattern by using the ReactiveX (RxJs) library. The SPFx will nativelly support this in future without the need of custom implementation through new SPFx api called Event Aggregator, but it is still in Alpha.|![react-rxjs-event-emitter](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-rxjs-event-emitter/assets/spfx-event-emitter.gif)|![drop](https://img.shields.io/badge/drop-1.4.1-green.svg) -Script editor web part for modern pages built in React
[react-script-editor](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-script-editor)|Coming from old classic SharePoint pages you might have existing script solutions you want to re-use on a modern pagewithout having to repackage it as a new SharePoint Framework web part. This web part is similar to the classicScript Editor Web Part, and allows you do drop arbitrary script or html on a modern page.|![react-script-editor](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-script-editor/assets/modern-script-editor-wp.gif)|![drop](https://img.shields.io/badge/drop-1.4.1-green.svg) -SharePoint Framework search with search box, refiners and paging sample
[react-search-refiners](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-search-refiners)|This sample shows you how to build user friendly SharePoint search experiences using SPFx in the modern interface. The main features include:|![react-search-refiners](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-search-refiners/images/react-search-refiners.gif)|![drop](https://img.shields.io/badge/drop-1.7.0-green.svg) -Search Client-Side Web Part built with React and Flux
[react-search](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-search)|Sample Search Web Part with internal and external template support. This sample illustrates how you can use React and Flux within the SharePoint Framework.|![react-search](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-search/assets/preview.png)|![drop](https://img.shields.io/badge/drop-GA-green.svg) -SPFX React Grid
[react-securitygrid](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-securitygrid)|React-securitygrid is an SPFX webpart that uses React and Office-UI-Fabric to render a grid showing which users have access to which lists/libraries/folders/files on a Web as shown here:|![react-securitygrid](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-securitygrid/src/images/MainDisplay.PNG)| -React Side Panel Client-Side Web Part
[react-side-panel](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-side-panel)|The web part illustrates creation and usage of Side Panel (Sidebar) control.|![react-side-panel](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-side-panel/assets/side-panel.gif)|![drop](https://img.shields.io/badge/drop-ga-green.svg) -react-sitepages-metadata
[react-sitepages-metadata](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-sitepages-metadata)|Solution provides an enhancement to SitePages library that enables updating existing items with metadata, and a rollup WebPart to display them.|![react-sitepages-metadata](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-sitepages-metadata/assets/demo-wp.gif)|![drop](https://img.shields.io/badge/version-GA-green.svg) -React Skype Status WebPart
[react-skype-status](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-skype-status)|This sample demonstrates how to use the UCWA JS SDK for skype with the SharePoint Framework. It shows how to subscribe to status change of the different people of the organization but you can get much more information, checkout the documentationIt allows leverages the Office UI Fabric Persona card to display comprehensive information about the user.|![react-skype-status](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-skype-status/images/demo.gif)|![drop](https://img.shields.io/badge/drop-GA-green.svg) -SPFx React Slide Swiper
[react-slide-swiper](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-slide-swiper)|This SPFx React web part sample demonstrates mobile touch slide swiper. By default the swiper web part is responsive, has cross device and browser touch support and uses paging, but additional features like navigation, autoplay, loop of the slides and more can be enabled from the web part properties panel. The swiper web part can be used as carousel as well. The slides or cards template can easily be customized. The SPFx React swiper client side solution can easly be extended with more swiper, carousel like features because it is based on a popular feature rich JavaScript library called Swiper.|![react-slide-swiper](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-slide-swiper/assets/SPFx-React-Slider-Swiper.gif)|![drop](https://img.shields.io/badge/drop-1.6.0-green.svg) -Communicate using elevated privileges with SharePoint
[react-sp-elevatedprivileges](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-sp-elevatedprivileges)|Sample SharePoint Framework client-side web part illustrating communication with SharePoint using elevated privileges through a custom Web API.|![react-sp-elevatedprivileges](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-sp-elevatedprivileges/assets/preview.png)|![drop](https://img.shields.io/badge/drop-drop4-red.svg) +React & Office Graph Web Part samples
[react-officegraph](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-officegraph)|Sample SharePoint Framework Client-Side Web Parts built using React showing interacting with the Office Graph.|![react-officegraph](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-officegraph/assets/trendinginthissite-preview.png)|![drop](https://img.shields.io/badge/drop-ga-green.svg) +React Aggregated Calendar Webpart
[react-aggregated-calendar](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-aggregated-calendar)|This is a sample webpart developed using React Framework to gather the aggregated events from the multiple calendars from multiple sites using Full Calendar from fullcalendar.io|![react-aggregated-calendar](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-aggregated-calendar/assets/react-aggregated-calendar.gif)|![drop](https://img.shields.io/badge/version-GA-green.svg) +React Calendar Feed Web Part
[react-calendar-feed](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-calendar-feed)|This web part uses RSS event feeds, iCal feeds, or WordPress calendar feeds and renders events using a look and feel that is consistent with the SharePoint out-of-the-box Group calendar/events web part.|![react-calendar-feed](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-calendar-feed/assets/react-calendar-feed-demo.gif)|![drop](https://img.shields.io/badge/drop-1.7.1-green.svg) +React Chart Control
[react-chartcontrol](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-chartcontrol)|This sample contains several web parts that demonstrate how to use the ChartControl from @pnp/spfx-controls-react.|![react-chartcontrol](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-chartcontrol/assets/react-chartcontrol.gif)|![drop](https://img.shields.io/badge/drop-1.7.1-green.svg) +React Content Query WebPart
[react-content-query-webpart](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-content-query-webpart)|The React Content Query WebPart is a modern version of the good old Content by Query WebPart that was introduced in SharePoint 2007. Built for SharePoint 2016 and Office 365, this modern version is built against the new SharePoint Framework (SPFx) and uses the latest Web Stack practices. While the original WebPart was based on a XSLT templating engine, this React WebPart is based on the well known Handlebars templating engine, which empowers users to create simple, yet powerfull HTML templates for rendering the queried content. This new version also lets the user query any site collections which resides on the same domain url, add unlimited filters, query DateTime fields to the nearest minute rather than being limited to a day, and much more.|![react-content-query-webpart](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-content-query-webpart/Misc/toolpart.gif)|![drop](https://img.shields.io/badge/drop-GA-green.svg) +React File Upload WebPart
[react-file-upload](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-file-upload)|The file upload web part allowing users to upload multiple files to a document library or as item attachments.|![react-file-upload](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-file-upload/assets/SPFileUploadPreview.gif)|![drop](https://img.shields.io/badge/version-GA-green.svg) +React List Form WebPart
[react-list-form](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-list-form)|The React List Form web part is a web part for adding a list form to any page. It provides a working example of implementing generic SharePoint list forms using the SharePoint Framework (SPFx) and the React and Office UI Fabric libraries.|![react-list-form](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-list-form/assets/React-ListForm-Overview.gif)|![drop](https://img.shields.io/badge/version-GA-green.svg) +React multi-page client-side web part
[react-multipage](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-multipage)|Sample SharePoint Framework client-side web parts built using React illustrating building multi-page web parts.|![react-multipage](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-multipage/assets/poll-preview.gif)|![drop](https://img.shields.io/badge/drop-GA-green.svg) +React Project Online
[react-project-online](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-project-online)|This sample shows how to use SPFx to consume data from the Project Online REST API. The code uses Placeholder and ListView reusable controls to create a better experience to the end user.The web part is intended to be used on a project site within PWA site collection, as the web url used for the rest calls is being taken from the web part context object. To use this web part outside of the PWA site collection, just add a new property to the web part to allow the PWA site collection url to be configured (or when provisioning through a provisioning mechanist).The web part is currently returning project tasks as a simple proof of concept.|![react-project-online](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-project-online/assets/Preview.gif)|![drop](https://img.shields.io/badge/drop-1.6.0-green.svg) +React sample showing the use of @pnp/js with Async / Await
[react-async-await-sp-pnp-js](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-async-await-sp-pnp-js)|This webpart demonstrates how to use PnPJS with Async functions into the SharePoint Framework as well as integrating PnP JS and SPFx Logging systems. Real example querying SharePoint library to show document sizes.|![react-async-await-sp-pnp-js](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-async-await-sp-pnp-js/assets/async-await-sp-pnp-js.png)|![drop](https://img.shields.io/badge/drop-1.4.1-green.svg) React sample showing the use of PnP JS Core custom objects with @select and @expand decorators
[react-sp-pnp-js-property-decorators](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-sp-pnp-js-property-decorators)|This webpart demonstrates how to use PnP JS Core Custom Objects with @select and @expand TypeScript decorators.If you are going to use PnP JS Core library and you've plans for extending it with Custom Business Objects, then this project will show you some best practices.You can also find more information in the blog series about working with Custom Business Objects, Parsers and TypeScript Decorators in PnP JS Core||![drop](https://img.shields.io/badge/drop-GA-green.svg) -SPFx webpart with Taxonomy picker Office UI Fabric Panel.
[react-taxonomypicker-panel](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-taxonomypicker-panel)|Sample webpart with Single and Multi-select taxonomy pickers using Office UI Fabric panel. The webpart uses the Taxonomy API support available in the @pnp/taxonomy.|![react-taxonomypicker-panel](https://github.com/vipulkelkar/sp-dev-fx-webparts/blob/TaxonomyPanelPicker/samples/react-taxonomypicker-panel/assets/TaxonomyPicker.gif)|![drop](https://img.shields.io/badge/drop-1.5.1-green.svg) -Taxonomy Picker (React)
[react-taxonomypicker](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-taxonomypicker)|A Taxonomy Picker control built with React based on react-taxonomypicker for use with SharePoint Framework client-side web parts (SPFx).|![react-taxonomypicker](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-taxonomypicker/assets/react-taxonomy-picker-spfx.gif)|![drop](https://img.shields.io/badge/drop-GA-green.svg) +React Side Panel Client-Side Web Part
[react-side-panel](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-side-panel)|The web part illustrates creation and usage of Side Panel (Sidebar) control.|![react-side-panel](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-side-panel/assets/side-panel.gif)|![drop](https://img.shields.io/badge/drop-ga-green.svg) +React Skype Status WebPart
[react-skype-status](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-skype-status)|This sample demonstrates how to use the UCWA JS SDK for skype with the SharePoint Framework. It shows how to subscribe to status change of the different people of the organization but you can get much more information, checkout the documentationIt allows leverages the Office UI Fabric Persona card to display comprehensive information about the user.|![react-skype-status](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-skype-status/images/demo.gif)|![drop](https://img.shields.io/badge/drop-GA-green.svg) React Teams Creator Web Part
[react-team-creator](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-team-creator)|The web part illustrates usage of MS Graph beta APIs to work with Teams:|![react-team-creator](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-team-creator/assets/teams-creator.png)|![drop](https://img.shields.io/badge/drop-1.7.0-green.svg) -Spfx Webpart / Teams tab Group members suggestion
[react-teams-tab-suggested-members](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-teams-tab-suggested-members)|This webpart uses Graph API to suggest you members to add to a group (based on People endpoint), so you can easily add those members to the Group / Teams. It can be used as a SharePoint webpart or Teams tab|![react-teams-tab-suggested-members](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-teams-tab-suggested-members/assets/SuggestedMembersTeamsTab.jpg)| -SharePoint Themes Client Side Web Part
[react-themes](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-themes)|This web part illustrates how to use SharePoint Theme variables in custom web parts.|![react-themes](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-themes/assets/themes.png)|![drop](https://img.shields.io/badge/drop-ga-green.svg) React TinyMCE Editor WebPart Integration with SharePoint
[react-tinymce](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-tinymce)|React TinyMCE is one of the worlds most popular editors for the web.It has many features out of the box and many more plugins that can beadded when needed. You can create your own plugins if you want, theeditor is powered by the communitiy.|![react-tinymce](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-tinymce/assets/preview.gif)|![drop](https://img.shields.io/badge/version-GA-green.svg) -Summary
[react-todo-basic](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-todo-basic)|A simple todo web part built using react to showcase some of the SharePoint Framework developer features, utilities and best practices in building react based web parts.|![react-todo-basic](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-todo-basic/assets/todo-basic-demo.gif)|![drop](https://img.shields.io/badge/drop-GA-green.svg) React Video Library
[react-videolibrary](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-videolibrary)|A set of 3 SPFX webparts that use different open-source carousels (react-3d-carousel, reactjs-coverface, and react-slick)to display videos stored on an Office 365 Video Channel. The idea being to display a carousel of the thumbnail images, and thenwhen a user clicks on one of the thumbnails, replace the tumbnail with a video player, or an Iframe playing the video.|![react-videolibrary](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-videolibrary/src/assets/react-3d-carousel.PNG)|![drop](https://img.shields.io/badge/drop-drop5-red.svg) React Visio Embed
[react-visio](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-visio)|This sample shows how the Visio JavaScript APIs can be used within a web part. For sample purposes, this web part will display the name and the hyperlinks of a Visio shape when the user selects it.|![react-visio](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-visio/assets/Preview.PNG)|![drop](https://img.shields.io/badge/drop-1.6.0-green.svg) -Webhooks Realtime
[react-webhooks-realtime](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-webhooks-realtime)|This web part demonstrates how to leverage the capabilities of SharePoint Webhooks.The libraries used by this web part are Socket.io, sp pnp js, moment.|![react-webhooks-realtime](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-webhooks-realtime/assets/spfx-react-webhooks-realtime.gif)|![drop](https://img.shields.io/badge/version-GA-green.svg) -Yammer REST API SPFx webpart
[react-yammer-api](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-yammer-api)|This sample shows how Yammer REST APIs can be consumed by using SharePoint Framework React webpart and the Yammer JavaScript SDK. The SPFx webpart contains wrapper around the Yammer JavaScript SDK that can be extended for fluent typescript api experience.|![react-yammer-api](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-yammer-api/assets/spfx-yammer-api-webpart.jpg)|![drop](https://img.shields.io/badge/drop-GA-green.svg) -Youtube Web Part
[react-youtube](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-youtube)|This web part allows to search and view the Youtube videos, across the Youtube API, directly on a SharePoint page, furthermore the property panel offers the possibility to specify the api key, the number of items to display and it is also possible specify a Youtube Channel Id.|![react-youtube](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-youtube/assets/Preview.gif)|![drop](https://img.shields.io/badge/version-GA-green.svg) -List RiotJS Client-Side Web Part
[riot-list](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/riot-list)|Simplistic sample Web Part that demonstrates the use of RiotJS in creating a SharePoint Framework web part. The properties pane for this web part display a drop down list of lists in the current web. Once the user selects one of the lists, the web part display the contents of the list.|![riot-list](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/riot-list/assets/riot-list-preview.gif)|![drop](https://img.shields.io/badge/drop-ga-green.svg) +react-item-history
[react-item-History](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-item-History)|This listview command is used to show the past versions of the selected list item in a grid.|![react-item-History](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-item-History/Capture.PNG)|![drop](https://img.shields.io/badge/version-GA-green.svg) +react-related-items
[react-related-items](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-related-items)|This is where you include your WebPart documentation.|| +react-relay-service
[react-RelayService](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-RelayService)|This is where you include your WebPart documentation.|| +react-sitepages-metadata
[react-sitepages-metadata](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-sitepages-metadata)|Solution provides an enhancement to SitePages library that enables updating existing items with metadata, and a rollup WebPart to display them.|![react-sitepages-metadata](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-sitepages-metadata/assets/demo-wp.gif)|![drop](https://img.shields.io/badge/version-GA-green.svg) +Real Time News Feed using Azure Logic Apps, Node.js and socket.io
[react-real-time](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-real-time)|This sample shows you how to implement real time web parts using the SPFx, Azure Logic Apps, Node.js and socket.io.|![react-real-time](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-real-time/assets/animated-demo.gif)|![drop](https://img.shields.io/badge/drop-drop4-red.svg) +Sample showing the use of @pnp/sp library with Knockoutjs
[knockout-sp-pnp-js](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/knockout-sp-pnp-js)|This webpart demonstrates how to integrate the @pnp/sp library into the SharePoint Framework as well as including mock data and simple list I/O.|![knockout-sp-pnp-js](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/knockout-sp-pnp-js/assets/screenshot.png)|![drop](https://img.shields.io/badge/drop-1.7.0-green.svg) +Script editor web part for modern pages built in React
[react-script-editor](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-script-editor)|Coming from old classic SharePoint pages you might have existing script solutions you want to re-use on a modern pagewithout having to repackage it as a new SharePoint Framework web part. This web part is similar to the classicScript Editor Web Part, and allows you do drop arbitrary script or html on a modern page.|![react-script-editor](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-script-editor/assets/modern-script-editor-wp.gif)|![drop](https://img.shields.io/badge/drop-1.4.1-green.svg) +Search Client-Side Web Part Built with Angular v1.x
[angular-search](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/angular-search)|This is a sample search web part that illustrates how you can use Angular within the new SharePoint Framework|![angular-search](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/angular-search/assets/angularSearch.png)|![drop](https://img.shields.io/badge/drop-rc0-green.svg) +Search Client-Side Web Part built with React and Flux
[react-search](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-search)|Sample Search Web Part with internal and external template support. This sample illustrates how you can use React and Flux within the SharePoint Framework.|![react-search](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-search/assets/preview.png)|![drop](https://img.shields.io/badge/drop-GA-green.svg) SharePoint CRUD operations
[sharepoint-crud](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/sharepoint-crud)|Sample Web Parts illustrating performing SharePoint CRUD operations in React, Angular, JavaScript without any framework and using the @pnp/sp library.|![sharepoint-crud](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/sharepoint-crud/assets/preview.png)|![drop](https://img.shields.io/badge/drop-1.6.0-green.svg) +SharePoint Framework Facebook Page Social Plugin web part sample
[react-facebook-plugin](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-facebook-plugin)|This sample shows how to implement iFrame-based web parts with a dynamic responsive behavior on the example of Facebook Page Social Plugin.|![react-facebook-plugin](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-facebook-plugin/assets/preview.png)|![drop](https://img.shields.io/badge/drop-1.5.1-blue.svg) +SharePoint Framework PnP Controls Sample
[pnp-controls](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/pnp-controls)|This is a sample project that contains a web part which makes use of the PnP SPFx Controls:|![pnp-controls](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/pnp-controls/assets/webpart-outcome.gif)|![drop](https://img.shields.io/badge/drop-1.4.1-green.svg) +SharePoint Framework React Jest Testing sample
[react-jest-testing](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-jest-testing)|This sample uses the popular Jest Testing Framework with a SPFx client side solution. It is a SPFx-Jest-Enzyme-Sinon starter kit so you can start writing and debugging unit tests in typescript for your SPFx solution.The setup includes unit tests examples, code coverage reports in different formats, visual studio code unit test debug configurations for typescript, setting a coverage threshold (gates) for continuous integration and continuous deployment scenarios.|![react-jest-testing](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-jest-testing/assets/Jest-Typescript-VSCode-debugging.png)|![drop](https://img.shields.io/badge/drop-1.6.0-green.svg) +SharePoint Framework search with search box, refiners and paging sample
[react-search-refiners](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-search-refiners)|This sample shows you how to build user friendly SharePoint search experiences using SPFx in the modern interface. The main features include:|![react-search-refiners](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-search-refiners/images/react-search-refiners.gif)|![drop](https://img.shields.io/badge/drop-1.7.0-green.svg) +SharePoint Framework webpart sample using React, Redux and ImmutableJS
[react-redux-async-immutablejs](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-redux-async-immutablejs)|SharePoint Framework webpart which uses Redux to maintain a single state for the entire application and ImmutableJS to create performant state trees.|![react-redux-async-immutablejs](https://raw.githubusercontent.com/vman/sp-dev-fx-webparts/master/samples/react-redux-async-immutablejs/assets/react-redux-immutable.gif)|![drop](https://img.shields.io/badge/version-GA-green.svg) +SharePoint Themes Client Side Web Part
[react-themes](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-themes)|This web part illustrates how to use SharePoint Theme variables in custom web parts.|![react-themes](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-themes/assets/themes.png)|![drop](https://img.shields.io/badge/drop-ga-green.svg) +SPFx Event Aggregator Sample
[react-events-aggregator](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-events-aggregator)|This sample shows how we can use the SPFx Event Aggregator to communicate between web parts through broadcasting events utilizing the Publish–subscribe pattern. It enables a webpart or component to raise event (broadcast message) through the SPFx event aggregator and that event is received by other web parts or components that have been subscribed to receive it.|![react-events-aggregator](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-events-aggregator/assets/spfx-event-aggregator.gif)|![drop](https://img.shields.io/badge/drop-1.4.1-green.svg) +SPFx React app settings webpart
[react-app-settings](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-app-settings)|This sample shows how appSettings.json file can be added and used within SharePoint Framewrok webparts similar to the Web.config / App.config key value app settings in .NET Framework projects.That allows better DevOps and Continious Integration automation. Typescript module appSettings.d.ts is also added so it allows the json app settings to be imported to any webpart or react component with intellisense support.|![react-app-settings](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-app-settings/assets/spfx-appSettings-json.PNG)|![drop](https://img.shields.io/badge/drop-1.4.1-green.svg) +SPFX React Grid
[react-multilist-grid](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-multilist-grid)|React-multilist-grid is an SPFX webpart that uses React, Office-UI-Fabric, and Redux to let users edit list data from lists that reside in multiple webs and multiple sites in a single grid, similar to Quick Edit mode. The lists do not to be of the same type – you just need to create column mappings to tell the webpart which fields to show in which columns of the grid.|![react-multilist-grid](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-multilist-grid/src/images/Configuration.PNG)|![drop](https://img.shields.io/badge/drop-RC0-green.svg) +SPFX React Grid
[react-securitygrid](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-securitygrid)|React-securitygrid is an SPFX webpart that uses React and Office-UI-Fabric to render a grid showing which users have access to which lists/libraries/folders/files on a Web as shown here:|![react-securitygrid](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-securitygrid/src/images/MainDisplay.PNG)| +SPFx React Slide Swiper
[react-slide-swiper](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-slide-swiper)|This SPFx React web part sample demonstrates mobile touch slide swiper. By default the swiper web part is responsive, has cross device and browser touch support and uses paging, but additional features like navigation, autoplay, loop of the slides and more can be enabled from the web part properties panel. The swiper web part can be used as carousel as well. The slides or cards template can easily be customized. The SPFx React swiper client side solution can easly be extended with more swiper, carousel like features because it is based on a popular feature rich JavaScript library called Swiper.|![react-slide-swiper](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-slide-swiper/assets/SPFx-React-Slider-Swiper.gif)|![drop](https://img.shields.io/badge/drop-1.6.0-green.svg) +SPFx ReactiveX (RxJs) Event Emitter Sample
[react-rxjs-event-emitter](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-rxjs-event-emitter)|This sample shows how we can use the ReactiveX (RxJs) library with the SharePoint Framework to communicate between web parts through broadcasting events utilizing the Publish–subscribe pattern. It enables a webpart or component to emit event (broadcast message) and that event is received by other web parts or components that have been subscribed to receive it. Please note this is custom implementation of the Publish–subscribe pattern by using the ReactiveX (RxJs) library. The SPFx will nativelly support this in future without the need of custom implementation through new SPFx api called Event Aggregator, but it is still in Alpha.|![react-rxjs-event-emitter](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-rxjs-event-emitter/assets/spfx-event-emitter.gif)|![drop](https://img.shields.io/badge/drop-1.4.1-green.svg) +SPFx Sample with Handlebars.js
[handlebarsjs-webpack-loader](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/handlebarsjs-webpack-loader)|This sample demonstrate how to set up SPFX to use Handlebars through webpack loader.||![drop](https://img.shields.io/badge/drop-1.4.1-green.svg) +Spfx Webpart / Teams tab Group members suggestion
[react-teams-tab-suggested-members](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-teams-tab-suggested-members)|This webpart uses Graph API to suggest you members to add to a group (based on People endpoint), so you can easily add those members to the Group / Teams. It can be used as a SharePoint webpart or Teams tab|![react-teams-tab-suggested-members](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-teams-tab-suggested-members/assets/SuggestedMembersTeamsTab.jpg)| +Spfx Webpart read / update MS Graph Custom Schema Extensions
[react-graph-schema-extensions](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-graph-schema-extensions)|This sample shows how read and update a custom Schema extension in MS Graph. It shows how to create acustom Schema extension in Graph to store custom data related to an Office 365 Group, and how we can read and updatethat data using an spfx webpart.|![react-graph-schema-extensions](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-graph-schema-extensions/assets/webpart.png)| +SPFx webpart using Redux-Form library and React
[react-reduxform](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-reduxform)|Sample webpart to demonstrate the use of Redux-Form library with SPFx, React and Typescript. Demonstrates how to easily build a dynamic grid using redux-form.|![react-reduxform](https://github.com/vipulkelkar/sp-dev-fx-webparts/blob/ReduxFormSample/samples/react-reduxform/assets/ReduxFormWebpart.gif)|![drop](https://img.shields.io/badge/version-GA-green.svg) +SPFx webpart with Taxonomy picker Office UI Fabric Panel.
[react-taxonomypicker-panel](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-taxonomypicker-panel)|Sample webpart with Single and Multi-select taxonomy pickers using Office UI Fabric panel. The webpart uses the Taxonomy API support available in the @pnp/taxonomy.|![react-taxonomypicker-panel](https://github.com/vipulkelkar/sp-dev-fx-webparts/blob/TaxonomyPanelPicker/samples/react-taxonomypicker-panel/assets/TaxonomyPicker.gif)|![drop](https://img.shields.io/badge/drop-1.5.1-green.svg) +Spfx Webpart: File Upload using AngularJs
[angular-ngofficeuifabric-file-upload](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/angular-ngofficeuifabric-file-upload)|File Update/Delete webpart using AngularJs and ngOfficeUIFabric with the SharePoint Framework.|![angular-ngofficeuifabric-file-upload](http://i.imgur.com/U5qg4II.png)|![drop](https://img.shields.io/badge/version-GA-green.svg) +Summary
[react-todo-basic](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-todo-basic)|A simple todo web part built using react to showcase some of the SharePoint Framework developer features, utilities and best practices in building react based web parts.|![react-todo-basic](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-todo-basic/assets/todo-basic-demo.gif)|![drop](https://img.shields.io/badge/drop-GA-green.svg) +Taxonomy Picker (React)
[react-taxonomypicker](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-taxonomypicker)|A Taxonomy Picker control built with React based on react-taxonomypicker for use with SharePoint Framework client-side web parts (SPFx).|![react-taxonomypicker](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-taxonomypicker/assets/react-taxonomy-picker-spfx.gif)|![drop](https://img.shields.io/badge/drop-GA-green.svg) +Taxonomy Web Part
[knockout-taxonomy](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/knockout-taxonomy)|Sample Web Part illustrating
  • Reading taxonomy term stores' hierarchy from SharePoint
  • Loading JavaScript Object Model scripts
  • creating Knockout components
|![knockout-taxonomy](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/knockout-taxonomy/assets/Taxonomy.png)|![drop](https://img.shields.io/badge/drop-ga-green.svg) +title of the sample
[js-dynamic-bundling-libraries](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/js-dynamic-bundling-libraries)|This sample illustrates how SPFx functionality and packages can be bundled in multiple '.js' files then be dynamically & asynchronously loaded into the page at execution time, such as with a button click.|![js-dynamic-bundling-libraries](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/js-dynamic-bundling-libraries/assets/WebPart-Preview-PreClick.jpg)|![drop](https://img.shields.io/badge/drop-1.7.0-orange.svg) +title of the sample
[knockout-dependent-properties](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/knockout-dependent-properties)|Sample Web Part illustrating
  • requesting Lists and Views data from SharePoint REST API
  • creating Knockout dropdown custom component with Fabric UI styling
  • creating dependent properties (dropdowns) in Client-Side Web Part Property Pane
|![knockout-dependent-properties](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/knockout-dependent-properties/assets/dep-props.png)|![drop](https://img.shields.io/badge/drop-ga-green.svg) Todo Client Web Part built with Vue.js and Vue's single-file components
[vuejs-todo-single-file-component](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/vuejs-todo-single-file-component)|Sample Todo web part demonstrating how you can utilize Vue (a progressive framework for building user interfaces) with SharePoint Framework using handy single-file components approach.||![drop](https://img.shields.io/badge/drop-ga-green.svg) +�Using jQuery loaded from CDN
[jquery-cdn](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/jquery-cdn)|This is a sample web Part that illustrates the use of jQuery and its plugins loaded from CDN for building SharePoint Framework client-side web parts.|![jquery-cdn](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/jquery-cdn/assets/preview_weather.png)|![drop](https://img.shields.io/badge/drop-drop2-red.svg) +Using React Accordion plugin with SPFx
[react-accordion](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-accordion)|This is a sample web Part that illustrates the use of React Accessible Accordion plugin for building SharePoint Framework client-side web parts to show SharePoint list data in Accordion format.|![react-accordion](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-accordion/assets/previewAccordion.PNG)|![drop](https://img.shields.io/badge/drop-1.5.1-green.svg) +Web part displaying hierarchical information from SharePoint list
[react-display-hierarchy](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-display-hierarchy)|At the time of developing this sample, the Office 365 UI fabric does not have any control for displaying hierarchical information. This web part helps to display the hierarchical information from SharePoint list.|![react-display-hierarchy](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-display-hierarchy/assets/webpart-preview.png)|![drop](https://img.shields.io/badge/drop-1.6-green.svg) +Webhooks Realtime
[react-webhooks-realtime](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-webhooks-realtime)|This web part demonstrates how to leverage the capabilities of SharePoint Webhooks.The libraries used by this web part are Socket.io, sp pnp js, moment.|![react-webhooks-realtime](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-webhooks-realtime/assets/spfx-react-webhooks-realtime.gif)|![drop](https://img.shields.io/badge/version-GA-green.svg) +Webpart showing Url validation for SharePoint using Office Graph
[react-graph-evalurl](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-graph-evalurl)|This sample contains a class that evaluates the url input of a text field against the Microsoft Graph. It is possible to evalute the existance of the following three SharePoint Elements:|![react-graph-evalurl](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-graph-evalurl/assets/evaluation-client-searching-for-site-collection.png)|![drop](https://img.shields.io/badge/drop-1.4.1-green.svg) +Webpart with React and Mobx
[react-mobx](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-mobx)|Sample webpart implementation that uses Mobx to keep track of its state.|![react-mobx](https://i.gyazo.com/e6f1903b9a9c8201985cd25cc1fe28bc.gif)|![drop](https://img.shields.io/badge/drop-drop5-red.svg) +Webpart with React and Redux
[react-redux](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-redux)|Sample webpart implementation that uses Redux to keep track of its state.|![react-redux](https://i.gyazo.com/729c4addf6c992513f8eb91a3fa0e302.gif)|![drop](https://img.shields.io/badge/drop-drop5-red.svg) +Yammer REST API SPFx webpart
[react-yammer-api](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-yammer-api)|This sample shows how Yammer REST APIs can be consumed by using SharePoint Framework React webpart and the Yammer JavaScript SDK. The SPFx webpart contains wrapper around the Yammer JavaScript SDK that can be extended for fluent typescript api experience.|![react-yammer-api](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-yammer-api/assets/spfx-yammer-api-webpart.jpg)|![drop](https://img.shields.io/badge/drop-GA-green.svg) +Youtube Web Part
[react-youtube](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-youtube)|This web part allows to search and view the Youtube videos, across the Youtube API, directly on a SharePoint page, furthermore the property panel offers the possibility to specify the api key, the number of items to display and it is also possible specify a Youtube Channel Id.|![react-youtube](https://raw.githubusercontent.com/SharePoint/sp-dev-fx-webparts/master/samples/react-youtube/assets/Preview.gif)|![drop](https://img.shields.io/badge/version-GA-green.svg) \ No newline at end of file