diff --git a/.circleci/config.yml b/.circleci/config.yml index 7d353014a..d554f14eb 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -23,6 +23,9 @@ jobs: - run: name: Update version number for telemetry command: npm run versionUpdater + - run: + name: Create/update the missing localization keys + command: npm run localization - run: name: build command: npm run build @@ -67,7 +70,7 @@ jobs: name: Run codevoc command: './node_modules/.bin/codecov -t $CODECOV_TOKEN' environment: - - CODECOV_TOKEN: "83a5682f-4c9f-4ed7-9da8-ccc04416f364" + - CODECOV_TOKEN: "$CODECOV_TOKEN" - store_artifacts: path: temp/coverage prefix: coverage @@ -96,7 +99,7 @@ jobs: deploy_docs: working_directory: ~/sp-dev-fx-controls-react/docs/documentation docker: - - image: circleci/python:2.7-jessie-node + - image: circleci/python:3.6.6-jessie-node steps: - attach_workspace: at: ~/sp-dev-fx-controls-react @@ -108,7 +111,7 @@ jobs: command: sudo pip install mkdocs - run: name: Install MkDocs theme - command: sudo pip install mkdocs-material + command: sudo pip install mkdocs-material==3.1.0 - run: name: Avoid hosts unknown for github command: echo -e "Host github.com\n\tStrictHostKeyChecking no\n" > ~/.ssh/config diff --git a/CHANGELOG.JSON b/CHANGELOG.JSON index 55290e72b..2e17a709b 100644 --- a/CHANGELOG.JSON +++ b/CHANGELOG.JSON @@ -1,5 +1,56 @@ { "versions": [ + { + "version": "1.17.0", + "changes": { + "new": [ + "`ComboBoxListItemPicker` component [#292](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/292)", + "`Localization`: Project now supports localization of all SharePoint Online languages (auto translation via Cognitive Services) [#456](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/456)", + "`IconPicker`: component [#485](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/485)", + "`FolderExplorer` component [#499](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/499)" + ], + "enhancements": [ + "`SecurityTrimmedControl`: Added the option to show a control when the user doesn't have permissions [307](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/307)", + "`PnP Telemetry` service opt-out support [#475](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/475)", + "`TaxonomyPicker`: Possibility to hide deprecated and \"Available for Tagging\"= false terms [#421](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/421)", + "`FilePicker` - French translation [#449](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/449)", + "Slovak localization [#457](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/457)", + "`TaxonomyPicker`: Placeholder for Taxonomy Picker [#464](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/464)", + "`ListItemPicker`, `PeoplePicker`: Placeholder for `ListItemPicker` and `PeoplePicker` [#486](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/486)", + "`FilePicker`: Do not store active tab in url's hash [#488](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/488)", + "`DateTimePicker`: Placeholder property option added [#503](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/503)" + ], + "fixes": [ + "`RichText`: problem with edit mode [#445](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/445)", + "`ListView` documentation: Typo - the first occurrence of maxWidth should be minWidth [#400](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/400)", + "`RichText`: Text indent buttons were copy-paste of subscript and superscript buttons. Clicking on the text-indent buttons would call subscript or superscript instead. [#454](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/454)", + "`RichText`: Fix of removing text and inserting link instead [#455](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/455)", + "`FilePicker`: Read file content in IE11 [#444](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/444)", + "`ListPicker`: listPicker always return \"test\" when multiple allowed [#458](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/458)", + "`FilePicker`: Button text overflow fix + global classnames and properties", + "`FieldUserRenderer`: implementation of `api/SP.UserProfiles.PeopleManager/GetPropertiesFor` is not working on on-prem [#468](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/468)", + "`Placeholder`: Placeholder component is not rendering after a string change in it's properties [#469](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/469)", + "`ListView` documentation update: `minWidth` instead of `maxWidth` [#480](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/480)", + "`DateTimePicker`: Minutes and Seconds validation [#495](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/495)", + "`FilePicker`: bingAPIKey not working [#489](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/489)" + ] + }, + "contributions": [ + "[Richard Gigan](https://github.com/PooLP)", + "[Reginald Johnson](https://github.com/LastGunslinger)", + "[JonasBjerke89](https://github.com/JonasBjerke89)", + "[Prasad Kasireddy](https://github.com/PrasadKasireddy)", + "[Alexander Kleshcheov](https://github.com/SharePickle)", + "[Konradox](https://github.com/Konradox)", + "[Léo Maradan](https://github.com/Leomaradan)", + "[Matej](https://github.com/Matej4386)", + "[mgwojciech](https://github.com/mgwojciech)", + "[Joel Rodrigues](https://github.com/joelfmrodrigues)", + "[Jason S](https://github.com/jason-appliedis)", + "[Piotr Siatka](https://github.com/siata13)", + "[Rabia Williams](https://github.com/rabwill)" + ] + }, { "version": "1.16.0", "changes": { @@ -275,7 +326,10 @@ "`PeoplePicker`: Suggested People not loading after first selection [#134](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/134)" ] }, - "contributions": ["[Gautam Sheth](https://github.com/gautamdsheth)", "[Alex Terentiev](https://github.com/AJIXuMuK)"] + "contributions": [ + "[Gautam Sheth](https://github.com/gautamdsheth)", + "[Alex Terentiev](https://github.com/AJIXuMuK)" + ] }, { "version": "1.8.0", @@ -298,7 +352,12 @@ "`PeoplePicker`: fix freezes when typing in search values [#117](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/117)" ] }, - "contributions": ["[Thomas Lamb](https://github.com/ThomasLamb)", "[Joel Rodrigues](https://github.com/joelfmrodrigues)", "[Mikael Svenson](https://github.com/wobba)", "[Alex Terentiev](https://github.com/AJIXuMuK)"] + "contributions": [ + "[Thomas Lamb](https://github.com/ThomasLamb)", + "[Joel Rodrigues](https://github.com/joelfmrodrigues)", + "[Mikael Svenson](https://github.com/wobba)", + "[Alex Terentiev](https://github.com/AJIXuMuK)" + ] }, { "version": "1.7.0", @@ -314,7 +373,12 @@ "`FieldNameRenderer` onClick does not suppress default link behavior [#103](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/103)" ] }, - "contributions": ["Octavie van Haaften", "Asish Padhy", "Mikael Svenson", "Alex Terentiev"] + "contributions": [ + "Octavie van Haaften", + "Asish Padhy", + "Mikael Svenson", + "Alex Terentiev" + ] }, { "version": "1.6.0", @@ -328,7 +392,9 @@ "PeoplePicker property selectedItems not implemented? [#90](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/90)" ] }, - "contributions": ["Octavie van Haaften"] + "contributions": [ + "Octavie van Haaften" + ] }, { "version": "1.5.0", @@ -345,7 +411,10 @@ "Fixed issue in single selection mode when all group items were selected in the `ListView` when user clicked on the group header [#86](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/86)" ] }, - "contributions": ["Asish Padhy", "Alex Terentiev"] + "contributions": [ + "Asish Padhy", + "Alex Terentiev" + ] }, { "version": "1.4.0", @@ -418,7 +487,9 @@ "changes": { "new": [], "enhancements": [], - "fixes": ["Fixes an issue sorting in the `ListView` control while items were selected. Indexes were not updated."] + "fixes": [ + "Fixes an issue sorting in the `ListView` control while items were selected. Indexes were not updated." + ] }, "contributions": [] }, @@ -427,7 +498,9 @@ "changes": { "new": [], "enhancements": [], - "fixes": ["`FieldTaxonomyRenderer` got fixed to support single and multiple values"] + "fixes": [ + "`FieldTaxonomyRenderer` got fixed to support single and multiple values" + ] }, "contributions": [] }, @@ -439,7 +512,9 @@ "`IFrameDialog` was added to the project" ], "enhancements": [], - "fixes": ["Fixed theming in the `WebPartTitle` control"] + "fixes": [ + "Fixed theming in the `WebPartTitle` control" + ] }, "contributions": [] }, @@ -448,7 +523,9 @@ "changes": { "new": [], "enhancements": [], - "fixes": ["`FileTypeIcon` icon fixed where it did not render an icon. This control should now works in SPFx extensions."] + "fixes": [ + "`FileTypeIcon` icon fixed where it did not render an icon. This control should now works in SPFx extensions." + ] }, "contributions": [] }, @@ -456,8 +533,12 @@ "version": "1.1.2", "changes": { "new": [], - "enhancements": ["Improved telemetry with some object checks"], - "fixes": ["Fix for `WebPartTitle` control to inherit color"] + "enhancements": [ + "Improved telemetry with some object checks" + ], + "fixes": [ + "Fix for `WebPartTitle` control to inherit color" + ] }, "contributions": [] }, @@ -465,7 +546,9 @@ "version": "1.1.1", "changes": { "new": [], - "enhancements": ["Removed operation name from telemetry"], + "enhancements": [ + "Removed operation name from telemetry" + ], "fixes": [] }, "contributions": [] @@ -474,7 +557,9 @@ "version": "1.1.0", "changes": { "new": [], - "enhancements": ["Telemetry added"], + "enhancements": [ + "Telemetry added" + ], "fixes": [] }, "contributions": [] @@ -482,8 +567,12 @@ { "version": "1.0.0", "changes": { - "new": ["`WebPartTitle` control got added"], - "enhancements": ["ListView control got extended with the ability to specify a set of preselected items."], + "new": [ + "`WebPartTitle` control got added" + ], + "enhancements": [ + "ListView control got extended with the ability to specify a set of preselected items." + ], "fixes": [] }, "contributions": [] @@ -493,14 +582,18 @@ "changes": { "new": [], "enhancements": [], - "fixes": ["Fix for the `ListView` control when selection is used in combination with `setState`."] + "fixes": [ + "Fix for the `ListView` control when selection is used in combination with `setState`." + ] }, "contributions": [] }, { "version": "Beta 1.0.0-beta.7", "changes": { - "new": ["Grouping functionality added to the `ListView` control"], + "new": [ + "Grouping functionality added to the `ListView` control" + ], "enhancements": [], "fixes": [] }, @@ -509,7 +602,9 @@ { "version": "Beta 1.0.0-beta.6", "changes": { - "new": ["Initial release"], + "new": [ + "Initial release" + ], "enhancements": [], "fixes": [] }, diff --git a/CHANGELOG.md b/CHANGELOG.md index 949c90984..c6c8b1ef1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,45 @@ # Releases +## 1.17.0 + +### New control(s) + +- `ComboBoxListItemPicker` component [#292](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/292) +- `Localization`: Project now supports localization of all SharePoint Online languages (auto translation via Cognitive Services) [#456](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/456) +- `IconPicker`: component [#485](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/485) +- `FolderExplorer` component [#499](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/499) + +### Enhancements + +- `SecurityTrimmedControl`: Added the option to show a control when the user doesn't have permissions [307](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/307) +- `PnP Telemetry` service opt-out support [#475](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/475) +- `TaxonomyPicker`: Possibility to hide deprecated and "Available for Tagging"= false terms [#421](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/421) +- `FilePicker` - French translation [#449](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/449) +- Slovak localization [#457](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/457) +- `TaxonomyPicker`: Placeholder for Taxonomy Picker [#464](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/464) +- `ListItemPicker`, `PeoplePicker`: Placeholder for `ListItemPicker` and `PeoplePicker` [#486](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/486) +- `FilePicker`: Do not store active tab in url's hash [#488](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/488) +- `DateTimePicker`: Placeholder property option added [#503](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/503) + +### Fixes + +- `RichText`: problem with edit mode [#445](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/445) +- `ListView` documentation: Typo - the first occurrence of maxWidth should be minWidth [#400](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/400) +- `RichText`: Text indent buttons were copy-paste of subscript and superscript buttons. Clicking on the text-indent buttons would call subscript or superscript instead. [#454](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/454) +- `RichText`: Fix of removing text and inserting link instead [#455](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/455) +- `FilePicker`: Read file content in IE11 [#444](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/444) +- `ListPicker`: listPicker always return "test" when multiple allowed [#458](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/458) +- `FilePicker`: Button text overflow fix + global classnames and properties +- `FieldUserRenderer`: implementation of `api/SP.UserProfiles.PeopleManager/GetPropertiesFor` is not working on on-prem [#468](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/468) +- `Placeholder`: Placeholder component is not rendering after a string change in it's properties [#469](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/469) +- `ListView` documentation update: `minWidth` instead of `maxWidth` [#480](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/480) +- `DateTimePicker`: Minutes and Seconds validation [#495](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/495) +- `FilePicker`: bingAPIKey not working [#489](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/489) + +### Contributors + +Special thanks to our contributors (in alphabetical order): [Richard Gigan](https://github.com/PooLP), [Reginald Johnson](https://github.com/LastGunslinger), [JonasBjerke89](https://github.com/JonasBjerke89), [Prasad Kasireddy](https://github.com/PrasadKasireddy), [Alexander Kleshcheov](https://github.com/SharePickle), [Konradox](https://github.com/Konradox), [Léo Maradan](https://github.com/Leomaradan), [Matej](https://github.com/Matej4386), [mgwojciech](https://github.com/mgwojciech), [Joel Rodrigues](https://github.com/joelfmrodrigues), [Jason S](https://github.com/jason-appliedis), [Piotr Siatka](https://github.com/siata13), [Rabia Williams](https://github.com/rabwill). + ## 1.16.0 ### Enhancements diff --git a/config/karma.config.js b/config/karma.config.js index b9273881e..6e260a057 100644 --- a/config/karma.config.js +++ b/config/karma.config.js @@ -20,6 +20,9 @@ module.exports = function (config) { }; config.plugins.push(htmlReporter); + config.set({ + framework: ['jasmine'] + }) // Add the remap-coverage - code coverage for the original files config.reporters.push('remap-coverage'); config.coverageReporter = { diff --git a/config/supported.localization.json b/config/supported.localization.json new file mode 100644 index 000000000..23607d2b2 --- /dev/null +++ b/config/supported.localization.json @@ -0,0 +1,3 @@ +{ + "langs": ["bg-bg", "ca-es", "da-dk", "de-de", "el-gr", "es-es", "et-ee", "fi-fi", "fr-fr", "it-it", "ja-jp", "lt-lt", "lv-lv", "nb-no", "nl-nl", "pl-pl", "pt-pt", "ro-ro", "ru-ru", "sk-sk", "sr-latn-rs", "sv-se", "tr-tr", "vi-vn", "zh-cn", "zh-tw"] +} diff --git a/docs/documentation/docs/about/release-notes.md b/docs/documentation/docs/about/release-notes.md index 949c90984..c6c8b1ef1 100644 --- a/docs/documentation/docs/about/release-notes.md +++ b/docs/documentation/docs/about/release-notes.md @@ -1,5 +1,45 @@ # Releases +## 1.17.0 + +### New control(s) + +- `ComboBoxListItemPicker` component [#292](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/292) +- `Localization`: Project now supports localization of all SharePoint Online languages (auto translation via Cognitive Services) [#456](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/456) +- `IconPicker`: component [#485](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/485) +- `FolderExplorer` component [#499](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/499) + +### Enhancements + +- `SecurityTrimmedControl`: Added the option to show a control when the user doesn't have permissions [307](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/307) +- `PnP Telemetry` service opt-out support [#475](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/475) +- `TaxonomyPicker`: Possibility to hide deprecated and "Available for Tagging"= false terms [#421](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/421) +- `FilePicker` - French translation [#449](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/449) +- Slovak localization [#457](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/457) +- `TaxonomyPicker`: Placeholder for Taxonomy Picker [#464](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/464) +- `ListItemPicker`, `PeoplePicker`: Placeholder for `ListItemPicker` and `PeoplePicker` [#486](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/486) +- `FilePicker`: Do not store active tab in url's hash [#488](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/488) +- `DateTimePicker`: Placeholder property option added [#503](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/503) + +### Fixes + +- `RichText`: problem with edit mode [#445](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/445) +- `ListView` documentation: Typo - the first occurrence of maxWidth should be minWidth [#400](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/400) +- `RichText`: Text indent buttons were copy-paste of subscript and superscript buttons. Clicking on the text-indent buttons would call subscript or superscript instead. [#454](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/454) +- `RichText`: Fix of removing text and inserting link instead [#455](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/455) +- `FilePicker`: Read file content in IE11 [#444](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/444) +- `ListPicker`: listPicker always return "test" when multiple allowed [#458](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/458) +- `FilePicker`: Button text overflow fix + global classnames and properties +- `FieldUserRenderer`: implementation of `api/SP.UserProfiles.PeopleManager/GetPropertiesFor` is not working on on-prem [#468](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/468) +- `Placeholder`: Placeholder component is not rendering after a string change in it's properties [#469](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/469) +- `ListView` documentation update: `minWidth` instead of `maxWidth` [#480](https://github.com/SharePoint/sp-dev-fx-controls-react/pull/480) +- `DateTimePicker`: Minutes and Seconds validation [#495](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/495) +- `FilePicker`: bingAPIKey not working [#489](https://github.com/SharePoint/sp-dev-fx-controls-react/issues/489) + +### Contributors + +Special thanks to our contributors (in alphabetical order): [Richard Gigan](https://github.com/PooLP), [Reginald Johnson](https://github.com/LastGunslinger), [JonasBjerke89](https://github.com/JonasBjerke89), [Prasad Kasireddy](https://github.com/PrasadKasireddy), [Alexander Kleshcheov](https://github.com/SharePickle), [Konradox](https://github.com/Konradox), [Léo Maradan](https://github.com/Leomaradan), [Matej](https://github.com/Matej4386), [mgwojciech](https://github.com/mgwojciech), [Joel Rodrigues](https://github.com/joelfmrodrigues), [Jason S](https://github.com/jason-appliedis), [Piotr Siatka](https://github.com/siata13), [Rabia Williams](https://github.com/rabwill). + ## 1.16.0 ### Enhancements diff --git a/docs/documentation/docs/assets/ComboBoxListItemPicker_1.png b/docs/documentation/docs/assets/ComboBoxListItemPicker_1.png new file mode 100644 index 000000000..2589b32dc Binary files /dev/null and b/docs/documentation/docs/assets/ComboBoxListItemPicker_1.png differ diff --git a/docs/documentation/docs/assets/ComboBoxListItemPicker_Multi.png b/docs/documentation/docs/assets/ComboBoxListItemPicker_Multi.png new file mode 100644 index 000000000..925eff2eb Binary files /dev/null and b/docs/documentation/docs/assets/ComboBoxListItemPicker_Multi.png differ diff --git a/docs/documentation/docs/assets/ComboBoxListItemPicker_Options_Multi.png b/docs/documentation/docs/assets/ComboBoxListItemPicker_Options_Multi.png new file mode 100644 index 000000000..8a3a74da2 Binary files /dev/null and b/docs/documentation/docs/assets/ComboBoxListItemPicker_Options_Multi.png differ diff --git a/docs/documentation/docs/assets/ComboBoxListItemPicker_Options_Single.png b/docs/documentation/docs/assets/ComboBoxListItemPicker_Options_Single.png new file mode 100644 index 000000000..c9e94a6fc Binary files /dev/null and b/docs/documentation/docs/assets/ComboBoxListItemPicker_Options_Single.png differ diff --git a/docs/documentation/docs/assets/FolderExplorer-new.png b/docs/documentation/docs/assets/FolderExplorer-new.png new file mode 100644 index 000000000..c0d7d2e15 Binary files /dev/null and b/docs/documentation/docs/assets/FolderExplorer-new.png differ diff --git a/docs/documentation/docs/assets/FolderExplorer.png b/docs/documentation/docs/assets/FolderExplorer.png new file mode 100644 index 000000000..807476375 Binary files /dev/null and b/docs/documentation/docs/assets/FolderExplorer.png differ diff --git a/docs/documentation/docs/assets/IconPickerOverview.png b/docs/documentation/docs/assets/IconPickerOverview.png new file mode 100644 index 000000000..ee6478841 Binary files /dev/null and b/docs/documentation/docs/assets/IconPickerOverview.png differ diff --git a/docs/documentation/docs/assets/IconPickerPanel.gif b/docs/documentation/docs/assets/IconPickerPanel.gif new file mode 100644 index 000000000..f1c5ef14c Binary files /dev/null and b/docs/documentation/docs/assets/IconPickerPanel.gif differ diff --git a/docs/documentation/docs/controls/ComboBoxListItemPicker.md b/docs/documentation/docs/controls/ComboBoxListItemPicker.md new file mode 100644 index 000000000..f4ab8e94e --- /dev/null +++ b/docs/documentation/docs/controls/ComboBoxListItemPicker.md @@ -0,0 +1,94 @@ +# ComboBoxListItemPicker control + +This control allows you to select one or more items from a list. The List can be filtered to allow select items from a subset of items The item selection is based from a column value. The control will suggest items based on the inserted value. + +Here is an example of the control: + +![ComboBoxComboBoxListItemPicker](../assets/ComboBoxListItemPicker_1.png) + +![ComboBoxListItemPicker multiple selection](../assets/ComboBoxListItemPicker_Multi.png) + +![ComboBoxListItemPicker selected Items](../assets/ComboBoxListItemPicker_Options_Single.png) + +![ComboBoxListItemPicker selected Items (Multiple Options)](../assets/ComboBoxListItemPicker_Options_Multi.png) + +## How to use this control in your solutions + +- Check that you installed the `@pnp/spfx-controls-react` dependency. Check out the [getting started](../../#getting-started) page for more information about installing the dependency. +- Import the control into your component: + +```TypeScript +import { ComboBoxListItemPicker } from '@pnp/spfx-controls-react/lib/ComboBoxListItemPicker'; +``` +- Use the `ComboBoxListItemPicker` control in your code as follows: + +```TypeScript + +``` + +- Use the `ComboBoxListItemPicker` with objects passed in defaultSelectedItems + +```TypeScript + +``` + +- Or only ids + +```TypeScript + +``` + +- The `onSelectedItem` change event returns the list items selected and can be implemented as follows: + +```TypeScript +private onSelectedItem(data: { key: string; name: string }[]) { + for (const item of data) { + console.log(`Item value: ${item.key}`); + console.log(`Item text: ${item.name}`); + } +} +``` +## Implementation + +The `ComboBoxListItemPicker` control can be configured with the following properties: + + +| Property | Type | Required | Description | +| ---- | ---- | ---- | ---- | +| columnInternalName | string | yes | InternalName of column to search and get values. | +| keyColumnInternalName | string | no | InternalName of column to use as the key for the selection. Must be a column with unique values. Default: Id | +| webUrl | string | yes | Url to web hosting list | +| spHttpClient | RequestClient | yes | Any implementation of PnPJS RequestClient | +| listId | string | yes | Guid of the list. | +| onSelectItem | (items: any[]) => void | yes | Callback function which returns the selected items. | +| className | string | no | ClassName for the picker. | +| webUrl | string | no | URL of the site. By default it uses the current site URL. | +| defaultSelectedItems | any[] | no | Initial items that have already been selected and should appear in the people picker. Support objects and Ids only | +| suggestionsHeaderText | string | no | The text that should appear at the top of the suggestion box. | +| noResultsFoundText | string | no | The text that should appear when no results are returned. | +| disabled | boolean | no | Specifies if the control is disabled or not. | +| filter | string | no | Condition to filter list Item, same as $filter ODATA parameter| +| multiSelect | boolean | no | Allows multiple selection| +| onInitialized | () => void | no | Calls when component is ready| + +![](https://telemetry.sharepointpnp.com/sp-dev-fx-controls-react/wiki/controls/ComboBoxListItemPicker) diff --git a/docs/documentation/docs/controls/DateTimePicker.md b/docs/documentation/docs/controls/DateTimePicker.md index c3633a9a1..ae60c23a7 100644 --- a/docs/documentation/docs/controls/DateTimePicker.md +++ b/docs/documentation/docs/controls/DateTimePicker.md @@ -68,6 +68,7 @@ The `DateTimePicker` control can be configured with the following properties: | showSeconds | boolean | no | Specifies, if seconds dropdown should be shown, defaults to false. | | timeDisplayControlType | TimeDisplayControlType | no | Specifies what type of control to use when rendering time part. | | showLabels | boolean | no | Specifies if labels in front of date and time parts should be rendered. | +| placeholder | string | no | Placeholder text for the DatePicker. | Enum `TimeDisplayControlType` diff --git a/docs/documentation/docs/controls/FilePicker.md b/docs/documentation/docs/controls/FilePicker.md index eeff97ccb..949b27039 100644 --- a/docs/documentation/docs/controls/FilePicker.md +++ b/docs/documentation/docs/controls/FilePicker.md @@ -74,6 +74,7 @@ The FilePicker component can be configured with the following properties: | hideSiteFilesTab | boolean | no | Specifies if SiteFilesTab should be hidden. | | hideLocalUploadTab | boolean | no | Specifies if LocalUploadTab should be hidden. | | hideLinkUploadTab | boolean | no | Specifies if LinkUploadTab should be hidden. | +| storeLastActiveTab | boolean | no | Specifies if last active tab will be stored after the Upload panel has been closed. Note: the value of selected tab is stored in the queryString hash. Default `true` | interface `IFilePickerResult` diff --git a/docs/documentation/docs/controls/FolderExplorer.md b/docs/documentation/docs/controls/FolderExplorer.md new file mode 100644 index 000000000..fab5d5748 --- /dev/null +++ b/docs/documentation/docs/controls/FolderExplorer.md @@ -0,0 +1,61 @@ +# FolderExplorer control + +This control allows you to explore a folder structure by clinking on a folder to load it's sub-folders and using a breadcrumb navigation to navigate back to a previous level. +It also allows the user to create a new folder at the current level being explored. + +Here is an example of the control: + +![FolderExplorer](../assets/FolderExplorer.png) + +`FolderExplorer` folder creation: + +![FolderExplorer add folder](../assets/FolderExplorer-new.png) + +## How to use this control in your solutions + +- Check that you installed the `@pnp/spfx-controls-react` dependency. Check out the [getting started](../../#getting-started) page for more information about installing the dependency. +- Import the control into your component: + +```TypeScript +import { FolderExplorer, IFolder } from "@pnp/spfx-controls-react/lib/FolderExplorer"; +``` + +- Use the `FolderExplorer` control in your code as follows: + +```TypeScript + +``` + +- The `onSelect` change event returns the selected folder and can be implemented as follows: + +```TypeScript +private _onFolderSelect = (folder: IFolder): void => { + console.log('selected folder', folder); +} +``` + +## Implementation + +The `FolderExplorer` control can be configured with the following properties: + +| Property | Type | Required | Description | +| ---- | ---- | ---- | ---- | +| context | WebPartContext \| ExtensionContext | yes | The context object of the SPFx loaded webpart or customizer. | +| rootFolder | IFolder | yes | The lowest level folder that can be explored. This can be the root folder of a library. | +| defaultFolder | IFolder | yes | The default folder to be explored. | +| canCreateFolders | boolean | no | Allow current user to create folders on the target location. If enabled, you need to ensure that the user has the required permissions. | +| hiddenBreadcrumb | boolean | no | Hide the breadcrumb control. | +| hiddenFilterBox | boolean | no | Hide the filter box | +| onSelect | (folder: IFolder): void | no | Callback function called after a folder is selected. | + +![](https://telemetry.sharepointpnp.com/sp-dev-fx-controls-react/wiki/controls/FolderExplorer) diff --git a/docs/documentation/docs/controls/IconPicker.md b/docs/documentation/docs/controls/IconPicker.md new file mode 100644 index 000000000..dd9e0e4db --- /dev/null +++ b/docs/documentation/docs/controls/IconPicker.md @@ -0,0 +1,46 @@ +# IconPicker control + +Control that allows to search and select an icon from office-ui-fabric-react icons. + +## Overview +The control allows selecting an icon from the list of icons available in the office-ui-fabric-react library. Icon list is a static copy of available icons. Currently, only one icon selection is supported. +![Icon Picker overview](../assets/IconPickerOverview.png) + + +## Displayed in the panel +Icon picker always opens a new panel where you can pick an icon. The panel displays all the icons and maintains readability. Picker does not displays selected icon outside the panel. +![Icon Picker panel](../assets/IconPickerPanel.gif) + + +## How to use this control + +- Check that you installed the `@pnp/spfx-controls-react` dependency. Check out the [getting started](../../#getting-started) page for more information about installing the dependency. +- Import the following module to your component: + +```TypeScript +import { IconPicker } from '@pnp/spfx-controls-react/lib/IconPicker'; +``` + +- Use the `IconPicker` control in your code as follows: + +```TypeScript + { this.setState({icon: iconName}); }} + onSave={(iconName: string) => { this.setState({icon: iconName}); }} /> +``` + +## Implementation + +The IconPicker component can be configured with the following properties: + +| Property | Type | Required | Description | +| ---- | ---- | ---- | ---- | +| buttonLabel | string | no | Specifies the label of the icon picker button. | +| onSave | (iconName: string) => void | yes | Handler when the icon has been selected and picker has been closed. | +| onChange | (iconName: string) => void | no | Handler when the icon selection has been changed. | +| disabled | boolean | no | Specifies if the picker button is disabled | +| buttonClassName | boolean | no | If provided, additional class name will be added to the picker button | +| panelClassName | boolean | no | If provided, additional class name will be added to the picker panel | +| currentIcon | boolean | no | Specifies default selected icon | + +![](https://telemetry.sharepointpnp.com/sp-dev-fx-controls-react/wiki/controls/IconPicker) diff --git a/docs/documentation/docs/controls/ListItemPicker.md b/docs/documentation/docs/controls/ListItemPicker.md index c426780d7..530195440 100644 --- a/docs/documentation/docs/controls/ListItemPicker.md +++ b/docs/documentation/docs/controls/ListItemPicker.md @@ -60,5 +60,6 @@ The `ListItemPicker` control can be configured with the following properties: | noResultsFoundText | string | no | The text that should appear when no results are returned. | | disabled | boolean | no | Specifies if the control is disabled or not. | | filter | string | no | condition to filter list Item, same as $filter ODATA parameter| +| placeholder | string | no | Short text hint to display in empty picker | ![](https://telemetry.sharepointpnp.com/sp-dev-fx-controls-react/wiki/controls/ListItemPicker) diff --git a/docs/documentation/docs/controls/ListPicker.md b/docs/documentation/docs/controls/ListPicker.md index 9431eb729..9063d5626 100644 --- a/docs/documentation/docs/controls/ListPicker.md +++ b/docs/documentation/docs/controls/ListPicker.md @@ -59,6 +59,7 @@ The `ListPicker` control can be configured with the following properties: | selectedList | string OR string[] | no | Keys of the selected item(s). If you provide this, you must maintain selection state by observing onSelectionChanged events and passing a new value in when changed. | | multiSelect | boolean | no | Optional mode indicates if multi-choice selections is allowed. Default to `false`. | | label | string | no | Label to use for the control. | +| placeHolder | string | no | Placeholder label to show in the dropdown. **Deprecated. Use `placeholder` instead.** | | placeholder | string | no | Placeholder label to show in the dropdown. | | onSelectionChanged | (newValue: string OR string[]): void | no | Callback function when the selected option changes. | diff --git a/docs/documentation/docs/controls/ListView.md b/docs/documentation/docs/controls/ListView.md index 1a5eae712..04054e077 100644 --- a/docs/documentation/docs/controls/ListView.md +++ b/docs/documentation/docs/controls/ListView.md @@ -87,7 +87,7 @@ The `IViewField` has the following implementation: | displayName | string | no | Name that will be used as the column title. If not defined, the name property will be used. | | linkPropertyName | string | no | Specify the field name that needs to be used to render a link for the current field. | | sorting | boolean | no | Specify if you want to enable sorting for the current field. | -| maxWidth | number | no | Specify the minimum width of the column. | +| minWidth | number | no | Specify the minimum width of the column. | | maxWidth | number | no | Specify the maximum width of the column. | | isResizable | boolean | no | Determines if the column can be resized. | | render | function | no | Override how the field has to get rendered. | diff --git a/docs/documentation/docs/controls/PeoplePicker.md b/docs/documentation/docs/controls/PeoplePicker.md index 741d137a8..c70d862c8 100644 --- a/docs/documentation/docs/controls/PeoplePicker.md +++ b/docs/documentation/docs/controls/PeoplePicker.md @@ -75,6 +75,7 @@ The People picker control can be configured with the following properties: | ensureUser | boolean | no | When ensure user property is true, it will return the local user ID on the current site when doing a tenant wide search. | false | | suggestionsLimit | number | no | Maximum number of suggestions to show in the full suggestion list. | 5 | | resolveDelay | number | no | Add delay to resolve and search users | 200 | +| placeholder | string | no | Short text hint to display in empty picker | Enum `PrincipalType` diff --git a/docs/documentation/docs/controls/Placeholder.md b/docs/documentation/docs/controls/Placeholder.md index 1d3c1b8db..491639b0b 100644 --- a/docs/documentation/docs/controls/Placeholder.md +++ b/docs/documentation/docs/controls/Placeholder.md @@ -26,7 +26,7 @@ import { Placeholder } from "@pnp/spfx-controls-react/lib/Placeholder"; - With the `onConfigure` property you can define what it needs to do when you click on the button. Like for example opening the property pane: ```typescript -private _onConfigure() { +private _onConfigure = () => { // Context of the web part this.props.context.propertyPane.open(); } diff --git a/docs/documentation/docs/controls/SecurityTrimmedControl.md b/docs/documentation/docs/controls/SecurityTrimmedControl.md index a1e17da43..159d2abc5 100644 --- a/docs/documentation/docs/controls/SecurityTrimmedControl.md +++ b/docs/documentation/docs/controls/SecurityTrimmedControl.md @@ -56,6 +56,19 @@ import { SecurityTrimmedControl } from "@pnp/spfx-controls-react/lib/SecurityTri ``` +**Show a control when the user doesn't have permissions** + +```jsx +SOrry, you don't have permissions to this list.

}> + {/* Specify the components to load when user has the required permissions */} +
+``` + ## Implementation The `SecurityTrimmedControl` can be configured with the following properties: @@ -70,6 +83,8 @@ The `SecurityTrimmedControl` can be configured with the following properties: | folderPath | string | no | Specify the name of a folder to check the user permissions against. Will be overridden if itemId is present. | | itemId | number | no | Specify the ID of the item to check the user permissions against. Takes precedence over folder. | | className | string | no | Specify the className to be used on the parent element. | +| noPermissionsControl | JSX.Element | no | Optional. Specify the control you want to render if user doesn't have permissions. | +| showLoadingAnimation | boolean | no | Optional. Specify should render loading animation. | The `PermissionLevel` enum has the following values: diff --git a/docs/documentation/docs/controls/TaxonomyPicker.md b/docs/documentation/docs/controls/TaxonomyPicker.md index fbc87b22b..2394fc0f1 100644 --- a/docs/documentation/docs/controls/TaxonomyPicker.md +++ b/docs/documentation/docs/controls/TaxonomyPicker.md @@ -115,6 +115,9 @@ The TaxonomyPicker control can be configured with the following properties: | disableChildrenOfDisabledParents | boolean | no | Specify if you want to disable the child terms when their parent is disabled. | | anchorId | string | no | Set the anchorid to a child term in the TermSet to be able to select terms from that level and below. | | termActions | ITermActions | no | Allows to execute custom action on the term like e.g. get other term labelsITermActions. | +| hideTagsNotAvailableForTagging | boolean | no | Specifies if the tags marked with 'Available for tagging' = false should be hidden | +| hideDeprecatedTags | boolean | no | Specifies if deprecated tags should be hidden | +| placeholder | string | no | Short text hint to display in empty picker | Interface `IPickerTerm` diff --git a/docs/documentation/docs/index.md b/docs/documentation/docs/index.md index b735e98da..ae0f9bbc0 100644 --- a/docs/documentation/docs/index.md +++ b/docs/documentation/docs/index.md @@ -39,7 +39,9 @@ The following controls are currently available: - [DateTimePicker](./controls/DateTimePicker) (DateTime Picker) - [FilePicker](./controls/FilePicker) (control that allows to browse and select a file from various places) - [FileTypeIcon](./controls/FileTypeIcon) (Control that shows the icon of a specified file path or application) +- [FolderExplorer](./controls/FolderExplorer) (Control that allows to browse the folders and sub-folders from a root folder) - [GridLayout](./controls/GridLayout) (control that renders a responsive grid layout for your web parts) +- [IconPicker](./controls/IconPicker) (control that allows to search and select an icon from office-ui-fabric icons) - [IFrameDialog](./controls/IFrameDialog) (renders a Dialog with an iframe as a content) - [ListItemPicker](./controls/ListItemPicker) (allows to select one or more items from a list) - [ListPicker](./controls/ListPicker) (allows to select one or multiple available lists/libraries of the current site) diff --git a/docs/documentation/mkdocs.yml b/docs/documentation/mkdocs.yml index 939be2871..4a6cbc55c 100644 --- a/docs/documentation/mkdocs.yml +++ b/docs/documentation/mkdocs.yml @@ -13,10 +13,13 @@ nav: - "Polar Area Chart": 'controls/charts/PolarAreaChart.md' - "Radar Chart": 'controls/charts/RadarChart.md' - "Scatter Chart": 'controls/charts/ScatterChart.md' + - ComboBoxListItemPicker: 'controls/ComboBoxListItemPicker.md' - DateTimePicker: 'controls/DateTimePicker.md' - FilePicker: 'controls/FilePicker.md' - FileTypeIcon: 'controls/FileTypeIcon.md' + - FolderExplorer: 'controls/FolderExplorer.md' - GridLayout: 'controls/GridLayout.md' + - IconPicker: 'controls/IconPicker.md' - IFrameDialog: 'controls/IFrameDialog.md' - IFramePanel: 'controls/IFramePanel.md' - ListItemAttachments: 'controls/ListItemAttachments.md' diff --git a/package-lock.json b/package-lock.json index 70e806cba..d5ad67c1f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@pnp/spfx-controls-react", - "version": "1.16.0", + "version": "1.17.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -153,7 +153,7 @@ "@microsoft/load-themed-styles": { "version": "1.7.84", "resolved": "https://registry.npmjs.org/@microsoft/load-themed-styles/-/load-themed-styles-1.7.84.tgz", - "integrity": "sha512-MY0bNJHQRPA/ffFDCXnuOKg+LJwsAP/nX77gpSCBTNBYV5WwVT/QC6N65JXW9jmW6U0jXQ0FdvlUWeKp834/Ng==", + "integrity": "sha1-lGteZMQ2sBIJfPdBDhHEUeDzR1I=", "dev": true } } @@ -287,7 +287,7 @@ "@microsoft/load-themed-styles": { "version": "1.7.84", "resolved": "https://registry.npmjs.org/@microsoft/load-themed-styles/-/load-themed-styles-1.7.84.tgz", - "integrity": "sha512-MY0bNJHQRPA/ffFDCXnuOKg+LJwsAP/nX77gpSCBTNBYV5WwVT/QC6N65JXW9jmW6U0jXQ0FdvlUWeKp834/Ng==", + "integrity": "sha1-lGteZMQ2sBIJfPdBDhHEUeDzR1I=", "dev": true }, "loader-utils": { @@ -718,7 +718,7 @@ "rimraf": { "version": "2.6.3", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "integrity": "sha1-stEE/g2Psnz54KHNqCYt04M8bKs=", "dev": true, "requires": { "glob": "^7.1.3" @@ -727,7 +727,7 @@ "glob": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "integrity": "sha1-OWCDLT8VdBCDQtr9OmezMsCWnfE=", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -1411,9 +1411,9 @@ } }, "@pnp/telemetry-js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@pnp/telemetry-js/-/telemetry-js-1.0.0.tgz", - "integrity": "sha1-LtP5nhIiqibrf8c2DEtERJXiqzg=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@pnp/telemetry-js/-/telemetry-js-2.0.0.tgz", + "integrity": "sha1-ThSqAxVj+yVNrgzvJyp0jCQiNKo=", "requires": { "whatwg-fetch": "2.0.4" } @@ -1424,12 +1424,6 @@ "integrity": "sha1-mgb08TfuhNffBGDB/bETX/psUP0=", "dev": true }, - "@tootallnate/once": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.0.0.tgz", - "integrity": "sha512-KYyTT/T6ALPkIRd2Ge080X/BsXvy9O0hcWTtMWkPvwAwF99+vn6Dv4GzrFT/Nn1LePr+FFDbRXXlqmsy9lw2zA==", - "dev": true - }, "@types/adal": { "version": "1.0.27", "resolved": "https://registry.npmjs.org/@types/adal/-/adal-1.0.27.tgz", @@ -1631,7 +1625,7 @@ "@types/mocha": { "version": "2.2.48", "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.48.tgz", - "integrity": "sha512-nlK/iyETgafGli8Zh9zJVCTicvU3iajSkRwOh3Hhiva598CMqNJ4NcVCGMTGKpGpTYj/9R8RLzS9NAykSSCqGw==", + "integrity": "sha1-NSOxJqCwSUguHDwRh3Rg92Yi/6s=", "dev": true }, "@types/node": { @@ -1667,7 +1661,7 @@ "@types/quill": { "version": "1.3.10", "resolved": "https://registry.npmjs.org/@types/quill/-/quill-1.3.10.tgz", - "integrity": "sha512-IhW3fPW+bkt9MLNlycw8u8fWb7oO7W5URC9MfZYHBlA24rex9rs23D5DETChu1zvgVdc5ka64ICjJOgQMr6Shw==", + "integrity": "sha1-3B97ZYf37pS99SkbySKJ9vBJdhM=", "requires": { "parchment": "^1.1.2" } @@ -1675,7 +1669,7 @@ "@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==", + "integrity": "sha1-fuMwunyq+5gJC+zoal7kQRWQTCw=", "dev": true }, "@types/react": { @@ -1771,7 +1765,7 @@ "@types/tapable": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.4.tgz", - "integrity": "sha512-78AdXtlhpCHT0K3EytMpn4JNxaf5tbqbLcbIRoQIHzpTIyjpxLQKRoxU55ujBXAtg3Nl2h/XWvfDa9dsMOd0pQ==", + "integrity": "sha1-tP/H3Je0mMlps2CkHu4kf4JhY3A=", "dev": true }, "@types/through2": { @@ -1786,7 +1780,7 @@ "@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==", + "integrity": "sha1-lr6uI99vVhhiqDC0KIpJ6GuqwII=", "dev": true, "requires": { "source-map": "^0.6.1" @@ -1795,7 +1789,7 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", "dev": true } } @@ -1832,7 +1826,7 @@ "@types/webpack-env": { "version": "1.13.9", "resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.13.9.tgz", - "integrity": "sha512-p8zp5xqkly3g4cCmo2mKOHI9+Z/kObmDj0BmjbDDJQlgDTiEGTbm17MEwTAusV6XceCy+bNw9q/ZHXHyKo3zkg==", + "integrity": "sha1-pnKHhhySjr9BWakI0fsaKjTUCXo=", "dev": true }, "@types/webpack-stream": { @@ -1877,7 +1871,7 @@ "@uifabric/styling": { "version": "5.37.0", "resolved": "https://registry.npmjs.org/@uifabric/styling/-/styling-5.37.0.tgz", - "integrity": "sha512-3hC0itW/hWSD5J4uANzUKk8XVGWUNkU+VLjEjWsQ6i5lvwFGaanR6Qy0bTkZdFGqFWMXe91CkBHV7HnvEx7tCA==", + "integrity": "sha1-p+R/oBqXkh/s69IDG7k9JiJYpVU=", "requires": { "@microsoft/load-themed-styles": "^1.7.13", "@uifabric/merge-styles": ">=5.17.1 <6.0.0", @@ -1888,7 +1882,7 @@ "@uifabric/utilities": { "version": "5.34.2", "resolved": "https://registry.npmjs.org/@uifabric/utilities/-/utilities-5.34.2.tgz", - "integrity": "sha512-7LDHamnrKpY49S49Nzu1YMTuBtZIgTsQd9AuWTvXlUevD67ZyjSRnhCKlKVZHwe/Vi0jWLIodbup4p5IyRGWoQ==", + "integrity": "sha1-eOsbQs6/Nhzj3gf5nJnHwY6i9VU=", "requires": { "@uifabric/merge-styles": ">=5.17.1 <6.0.0", "prop-types": "^15.5.10", @@ -1914,7 +1908,7 @@ "acorn": { "version": "5.7.3", "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "integrity": "sha1-Z6ojG/iBKXS4UjWpZ3Hra9B+onk=", "dev": true }, "acorn-dynamic-import": { @@ -1946,32 +1940,6 @@ "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", "dev": true }, - "agent-base": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.0.tgz", - "integrity": "sha512-j1Q7cSCqN+AwrmDd+pzgqc0/NpC655x2bUf5ZjRIO77DcNBFmh+OgRNzF6OKdCC9RSCb19fGd99+bhXFdkRNqw==", - "dev": true, - "requires": { - "debug": "4" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, "ajv": { "version": "6.7.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.7.0.tgz", @@ -2018,6 +1986,12 @@ "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", "dev": true }, + "amd-loader": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/amd-loader/-/amd-loader-0.0.8.tgz", + "integrity": "sha1-ECKSgEDlZ+jmpvtYvaBS+BkYkgY=", + "dev": true + }, "amdefine": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", @@ -2036,7 +2010,7 @@ "ansi-colors": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", - "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "integrity": "sha1-Y3S03V1HGP884npnGjscrQdxMqk=", "dev": true, "requires": { "ansi-wrap": "^0.1.0" @@ -2078,7 +2052,7 @@ "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==", + "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", "dev": true, "requires": { "color-convert": "^1.9.0" @@ -2087,7 +2061,7 @@ "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==", + "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=", "dev": true, "requires": { "color-name": "1.1.3" @@ -2223,7 +2197,7 @@ "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==", + "integrity": "sha1-SzXClE8GKov82mZBB2A1D+nd/CE=", "dev": true, "requires": { "delegates": "^1.0.0", @@ -2239,7 +2213,7 @@ "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==", + "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -2254,7 +2228,7 @@ "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==", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -2265,7 +2239,7 @@ "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=", "dev": true, "requires": { "sprintf-js": "~1.0.2" @@ -2366,7 +2340,7 @@ "asn1": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "integrity": "sha1-jSR136tVO7M+d7VOWeiAu4ziMTY=", "dev": true, "requires": { "safer-buffer": "~2.1.0" @@ -2375,7 +2349,7 @@ "asn1.js": { "version": "4.10.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "integrity": "sha1-ucK/WAXx5kqt7tbfOiv6+1pz9aA=", "dev": true, "requires": { "bn.js": "^4.0.0", @@ -2460,7 +2434,7 @@ "atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "integrity": "sha1-bZUX654DDSQ2ZmZR6GvZ9vE1M8k=", "dev": true }, "autoprefixer": { @@ -2486,7 +2460,7 @@ "aws4": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "integrity": "sha1-8OAD2cqef1nHpQiUXXsu+aBKVC8=", "dev": true }, "azure-storage": { @@ -2601,7 +2575,7 @@ "lodash": { "version": "4.17.11", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "integrity": "sha1-s56mIp72B+zYniyN8SU2iRysm40=", "dev": true }, "node-uuid": { @@ -2674,7 +2648,7 @@ "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "integrity": "sha1-+LETa0Bx+9jrFAr/hYsQGewpFfo=", "dev": true } } @@ -2798,7 +2772,7 @@ "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==", + "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", "dev": true, "requires": { "kind-of": "^6.0.0" @@ -2807,7 +2781,7 @@ "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==", + "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", "dev": true, "requires": { "kind-of": "^6.0.0" @@ -2816,7 +2790,7 @@ "is-descriptor": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", "dev": true, "requires": { "is-accessor-descriptor": "^1.0.0", @@ -2835,7 +2809,7 @@ "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==", + "integrity": "sha1-yrHmEY8FEJXli1KBrqjBzSK/wOM=", "dev": true }, "base64-url": { @@ -3066,7 +3040,7 @@ "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", "dev": true, "requires": { "balanced-match": "^1.0.0", @@ -3076,7 +3050,7 @@ "braces": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "integrity": "sha1-WXn9PxTNUxVl5fot8av/8d+u5yk=", "dev": true, "requires": { "arr-flatten": "^1.1.0", @@ -3117,7 +3091,7 @@ "browserify-aes": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "integrity": "sha1-Mmc0ZC9APavDADIJhTu3CtQo70g=", "dev": true, "requires": { "buffer-xor": "^1.0.3", @@ -3131,7 +3105,7 @@ "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==", + "integrity": "sha1-jWR0wbhwv9q807z8wZNKEOlPFfA=", "dev": true, "requires": { "browserify-aes": "^1.0.4", @@ -3142,7 +3116,7 @@ "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==", + "integrity": "sha1-OvTx9Zg5QDVy8cZiBDdfen9wPpw=", "dev": true, "requires": { "cipher-base": "^1.0.1", @@ -3250,7 +3224,7 @@ "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==", + "integrity": "sha1-MnE7wCj3XAL9txDXx7zsHyxgcO8=", "dev": true }, "buffer-xor": { @@ -3347,7 +3321,7 @@ "query-string": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", - "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "integrity": "sha1-p4wBK3HBfgXy4/ojGd0zBoLvs8s=", "dev": true, "requires": { "decode-uri-component": "^0.2.0", @@ -3419,7 +3393,7 @@ "capture-stack-trace": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", - "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", + "integrity": "sha1-psC74fOPOqC5Ijjstv9Cw0TUE10=", "dev": true }, "caseless": { @@ -3464,7 +3438,7 @@ "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -3537,7 +3511,7 @@ "lodash.merge": { "version": "4.6.1", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.1.tgz", - "integrity": "sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ==", + "integrity": "sha1-rcJdnLmbk5HFliTzefu6YNcRHVQ=", "dev": true } } @@ -3648,7 +3622,7 @@ "clean-css": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz", - "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==", + "integrity": "sha1-LUEe92uFabbQyEBo2r6FsKpeXBc=", "dev": true, "requires": { "source-map": "~0.6.0" @@ -3657,7 +3631,7 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", "dev": true } } @@ -3709,7 +3683,7 @@ "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==", + "integrity": "sha1-1ZHe5Kj4vBXaQ86X3O66E9Q+KmU=", "dev": true, "requires": { "inherits": "^2.0.1", @@ -3726,7 +3700,7 @@ "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==", + "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -3741,7 +3715,7 @@ "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==", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -3771,32 +3745,137 @@ "dev": true }, "codecov": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/codecov/-/codecov-3.6.5.tgz", - "integrity": "sha512-v48WuDMUug6JXwmmfsMzhCHRnhUf8O3duqXvltaYJKrO1OekZWpB/eH6iIoaxMl8Qli0+u3OxptdsBOYiD7VAQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/codecov/-/codecov-3.0.0.tgz", + "integrity": "sha1-wnO4xPEpRXI+jcnSWAPYk0Pl8o4=", "dev": true, "requires": { "argv": "0.0.2", - "ignore-walk": "3.0.3", - "js-yaml": "3.13.1", - "teeny-request": "6.0.1", + "request": "2.81.0", "urlgrey": "0.4.4" }, "dependencies": { - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "dev": true, + "requires": { + "co": "^4.6.0", + "json-stable-stringify": "^1.0.1" + } + }, + "assert-plus": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", "dev": true }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "dev": true + }, + "form-data": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", "dev": true, "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.12" + } + }, + "har-schema": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", + "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", + "dev": true + }, + "har-validator": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", + "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", + "dev": true, + "requires": { + "ajv": "^4.9.1", + "har-schema": "^1.0.5" + } + }, + "http-signature": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "dev": true, + "requires": { + "assert-plus": "^0.2.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "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 + }, + "performance-now": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", + "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", + "dev": true + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "qs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", + "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", + "dev": true + }, + "request": { + "version": "2.81.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", + "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", + "dev": true, + "requires": { + "aws-sign2": "~0.6.0", + "aws4": "^1.2.1", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.0", + "forever-agent": "~0.6.1", + "form-data": "~2.1.1", + "har-validator": "~4.2.1", + "hawk": "~3.1.3", + "http-signature": "~1.1.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.7", + "oauth-sign": "~0.8.1", + "performance-now": "^0.2.0", + "qs": "~6.4.0", + "safe-buffer": "^5.0.1", + "stringstream": "~0.0.4", + "tough-cookie": "~2.3.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.0.0" + } + }, + "tough-cookie": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", + "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", + "dev": true, + "requires": { + "punycode": "^1.4.1" } } } @@ -3814,7 +3893,7 @@ "color": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz", - "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", + "integrity": "sha1-aBSOf4XUGtdknF+oyBBvCY0inhA=", "requires": { "color-convert": "^1.9.1", "color-string": "^1.5.2" @@ -3843,12 +3922,12 @@ "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=" }, "color-string": { "version": "1.5.3", "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", - "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", + "integrity": "sha1-ybvF8BtYtUkvPWhXRZy2WQziBMw=", "requires": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" @@ -3885,7 +3964,7 @@ "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==", + "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=", "dev": true, "requires": { "color-name": "1.1.3" @@ -3911,13 +3990,13 @@ "colors": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.3.tgz", - "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==", + "integrity": "sha1-OeAF1Uav4B4B+cTKj6UPaGoBIF0=", "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==", + "integrity": "sha1-LR0kMXr7ir6V1tLAsHtXgTU52Cg=", "dev": true, "requires": { "delayed-stream": "~1.0.0" @@ -3926,7 +4005,7 @@ "commander": { "version": "2.19.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", - "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "integrity": "sha1-9hmKqE5bg8RgVLlN3tv+1e6f8So=", "dev": true }, "component-bind": { @@ -4024,7 +4103,7 @@ "concat-stream": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "integrity": "sha1-kEvfGUzTEi/Gdcd/xKw9T/D9GjQ=", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -4042,7 +4121,7 @@ "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==", + "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -4057,7 +4136,7 @@ "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==", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -4193,7 +4272,7 @@ "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==", + "integrity": "sha1-UbU3qMQ+DwTewZk7/83VBOdYrCA=", "dev": true, "requires": { "safe-buffer": "~5.1.1" @@ -4271,7 +4350,7 @@ "create-ecdh": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "integrity": "sha1-yREbbzMEXEaX8UR4f5JUzcd8Rf8=", "dev": true, "requires": { "bn.js": "^4.1.0", @@ -4290,7 +4369,7 @@ "create-hash": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "integrity": "sha1-iJB4rxGmN1a8+1m9IhmWvjqe8ZY=", "dev": true, "requires": { "cipher-base": "^1.0.1", @@ -4303,7 +4382,7 @@ "create-hmac": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "integrity": "sha1-aRcMeLOrlXFHsriwRXLkfq0iQ/8=", "dev": true, "requires": { "cipher-base": "^1.0.3", @@ -4317,7 +4396,7 @@ "create-react-class": { "version": "15.6.3", "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.6.3.tgz", - "integrity": "sha512-M+/3Q6E6DLO6Yx3OwrWjwHBnvfXXYA7W+dFjt/ZDBemHO1DDZhsalX/NUtnTYclN6GfnBDRh4qRHjcDHmlJBJg==", + "integrity": "sha1-LXMjf7P5cK5uvgEanmb0bbyoADY=", "requires": { "fbjs": "^0.8.9", "loose-envify": "^1.3.1", @@ -4338,7 +4417,7 @@ "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==", + "integrity": "sha1-i75Q6oW+1ZvJ4z3KuCNe6bz0Q80=", "dev": true, "requires": { "pseudomap": "^1.0.2", @@ -4531,7 +4610,7 @@ "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==", + "integrity": "sha1-oXcnGovKUBkXL0+JH8bu2cv2jV0=", "dev": true, "requires": { "cssesc": "^0.1.0", @@ -4679,7 +4758,7 @@ "deasync": { "version": "0.1.14", "resolved": "https://registry.npmjs.org/deasync/-/deasync-0.1.14.tgz", - "integrity": "sha512-wN8sIuEqIwyQh72AG7oY6YQODCxIp1eXzEZlZznBuwDF8Q03Tdy9QNp1BNZXeadXoklNrw+Ip1fch+KXo/+ASw==", + "integrity": "sha1-Iy6iJStEOUjK0DPXkus7JLCj2Cg=", "dev": true, "requires": { "bindings": "~1.2.1", @@ -4719,7 +4798,7 @@ "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "integrity": "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE=", "dev": true } } @@ -4882,7 +4961,7 @@ "deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "integrity": "sha1-xPp8lUBKF6nD6Mp+FTcxK3NjMKw=", "dev": true }, "deep-is": { @@ -4903,7 +4982,7 @@ "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==", + "integrity": "sha1-z4jabL7ib+bbcJT2HYcMvYTO6fE=", "dev": true, "requires": { "object-keys": "^1.0.12" @@ -4920,7 +4999,7 @@ "define-property": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "integrity": "sha1-1Flono1lS6d+AqgX+HENcCyxbp0=", "dev": true, "requires": { "is-descriptor": "^1.0.2", @@ -4930,7 +5009,7 @@ "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==", + "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", "dev": true, "requires": { "kind-of": "^6.0.0" @@ -4939,7 +5018,7 @@ "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==", + "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", "dev": true, "requires": { "kind-of": "^6.0.0" @@ -4948,7 +5027,7 @@ "is-descriptor": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", "dev": true, "requires": { "is-accessor-descriptor": "^1.0.0", @@ -5040,7 +5119,7 @@ "diffie-hellman": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "integrity": "sha1-QOjumPVaIUlgcUaSHGPhrl89KHU=", "dev": true, "requires": { "bn.js": "^4.1.0", @@ -5087,13 +5166,13 @@ "domelementtype": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "integrity": "sha1-0EjESzew0Qp/Kj1f7j9DM9eQSB8=", "dev": true }, "domhandler": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "integrity": "sha1-iAUJfpM9ZehVRvcm1g9euItE+AM=", "dev": true, "requires": { "domelementtype": "1" @@ -5251,7 +5330,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "5.1.2" } } } @@ -5281,7 +5360,7 @@ "elliptic": { "version": "6.4.1", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz", - "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", + "integrity": "sha1-wtC3d2kRuGcixjLDwGxg8vgZk5o=", "dev": true, "requires": { "bn.js": "^4.4.0", @@ -5436,7 +5515,7 @@ "entities": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "integrity": "sha1-vfpzUplmTfr9NFKe1PhSKidf6lY=", "dev": true }, "enzyme": { @@ -5460,7 +5539,7 @@ "errno": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "integrity": "sha1-RoTXF3mtOa8Xfj8AeZb3xnyFJhg=", "dev": true, "requires": { "prr": "~1.0.1" @@ -5469,7 +5548,7 @@ "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==", + "integrity": "sha1-tKxAZIEH/c3PriQvQovqihTU8b8=", "dev": true, "requires": { "is-arrayish": "^0.2.1" @@ -5496,7 +5575,7 @@ "es-abstract": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", - "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", + "integrity": "sha1-rIYUX91QmdjdSVWMy6Lq+biOJOk=", "dev": true, "requires": { "es-to-primitive": "^1.2.0", @@ -5518,7 +5597,7 @@ "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==", + "integrity": "sha1-7fckeAM0VujdqO8J4ArZZQcH83c=", "dev": true, "requires": { "is-callable": "^1.1.4", @@ -5685,7 +5764,7 @@ "esrecurse": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "integrity": "sha1-AHo7n9vCs7uH5IeeoZyS/b05Qs8=", "dev": true, "requires": { "estraverse": "^4.1.0" @@ -5751,7 +5830,7 @@ "events": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", - "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==", + "integrity": "sha1-mgoN+vYok9krh1uPJpjKQRSXPog=", "dev": true }, "evp_bytestokey": { @@ -5882,7 +5961,7 @@ "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==", + "integrity": "sha1-6x53OrsFbc2N8r/favWbizqTZWU=", "dev": true, "requires": { "is-number": "^2.1.0", @@ -6101,7 +6180,7 @@ "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + "integrity": "sha1-+LETa0Bx+9jrFAr/hYsQGewpFfo=" }, "extend-shallow": { "version": "3.0.2", @@ -6116,7 +6195,7 @@ "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==", + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", "dev": true, "requires": { "is-plain-object": "^2.0.4" @@ -6161,7 +6240,7 @@ "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==", + "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", "dev": true, "requires": { "kind-of": "^6.0.0" @@ -6170,7 +6249,7 @@ "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==", + "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", "dev": true, "requires": { "kind-of": "^6.0.0" @@ -6179,7 +6258,7 @@ "is-descriptor": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", "dev": true, "requires": { "is-accessor-descriptor": "^1.0.0", @@ -6210,7 +6289,7 @@ "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==", + "integrity": "sha1-28GRVPVYaQFQojlToK29A1vkX8c=", "dev": true, "requires": { "ansi-gray": "^0.1.1", @@ -6228,7 +6307,7 @@ "fast-diff": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.1.2.tgz", - "integrity": "sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig==" + "integrity": "sha1-S2LEK44D3j+EhGC2OQeZIGldAVQ=" }, "fast-json-stable-stringify": { "version": "2.0.0", @@ -6245,7 +6324,7 @@ "fastparse": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", - "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", + "integrity": "sha1-kXKMWllC7O2FMSg8eUQe5BIsNak=", "dev": true }, "faye-websocket": { @@ -6408,7 +6487,7 @@ "fined": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/fined/-/fined-1.1.1.tgz", - "integrity": "sha512-jQp949ZmEbiYHk3gkbdtpJ0G1+kgtLQBNdP5edFP7Fh+WAYceLQz6yO1SBj72Xkg8GVyTB3bBzAYrHJVh5Xd5g==", + "integrity": "sha1-ldiP8ykSPdGmlQ/fzTIfdGJx4B8=", "dev": true, "requires": { "expand-tilde": "^2.0.2", @@ -6427,7 +6506,7 @@ "flagged-respawn": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", - "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", + "integrity": "sha1-595vEnnd2cqarIpZcdYYYGs6q0E=", "dev": true }, "flatten": { @@ -6486,7 +6565,7 @@ "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==", + "integrity": "sha1-3M5SwF9kTymManq5Nr1yTO/786Y=", "dev": true, "requires": { "asynckit": "^0.4.0", @@ -6549,7 +6628,7 @@ "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==", + "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -6600,7 +6679,7 @@ "fsevents": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.7.tgz", - "integrity": "sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw==", + "integrity": "sha1-SFG2ZKN4PlIAOzxm6w7uEHSTOqQ=", "dev": true, "optional": true, "requires": { @@ -7202,7 +7281,7 @@ "generate-function": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", - "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "integrity": "sha1-8GlhdpDBDIaOc7hGV0Z2T5fDR58=", "dev": true, "requires": { "is-property": "^1.0.2" @@ -7229,7 +7308,7 @@ "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==", + "integrity": "sha1-+Xj6TJDR3+f/LWvtoqUV5xO9z0o=", "dev": true }, "get-proxy": { @@ -7290,7 +7369,7 @@ "glob": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "integrity": "sha1-OWCDLT8VdBCDQtr9OmezMsCWnfE=", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -7530,7 +7609,7 @@ "glogg": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", - "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", + "integrity": "sha1-LX3XAr7aIus7/634gGltpthGMT8=", "dev": true, "requires": { "sparkles": "^1.0.0" @@ -7577,7 +7656,7 @@ "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==", + "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -7592,7 +7671,7 @@ "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==", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -7603,7 +7682,7 @@ "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==", + "integrity": "sha1-/7cD4QZuig7qpMi4C6klPu77+wA=", "dev": true }, "graceful-readlink": { @@ -7698,7 +7777,7 @@ "bluebird": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz", - "integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==", + "integrity": "sha1-fQHG+WFsmlGrD4xUmnnf5uwz76c=", "dev": true }, "isarray": { @@ -7710,7 +7789,7 @@ "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==", + "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -7725,7 +7804,7 @@ "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==", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -8087,7 +8166,7 @@ "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==", + "integrity": "sha1-5d2JiVQ2MNlMbPTWVxIDQfoxY2s=", "dev": true, "requires": { "duplexer": "^0.1.1", @@ -8238,7 +8317,7 @@ "split": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "integrity": "sha1-YFvZvjA6pZ+zX5Ip++oN3snqB9k=", "dev": true, "requires": { "through": "2" @@ -8553,7 +8632,7 @@ "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==", + "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -8568,7 +8647,7 @@ "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==", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -8871,7 +8950,7 @@ "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==", + "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -8886,7 +8965,7 @@ "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==", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -8904,7 +8983,7 @@ "unique-stream": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", - "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", + "integrity": "sha1-xl0RDppK35psWUiygFPZqNBMvqw=", "dev": true, "requires": { "json-stable-stringify-without-jsonify": "^1.0.1", @@ -8914,7 +8993,7 @@ "through2-filter": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", - "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", + "integrity": "sha1-cA54bfI2fCyIzYqlvkz5weeDElQ=", "dev": true, "requires": { "through2": "~2.0.0", @@ -9073,7 +9152,7 @@ "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==", + "integrity": "sha1-HvievT5JllV2de7ZiTEQ3DUPoIA=", "dev": true, "requires": { "ajv": "^6.5.5", @@ -9083,7 +9162,7 @@ "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "integrity": "sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=", "dev": true, "requires": { "function-bind": "^1.1.1" @@ -9200,7 +9279,7 @@ "hash.js": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "integrity": "sha1-C6vKU46NTuSg+JiNaIZlN6ADz0I=", "dev": true, "requires": { "inherits": "^2.0.3", @@ -9232,7 +9311,7 @@ "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "integrity": "sha1-hK5l+n6vsWX922FWauFLrwVmTw8=", "dev": true }, "hmac-drbg": { @@ -9264,13 +9343,13 @@ "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==", + "integrity": "sha1-l/I2l3vW4SVAiTD/bePuxigewEc=", "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==", + "integrity": "sha1-l9RoiutcgYhqNk+qDK0d2hTUM6c=", "dev": true }, "html-loader": { @@ -9289,13 +9368,13 @@ "big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "integrity": "sha1-ZfCvOC9Xi83HQr2cKB6cstd2gyg=", "dev": true }, "json5": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "integrity": "sha1-d5+wAYYE+oVOrL9iUhgNg1Q+Pb4=", "dev": true, "requires": { "minimist": "^1.2.0" @@ -9304,7 +9383,7 @@ "loader-utils": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "integrity": "sha1-H/XcaRHJ8KBiUxpMBLYJQGEIwsc=", "dev": true, "requires": { "big.js": "^5.2.2", @@ -9317,7 +9396,7 @@ "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==", + "integrity": "sha1-0AQOBUcw41TbAIRjWTGUAVIS0gw=", "dev": true, "requires": { "camel-case": "3.0.x", @@ -9332,7 +9411,7 @@ "commander": { "version": "2.17.1", "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "integrity": "sha1-vXerfebelCBc6sxy8XFtKfIKd78=", "dev": true } } @@ -9394,13 +9473,13 @@ "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==", + "integrity": "sha1-1l7b7ehDSdDcMDIIFaFdOcw8u9g=", "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==", + "integrity": "sha1-etOElGWPhGBeL220Q230EPTlvpo=", "dev": true, "requires": { "eventemitter3": "^3.0.0", @@ -9408,34 +9487,6 @@ "requires-port": "^1.0.0" } }, - "http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", @@ -9453,43 +9504,10 @@ "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", "dev": true }, - "https-proxy-agent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", - "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", - "dev": true, - "requires": { - "agent-base": "5", - "debug": "4" - }, - "dependencies": { - "agent-base": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", - "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==", - "dev": true - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, "hyphenate-style-name": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.3.tgz", - "integrity": "sha512-EcuixamT82oplpoJ2XU4pDtKGWQ7b00CD9f1ug9IaQ3p1bkHMiKCZ9ut9QDI6qsa6cpUuB+A/I+zLtdNK4n2DQ==", + "integrity": "sha1-CXu3+guPGpzwvVxzTPlYmZgam0g=", "dev": true }, "iconv-lite": { @@ -9512,15 +9530,6 @@ "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==", "dev": true }, - "ignore-walk": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", - "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", - "dev": true, - "requires": { - "minimatch": "^3.0.4" - } - }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -9595,7 +9604,7 @@ "interpret": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", - "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", + "integrity": "sha1-1QYaYiS+WOgIOYX1AU2EQ1lXYpY=", "dev": true }, "into-stream": { @@ -9623,7 +9632,7 @@ "is": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/is/-/is-3.3.0.tgz", - "integrity": "sha512-nW24QBoPcFGGHJGUwnfpI7Yc5CdqWNdsyHQszVE/z2pKHXzh7FZ5GWhJqSyaQ9wMkQnsTx+kAI8bHlCX4tKdbg==", + "integrity": "sha1-Yc/23TxBk9uUo9YlggcrROVkXXk=", "dev": true }, "is-absolute": { @@ -9665,7 +9674,7 @@ "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==" + "integrity": "sha1-RXSirlb3qyBolvtDHq7tBm/fjwM=" }, "is-binary-path": { "version": "1.0.1", @@ -9694,7 +9703,7 @@ "is-callable": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "integrity": "sha1-HhrfIZ4e62hNaR+dagX/DTCiTXU=", "dev": true }, "is-data-descriptor": { @@ -9726,7 +9735,7 @@ "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", "dev": true, "requires": { "is-accessor-descriptor": "^0.1.6", @@ -9737,7 +9746,7 @@ "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==", + "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=", "dev": true } } @@ -9805,13 +9814,13 @@ "is-my-ip-valid": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz", - "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==", + "integrity": "sha1-ezUbjo7dTTmV1NBmaA5mTZRpaCQ=", "dev": true }, "is-my-json-valid": { "version": "2.19.0", "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.19.0.tgz", - "integrity": "sha512-mG0f/unGX1HZ5ep4uhRaPOS8EkAY8/j6mDRMJrutq4CqhoJWYp7qAlonIPy3TV7p3ju4TK9fo/PbnoksWmsp5Q==", + "integrity": "sha1-j9bkA2PNBrlj+od9REv7Xt3GIXU=", "dev": true, "requires": { "generate-function": "^2.0.0", @@ -9874,7 +9883,7 @@ "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==", + "integrity": "sha1-WsSLNF72dTOb1sekipEhELJBz1I=", "dev": true, "requires": { "is-path-inside": "^1.0.0" @@ -9975,7 +9984,7 @@ "is-symbol": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", - "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "integrity": "sha1-oFX2rlcZLK7jKeeoYBGLSXqVDzg=", "dev": true, "requires": { "has-symbols": "^1.0.0" @@ -10011,7 +10020,7 @@ "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==", + "integrity": "sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0=", "dev": true }, "isarray": { @@ -10023,7 +10032,7 @@ "isbinaryfile": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", - "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", + "integrity": "sha1-XW3vPt6/boyoyunDAYOoBLX4voA=", "dev": true, "requires": { "buffer-alloc": "^1.2.0" @@ -10160,13 +10169,13 @@ "js-base64": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.1.tgz", - "integrity": "sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw==", + "integrity": "sha1-Hvo57yxfeYC7F4St5KivLeMpESE=", "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==" + "integrity": "sha1-GSA/tZmR35jjoocFDUZHzerzJJk=" }, "js-yaml": { "version": "3.12.1", @@ -10219,9 +10228,18 @@ "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==", + "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=", "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-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", @@ -10255,6 +10273,12 @@ "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 + }, "jsonpointer": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", @@ -10455,7 +10479,7 @@ "karma-webpack": { "version": "2.0.13", "resolved": "https://registry.npmjs.org/karma-webpack/-/karma-webpack-2.0.13.tgz", - "integrity": "sha512-2cyII34jfrAabbI2+4Rk4j95Nazl98FvZQhgSiqKUDarT317rxfv/EdzZ60CyATN4PQxJdO5ucR5bOOXkEVrXw==", + "integrity": "sha1-z1bjBWwVt3R6C7IUD8mmvkHdnwI=", "dev": true, "requires": { "async": "^2.0.0", @@ -10486,13 +10510,13 @@ "big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "integrity": "sha1-ZfCvOC9Xi83HQr2cKB6cstd2gyg=", "dev": true }, "json5": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "integrity": "sha1-d5+wAYYE+oVOrL9iUhgNg1Q+Pb4=", "dev": true, "requires": { "minimist": "^1.2.0" @@ -10501,7 +10525,7 @@ "loader-utils": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "integrity": "sha1-H/XcaRHJ8KBiUxpMBLYJQGEIwsc=", "dev": true, "requires": { "big.js": "^5.2.2", @@ -10580,7 +10604,7 @@ "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==", + "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -10595,7 +10619,7 @@ "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==", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -10641,7 +10665,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==", + "integrity": "sha1-RHwxzx6pq1L8INthXF3fZ494AJw=", "dev": true }, "load-json-file": { @@ -10671,7 +10695,7 @@ "loader-runner": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "integrity": "sha1-7UcGa/5TTX6ExMe5mYwqdWB9k1c=", "dev": true }, "loader-utils": { @@ -11065,7 +11089,7 @@ "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==", + "integrity": "sha1-Y5BX5ybDr72z59QnQcqo1uQzWSc=", "dev": true }, "lodash.pick": { @@ -11249,7 +11273,7 @@ "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==", + "integrity": "sha1-ce5R+nvkyuwaY4OffmgtgTLTDK8=", "requires": { "js-tokens": "^3.0.0 || ^4.0.0" } @@ -11273,7 +11297,7 @@ "lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "integrity": "sha1-b54wtHCE2XGnyCD/FabFFnt0wm8=", "dev": true }, "lru-cache": { @@ -11302,7 +11326,7 @@ "make-iterator": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", - "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "integrity": "sha1-KbM/MSqo9UfEpeSQ9Wr87JkTOtY=", "dev": true, "requires": { "kind-of": "^6.0.2" @@ -11344,7 +11368,7 @@ "math-random": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", - "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", + "integrity": "sha1-XdaUPJOFSCZwFtTjTwV1gwgMUUw=", "dev": true }, "md5": { @@ -11361,7 +11385,7 @@ "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==", + "integrity": "sha1-tdB7jjIW4+J81yjXL3DR5qNCAF8=", "dev": true, "requires": { "hash-base": "^3.0.0", @@ -11403,7 +11427,7 @@ "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==", + "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -11418,7 +11442,7 @@ "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==", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -11468,7 +11492,7 @@ "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==", + "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -11483,7 +11507,7 @@ "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==", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -11518,7 +11542,7 @@ "micromatch": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "integrity": "sha1-cIWbyVyYQJUvNZoGij/En57PrCM=", "dev": true, "requires": { "arr-diff": "^4.0.0", @@ -11570,7 +11594,7 @@ "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==", + "integrity": "sha1-ggyGo5M0ZA6ZUWkovQP8qIBX0CI=", "dev": true }, "mimic-response": { @@ -11582,7 +11606,7 @@ "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==", + "integrity": "sha1-LhlN4ERibUoQ5/f7wAznPoPk1cc=", "dev": true }, "minimalistic-crypto-utils": { @@ -11609,7 +11633,7 @@ "mixin-deep": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", - "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "integrity": "sha1-pJ5yaNzhoNlpjkUybFYm3zVD0P4=", "dev": true, "requires": { "for-in": "^1.0.2", @@ -11619,7 +11643,7 @@ "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==", + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", "dev": true, "requires": { "is-plain-object": "^2.0.4" @@ -11727,7 +11751,7 @@ "moment": { "version": "2.24.0", "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", - "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" + "integrity": "sha1-DQVdU/UFKqZTyfbraLtdEr9cK1s=" }, "morgan": { "version": "1.6.1", @@ -11799,7 +11823,7 @@ "mute-stream": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "integrity": "sha1-FjDEKyJR/4HiooPelqVJfqkuXg0=", "dev": true }, "nan": { @@ -11811,7 +11835,7 @@ "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "integrity": "sha1-uHqKpPwN6P5r6IiVs4mD/yZb0Rk=", "dev": true, "requires": { "arr-diff": "^4.0.0", @@ -11830,7 +11854,7 @@ "natives": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.6.tgz", - "integrity": "sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA==", + "integrity": "sha1-pgO0pJirdxc2ErnqGs3sTZgPALs=", "dev": true }, "negotiator": { @@ -11842,7 +11866,7 @@ "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==", + "integrity": "sha1-udFeTXHGdikIZUtRg+04t1M0CDU=", "dev": true }, "next-tick": { @@ -11863,13 +11887,13 @@ "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==", + "integrity": "sha1-2KrZeBpc/EEyzC/s292YJTQmUhc=", "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==", + "integrity": "sha1-mA9vcthSEaU0fGsrwYxbhMPrR+8=", "requires": { "encoding": "^0.1.11", "is-stream": "^1.0.1" @@ -11878,13 +11902,13 @@ "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==", + "integrity": "sha1-/fO0GK7h+U8O9kLNY0hsd8qXJKw=", "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==", + "integrity": "sha1-VAMEJhwzDoDQ1e3OJTpoyzlkIYw=", "dev": true, "requires": { "fstream": "^1.0.0", @@ -11904,7 +11928,7 @@ "node-libs-browser": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.0.tgz", - "integrity": "sha512-5MQunG/oyOaBdttrL40dA7bUfPORLRWMUJLQtMg7nluxUvk5XwnLdL9twQHFAjRx/y7mIMkLKT9++qPbbk6BZA==", + "integrity": "sha1-xy9g2dRt4IqUDe27JfP/ovm7qnc=", "dev": true, "requires": { "assert": "^1.1.1", @@ -11947,7 +11971,7 @@ "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==", + "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -11962,7 +11986,7 @@ "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==", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -11973,7 +11997,7 @@ "string_decoder": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz", - "integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==", + "integrity": "sha1-/obnOLGVRK/nBGkkOyoe6SQOro0=", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -11996,7 +12020,7 @@ "node-sass": { "version": "4.11.0", "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.11.0.tgz", - "integrity": "sha512-bHUdHTphgQJZaF1LASx0kAviPH7sGlcyNhWade4eVIpFp6tsn7SV8xNMTbsQFpEV9VXpnwTTnNYlfsZXgGgmkA==", + "integrity": "sha1-GD+uw5jpy+k7pDNi4naMqYimNpo=", "dev": true, "requires": { "async-foreach": "^0.1.3", @@ -12032,11 +12056,11 @@ "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" + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" } }, "cross-spawn": { @@ -12045,14 +12069,14 @@ "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", "dev": true, "requires": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" + "lru-cache": "4.1.5", + "which": "1.3.1" } }, "gaze": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", - "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", + "integrity": "sha1-xEFzPhO5J6yMD/C0w7Az8ogSkko=", "dev": true, "requires": { "globule": "^1.0.0" @@ -12061,7 +12085,7 @@ "globule": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz", - "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==", + "integrity": "sha1-Xf+xsZHyLSB5epNptJ6rTpg5aW0=", "dev": true, "requires": { "glob": "~7.1.1", @@ -12072,13 +12096,13 @@ "lodash": { "version": "4.17.11", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "integrity": "sha1-s56mIp72B+zYniyN8SU2iRysm40=", "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==", + "integrity": "sha1-i75Q6oW+1ZvJ4z3KuCNe6bz0Q80=", "dev": true, "requires": { "pseudomap": "^1.0.2", @@ -12111,7 +12135,7 @@ "node.extend": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/node.extend/-/node.extend-1.1.8.tgz", - "integrity": "sha512-L/dvEBwyg3UowwqOUTyDsGBU6kjBQOpOhshio9V3i3BMPv5YUb9+mWNN8MK0IbWqT0AqaTSONZf0aTuMMahWgA==", + "integrity": "sha1-Cqs+Y3ifTm1otCvAAHOtGIEkPPA=", "dev": true, "requires": { "has": "^1.0.3", @@ -12208,7 +12232,7 @@ "nth-check": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "integrity": "sha1-sr0pXDfj3VijvwcAN2Zjuk2c8Fw=", "dev": true, "requires": { "boolbase": "~1.0.0" @@ -12229,7 +12253,7 @@ "oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "integrity": "sha1-R6ewFrqmi1+g7PPe4IqFxnmsZFU=", "dev": true }, "object-assign": { @@ -12330,7 +12354,7 @@ "object.entries": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.0.tgz", - "integrity": "sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA==", + "integrity": "sha1-ICT8bWuiRq7ji9sP/Vz7zzcbdRk=", "dev": true, "requires": { "define-properties": "^1.1.3", @@ -12382,7 +12406,7 @@ "object.values": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.0.tgz", - "integrity": "sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg==", + "integrity": "sha1-v2gQ712j5TJXkOqqK+IT6oRiTak=", "dev": true, "requires": { "define-properties": "^1.1.3", @@ -12554,7 +12578,7 @@ "osenv": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "integrity": "sha1-hc36+uso6Gd/QW4odZK18/SepBA=", "dev": true, "requires": { "os-homedir": "^1.0.0", @@ -12564,7 +12588,7 @@ "p-cancelable": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", - "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==", + "integrity": "sha1-NfNj1n1SCByNlYXje8zrfgu8sqA=", "dev": true }, "p-event": { @@ -12602,7 +12626,7 @@ "p-limit": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "integrity": "sha1-uGvV8MJWkJEcdZD8v8IBDVSzzLg=", "dev": true, "requires": { "p-try": "^1.0.0" @@ -12730,7 +12754,7 @@ "parse-node-version": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", - "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "integrity": "sha1-4rXb7eAOf6m8NjYH9TMn6LBzGJs=", "dev": true }, "parse-passwd": { @@ -12820,7 +12844,7 @@ "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==", + "integrity": "sha1-1i27VnlAXXLEc37FhgDp3c8G0kw=", "dev": true }, "path-root": { @@ -12873,7 +12897,7 @@ "pbkdf2": { "version": "3.0.17", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", - "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "integrity": "sha1-l2wgZTBhexTrsyEUI597CTNuk6Y=", "dev": true, "requires": { "create-hash": "^1.1.2", @@ -12973,7 +12997,7 @@ "plugin-error": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", - "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", + "integrity": "sha1-dwFr2JGdCsN3/c3QMiMolTyleBw=", "dev": true, "requires": { "ansi-colors": "^1.0.1", @@ -13125,7 +13149,7 @@ "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==", + "integrity": "sha1-giRf34IzcEFkXkdxFNjlk6oYuOw=", "dev": true, "requires": { "postcss": "^5.0.4" @@ -13283,7 +13307,7 @@ "postcss": { "version": "6.0.23", "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "integrity": "sha1-YcgswyisYOZ3ZF+XkFTrmLwOMyQ=", "dev": true, "requires": { "chalk": "^2.4.1", @@ -13312,7 +13336,7 @@ "postcss": { "version": "6.0.23", "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "integrity": "sha1-YcgswyisYOZ3ZF+XkFTrmLwOMyQ=", "dev": true, "requires": { "chalk": "^2.4.1", @@ -13341,7 +13365,7 @@ "postcss": { "version": "6.0.23", "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "integrity": "sha1-YcgswyisYOZ3ZF+XkFTrmLwOMyQ=", "dev": true, "requires": { "chalk": "^2.4.1", @@ -13370,7 +13394,7 @@ "postcss": { "version": "6.0.23", "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "integrity": "sha1-YcgswyisYOZ3ZF+XkFTrmLwOMyQ=", "dev": true, "requires": { "chalk": "^2.4.1", @@ -13484,7 +13508,7 @@ "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==", + "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", "dev": true }, "postcss-zindex": { @@ -13537,7 +13561,7 @@ "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==", + "integrity": "sha1-o31zL0JxtKsa0HDTVQjoKQeI/6o=", "dev": true }, "progress": { @@ -13549,7 +13573,7 @@ "promise": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "integrity": "sha1-BktyYCsY+Q8pGSuLG8QY/9Hr078=", "requires": { "asap": "~2.0.3" } @@ -13594,13 +13618,13 @@ "psl": { "version": "1.1.31", "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", - "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==", + "integrity": "sha1-6aqG0BAbWxBcvpOsa3hM1UcnYYQ=", "dev": true }, "public-encrypt": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "integrity": "sha1-T8ydd6B+SLp1J+fL4N4z0HATMeA=", "dev": true, "requires": { "bn.js": "^4.1.0", @@ -13614,7 +13638,7 @@ "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "integrity": "sha1-tYsBCsQMIsVldhbI0sLALHv0eew=", "dev": true }, "q": { @@ -13626,7 +13650,7 @@ "qs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "integrity": "sha1-yzroBuh0BERYTvFUzo7pjUA/PjY=", "dev": true }, "query-string": { @@ -13679,7 +13703,7 @@ "quill-delta": { "version": "3.6.3", "resolved": "https://registry.npmjs.org/quill-delta/-/quill-delta-3.6.3.tgz", - "integrity": "sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg==", + "integrity": "sha1-sZ/SuJQSMBxg4f8hPY2GDqwPEDI=", "requires": { "deep-equal": "^1.0.1", "extend": "^3.0.2", @@ -13702,7 +13726,7 @@ "randomatic": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", - "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", + "integrity": "sha1-t3bvxZN1mE42xTey9RofCv8Noe0=", "dev": true, "requires": { "is-number": "^4.0.0", @@ -13713,7 +13737,7 @@ "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==", + "integrity": "sha1-ACbjf1RU1z41bf5lZGmYZ8an8P8=", "dev": true } } @@ -13730,7 +13754,7 @@ "randomfill": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "integrity": "sha1-ySGW/IarQr6YPxvzF3giSTHWFFg=", "dev": true, "requires": { "randombytes": "^2.0.5", @@ -13746,7 +13770,7 @@ "raw-body": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", - "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", + "integrity": "sha1-GzJOzmtXBuFThVvBFIxlu39uoMM=", "dev": true, "requires": { "bytes": "3.0.0", @@ -13758,7 +13782,7 @@ "rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "integrity": "sha1-zZJL9SAKB1uDwYjNa54hG3/A0+0=", "dev": true, "requires": { "deep-extend": "^0.6.0", @@ -13803,7 +13827,7 @@ "react-quill": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/react-quill/-/react-quill-1.3.3.tgz", - "integrity": "sha512-T9RubLaWJ8gCfp7sOqmFupjiTiEp/EdGqhCG+PWGKc5UHiK6xIWNKWYsOHHEhQ+sZCKs8u/DPx47gc1VfFmcLg==", + "integrity": "sha1-lbjgiK1OSsxsecL4W9wEYO6+COs=", "requires": { "@types/quill": "1.3.10", "@types/react": "*", @@ -13842,7 +13866,7 @@ "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==", + "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -13857,7 +13881,7 @@ "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==", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -13901,7 +13925,7 @@ "readdirp": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "integrity": "sha1-DodiKjMlqjPokihcr4tOhGUppSU=", "dev": true, "requires": { "graceful-fs": "^4.1.11", @@ -13918,7 +13942,7 @@ "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==", + "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -13933,7 +13957,7 @@ "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==", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -14019,13 +14043,13 @@ "regenerate": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "integrity": "sha1-SoVuxLVuQHfFV1icroXnpMiGmhE=", "dev": true }, "regenerator-runtime": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "integrity": "sha1-vgWtf5v30i4Fb5cmzuUBf78Z4uk=", "dev": true }, "regex-cache": { @@ -14040,7 +14064,7 @@ "regex-not": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "integrity": "sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw=", "dev": true, "requires": { "extend-shallow": "^3.0.2", @@ -14215,7 +14239,7 @@ "repeat-element": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "integrity": "sha1-eC4NglwMWjuzlzH4Tv7mt0Lmsc4=", "dev": true }, "repeat-string": { @@ -14259,7 +14283,7 @@ "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==", + "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -14274,7 +14298,7 @@ "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==", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -14285,7 +14309,7 @@ "request": { "version": "2.88.0", "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "integrity": "sha1-nC/KT301tZLv5Xx/ClXoEFIST+8=", "dev": true, "requires": { "aws-sign2": "~0.7.0", @@ -14319,6 +14343,43 @@ "throttleit": "^1.0.0" } }, + "request-promise": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/request-promise/-/request-promise-4.2.5.tgz", + "integrity": "sha1-GGIixZrlEvNJff5NdanIRhvQBTw=", + "dev": true, + "requires": { + "bluebird": "^3.5.0", + "request-promise-core": "1.1.3", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + }, + "dependencies": { + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha1-nyKcFb4nJFT/qXOs4NvueaGww28=", + "dev": true + } + } + }, + "request-promise-core": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz", + "integrity": "sha1-6aPAgbUTgN/qZ3M2Bh/qh5qCnuk=", + "dev": true, + "requires": { + "lodash": "^4.17.15" + }, + "dependencies": { + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha1-tEf2ZwoEVbv+7dETku/zMOoJdUg=", + "dev": true + } + } + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -14352,7 +14413,7 @@ "resolve": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", - "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", + "integrity": "sha1-O9qur0XMB/N1ZW39LlTtCBCxAbo=", "dev": true, "requires": { "path-parse": "^1.0.6" @@ -14396,7 +14457,7 @@ "ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "integrity": "sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w=", "dev": true }, "right-align": { @@ -14420,7 +14481,7 @@ "ripemd160": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "integrity": "sha1-ocGm9iR1FXe6XQeRTLyShQWFiQw=", "dev": true, "requires": { "hash-base": "^3.0.0", @@ -14436,7 +14497,7 @@ "rtl-css-js": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/rtl-css-js/-/rtl-css-js-1.11.0.tgz", - "integrity": "sha512-YnZ6jWxZxlWlcQAGF9vOmiF9bEmoQmSHE+wsrsiILkdK9HqiRPAIll4SY/QDzbvEu2lB2h62+hfg3TYzjnldbA==", + "integrity": "sha1-pxUZMO+dVGVmB9dU67Fy3fye+DY=", "dev": true, "requires": { "@babel/runtime": "^7.1.2" @@ -14445,7 +14506,7 @@ "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==", + "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=", "dev": true }, "safe-regex": { @@ -14460,7 +14521,7 @@ "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=" }, "samsam": { "version": "1.1.2", @@ -14787,7 +14848,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -14800,13 +14861,13 @@ "setprototypeof": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "integrity": "sha1-0L2FU2iHtv58DYGMuWLZ2RxU5lY=", "dev": true }, "sha.js": { "version": "2.4.11", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "integrity": "sha1-N6XPC4HsvGlD3hCbopYNGyZYSuc=", "dev": true, "requires": { "inherits": "^2.0.1", @@ -14895,7 +14956,7 @@ "snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "integrity": "sha1-ZJIufFZbDhQgS6GqfWlkJ40lGC0=", "dev": true, "requires": { "base": "^0.11.1", @@ -14931,7 +14992,7 @@ "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==", + "integrity": "sha1-bBdfhv8UvbByRWPo88GwIaKGhTs=", "dev": true, "requires": { "define-property": "^1.0.0", @@ -14951,7 +15012,7 @@ "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==", + "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", "dev": true, "requires": { "kind-of": "^6.0.0" @@ -14960,7 +15021,7 @@ "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==", + "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", "dev": true, "requires": { "kind-of": "^6.0.0" @@ -14969,7 +15030,7 @@ "is-descriptor": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", "dev": true, "requires": { "is-accessor-descriptor": "^1.0.0", @@ -15191,7 +15252,7 @@ "progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "integrity": "sha1-foz42PW48jnBvGi+tOt4Vn1XLvg=", "dev": true }, "read-pkg": { @@ -15234,7 +15295,7 @@ "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==", + "integrity": "sha1-OZO9hzv8SEecyp6jpUeDXHwVSzQ=", "dev": true }, "source-map": { @@ -15274,7 +15335,7 @@ "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==", + "integrity": "sha1-cuLMNAlVQ+Q7LGKyxMENSpBU8lk=", "dev": true, "requires": { "atob": "^2.1.1", @@ -15293,13 +15354,13 @@ "sparkles": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", - "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", + "integrity": "sha1-AI22XtzmxQ7sDF4ijhlFBh3QQ3w=", "dev": true }, "spdx-correct": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "integrity": "sha1-+4PlBERSaPFUsHTiGMh8ADzTHfQ=", "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", @@ -15309,13 +15370,13 @@ "spdx-exceptions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "integrity": "sha1-LqRQrudPKom/uUUZwH/Nb0EyKXc=", "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==", + "integrity": "sha1-meEZt6XaAOBUkcn6M4t5BII7QdA=", "dev": true, "requires": { "spdx-exceptions": "^2.1.0", @@ -15325,7 +15386,7 @@ "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==", + "integrity": "sha1-gcDOjyFHR1YUi7tfO/wPNr8V124=", "dev": true }, "split": { @@ -15355,7 +15416,7 @@ "sshpk": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "integrity": "sha1-+2YcC+8ps520B2nuOfpwCT1vaHc=", "dev": true, "requires": { "asn1": "~0.2.3", @@ -15399,7 +15460,7 @@ "stdout-stream": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", - "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", + "integrity": "sha1-WsF0zdXNcmEEqgwLK9g4FdjVNd4=", "dev": true, "requires": { "readable-stream": "^2.0.1" @@ -15414,7 +15475,7 @@ "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==", + "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -15429,7 +15490,7 @@ "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==", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -15437,10 +15498,16 @@ } } }, + "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.2", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "integrity": "sha1-h1IdOKRKp+6RzhzSpH3wy0ndZgs=", "dev": true, "requires": { "inherits": "~2.0.1", @@ -15456,7 +15523,7 @@ "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==", + "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -15471,7 +15538,7 @@ "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==", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -15491,7 +15558,7 @@ "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==", + "integrity": "sha1-0721mMK9CugrjKx6xQsRB6eZbEg=", "dev": true }, "stream-counter": { @@ -15503,19 +15570,10 @@ "readable-stream": "~1.1.8" } }, - "stream-events": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", - "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", - "dev": true, - "requires": { - "stubs": "^3.0.0" - } - }, "stream-http": { "version": "2.8.3", "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "integrity": "sha1-stJCRpKIpaJ+xP6JM6z2I95lFPw=", "dev": true, "requires": { "builtin-status-codes": "^3.0.0", @@ -15534,7 +15592,7 @@ "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==", + "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -15549,7 +15607,7 @@ "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==", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -15595,7 +15653,7 @@ "stringstream": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.6.tgz", - "integrity": "sha512-87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA==", + "integrity": "sha1-eIAiWw1K0Q4wkn0Weh1vL9OzOnI=", "dev": true }, "strip-ansi": { @@ -15677,12 +15735,6 @@ "escape-string-regexp": "^1.0.2" } }, - "stubs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", - "integrity": "sha1-6NK6H6nJBXAwPAMLaQD31fiavls=", - "dev": true - }, "sudo": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sudo/-/sudo-1.0.3.tgz", @@ -15697,7 +15749,7 @@ "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -15751,7 +15803,7 @@ "tapable": { "version": "0.2.9", "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.9.tgz", - "integrity": "sha512-2wsvQ+4GwBvLPLWsNfLCDYGsW6xb7aeC6utq2Qh0PFwgEy7K7dsma9Jsmb2zSQj7GvYAyUGSntLtsv++GmgL1A==", + "integrity": "sha1-ry2LvJsE907hevK02QSPgHrNGKg=", "dev": true }, "tar": { @@ -15789,7 +15841,7 @@ "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==", + "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -15812,27 +15864,6 @@ } } }, - "teeny-request": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-6.0.1.tgz", - "integrity": "sha512-TAK0c9a00ELOqLrZ49cFxvPVogMUFaWY8dUsQc/0CuQPGF+BOxOQzXfE413BAk2kLomwNplvdtMpeaeGWmoc2g==", - "dev": true, - "requires": { - "http-proxy-agent": "^4.0.0", - "https-proxy-agent": "^4.0.0", - "node-fetch": "^2.2.0", - "stream-events": "^1.0.5", - "uuid": "^3.3.2" - }, - "dependencies": { - "node-fetch": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", - "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==", - "dev": true - } - } - }, "ternary-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ternary-stream/-/ternary-stream-2.0.1.tgz", @@ -15866,7 +15897,7 @@ "through2": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "integrity": "sha1-AcHjnrMdB8t9A6lqcIIyYLIxMs0=", "dev": true, "requires": { "readable-stream": "~2.3.6", @@ -15882,7 +15913,7 @@ "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==", + "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -15897,7 +15928,7 @@ "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==", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -15939,7 +15970,7 @@ "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==", + "integrity": "sha1-HSjj0qrfHVpZlsTp+VYBzQU0gK4=", "dev": true, "requires": { "setimmediate": "^1.0.4" @@ -16119,7 +16150,7 @@ "to-regex": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "integrity": "sha1-E8/dmzNlUvMLUfM6iuG0Knp1mc4=", "dev": true, "requires": { "define-property": "^2.0.2", @@ -16141,7 +16172,7 @@ "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==", + "integrity": "sha1-U/Nto/R3g7CSWvoG/587FlKA94E=", "dev": true, "requires": { "psl": "^1.1.24", @@ -16180,7 +16211,7 @@ "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==", + "integrity": "sha1-+BO1qMhrQNpZYGcisUTjIleZ9H0=", "dev": true, "requires": { "glob": "^7.1.2" @@ -16218,7 +16249,7 @@ "tslint-microsoft-contrib": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/tslint-microsoft-contrib/-/tslint-microsoft-contrib-5.0.3.tgz", - "integrity": "sha512-5AnfTGlfpUzpRHLmoojPBKFTTmbjnwgdaTHMdllausa4GBPya5u36i9ddrTX4PhetGZvd4JUYIpAmgHqVnsctg==", + "integrity": "sha1-b8PiOBec1yBFwrQi5NZV9Bg6jVw=", "dev": true, "requires": { "tsutils": "^2.12.1" @@ -16233,7 +16264,7 @@ "tsutils": { "version": "2.29.0", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "integrity": "sha1-MrSIUBRnrL7dS4VJhnOggSrKC5k=", "dev": true, "requires": { "tslib": "^1.8.1" @@ -16278,7 +16309,7 @@ "type-is": { "version": "1.6.16", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", - "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", + "integrity": "sha1-+JzjQVQcZysl7nrjxz3uOyvlAZQ=", "dev": true, "requires": { "media-typer": "0.3.0", @@ -16300,7 +16331,7 @@ "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==" + "integrity": "sha1-lBUb5MCn+x0AGvcCL9rKRkJlnks=" }, "uglify-js": { "version": "3.4.9", @@ -16463,7 +16494,7 @@ "underscore.string": { "version": "3.3.5", "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.5.tgz", - "integrity": "sha512-g+dpmgn+XBneLmXXo+sGlW5xQEt4ErkS3mgeN2GFbremYeMBSJKr9Wf2KJplQVaiPY/f7FN6atosWYNm9ovrYg==", + "integrity": "sha1-/CrSVbi9MJ4jnLxYFv0jqbfqQCM=", "dev": true, "requires": { "sprintf-js": "^1.0.3", @@ -16639,7 +16670,7 @@ "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==", + "integrity": "sha1-lMVA4f93KVbiKZUHwBCupsiDjrA=", "dev": true, "requires": { "punycode": "^2.1.0" @@ -16693,7 +16724,7 @@ "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "integrity": "sha1-1QyMrHmhn7wg8pEfVuuXP04QBw8=", "dev": true }, "user-home": { @@ -16715,7 +16746,7 @@ "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==", + "integrity": "sha1-i75Q6oW+1ZvJ4z3KuCNe6bz0Q80=", "dev": true, "requires": { "pseudomap": "^1.0.2", @@ -16727,7 +16758,7 @@ "util": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "integrity": "sha1-MjZzNyDsZLsn9uJvQhqqLhtYjWE=", "dev": true, "requires": { "inherits": "2.0.3" @@ -16748,7 +16779,7 @@ "uuid": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "integrity": "sha1-G0r0lV6zB3xQHCOHL8ZROBFYcTE=", "dev": true }, "v8flags": { @@ -16769,7 +16800,7 @@ "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==", + "integrity": "sha1-/JH2uce6FchX9MssXe/uw51PQQo=", "dev": true, "requires": { "spdx-correct": "^3.0.0", @@ -16791,7 +16822,7 @@ "vendors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.2.tgz", - "integrity": "sha512-w/hry/368nO21AN9QljsaIhb9ZiZtZARoVH5f3CsFbawdLdayCgKRPup7CggujvySMxx0I91NOyxdVENohprLQ==", + "integrity": "sha1-f8te759WI7FWvOqJ7DfWNnbyGAE=", "dev": true }, "verror": { @@ -16914,7 +16945,7 @@ "watchpack": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", - "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "integrity": "sha1-S8EsLr6KonenHx0/FNaFx7RGzQA=", "dev": true, "requires": { "chokidar": "^2.0.2", @@ -16925,7 +16956,7 @@ "anymatch": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "integrity": "sha1-vLJLTzeTTZqnrBe0ra+J58du8us=", "dev": true, "requires": { "micromatch": "^3.1.4", @@ -16994,7 +17025,7 @@ "webpack": { "version": "3.5.6", "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.5.6.tgz", - "integrity": "sha512-sXnxfx6KoZVrFAGLjdhCCwDtDwkYMfwm8mJjkQv3thr5pjTlbxopVlr/kJwc9Bz317gL+gNjvz++ir9TgG1MDg==", + "integrity": "sha1-pJL7bB7X9XOBb5DgDI+7WiDMXDY=", "dev": true, "requires": { "acorn": "^5.0.0", @@ -17051,7 +17082,7 @@ "big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "integrity": "sha1-ZfCvOC9Xi83HQr2cKB6cstd2gyg=", "dev": true }, "camelcase": { @@ -17108,7 +17139,7 @@ "loader-utils": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "integrity": "sha1-H/XcaRHJ8KBiUxpMBLYJQGEIwsc=", "dev": true, "requires": { "big.js": "^5.2.2", @@ -17119,7 +17150,7 @@ "json5": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "integrity": "sha1-d5+wAYYE+oVOrL9iUhgNg1Q+Pb4=", "dev": true, "requires": { "minimist": "^1.2.0" @@ -17130,7 +17161,7 @@ "lodash": { "version": "4.17.11", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "integrity": "sha1-s56mIp72B+zYniyN8SU2iRysm40=", "dev": true }, "os-locale": { @@ -17256,7 +17287,7 @@ "time-stamp": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.2.0.tgz", - "integrity": "sha512-zxke8goJQpBeEgD82CXABeMh0LSJcj7CXEd0OHOg45HgcofF7pxNwZm9+RknpxpDhwN4gFpySkApKfFYfRQnUA==", + "integrity": "sha1-kX4KZpBWiHkOx7u94EBGJZr4P1c=", "dev": true } } @@ -17264,7 +17295,7 @@ "webpack-sources": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", - "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", + "integrity": "sha1-KijcufH0X+lg2PFJMlK17mUw+oU=", "dev": true, "requires": { "source-list-map": "^2.0.0", @@ -17274,7 +17305,7 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", "dev": true } } @@ -17282,7 +17313,7 @@ "webpack-stream": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/webpack-stream/-/webpack-stream-4.0.3.tgz", - "integrity": "sha512-Tx7ks7Of/JiPz7/tUM4WqSg4OcXF4m4OzNSaEzNA1TNXQaiTHIjiKqUoL79wGXbFt2q1IP8VG5DcEdaxifY5Ew==", + "integrity": "sha1-ljmf15EblMJkv8WeNWc4qJtcoTY=", "dev": true, "requires": { "fancy-log": "^1.3.2", @@ -17317,7 +17348,7 @@ "vinyl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", - "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", + "integrity": "sha1-2FsH2pbkWNJbL/4Z/s6fLKoT7YY=", "dev": true, "requires": { "clone": "^2.1.1", @@ -17349,7 +17380,7 @@ "whatwg-fetch": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", - "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==" + "integrity": "sha1-3eal3zFfnTmZGqF2IYU9cguFVm8=" }, "whatwg-url": { "version": "4.7.1", @@ -17370,7 +17401,7 @@ "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "integrity": "sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo=", "dev": true, "requires": { "isexe": "^2.0.0" @@ -17385,7 +17416,7 @@ "wide-align": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "integrity": "sha1-rgdOa9wMFKQx6ATmJFScYzsABFc=", "dev": true, "requires": { "string-width": "^1.0.2 || 2" diff --git a/package.json b/package.json index 311a339e4..356c9515f 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@pnp/spfx-controls-react", "description": "Reusable React controls for SharePoint Framework solutions", - "version": "1.16.0", + "version": "1.17.0", "engines": { "node": ">=0.10.0" }, @@ -15,14 +15,15 @@ "changelog": "node scripts/create-changelog.js && node scripts/sync-changelogs.js && gulp versionUpdater", "postinstall": "node postinstall/install.js", "sonarcloud:config": "node ./scripts/sonarcloud.js", - "sonarcloud:start": "gulp sonarqube --gulpfile gulpfile.sonarqube.js" + "sonarcloud:start": "gulp sonarqube --gulpfile gulpfile.sonarqube.js", + "localization": "node scripts/execute-translation.js" }, "dependencies": { "@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", + "@pnp/telemetry-js": "2.0.0", "@types/chart.js": "2.7.40", "chart.js": "2.7.3", "color": "^3.1.2", @@ -48,7 +49,8 @@ "@types/react-dom": "0.14.18", "@types/sinon": "2.3.4", "@types/webpack-env": "^1.13.9", - "codecov": "3.6.5", + "amd-loader": "0.0.8", + "codecov": "3.0.0", "enzyme": "2.9.1", "gulp": "~3.9.1", "karma-html-reporter": "0.2.7", @@ -56,6 +58,7 @@ "react": "15.4.2", "react-addons-test-utils": "15.6.0", "react-dom": "15.4.2", + "request-promise": "4.2.5", "sonarqube-scanner": "2.1.2" }, "repository": { diff --git a/scripts/execute-translation.js b/scripts/execute-translation.js new file mode 100644 index 000000000..c9d1d0f45 --- /dev/null +++ b/scripts/execute-translation.js @@ -0,0 +1,238 @@ +/** + * Script executes the translation of the localization keys for the provided languages (config/supported.localization.json) with the usage of the Azure Cognitive services. + * In case the language localization file doesn't exist, it is going to be created. + * Only languages supported by Azure Cognitive services are supported. + * + * English is used as a main language. The translation is executed for the keys which are the same as in English or are missing. + */ + + +const path = require('path'); +const fs = require('fs'); +const _ = require('lodash'); +// Cognitive services +const request = require('request-promise'); +const uuidv4 = require('uuid/v4'); + +// Replace with process.env.subscriptionKey to get an access to Azure Cognitive services +const subscriptionKey = process.env.SUBSCRIPTION_KEY; +const endpoint = "https://api.cognitive.microsofttranslator.com"; + +const locHelper = require('./export-localization'); +// Load configuration for supported languages +const languagesConfiguration = require('../config/supported.localization.json'); + +/** + * Obtain auth token for the global cognitive services endpoint from region (WestEurope) + */ +let authToken = null; +async function getAuthToken() { + try { + // Cache AuthToken + if (authToken) { + return authToken; + } + + const options = { + method: 'POST', + url: 'https://westeurope.api.cognitive.microsoft.com/sts/v1.0/issueToken', + headers: { + 'Ocp-Apim-Subscription-Key': subscriptionKey, + 'Content-type': 'application/x-www-form-urlencoded', + 'Content-length': 0 + } + } + + const token = await request(options); + if (!token || token.length < 0) { + throw new Error("Somethig went wrong when obtaining Auth token!"); + } + + // Cache Auth token + authToken = token; + return token; + } + catch (err) { + console.error(`[Exception]: Cannot obtain Auth token. Err=${err}`) + return null; + } +} + +/** + * Function executes the translation using cognitive services. + */ +async function executeTranslation(lang, inputObj) { + try { + const authToken = await getAuthToken(); + let options = { + method: 'POST', + baseUrl: endpoint, + url: 'translate', + qs: { + 'api-version': '3.0', + 'to': [`${lang}`] + }, + headers: { + 'Authorization': `Bearer ${authToken}`, + 'Content-type': 'application/json', + 'X-ClientTraceId': uuidv4().toString() + }, + body: inputObj, + json: true, + }; + + const response = await request(options); + if (!response || response.length < 0) { + throw new Error("Somethig went wrong when obtaining translated text!"); + } + + // Go through all the results + const translations = response.map((item) => { + // Every translation is in a separate 1-element array -> make it flat + return item.translations[0]; + }) + + return translations; + } catch (err) { + console.error(`[Exception]: Cannot execute translation for lang - ${lang}. Err=${err}`) + return null; + } +} + +function compareTranslationKeys(srcObj, dstObj) { + // Extract all the keys and set them in alpabetyical order + let dstKeys = Object.keys(dstObj); + + // Array + let toTranslate = []; + dstKeys.forEach((locKey) => { + if (typeof srcObj[locKey] !== "string") { + // In case we have nested translation objects + toTranslate = toTranslate.concat(compareTranslationKeys(srcObj[locKey], dstObj[locKey])); + } else if (srcObj[locKey] === dstObj[locKey]) { + // In case the english value is the same as localized one, add it to translate + toTranslate.push(srcObj[locKey]); + } + }); + + return toTranslate; +} + +let currentTranslationIndex = 0; +function injectTranslatedKeys(srcObj, dstObj, translatedValues) { + const srcKeys = Object.keys(srcObj); + srcKeys.forEach((locKey) => { + if (typeof srcObj[locKey] !== "string") { + dstObj[locKey] = injectTranslatedKeys(srcObj[locKey], dstObj[locKey], translatedValues); + } else if (srcObj[locKey] === dstObj[locKey]) { + const translatedKey = translatedValues[currentTranslationIndex++]; + dstObj[locKey] = translatedKey ? translatedKey : dstObj[locKey]; + } + }); + + return dstObj; +} + +function prepareTranslationRequestMsg(wordsToTranslate) { + // Execute translation for every 50 words in batch + const result = []; + const chunk = 50; + for (let i = 0; i < wordsToTranslate.length; i += chunk) { + const slicedWords = wordsToTranslate.slice(i, i + chunk); + const slicedMessages = []; + // do whatever + slicedWords.forEach((word) => { + slicedMessages.push({ + //'text': encodeURI(word) + 'text': word + }); + }); + result.push(slicedMessages); + } + + return result; +} + +function extranctTranslatedKeys(translatedMsgs) { + // Flatten the result to retrieve original structure of the keys array + const translatedKeys = []; + translatedMsgs.forEach((keys) => { + keys.forEach((translationMsg) => { + // There is often a replacement of '||' to ' | | ' during the translation + // Replace ' | | ' to '||' + const translationResult = translationMsg.text ? translationMsg.text.replace(" | | ", "||") : translationMsg.text; + translatedKeys.push(translationResult); + }) + }); + + return translatedKeys; +} + +async function executeLocalizationTranslation(srcObj, langObj, lang) { + try { + // Initialize result object with all english keys and localized keys + const dstLoc = Object.assign({}, srcObj, langObj); + + // Prepare keys to translate + const keysToTranslate = compareTranslationKeys(srcObj, dstLoc); + + if (keysToTranslate && keysToTranslate.length <= 0) { + console.log(`There are no keys to translate`); + dstLoc; + } + console.log(`There are ${keysToTranslate.length} keys to translate.`) + + // Split the array to separate calls in case max limit of carachters (5000) is reached and execute translation + const requestMessges = prepareTranslationRequestMsg(keysToTranslate); + const promises = []; + requestMessges.forEach((msgBody) => { + promises.push(executeTranslation(lang, msgBody)); + }); + + const translatedMsgs = await Promise.all(promises); + const translatedKeys = extranctTranslatedKeys(translatedMsgs); + + // Inject translated keys into dstLoc object + // Reset the global rec counter + currentTranslationIndex = 0; + const result = injectTranslatedKeys(srcObj, dstLoc, translatedKeys); + + return result; + } catch (err) { + console.log(`[Exception]: executeLocalizationTranslation : ${err.message}`); + return null; + } +} + +const run = async () => { + // Load files in the localization directory + const locDirPath = path.join(__dirname, '../src/loc'); + let locFiles = fs.readdirSync(locDirPath); + locFiles = locFiles.filter(f => f !== "mystrings.d.ts" && f != "en-us.ts"); + + // Load main localization file + const mainLoc = locHelper.getSPLocalizationFileAsJSON('en-us'); + + // Iterate over all supported languages and prepare translation request + for (const lang of languagesConfiguration.langs) { + console.log(`Processing ${lang}.`); + + // If current loc file doesn't exist - copy the original one + let currentLoc = locHelper.getSPLocalizationFileAsJSON(lang); + if (!currentLoc) { + currentLoc = _.cloneDeep(mainLoc); + } + + const translatedObj = await executeLocalizationTranslation(mainLoc, currentLoc, lang); + // Replace translated part in .ts file + if (translatedObj) { + locHelper.replaceTranslatedKeysInJSON(translatedObj, lang) + } + + // Set delay to wait for Azure to execute the transation + console.log(`Finished processing ${lang}`); + console.log(); + } +}; +run(); + diff --git a/scripts/export-localization.js b/scripts/export-localization.js new file mode 100644 index 000000000..2395a86dd --- /dev/null +++ b/scripts/export-localization.js @@ -0,0 +1,49 @@ +/** + * Scripts exports english localization keys to the .csv file + */ + +const path = require('path'); +const fs = require('fs'); +const ts = require("typescript"); +require('amd-loader'); + +const jsPlaceholder = +`declare var define: any; + +define([], () => { + return {0}; +});`; + +const getSPLocalizationFileAsJSON = (locale) => { + const locFilePath = path.join(__dirname, `../src/loc/${locale}.ts`); + const tmpLocJSFilePath = path.join(__dirname, `${locale}-tmp.js`); + + // Localization file doesn't exist + if (!fs.existsSync(locFilePath)) { + return null; + } + + // Read en-us localization file and transpile if to JS + // Add named module to avoid amdefine excpetion + const enLocFileContent = fs.readFileSync(locFilePath, 'utf-8'); + let result = ts.transpileModule(enLocFileContent, { compilerOptions: { module: ts.ModuleKind.CommonJS }}); + + // Create temp JS file + fs.writeFileSync(tmpLocJSFilePath, result.outputText); + + var locResources = require(`./${locale}-tmp`); + + // Remove tmp file + fs.unlinkSync(tmpLocJSFilePath); + return locResources; +} + +const replaceTranslatedKeysInJSON = (translatedObj, locale) => { + const locFilePath = path.join(__dirname, `../src/loc/${locale}.ts`); + const fileContent = jsPlaceholder.replace('{0}', JSON.stringify(translatedObj, null, 2)); + + // Save file content + fs.writeFileSync(locFilePath, fileContent); +} + +module.exports = { getSPLocalizationFileAsJSON , replaceTranslatedKeysInJSON } diff --git a/src/FolderExplorer.ts b/src/FolderExplorer.ts new file mode 100644 index 000000000..18306de77 --- /dev/null +++ b/src/FolderExplorer.ts @@ -0,0 +1 @@ +export * from './controls/folderExplorer/index'; diff --git a/src/IconPicker.ts b/src/IconPicker.ts new file mode 100644 index 000000000..3851b4236 --- /dev/null +++ b/src/IconPicker.ts @@ -0,0 +1 @@ +export * from './controls/iconPicker/index'; diff --git a/src/common/dal/ListItemRepository.ts b/src/common/dal/ListItemRepository.ts new file mode 100644 index 000000000..176716fc9 --- /dev/null +++ b/src/common/dal/ListItemRepository.ts @@ -0,0 +1,34 @@ +import { SPHttpClient } from '@microsoft/sp-http'; + +export class ListItemRepository { + constructor(protected SiteUrl: string, protected SPClient: SPHttpClient) { + + } + /** + * + * @param filterText text value of the filter part of oData query 'Id eq 1' + * @param listId + * @param internalColumnName + * @param keyInternalColumnName + * @param webUrl + * @param top + */ + public async getListItemsByFilterClause(filterText: string, listId: string, internalColumnName: string, keyInternalColumnName?: string, webUrl?: string, top?: number): Promise { + let returnItems: any[]; + try { + const webAbsoluteUrl = !webUrl ? this.SiteUrl : webUrl; + const apiUrl = `${webAbsoluteUrl}/_api/web/lists('${listId}')/items?$select=${keyInternalColumnName || 'Id'},${internalColumnName}&$filter=${filterText}`; + const data = await this.SPClient.get(apiUrl, SPHttpClient.configurations.v1); + if (data.ok) { + const results = await data.json(); + if (results && results.value && results.value.length > 0) { + return results.value; + } + } + + return []; + } catch (error) { + return Promise.reject(error); + } + } +} diff --git a/src/common/mocks/RequestClientMock.ts b/src/common/mocks/RequestClientMock.ts new file mode 100644 index 000000000..4c48d5a83 --- /dev/null +++ b/src/common/mocks/RequestClientMock.ts @@ -0,0 +1,46 @@ +import { SPHttpClient, SPHttpClientConfiguration, ISPHttpClientOptions, SPHttpClientResponse } from '@microsoft/sp-http'; + +export class RequestClientMock extends SPHttpClient { + public Requests: { url: string, method: string, options?: ISPHttpClientOptions, resultString: string }[] = []; + public OnRequest: (url: string, method: string, options?: ISPHttpClientOptions) => void; + public fetch(url: string, configuration: SPHttpClientConfiguration, options: ISPHttpClientOptions): Promise { + let mockedResponse = this.Requests.filter(req => req.method === options.method && req.url == url)[0]; + let response: Response; + if (mockedResponse) { + response = new Response(mockedResponse.resultString, { + status: 200, + statusText: "Ok" + }); + } + else { + response = new Response(null, { + status: 404, + statusText: "Not fount", + }); + } + return Promise.resolve(new SPHttpClientResponse(response)); + } + public fetchRaw(url: string, configuration: SPHttpClientConfiguration, options?: ISPHttpClientOptions): Promise { + return this.fetch(url, configuration, options); + } + public get(url: string, configuration: SPHttpClientConfiguration, options?: ISPHttpClientOptions): Promise { + options = options || {}; + options.method = "GET"; + return this.fetch(url, configuration, options); + } + public post(url: string, configuration: SPHttpClientConfiguration, options?: ISPHttpClientOptions): Promise { + options = options || {}; + options.method = "POST"; + return this.fetch(url, configuration, options); + } + public patch(url: string, configuration: SPHttpClientConfiguration, options?: ISPHttpClientOptions): Promise { + options = options || {}; + options.method = "PATCH"; + return this.fetch(url, configuration, options); + } + public delete(url: string, configuration: SPHttpClientConfiguration, options?: ISPHttpClientOptions): Promise { + options = options || {}; + options.method = "DELETE"; + return this.fetch(url, configuration, options); + } +} diff --git a/src/common/telemetry/version.ts b/src/common/telemetry/version.ts index d09b5f589..aa137b9a5 100644 --- a/src/common/telemetry/version.ts +++ b/src/common/telemetry/version.ts @@ -1 +1 @@ -export const version: string = "1.16.0"; \ No newline at end of file +export const version: string = "1.17.0"; \ No newline at end of file diff --git a/src/common/utilities/GeneralHelper.ts b/src/common/utilities/GeneralHelper.ts index 5fe31f1f1..3b0b3a5aa 100644 --- a/src/common/utilities/GeneralHelper.ts +++ b/src/common/utilities/GeneralHelper.ts @@ -232,6 +232,24 @@ export class GeneralHelper { } } + /** + * To support IE11 that has no support for File constructor + * @param blob + */ + public static getFileFromBlob(blob :Blob, fileName: string) : File { + let result : any = null; + // IE 11 foesn't support File API, create a workaround to return Blob with fileName assigned. + try { + result = new File([blob], fileName); + } + catch (ieErr) { + result = blob; + result.fileName = fileName; + } + + return result; + } + public static formatBytes(bytes, decimals) { if (bytes == 0) { return strings.EmptyFileSize; diff --git a/src/common/utilities/SPHelper.ts b/src/common/utilities/SPHelper.ts index d8fb58cc7..3a5ff61d7 100644 --- a/src/common/utilities/SPHelper.ts +++ b/src/common/utilities/SPHelper.ts @@ -352,7 +352,7 @@ export class SPHelper { url = context.pageContext.web.absoluteUrl; url = GeneralHelper.trimSlash(url); - url += `/_api/SP.UserProfiles.PeopleManager/GetPropertiesFor('${encodeURIComponent(loginName)}')`; + url += "/_api/SP.UserProfiles.PeopleManager/GetPropertiesFor(accountName=@v)?@v='" + encodeURIComponent(loginName) + "'"; return context.spHttpClient.get(url, SPHttpClient.configurations.v1) .then((response): Promise => { return response.json(); diff --git a/src/controls/dateTimePicker/DateTimePicker.tsx b/src/controls/dateTimePicker/DateTimePicker.tsx index 2140ab611..df19fd68a 100644 --- a/src/controls/dateTimePicker/DateTimePicker.tsx +++ b/src/controls/dateTimePicker/DateTimePicker.tsx @@ -204,6 +204,7 @@ export class DateTimePicker extends React.Component diff --git a/src/controls/dateTimePicker/IDateTimePickerProps.ts b/src/controls/dateTimePicker/IDateTimePickerProps.ts index bb49cfb4f..77d8b3763 100644 --- a/src/controls/dateTimePicker/IDateTimePickerProps.ts +++ b/src/controls/dateTimePicker/IDateTimePickerProps.ts @@ -102,4 +102,9 @@ export interface IDateTimePickerProps { * Specify if labels in front of date and time parts should be rendered. True by default */ showLabels?: boolean; + + /** + * Placeholder text for the DatePicker + */ + placeholder?: string; } diff --git a/src/controls/dateTimePicker/MinutesComponent.tsx b/src/controls/dateTimePicker/MinutesComponent.tsx index b3a18db3c..7fa898a0e 100644 --- a/src/controls/dateTimePicker/MinutesComponent.tsx +++ b/src/controls/dateTimePicker/MinutesComponent.tsx @@ -1,3 +1,4 @@ +import * as strings from 'ControlStrings'; import * as React from 'react'; import { ITimeComponentProps } from './ITimeComponentProps'; import { MaskedTextField } from 'office-ui-fabric-react/lib/TextField'; @@ -46,8 +47,17 @@ export default class MinutesComponent extends React.Component { - onChange(val); - return ""; + let message = ""; + const minutes: number = parseInt(val); + if (isNaN(minutes)) { + message = strings.DateTimePickerMinuteValueInvalid; + } + + if (!message) { + onChange(val); + } + + return message; }} mask="59" maskFormat={{ diff --git a/src/controls/dateTimePicker/SecondsComponent.tsx b/src/controls/dateTimePicker/SecondsComponent.tsx index e62a9fa68..2a07e3c33 100644 --- a/src/controls/dateTimePicker/SecondsComponent.tsx +++ b/src/controls/dateTimePicker/SecondsComponent.tsx @@ -1,3 +1,4 @@ +import * as strings from 'ControlStrings'; import * as React from 'react'; import { ITimeComponentProps } from './ITimeComponentProps'; import { MaskedTextField } from 'office-ui-fabric-react/lib/TextField'; @@ -46,8 +47,17 @@ export default class SecondsComponent extends React.Component { - onChange(val); - return ""; + let message = ""; + const seconds: number = parseInt(val); + if (isNaN(seconds)) { + message = strings.DateTimePickerSecondValueInvalid; + } + + if (!message) { + onChange(val); + } + + return message; }} mask="59" maskFormat={{ diff --git a/src/controls/filePicker/FilePicker.tsx b/src/controls/filePicker/FilePicker.tsx index 765bdc3f0..3d43026e6 100644 --- a/src/controls/filePicker/FilePicker.tsx +++ b/src/controls/filePicker/FilePicker.tsx @@ -65,6 +65,8 @@ export class FilePicker extends React.Component +
{ this.props.label && } { this.props.buttonIcon ? : - + } { + const addUrl = this.props.storeLastActiveTab !== false; let links = []; if (!this.props.hideRecentTab) { links.push({ name: strings.RecentLinkLabel, - url: '#recent', + url: addUrl ? '#recent' : undefined, icon: 'Recent', key: 'keyRecent', }); @@ -231,7 +235,7 @@ export class FilePicker extends React.Component div { + font-weight: 600; + color: $ms-color-neutralPrimary; + } +} + +.filterBox { + margin-bottom: 10px; + margin-top: 20px; + padding-left: 8px; + padding-right: 8px; + max-width: 450px; +} + +.libraryItem { + padding: 5px 0 5px 8px; + cursor: pointer; + height: 30px; + line-height: 30px; + border-width: 1px; + display: flex; + align-items: center; + &:hover { + background-color: #f4f4f4; + } +} + +.folderIcon { + margin-right: 10px; +} + +.status { + font-size: 14px; + color: $ms-color-neutralSecondary; + padding-top: 15px; + padding-left: 30px; + padding-bottom: 20px; + padding-right: 40px; +} diff --git a/src/controls/folderExplorer/FolderExplorer/FolderExplorer.tsx b/src/controls/folderExplorer/FolderExplorer/FolderExplorer.tsx new file mode 100644 index 000000000..8f17f2e9d --- /dev/null +++ b/src/controls/folderExplorer/FolderExplorer/FolderExplorer.tsx @@ -0,0 +1,163 @@ +import * as React from 'react'; +import { TextField } from "office-ui-fabric-react/lib/TextField"; +import styles from './FolderExplorer.module.scss'; +import * as strings from 'ControlStrings'; +import { Icon } from "office-ui-fabric-react/lib/Icon"; +import { IFolderExplorerProps, IFolderExplorerState } from '.'; +import { FolderExplorerService } from '../../../services/FolderExplorerService'; +import { IFolder, IFolderExplorerService } from '../../../services/IFolderExplorerService'; +import { NewFolder } from "../NewFolder"; +import { Breadcrumb, IBreadcrumbItem } from "office-ui-fabric-react/lib/Breadcrumb"; +import * as telemetry from '../../../common/telemetry'; + + +export class FolderExplorer extends React.Component { + + private _spService: IFolderExplorerService; + private _allFolders: IFolder[] = []; + + constructor(props: IFolderExplorerProps) { + super(props); + + telemetry.track('FolderExplorer'); + + this._spService = new FolderExplorerService(this.props.context.serviceScope); + + this.state = { + foldersLoading: false, + folders: [], + selectedFolder: null, + }; + } + + public async componentDidMount() { + await this._getSubFolders(this.props.defaultFolder ? this.props.defaultFolder : this.props.rootFolder); + } + + public render(): React.ReactElement { + return ( +
+ {!this.props.hiddenBreadcrumb && + this._getBreadcrumbDOM() + } +
+ {!this.props.hiddenFilterBox && this._allFolders.length > 0 && +
+ +
+ } + {this.state.folders.length === 0 && +
+ {this.state.foldersLoading ? strings.FolderExplorerLoading : strings.FolderExplorerNoItems} +
+ } + {this.state.folders.length > 0 && +
+ {this.state.folders.map((folder) => { + return ( +
{ this._getSubFolders(folder); }}> + + {folder.Name} +
+ ); + }) + } +
+ } + {this.props.canCreateFolders && + + } +
+
+ ); + + } + + /** + * Get HTML elements for rendering breadcrumb + */ + private _getBreadcrumbDOM = (): JSX.Element => { + let breadCrumbDOM = null; + + let breadCrumbItems = this._getCurrentBreadcrumbItems(); + let overflowIndex = breadCrumbItems.length > 1 ? 1 : 0; + breadCrumbDOM = ; + + return breadCrumbDOM; + } + + /** + * Get breadcrumb items + * @returns an array of IBreadcrumbItem objects + */ + private _getCurrentBreadcrumbItems = (): IBreadcrumbItem[] => { + let items: IBreadcrumbItem[] = []; + + let rootItem: IBreadcrumbItem = { text: this.props.rootFolder.Name, key: 'Root-Item', onClick: this._getSubFolders.bind(this, this.props.rootFolder) }; + items.push(rootItem); + + if (this.state.selectedFolder && this.state.selectedFolder.ServerRelativeUrl !== this.props.rootFolder.ServerRelativeUrl) { + const folderPathSplit = this.state.selectedFolder.ServerRelativeUrl.replace(this.props.rootFolder.ServerRelativeUrl, '').split('/'); + let folderPath = this.props.rootFolder.ServerRelativeUrl; + folderPathSplit.forEach((folderName, index) => { + if (folderName !== '') { + folderPath += '/' + folderName; + let folderItem: IBreadcrumbItem = { text: folderName, key: `Folder-${index.toString()}`, onClick: this._getSubFolders.bind(this, { Name: folderName, ServerRelativeUrl: folderPath }) }; + items.push(folderItem); + } + }); + } + + items[items.length - 1].isCurrentItem = true; + return items; + } + + /** + * Filter list of folders based on user input + * @param filterText - The text to use when filtering the collection + */ + private _onChangeFilterText = (filterText: string): void => { + this.setState({ + folders: filterText ? this._allFolders.filter(f => f.Name.toLowerCase().indexOf(filterText.toLowerCase()) > -1) : this._allFolders + }); + } + + /** +* Load sub folders and files within a given folder +* @param folder - Name of the folder +*/ + private _getSubFolders = async (folder: IFolder): Promise => { + + this.setState({ foldersLoading: true }); + try { + this._allFolders = await this._spService.GetFolders(this.props.context.pageContext.web.absoluteUrl, folder.ServerRelativeUrl); + this.setState({ folders: this._allFolders, selectedFolder: folder, foldersLoading: false }); + + // callback to parent component + this.props.onSelect(folder); + + } catch (error) { + this.setState({ selectedFolder: null, foldersLoading: false }); + console.error(error); + } + } + + /** + * Add new subfolder to current folder + */ + private _addSubFolder = async (newFolder: IFolder): Promise => { + if (newFolder) { + + // add folder if a folder with the same name does not exist yet + if (!this._allFolders.some(f => f.Name === newFolder.Name)) { + // update both list of folders + this._allFolders.push(newFolder); + this.setState({ + folders: this._allFolders + }); + } + } + } +} diff --git a/src/controls/folderExplorer/FolderExplorer/IFolderExplorerProps.ts b/src/controls/folderExplorer/FolderExplorer/IFolderExplorerProps.ts new file mode 100644 index 000000000..8566860ef --- /dev/null +++ b/src/controls/folderExplorer/FolderExplorer/IFolderExplorerProps.ts @@ -0,0 +1,43 @@ +import { WebPartContext } from '@microsoft/sp-webpart-base'; +import { ExtensionContext } from '@microsoft/sp-extension-base'; + +import { IFolder } from '../../../services/IFolderExplorerService'; + + +export interface IFolderExplorerProps { + /** + * Current context + */ + context: WebPartContext | ExtensionContext; + + /** + * The lowest level folder that can be explored. This can be the root folder of a library. + */ + rootFolder: IFolder; + + /** + * The default folder to be explored + */ + defaultFolder: IFolder; + + /** + * Allow current user to create folders on the target location. If enabled, you need to ensure that the user has the required permissions + */ + canCreateFolders?: boolean; + + /** + * Hide the breadcrumb control + */ + hiddenBreadcrumb?: boolean; + + /** + * Hide the filter box + */ + hiddenFilterBox?: boolean; + + /** + * Callback function called after a folder is selected + * @argument folder The selected folder + */ + onSelect: (folder: IFolder) => void; +} diff --git a/src/controls/folderExplorer/FolderExplorer/IFolderExplorerState.ts b/src/controls/folderExplorer/FolderExplorer/IFolderExplorerState.ts new file mode 100644 index 000000000..2e038e432 --- /dev/null +++ b/src/controls/folderExplorer/FolderExplorer/IFolderExplorerState.ts @@ -0,0 +1,7 @@ +import { IFolder } from '../../../services/IFolderExplorerService'; + +export interface IFolderExplorerState { + foldersLoading: boolean; + folders: IFolder[]; + selectedFolder: IFolder; +} diff --git a/src/controls/folderExplorer/FolderExplorer/index.ts b/src/controls/folderExplorer/FolderExplorer/index.ts new file mode 100644 index 000000000..f770e0ff2 --- /dev/null +++ b/src/controls/folderExplorer/FolderExplorer/index.ts @@ -0,0 +1,3 @@ +export * from './FolderExplorer'; +export * from './IFolderExplorerProps'; +export * from './IFolderExplorerState'; diff --git a/src/controls/folderExplorer/NewFolder/INewFolderProps.ts b/src/controls/folderExplorer/NewFolder/INewFolderProps.ts new file mode 100644 index 000000000..f502fb596 --- /dev/null +++ b/src/controls/folderExplorer/NewFolder/INewFolderProps.ts @@ -0,0 +1,21 @@ +import { WebPartContext } from '@microsoft/sp-webpart-base'; +import { ExtensionContext } from '@microsoft/sp-extension-base'; +import { IFolder } from '../../../services/IFolderExplorerService'; + +export interface INewFolderProps { + /** + * Current context + */ + context: WebPartContext | ExtensionContext; + + /** + * Folder currently selected + */ + selectedFolder: IFolder; + + /** + * Callback function called after the folder has been added + * @argument newFolder The new folder created. Null if error occurred. + */ + addSubFolder: (newFolder: IFolder) => Promise; +} diff --git a/src/controls/folderExplorer/NewFolder/INewFolderState.ts b/src/controls/folderExplorer/NewFolder/INewFolderState.ts new file mode 100644 index 000000000..ca212fdb9 --- /dev/null +++ b/src/controls/folderExplorer/NewFolder/INewFolderState.ts @@ -0,0 +1,5 @@ +export interface INewFolderState { + folderName: string; + showInput: boolean; + loading: boolean; +} diff --git a/src/controls/folderExplorer/NewFolder/NewFolder.module.scss b/src/controls/folderExplorer/NewFolder/NewFolder.module.scss new file mode 100644 index 000000000..41abe06dc --- /dev/null +++ b/src/controls/folderExplorer/NewFolder/NewFolder.module.scss @@ -0,0 +1,47 @@ +// @import "~@microsoft/sp-office-ui-fabric-core/dist/sass/SPFabricCore.scss"; +@import '~office-ui-fabric-react/dist/sass/References.scss'; + +.libraryItem { + padding: 5px 0 5px 10px; + cursor: pointer; + height: 30px; + line-height: 30px; + border-width: 1px; + display: flex; + align-items: center; +} + +.libraryItem:hover { + background-color: #f4f4f4; +} + +.folderIcon { + margin-right: 10px; + color: $ms-color-themeSecondary; +} + +.defaultText { + width: 100%; +} + +.button { + background-color: $ms-color-themePrimary; + color: white; + + &:hover { + background-color: $ms-color-themeSecondary; + color: white; + } + + &:disabled { + background-color: #f4f4f4; + } + + & i { + font-weight: bolder; + } +} + +.spinner { + padding-right: 10px; +} diff --git a/src/controls/folderExplorer/NewFolder/NewFolder.tsx b/src/controls/folderExplorer/NewFolder/NewFolder.tsx new file mode 100644 index 000000000..2bacdb517 --- /dev/null +++ b/src/controls/folderExplorer/NewFolder/NewFolder.tsx @@ -0,0 +1,100 @@ +import * as React from 'react'; +import { Icon, IIconProps } from 'office-ui-fabric-react/lib/Icon'; +import { IconButton } from 'office-ui-fabric-react/lib/Button'; +import { TextField } from 'office-ui-fabric-react/lib/TextField'; +import { Spinner, SpinnerSize } from "office-ui-fabric-react/lib/Spinner"; +import styles from './NewFolder.module.scss'; +import * as strings from 'ControlStrings'; +import { INewFolderProps, INewFolderState } from '.'; +import { FolderExplorerService } from '../../../services/FolderExplorerService'; +import { IFolder, IFolderExplorerService } from '../../../services/IFolderExplorerService'; + +const addIcon: IIconProps = { iconName: 'CheckMark' }; + +export class NewFolder extends React.Component { + + private _spService: IFolderExplorerService; + + constructor(props: INewFolderProps) { + super(props); + + this._spService = new FolderExplorerService(this.props.context.serviceScope); + + this.state = { + folderName: '', + showInput: false, + loading: false, + }; + } + + + public render(): React.ReactElement { + return ( +
+ {this.state.loading && + + } + {!this.state.loading && + + } + {!this.state.showInput && +
New folder
+ } + {this.state.showInput && + + } + {this.state.folderName.length > 0 && + + } +
+ ); + } + + private _onFolderNameChange = (newValue?: string) => { + this.setState({ folderName: newValue || '' }); + } + + private _onShowInputChange = (event: React.MouseEvent) => { + this.setState({ showInput: true }); + } + + /** + * Add new subfolder to current folder + */ + private _addSubFolder = async (): Promise => { + + let newFolder: IFolder = null; + + this.setState({ loading: true }); + + try { + const folder = await this._spService.AddFolder( + this.props.context.pageContext.web.absoluteUrl, + this.props.selectedFolder.ServerRelativeUrl, + this.state.folderName); + + // update folder variable to be used on the callback + newFolder = { Name: folder.Name, ServerRelativeUrl: folder.ServerRelativeUrl }; + // update return variable + + this.setState({ loading: false, folderName: '' }); + + } catch (error) { + console.error('Error adding folder', error); + } + + // callback + this.props.addSubFolder(newFolder); + } +} diff --git a/src/controls/folderExplorer/NewFolder/index.ts b/src/controls/folderExplorer/NewFolder/index.ts new file mode 100644 index 000000000..3826f0f30 --- /dev/null +++ b/src/controls/folderExplorer/NewFolder/index.ts @@ -0,0 +1,3 @@ +export * from './NewFolder'; +export * from './INewFolderProps'; +export * from './INewFolderState'; diff --git a/src/controls/folderExplorer/index.ts b/src/controls/folderExplorer/index.ts new file mode 100644 index 000000000..e51181e1f --- /dev/null +++ b/src/controls/folderExplorer/index.ts @@ -0,0 +1,2 @@ +export * from "./FolderExplorer/index"; +export {IFolder} from "../../services/IFolderExplorerService"; diff --git a/src/controls/iconPicker/IIconPickerProps.ts b/src/controls/iconPicker/IIconPickerProps.ts new file mode 100644 index 000000000..8db8b7e6b --- /dev/null +++ b/src/controls/iconPicker/IIconPickerProps.ts @@ -0,0 +1,30 @@ +export interface IIconPickerProps { + /** + * call-back function when icon selection has been confirmed + */ + onSave(iconName: string): void; + /** + * call-back function when icon has changed + */ + onChange?(iconName: string): void; + /** + * Specifies the label of the icon picker button + */ + buttonLabel?: string; + /** + * Specifies if the picker button is disabled + */ + disabled?: boolean; + /** + * Specifies a custom className for the picker button + */ + buttonClassName?: string; + /** + * Specifies a custom className for the panel element + */ + panelClassName?: string; + /** + * initially selected icon + */ + currentIcon?: string; +} \ No newline at end of file diff --git a/src/controls/iconPicker/IIconPickerState.ts b/src/controls/iconPicker/IIconPickerState.ts new file mode 100644 index 000000000..3029d6904 --- /dev/null +++ b/src/controls/iconPicker/IIconPickerState.ts @@ -0,0 +1,5 @@ +export interface IIconPickerState { + items: string[]; + currentIcon?: string; + isPanelOpen: boolean; +} \ No newline at end of file diff --git a/src/controls/iconPicker/IconNames.ts b/src/controls/iconPicker/IconNames.ts new file mode 100644 index 000000000..e3519e3a0 --- /dev/null +++ b/src/controls/iconPicker/IconNames.ts @@ -0,0 +1,1722 @@ +export class IconNames { + public static Icons = [ + 'InternetSharing', + 'Brightness', + 'MapPin', + 'Airplane', + 'Tablet', + 'QuickNote', + 'Video', + 'People', + 'Phone', + 'Pin', + 'Shop', + 'Stop', + 'Link', + 'AllApps', + 'Zoom', + 'ZoomOut', + 'Microphone', + 'Camera', + 'Attach', + 'Send', + 'FavoriteList', + 'PageSolid', + 'Forward', + 'Back', + 'Refresh', + 'Lock', + 'ReportHacked', + 'EMI', + 'MiniLink', + 'Blocked', + 'ReadingMode', + 'Favicon', + 'Remove', + 'Checkbox', + 'CheckboxComposite', + 'CheckboxFill', + 'CheckboxIndeterminate', + 'CheckboxCompositeReversed', + 'BackToWindow', + 'FullScreen', + 'Print', + 'Up', + 'Down', + 'OEM', + 'Save', + 'ReturnKey', + 'Cloud', + 'Flashlight', + 'CommandPrompt', + 'Sad', + 'RealEstate', + 'SIPMove', + 'EraseTool', + 'GripperTool', + 'Dialpad', + 'PageLeft', + 'PageRight', + 'MultiSelect', + 'KeyboardClassic', + 'Play', + 'Pause', + 'InkingTool', + 'Emoji2', + 'GripperBarHorizontal', + 'System', + 'Personalize', + 'SearchAndApps', + 'Globe', + 'EaseOfAccess', + 'ContactInfo', + 'Unpin', + 'Contact', + 'Memo', + 'IncomingCall', + 'Paste', + 'WindowsLogo', + 'Error', + 'GripperBarVertical', + 'Unlock', + 'Slideshow', + 'AutoEnhanceOn', + 'AutoEnhanceOff', + 'Color', + 'SaveAs', + 'Light', + 'Filters', + 'AspectRatio', + 'Contrast', + 'Redo', + 'Crop', + 'PhotoCollection', + 'Album', + 'Rotate', + 'PanoIndicator', + 'Translate', + 'RedEye', + 'ThumbnailView', + 'Package', + 'Telemarketer', + 'Warning', + 'Financial', + 'Education', + 'ShoppingCart', + 'Train', + 'Move', + 'TouchPointer', + 'Merge', + 'TurnRight', + 'Ferry', + 'Highlight', + 'PowerButton', + 'Tab', + 'Admin', + 'TVMonitor', + 'Speakers', + 'Game', + 'UnstackSelected', + 'StackIndicator', + 'Nav2DMapView', + 'StreetsideSplitMinimize', + 'Car', + 'Bus', + 'EatDrink', + 'SeeDo', + 'LocationCircle', + 'Home', + 'SwitcherStartEnd', + 'ParkingLocation', + 'IncidentTriangle', + 'Touch', + 'MapDirections', + 'CaretHollow', + 'CaretSolid', + 'History', + 'Location', + 'MapLayers', + 'SearchNearby', + 'Work', + 'Recent', + 'Hotel', + 'Bank', + 'LocationDot', + 'Dictionary', + 'ChromeBack', + 'FolderOpen', + 'PinnedFill', + 'RevToggleKey', + 'USB', + 'Previous', + 'Next', + 'Sync', + 'Help', + 'Emoji', + 'MailForward', + 'ClosePane', + 'OpenPane', + 'PreviewLink', + 'ZoomIn', + 'Bookmarks', + 'Document', + 'ProtectedDocument', + 'OpenInNewWindow', + 'MailFill', + 'ViewAll', + 'Switch', + 'Rename', + 'Go', + 'Remote', + 'SelectAll', + 'Orientation', + 'Import', + 'Picture', + 'ChromeClose', + 'ShowResults', + 'Message', + 'CalendarDay', + 'CalendarWeek', + 'MailReplyAll', + 'Read', + 'Cut', + 'PaymentCard', + 'Copy', + 'Important', + 'MailReply', + 'GotoToday', + 'Font', + 'FontColor', + 'FolderFill', + 'Permissions', + 'DisableUpdates', + 'Unfavorite', + 'Italic', + 'Underline', + 'Bold', + 'MoveToFolder', + 'Dislike', + 'Like', + 'AlignCenter', + 'OpenFile', + 'FontDecrease', + 'HighlightMappedShapes', + 'TextCallout', + 'IconSetsFlag', + 'VisioLogo', + 'VisioLogoFill', + 'VisioDocument', + 'TimelineProgress', + 'TimelineDelivery', + 'Backlog', + 'TeamFavorite', + 'TaskGroup', + 'TaskGroupMirrored', + 'ScopeTemplate', + 'AssessmentGroupTemplate', + 'NewTeamProject', + 'CommentAdd', + 'CommentNext', + 'CommentPrevious', + 'ShopServer', + 'LocaleLanguage', + 'QueryList', + 'UserSync', + 'UserPause', + 'StreamingOff', + 'ArrowTallUpLeft', + 'ArrowTallUpRight', + 'ArrowTallDownLeft', + 'ArrowTallDownRight', + 'FieldEmpty', + 'FieldFilled', + 'FieldChanged', + 'FieldNotChanged', + 'RingerOff', + 'PlayResume', + 'BulletedList2', + 'BulletedList2Mirrored', + 'ImageCrosshair', + 'GitGraph', + 'Repo', + 'RepoSolid', + 'FolderQuery', + 'FolderList', + 'FolderListMirrored', + 'LocationOutline', + 'POISolid', + 'CalculatorNotEqualTo', + 'BoxSubtractSolid', + 'BoxAdditionSolid', + 'BoxMultiplySolid', + 'BoxPlaySolid', + 'BoxCheckmarkSolid', + 'CirclePauseSolid', + 'CirclePause', + 'MSNVideosSolid', + 'CircleStopSolid', + 'CircleStop', + 'NavigateBack', + 'NavigateBackMirrored', + 'NavigateForward', + 'NavigateForwardMirrored', + 'UnknownSolid', + 'UnknownMirroredSolid', + 'CircleAddition', + 'CircleAdditionSolid', + 'FilePDB', + 'FileTemplate', + 'FileSQL', + 'FileJAVA', + 'FileASPX', + 'FileCSS', + 'FileSass', + 'FileLess', + 'FileHTML', + 'JavaScriptLanguage', + 'CSharpLanguage', + 'CSharp', + 'VisualBasicLanguage', + 'VB', + 'CPlusPlusLanguage', + 'CPlusPlus', + 'FSharpLanguage', + 'FSharp', + 'TypeScriptLanguage', + 'PythonLanguage', + 'PY', + 'CoffeeScript', + 'MarkDownLanguage', + 'FullWidth', + 'FullWidthEdit', + 'Plug', + 'PlugSolid', + 'PlugConnected', + 'PlugDisconnected', + 'UnlockSolid', + 'Variable', + 'Parameter', + 'CommentUrgent', + 'Storyboard', + 'DiffInline', + 'DiffSideBySide', + 'ImageDiff', + 'ImagePixel', + 'FileBug', + 'FileCode', + 'FileComment', + 'BusinessHoursSign', + 'FileImage', + 'FileSymlink', + 'AutoFillTemplate', + 'WorkItem', + 'WorkItemBug', + 'LogRemove', + 'ColumnOptions', + 'Packages', + 'BuildIssue', + 'AssessmentGroup', + 'VariableGroup', + 'FullHistory', + 'SingleColumnEdit', + 'DoubleColumnEdit', + 'TripleColumnEdit', + 'ColumnLeftTwoThirdsEdit', + 'ColumnRightTwoThirdsEdit', + 'StreamLogo', + 'PassiveAuthentication', + 'AlertSolid', + 'MegaphoneSolid', + 'TaskSolid', + 'ConfigurationSolid', + 'BugSolid', + 'CrownSolid', + 'Trophy2Solid', + 'QuickNoteSolid', + 'ConstructionConeSolid', + 'PageListSolid', + 'PageListMirroredSolid', + 'StarburstSolid', + 'ReadingModeSolid', + 'SadSolid', + 'HealthSolid', + 'ShieldSolid', + 'GiftBoxSolid', + 'ShoppingCartSolid', + 'MailSolid', + 'ChatSolid', + 'RibbonSolid', + 'FinancialSolid', + 'FinancialMirroredSolid', + 'HeadsetSolid', + 'PermissionsSolid', + 'ParkingSolid', + 'ParkingMirroredSolid', + 'DiamondSolid', + 'AsteriskSolid', + 'OfflineStorageSolid', + 'BankSolid', + 'DecisionSolid', + 'Parachute', + 'ParachuteSolid', + 'FiltersSolid', + 'ColorSolid', + 'ReviewSolid', + 'ReviewRequestSolid', + 'ReviewRequestMirroredSolid', + 'ReviewResponseSolid', + 'FeedbackRequestSolid', + 'FeedbackRequestMirroredSolid', + 'FeedbackResponseSolid', + 'WorkItemBar', + 'WorkItemBarSolid', + 'Separator', + 'NavigateExternalInline', + 'PlanView', + 'TimelineMatrixView', + 'EngineeringGroup', + 'ProjectCollection', + 'CaretBottomRightCenter8', + 'CaretBottomLeftCenter8', + 'CaretTopRightCenter8', + 'CaretTopLeftCenter8', + 'DonutChart', + 'ChevronUnfold10', + 'ChevronFold10', + 'DoubleChevronDown8', + 'DoubleChevronUp8', + 'DoubleChevronLeft8', + 'DoubleChevronRight8', + 'ChevronDownEnd6', + 'ChevronUpEnd6', + 'ChevronLeftEnd6', + 'ChevronRightEnd6', + 'ContextMenu', + 'AzureAPIManagement', + 'AzureServiceEndpoint', + 'VSTSLogo', + 'VSTSAltLogo1', + 'VSTSAltLogo2', + 'FileTypeSolution', + 'WordLogoInverse16', + 'WordLogo16', + 'WordLogoFill16', + 'PowerPointLogoInverse16', + 'PowerPointLogo16', + 'PowerPointLogoFill16', + 'ExcelLogoInverse16', + 'ExcelLogo16', + 'ExcelLogoFill16', + 'OneNoteLogoInverse16', + 'OneNoteLogo16', + 'OneNoteLogoFill16', + 'OutlookLogoInverse16', + 'OutlookLogo16', + 'OutlookLogoFill16', + 'PublisherLogoInverse16', + 'PublisherLogo16', + 'PublisherLogoFill16', + 'VisioLogoInverse16', + 'VisioLogo16', + 'VisioLogoFill16', + 'TestBeaker', + 'TestBeakerSolid', + 'TestExploreSolid', + 'TestAutoSolid', + 'TestUserSolid', + 'TestImpactSolid', + 'TestPlan', + 'TestStep', + 'TestParameter', + 'TestSuite', + 'TestCase', + 'Sprint', + 'SignOut', + 'TriggerApproval', + 'Rocket', + 'AzureKeyVault', + 'Onboarding', + 'Transition', + 'LikeSolid', + 'DislikeSolid', + 'CRMCustomerInsightsApp', + 'EditCreate', + 'UnSetColor', + 'DeclineCall', + 'RectangularClipping', + 'TeamsLogo16', + 'TeamsLogoFill16', + 'Spacer', + 'SkypeLogo16', + 'SkypeForBusinessLogo16', + 'SkypeForBusinessLogoFill16', + 'FilterSolid', + 'MailUndelivered', + 'MailTentative', + 'MailTentativeMirrored', + 'MailReminder', + 'ReceiptUndelivered', + 'ReceiptTentative', + 'ReceiptTentativeMirrored', + 'Inbox', + 'IRMReply', + 'IRMReplyMirrored', + 'IRMForward', + 'IRMForwardMirrored', + 'VoicemailIRM', + 'EventAccepted', + 'EventTentative', + 'EventTentativeMirrored', + 'EventDeclined', + 'IDBadge', + 'BackgroundColor', + 'OfficeFormsLogoInverse16', + 'OfficeFormsLogo', + 'OfficeFormsLogoFill', + 'OfficeFormsLogo16', + 'OfficeFormsLogoFill16', + 'OfficeFormsLogoInverse24', + 'OfficeFormsLogo24', + 'OfficeFormsLogoFill24', + 'PageLock', + 'NotExecuted', + 'NotImpactedSolid', + 'FieldReadOnly', + 'FieldRequired', + 'BacklogBoard', + 'ExternalBuild', + 'ExternalTFVC', + 'ExternalXAML', + 'IssueSolid', + 'DefectSolid', + 'LadybugSolid', + 'NugetLogo', + 'TFVCLogo', + 'ProjectLogo32', + 'ProjectLogoFill32', + 'ProjectLogo16', + 'ProjectLogoFill16', + 'SwayLogo32', + 'SwayLogoFill32', + 'SwayLogo16', + 'SwayLogoFill16', + 'ClassNotebookLogo32', + 'ClassNotebookLogoFill32', + 'ClassNotebookLogo16', + 'ClassNotebookLogoFill16', + 'ClassNotebookLogoInverse32', + 'ClassNotebookLogoInverse16', + 'StaffNotebookLogo32', + 'StaffNotebookLogoFill32', + 'StaffNotebookLogo16', + 'StaffNotebookLogoFill16', + 'StaffNotebookLogoInverted32', + 'StaffNotebookLogoInverted16', + 'KaizalaLogo', + 'TaskLogo', + 'ProtectionCenterLogo32', + 'GallatinLogo', + 'Globe2', + 'Guitar', + 'Breakfast', + 'Brunch', + 'BeerMug', + 'Vacation', + 'Teeth', + 'Taxi', + 'Chopsticks', + 'SyncOccurence', + 'UnsyncOccurence', + 'GIF', + 'PrimaryCalendar', + 'SearchCalendar', + 'VideoOff', + 'MicrosoftFlowLogo', + 'BusinessCenterLogo', + 'ToDoLogoBottom', + 'ToDoLogoTop', + 'EditSolid12', + 'EditSolidMirrored12', + 'UneditableSolid12', + 'UneditableSolidMirrored12', + 'UneditableMirrored', + 'AdminALogo32', + 'AdminALogoFill32', + 'ToDoLogoInverse', + 'Snooze', + 'WaffleOffice365', + 'ImageSearch', + 'NewsSearch', + 'VideoSearch', + 'R', + 'FontColorA', + 'FontColorSwatch', + 'LightWeight', + 'NormalWeight', + 'SemiboldWeight', + 'GroupObject', + 'UngroupObject', + 'AlignHorizontalLeft', + 'AlignHorizontalCenter', + 'AlignHorizontalRight', + 'AlignVerticalTop', + 'AlignVerticalCenter', + 'AlignVerticalBottom', + 'HorizontalDistributeCenter', + 'VerticalDistributeCenter', + 'Ellipse', + 'Line', + 'Octagon', + 'Hexagon', + 'Pentagon', + 'RightTriangle', + 'HalfCircle', + 'QuarterCircle', + 'ThreeQuarterCircle', + '6PointStar', + '12PointStar', + 'ArrangeBringToFront', + 'ArrangeSendToBack', + 'ArrangeSendBackward', + 'ArrangeBringForward', + 'BorderDash', + 'BorderDot', + 'LineStyle', + 'LineThickness', + 'WindowEdit', + 'HintText', + 'MediaAdd', + 'AnchorLock', + 'AutoHeight', + 'ChartSeries', + 'ChartXAngle', + 'ChartYAngle', + 'Combobox', + 'LineSpacing', + 'Padding', + 'PaddingTop', + 'PaddingBottom', + 'PaddingLeft', + 'PaddingRight', + 'NavigationFlipper', + 'AlignJustify', + 'TextOverflow', + 'VisualsFolder', + 'VisualsStore', + 'PictureCenter', + 'PictureFill', + 'PicturePosition', + 'PictureStretch', + 'PictureTile', + 'Slider', + 'SliderHandleSize', + 'DefaultRatio', + 'NumberSequence', + 'GUID', + 'ReportAdd', + 'DashboardAdd', + 'MapPinSolid', + 'WebPublish', + 'PieSingleSolid', + 'BlockedSolid', + 'DrillDown', + 'DrillDownSolid', + 'DrillExpand', + 'DrillShow', + 'SpecialEvent', + 'OneDriveFolder16', + 'FunctionalManagerDashboard', + 'BIDashboard', + 'CodeEdit', + 'RenewalCurrent', + 'RenewalFuture', + 'SplitObject', + 'BulkUpload', + 'DownloadDocument', + 'Flower', + 'WaitlistConfirm', + 'WaitlistConfirmMirrored', + 'LaptopSecure', + 'DragObject', + 'EntryView', + 'EntryDecline', + 'ContactCardSettings', + 'ContactCardSettingsMirrored', + 'CalendarSettings', + 'CalendarSettingsMirrored', + 'HardDriveLock', + 'HardDriveUnlock', + 'AccountManagement', + 'TransitionPop', + 'TransitionPush', + 'TransitionEffect', + 'LookupEntities', + 'ExploreData', + 'AddBookmark', + 'SearchBookmark', + 'DrillThrough', + 'MasterDatabase', + 'CertifiedDatabase', + 'MaximumValue', + 'MinimumValue', + 'VisualStudioIDELogo32', + 'PasteAsText', + 'PasteAsCode', + 'BrowserTab', + 'BrowserTabScreenshot', + 'DesktopScreenshot', + 'FileYML', + 'ClipboardSolid', + 'FabricUserFolder', + 'FabricNetworkFolder', + 'AnalyticsView', + 'Video360Generic', + 'Leave', + 'Trending12', + 'Blocked12', + 'Warning12', + 'CheckedOutByOther12', + 'CheckedOutByYou12', + 'CircleShapeSolid', + 'SquareShapeSolid', + 'TriangleShapeSolid', + 'DropShapeSolid', + 'RectangleShapeSolid', + 'ZoomToFit', + 'InsertColumnsLeft', + 'InsertColumnsRight', + 'InsertRowsAbove', + 'InsertRowsBelow', + 'DeleteColumns', + 'DeleteRows', + 'DeleteRowsMirrored', + 'DeleteTable', + 'AccountBrowser', + 'VersionControlPush', + 'StackedColumnChart2', + 'TripleColumnWide', + 'QuadColumn', + 'WhiteBoardApp16', + 'WhiteBoardApp32', + 'InsertSignatureLine', + 'ArrangeByFrom', + 'Phishing', + 'CreateMailRule', + 'PublishCourse', + 'DictionaryRemove', + 'UserRemove', + 'UserEvent', + 'Encryption', + 'PasswordField', + 'OpenInNewTab', + 'Hide3', + 'VerifiedBrandSolid', + 'MarkAsProtected', + 'AuthenticatorApp', + 'WebTemplate', + 'DefenderTVM', + 'MedalSolid', + 'D365TalentLearn', + 'D365TalentInsight', + 'D365TalentHRCore', + 'BacklogList', + 'ButtonControl', + 'TableGroup', + 'MountainClimbing', + 'TagUnknown', + 'TagUnknownMirror', + 'TagUnknown12', + 'TagUnknown12Mirror', + 'Link12', + 'Presentation', + 'Presentation12', + 'Lock12', + 'BuildDefinition', + 'ReleaseDefinition', + 'SaveTemplate', + 'UserGauge', + 'BlockedSiteSolid12', + 'TagSolid', + 'OfficeChat', + 'OfficeChatSolid', + 'MailSchedule', + 'WarningSolid', + 'Blocked2Solid', + 'SkypeCircleArrow', + 'SkypeArrow', + 'SyncStatus', + 'SyncStatusSolid', + 'ProjectDocument', + 'ToDoLogoOutline', + 'VisioOnlineLogoFill32', + 'VisioOnlineLogo32', + 'VisioOnlineLogoCloud32', + 'VisioDiagramSync', + 'Event12', + 'EventDateMissed12', + 'UserOptional', + 'ResponsesMenu', + 'DoubleDownArrow', + 'DistributeDown', + 'BookmarkReport', + 'FilterSettings', + 'GripperDotsVertical', + 'MailAttached', + 'AddIn', + 'LinkedDatabase', + 'PromotedDatabase', + 'BarChartVerticalFilter', + 'BarChartVerticalFilterSolid', + 'MicrosoftTranslatorLogo', + 'ShowTimeAs', + 'FileRequest', + 'WorkItemAlert', + 'PowerBILogo16', + 'PowerBILogoBackplate16', + 'BulletedListText', + 'BulletedListBullet', + 'BulletedListTextMirrored', + 'BulletedListBulletMirrored', + 'NumberedListText', + 'NumberedListNumber', + 'NumberedListTextMirrored', + 'NumberedListNumberMirrored', + 'RemoveLinkChain', + 'RemoveLinkX', + 'FabricTextHighlight', + 'ClearFormattingA', + 'ClearFormattingEraser', + 'Photo2Fill', + 'IncreaseIndentText', + 'IncreaseIndentArrow', + 'DecreaseIndentText', + 'DecreaseIndentArrow', + 'IncreaseIndentTextMirrored', + 'IncreaseIndentArrowMirrored', + 'DecreaseIndentTextMirrored', + 'DecreaseIndentArrowMirrored', + 'CheckListText', + 'CheckListCheck', + 'CheckListTextMirrored', + 'CheckListCheckMirrored', + 'NumberSymbol', + 'Coupon', + 'VerifiedBrand', + 'ReleaseGate', + 'ReleaseGateCheck', + 'ReleaseGateError', + 'M365InvoicingLogo', + 'FabricTextHighlightComposite', + 'Dataflows', + 'GenericScanFilled', + 'DiagnosticDataBarTooltip', + 'SaveToMobile', + 'Orientation2', + 'ScreenCast', + 'ShowGrid', + 'SnapToGrid', + 'ContactList', + 'NewMail', + 'EyeShadow', + 'FabricFolderConfirm', + 'InformationBarriers', + 'CommentActive', + 'ColumnVerticalSectionEdit', + 'WavingHand', + 'ShakeDevice', + 'SmartGlassRemote', + 'Rotate90Clockwise', + 'Rotate90CounterClockwise', + 'CampaignTemplate', + 'ChartTemplate', + 'PageListFilter', + 'SecondaryNav', + 'ColumnVerticalSection', + 'SkypeCircleSlash', + 'SkypeSlash', + 'CustomizeToolbar', + 'DuplicateRow', + 'RemoveFromTrash', + 'MailOptions', + 'Childof', + 'Footer', + 'Header', + 'BarChartVerticalFill', + 'StackedColumnChart2Fill', + 'PlainText', + 'AccessibiltyChecker', + 'DatabaseSync', + 'ReservationOrders', + 'TabOneColumn', + 'TabTwoColumn', + 'TabThreeColumn', + 'MicrosoftTranslatorLogoGreen', + 'MicrosoftTranslatorLogoBlue', + 'InternalInvestigation', + 'AppleTVPlay', + 'AppleTVMonitor', + 'AppleTVMicrophone', + 'AppleTVMenu', + 'AddReaction', + 'DecreaseIndentLegacy', + 'IncreaseIndentLegacy', + 'SizeLegacy', + 'FontIncrease', + 'FontSize', + 'CellPhone', + 'RepeatOne', + 'RepeatAll', + 'Calculator', + 'Library', + 'PostUpdate', + 'NewFolder', + 'CalendarReply', + 'UnsyncFolder', + 'SyncFolder', + 'BlockContact', + 'Accept', + 'BulletedList', + 'Preview', + 'News', + 'Chat', + 'Group', + 'World', + 'Comment', + 'DockLeft', + 'DockRight', + 'Repair', + 'Accounts', + 'Street', + 'RadioBullet', + 'Stopwatch', + 'Clock', + 'WorldClock', + 'AlarmClock', + 'Photo', + 'ActionCenter', + 'Hospital', + 'Timer', + 'FullCircleMask', + 'LocationFill', + 'ChromeMinimize', + 'ChromeRestore', + 'Annotation', + 'Fingerprint', + 'Handwriting', + 'ChromeFullScreen', + 'Completed', + 'Label', + 'FlickDown', + 'FlickUp', + 'FlickLeft', + 'FlickRight', + 'MiniExpand', + 'MiniContract', + 'Streaming', + 'MusicInCollection', + 'OneDriveLogo', + 'CompassNW', + 'Code', + 'LightningBolt', + 'CalculatorMultiply', + 'CalculatorAddition', + 'CalculatorSubtract', + 'CalculatorPercentage', + 'CalculatorEqualTo', + 'PrintfaxPrinterFile', + 'StorageOptical', + 'Communications', + 'Headset', + 'Health', + 'FrontCamera', + 'ChevronUpSmall', + 'ChevronDownSmall', + 'ChevronLeftSmall', + 'ChevronRightSmall', + 'ChevronUpMed', + 'ChevronDownMed', + 'ChevronLeftMed', + 'ChevronRightMed', + 'Devices2', + 'PC1', + 'PresenceChickletVideo', + 'Reply', + 'HalfAlpha', + 'ConstructionCone', + 'DoubleChevronLeftMed', + 'Volume0', + 'Volume1', + 'Volume2', + 'Volume3', + 'Chart', + 'Robot', + 'Manufacturing', + 'LockSolid', + 'FitPage', + 'FitWidth', + 'BidiLtr', + 'BidiRtl', + 'RightDoubleQuote', + 'Sunny', + 'CloudWeather', + 'Cloudy', + 'PartlyCloudyDay', + 'PartlyCloudyNight', + 'ClearNight', + 'RainShowersDay', + 'Rain', + 'Thunderstorms', + 'RainSnow', + 'Snow', + 'BlowingSnow', + 'Frigid', + 'Fog', + 'Squalls', + 'Duststorm', + 'Unknown', + 'Precipitation', + 'Ribbon', + 'AreaChart', + 'Assign', + 'FlowChart', + 'CheckList', + 'Diagnostic', + 'Generate', + 'LineChart', + 'Equalizer', + 'BarChartHorizontal', + 'BarChartVertical', + 'Freezing', + 'FunnelChart', + 'Processing', + 'Quantity', + 'ReportDocument', + 'StackColumnChart', + 'SnowShowerDay', + 'HailDay', + 'WorkFlow', + 'HourGlass', + 'StoreLogoMed20', + 'TimeSheet', + 'TriangleSolid', + 'UpgradeAnalysis', + 'VideoSolid', + 'RainShowersNight', + 'SnowShowerNight', + 'Teamwork', + 'HailNight', + 'PeopleAdd', + 'Glasses', + 'DateTime2', + 'Shield', + 'Header1', + 'PageAdd', + 'NumberedList', + 'PowerBILogo', + 'Info2', + 'MusicInCollectionFill', + 'Asterisk', + 'ErrorBadge', + 'CircleFill', + 'Record2', + 'AllAppsMirrored', + 'BookmarksMirrored', + 'BulletedListMirrored', + 'CaretHollowMirrored', + 'CaretSolidMirrored', + 'ChromeBackMirrored', + 'ClosePaneMirrored', + 'DockLeftMirrored', + 'DoubleChevronLeftMedMirrored', + 'GoMirrored', + 'HelpMirrored', + 'ImportMirrored', + 'ImportAllMirrored', + 'ListMirrored', + 'MailForwardMirrored', + 'MailReplyMirrored', + 'MailReplyAllMirrored', + 'MiniContractMirrored', + 'MiniExpandMirrored', + 'OpenPaneMirrored', + 'ParkingLocationMirrored', + 'SendMirrored', + 'ShowResultsMirrored', + 'ThumbnailViewMirrored', + 'Media', + 'Devices3', + 'Focus', + 'VideoLightOff', + 'Lightbulb', + 'StatusTriangle', + 'VolumeDisabled', + 'Puzzle', + 'EmojiNeutral', + 'EmojiDisappointed', + 'HomeSolid', + 'Ringer', + 'PDF', + 'HeartBroken', + 'StoreLogo16', + 'MultiSelectMirrored', + 'Broom', + 'Cocktails', + 'Wines', + 'Articles', + 'Cycling', + 'DietPlanNotebook', + 'Pill', + 'ExerciseTracker', + 'HandsFree', + 'Medical', + 'Running', + 'Weights', + 'Trackers', + 'AddNotes', + 'AllCurrency', + 'BarChart4', + 'CirclePlus', + 'Coffee', + 'Cotton', + 'Market', + 'Money', + 'PieDouble', + 'PieSingle', + 'RemoveFilter', + 'Savings', + 'Sell', + 'StockDown', + 'StockUp', + 'Lamp', + 'Source', + 'MSNVideos', + 'Cricket', + 'Golf', + 'Baseball', + 'Soccer', + 'MoreSports', + 'AutoRacing', + 'CollegeHoops', + 'CollegeFootball', + 'ProFootball', + 'ProHockey', + 'Rugby', + 'SubstitutionsIn', + 'Tennis', + 'Arrivals', + 'Design', + 'Website', + 'Drop', + 'HistoricalWeather', + 'SkiResorts', + 'Snowflake', + 'BusSolid', + 'FerrySolid', + 'AirplaneSolid', + 'TrainSolid', + 'Ticket', + 'WifiWarning4', + 'Devices4', + 'AzureLogo', + 'BingLogo', + 'MSNLogo', + 'OutlookLogoInverse', + 'OfficeLogo', + 'SkypeLogo', + 'Door', + 'EditMirrored', + 'GiftCard', + 'DoubleBookmark', + 'StatusErrorFull', + 'Certificate', + 'FastForward', + 'Rewind', + 'Photo2', + 'OpenSource', + 'Movers', + 'CloudDownload', + 'Family', + 'WindDirection', + 'Bug', + 'SiteScan', + 'BrowserScreenShot', + 'F12DevTools', + 'CSS', + 'JS', + 'DeliveryTruck', + 'ReminderPerson', + 'ReminderGroup', + 'TabletMode', + 'Umbrella', + 'NetworkTower', + 'CityNext', + 'CityNext2', + 'Section', + 'OneNoteLogoInverse', + 'ToggleFilled', + 'ToggleBorder', + 'SliderThumb', + 'ToggleThumb', + 'Documentation', + 'Badge', + 'Giftbox', + 'VisualStudioLogo', + 'HomeGroup', + 'ExcelLogoInverse', + 'WordLogoInverse', + 'PowerPointLogoInverse', + 'Cafe', + 'SpeedHigh', + 'Commitments', + 'ThisPC', + 'MusicNote', + 'MicOff', + 'EdgeLogo', + 'CompletedSolid', + 'AlbumRemove', + 'MessageFill', + 'TabletSelected', + 'MobileSelected', + 'LaptopSelected', + 'TVMonitorSelected', + 'DeveloperTools', + 'Shapes', + 'InsertTextBox', + 'LowerBrightness', + 'WebComponents', + 'OfflineStorage', + 'DOM', + 'CloudUpload', + 'ScrollUpDown', + 'DateTime', + 'Event', + 'Cake', + 'Org', + 'PartyLeader', + 'DRM', + 'CloudAdd', + 'AppIconDefault', + 'Photo2Add', + 'Photo2Remove', + 'POI', + 'AddTo', + 'RadioBtnOff', + 'RadioBtnOn', + 'ExploreContent', + 'Product', + 'ProgressLoopInner', + 'ProgressLoopOuter', + 'Blocked2', + 'FangBody', + 'PageHeader', + 'ChatInviteFriend', + 'Brush', + 'Shirt', + 'Crown', + 'Diamond', + 'ScaleUp', + 'QRCode', + 'Feedback', + 'SharepointLogoInverse', + 'YammerLogo', + 'Hide', + 'Uneditable', + 'ReturnToSession', + 'OpenFolderHorizontal', + 'CalendarMirrored', + 'SwayLogoInverse', + 'OutOfOffice', + 'Trophy', + 'ReopenPages', + 'EmojiTabSymbols', + 'AADLogo', + 'AccessLogo', + 'AdminALogoInverse32', + 'AdminCLogoInverse32', + 'AdminDLogoInverse32', + 'AdminELogoInverse32', + 'AdminLLogoInverse32', + 'AdminMLogoInverse32', + 'AdminOLogoInverse32', + 'AdminPLogoInverse32', + 'AdminSLogoInverse32', + 'AdminYLogoInverse32', + 'DelveLogoInverse', + 'ExchangeLogoInverse', + 'LyncLogo', + 'OfficeVideoLogoInverse', + 'SocialListeningLogo', + 'VisioLogoInverse', + 'Balloons', + 'Cat', + 'MailAlert', + 'MailCheck', + 'MailLowImportance', + 'MailPause', + 'MailRepeat', + 'SecurityGroup', + 'Table', + 'VoicemailForward', + 'VoicemailReply', + 'Waffle', + 'RemoveEvent', + 'EventInfo', + 'ForwardEvent', + 'WipePhone', + 'AddOnlineMeeting', + 'JoinOnlineMeeting', + 'RemoveLink', + 'PeopleBlock', + 'PeopleRepeat', + 'PeopleAlert', + 'PeoplePause', + 'TransferCall', + 'AddPhone', + 'UnknownCall', + 'NoteReply', + 'NoteForward', + 'NotePinned', + 'RemoveOccurrence', + 'Timeline', + 'EditNote', + 'CircleHalfFull', + 'Room', + 'Unsubscribe', + 'Subscribe', + 'HardDrive', + 'RecurringTask', + 'TaskManager', + 'TaskManagerMirrored', + 'Combine', + 'Split', + 'DoubleChevronUp', + 'DoubleChevronLeft', + 'DoubleChevronRight', + 'TextBox', + 'TextField', + 'NumberField', + 'Dropdown', + 'PenWorkspace', + 'BookingsLogo', + 'ClassNotebookLogoInverse', + 'DelveAnalyticsLogo', + 'DocsLogoInverse', + 'Dynamics365Logo', + 'DynamicSMBLogo', + 'OfficeAssistantLogo', + 'OfficeStoreLogo', + 'OneNoteEduLogoInverse', + 'PlannerLogo', + 'PowerApps', + 'Suitcase', + 'ProjectLogoInverse', + 'CaretLeft8', + 'CaretRight8', + 'CaretUp8', + 'CaretDown8', + 'CaretLeftSolid8', + 'CaretRightSolid8', + 'CaretUpSolid8', + 'CaretDownSolid8', + 'ClearFormatting', + 'Superscript', + 'Subscript', + 'Strikethrough', + 'Export', + 'ExportMirrored', + 'SingleBookmark', + 'SingleBookmarkSolid', + 'DoubleChevronDown', + 'FollowUser', + 'ReplyAll', + 'WorkforceManagement', + 'RecruitmentManagement', + 'Questionnaire', + 'ManagerSelfService', + 'ProductRelease', + 'ReplyMirrored', + 'ReplyAllMirrored', + 'Medal', + 'AddGroup', + 'QuestionnaireMirrored', + 'TemporaryUser', + 'CaretSolid16', + 'GroupedDescending', + 'GroupedAscending', + 'AwayStatus', + 'MyMoviesTV', + 'GenericScan', + 'AustralianRules', + 'WifiEthernet', + 'TrackersMirrored', + 'DateTimeMirrored', + 'StopSolid', + 'DoubleChevronUp12', + 'DoubleChevronDown12', + 'DoubleChevronLeft12', + 'DoubleChevronRight12', + 'CalendarAgenda', + 'AddEvent', + 'AssetLibrary', + 'DataConnectionLibrary', + 'DocLibrary', + 'FormLibrary', + 'FormLibraryMirrored', + 'ReportLibrary', + 'ReportLibraryMirrored', + 'ContactCard', + 'CustomList', + 'CustomListMirrored', + 'IssueTracking', + 'IssueTrackingMirrored', + 'PictureLibrary', + 'OfficeAddinsLogo', + 'OfflineOneDriveParachute', + 'OfflineOneDriveParachuteDisabled', + 'TriangleSolidUp12', + 'TriangleSolidDown12', + 'TriangleSolidLeft12', + 'TriangleSolidRight12', + 'TriangleUp12', + 'TriangleDown12', + 'TriangleLeft12', + 'TriangleRight12', + 'ArrowUpRight8', + 'ArrowDownRight8', + 'DocumentSet', + 'DelveAnalytics', + 'ArrowUpRightMirrored8', + 'ArrowDownRightMirrored8', + 'CompanyDirectory', + 'OpenEnrollment', + 'CompanyDirectoryMirrored', + 'OneDriveAdd', + 'ProfileSearch', + 'Header2', + 'Header3', + 'Header4', + 'RingerSolid', + 'Eyedropper', + 'MarketDown', + 'CalendarWorkWeek', + 'SidePanel', + 'GlobeFavorite', + 'CaretTopLeftSolid8', + 'CaretTopRightSolid8', + 'ViewAll2', + 'DocumentReply', + 'PlayerSettings', + 'ReceiptForward', + 'ReceiptReply', + 'ReceiptCheck', + 'Fax', + 'RecurringEvent', + 'ReplyAlt', + 'ReplyAllAlt', + 'EditStyle', + 'EditMail', + 'Lifesaver', + 'LifesaverLock', + 'InboxCheck', + 'FolderSearch', + 'CollapseMenu', + 'ExpandMenu', + 'Boards', + 'SunAdd', + 'SunQuestionMark', + 'LandscapeOrientation', + 'DocumentSearch', + 'PublicCalendar', + 'PublicContactCard', + 'PublicEmail', + 'PublicFolder', + 'WordDocument', + 'PowerPointDocument', + 'ExcelDocument', + 'GroupedList', + 'ClassroomLogo', + 'Sections', + 'EditPhoto', + 'Starburst', + 'ShareiOS', + 'AirTickets', + 'PencilReply', + 'Tiles2', + 'SkypeCircleCheck', + 'SkypeCircleClock', + 'SkypeCircleMinus', + 'SkypeMessage', + 'ClosedCaption', + 'ATPLogo', + 'OfficeFormsLogoInverse', + 'RecycleBin', + 'EmptyRecycleBin', + 'Hide2', + 'Breadcrumb', + 'BirthdayCake', + 'TimeEntry', + 'CRMProcesses', + 'PageEdit', + 'PageArrowRight', + 'PageRemove', + 'Database', + 'DataManagementSettings', + 'CRMServices', + 'EditContact', + 'ConnectContacts', + 'AppIconDefaultAdd', + 'AppIconDefaultList', + 'ActivateOrders', + 'DeactivateOrders', + 'DocumentManagement', + 'CRMReport', + 'KnowledgeArticle', + 'Relationship', + 'HomeVerify', + 'ZipFolder', + 'SurveyQuestions', + 'TextDocument', + 'TextDocumentShared', + 'PageCheckedOut', + 'SaveAndClose', + 'Script', + 'Archive', + 'ActivityFeed', + 'Compare', + 'EventDate', + 'ArrowUpRight', + 'CaretRight', + 'SetAction', + 'CaretSolidLeft', + 'CaretSolidDown', + 'CaretSolidRight', + 'CaretSolidUp', + 'PowerAppsLogo', + 'PowerApps2Logo', + 'SearchIssue', + 'SearchIssueMirrored', + 'FabricAssetLibrary', + 'FabricDataConnectionLibrary', + 'FabricDocLibrary', + 'FabricFormLibrary', + 'FabricFormLibraryMirrored', + 'FabricReportLibrary', + 'FabricReportLibraryMirrored', + 'FabricPublicFolder', + 'FabricFolderSearch', + 'FabricMovetoFolder', + 'FabricUnsyncFolder', + 'FabricSyncFolder', + 'FabricOpenFolderHorizontal', + 'FabricFolder', + 'FabricFolderFill', + 'FabricNewFolder', + 'FabricPictureLibrary', + 'AddFavorite', + 'AddFavoriteFill', + 'BufferTimeBefore', + 'BufferTimeAfter', + 'BufferTimeBoth', + 'PublishContent', + 'ClipboardList', + 'ClipboardListMirrored', + 'CannedChat', + 'SkypeForBusinessLogo', + 'TabCenter', + 'PageCheckedin', + 'PageList', + 'ReadOutLoud', + 'CaretBottomLeftSolid8', + 'CaretBottomRightSolid8', + 'FolderHorizontal', + 'MicrosoftStaffhubLogo', + 'GiftboxOpen', + 'StatusCircleOuter', + 'StatusCircleInner', + 'StatusCircleRing', + 'StatusTriangleOuter', + 'StatusTriangleInner', + 'StatusTriangleExclamation', + 'StatusCircleExclamation', + 'StatusCircleErrorX', + 'StatusCircleInfo', + 'StatusCircleBlock', + 'StatusCircleBlock2', + 'StatusCircleQuestionMark', + 'StatusCircleSync', + 'Toll', + 'ExploreContentSingle', + 'CollapseContent', + 'CollapseContentSingle', + 'InfoSolid', + 'ProgressRingDots', + 'CaloriesAdd', + 'BranchFork', + 'AddHome', + 'MobileReport', + 'ScaleVolume', + 'HardDriveGroup', + 'FastMode', + 'ToggleLeft', + 'ToggleRight', + 'TriangleShape', + 'RectangleShape', + 'Trophy2', + 'BucketColor', + 'BucketColorFill', + 'Taskboard', + 'SingleColumn', + 'DoubleColumn', + 'TripleColumn', + 'ColumnLeftTwoThirds', + 'ColumnRightTwoThirds', + 'AccessLogoFill', + 'AnalyticsLogo', + 'AnalyticsQuery', + 'NewAnalyticsQuery', + 'AnalyticsReport', + 'WordLogo', + 'WordLogoFill', + 'ExcelLogo', + 'ExcelLogoFill', + 'OneNoteLogo', + 'OneNoteLogoFill', + 'OutlookLogo', + 'OutlookLogoFill', + 'PowerPointLogo', + 'PowerPointLogoFill', + 'PublisherLogo', + 'PublisherLogoFill', + 'ScheduleEventAction', + 'FlameSolid', + 'ServerProcesses', + 'Server', + 'SaveAll', + 'LinkedInLogo', + 'Decimals', + 'SidePanelMirrored', + 'ProtectRestrict', + 'Blog', + 'UnknownMirrored', + 'PublicContactCardMirrored', + 'GridViewSmall', + 'GridViewMedium', + 'GridViewLarge', + 'Step', + 'StepInsert', + 'StepShared', + 'StepSharedAdd', + 'StepSharedInsert', + 'ViewDashboard', + 'ViewList', + 'ViewListGroup', + 'ViewListTree', + 'TriggerAuto', + 'TriggerUser', + 'PivotChart', + 'StackedBarChart', + 'StackedLineChart', + 'BuildQueue', + 'BuildQueueNew', + 'UserFollowed', + 'ContactLink', + 'Stack', + 'Bullseye', + 'VennDiagram', + 'FiveTileGrid', + 'FocalPoint', + 'RingerRemove', + 'TeamsLogoInverse', + 'TeamsLogo', + 'TeamsLogoFill', + 'SkypeForBusinessLogoFill', + 'SharepointLogo', + 'SharepointLogoFill', + 'DelveLogo', + 'DelveLogoFill', + 'OfficeVideoLogo', + 'OfficeVideoLogoFill', + 'ExchangeLogo', + 'ExchangeLogoFill', + 'Signin', + 'DocumentApproval', + 'CloneToDesktop', + 'InstallToDrive', + 'Blur', + 'Build', + 'ProcessMetaTask', + 'BranchFork2', + 'BranchLocked', + 'BranchCommit', + 'BranchCompare', + 'BranchMerge', + 'BranchPullRequest', + 'BranchSearch', + 'BranchShelveset', + 'RawSource', + 'MergeDuplicate', + 'RowsGroup', + 'RowsChild', + 'Deploy', + 'Redeploy', + 'ServerEnviroment', + 'VisioDiagram', + 'GlobalNavButton', + 'ChevronDown', + 'ChevronUp', + 'Edit', + 'Add', + 'Cancel', + 'More', + 'Settings', + 'Mail', + 'Filter', + 'Search', + 'Share', + 'BlockedSite', + 'FavoriteStar', + 'FavoriteStarFill', + 'CheckMark', + 'Delete', + 'ChevronLeft', + 'ChevronRight', + 'Calendar', + 'Megaphone', + 'Undo', + 'Flag', + 'Page', + 'Pinned', + 'View', + 'Clear', + 'Download', + 'Upload', + 'Folder', + 'Sort', + 'AlignRight', + 'AlignLeft', + 'Tag', + 'AddFriend', + 'Info', + 'SortLines', + 'List', + 'CircleRing', + 'Heart', + 'HeartFill', + 'Tiles', + 'Embed', + 'Glimmer', + 'Ascending', + 'Descending', + 'SortUp', + 'SortDown', + 'SyncToPC', + 'LargeGrid', + 'SkypeCheck', + 'SkypeClock', + 'SkypeMinus', + 'ClearFilter', + 'Flow', + 'StatusCircleCheckmark', + 'MoreVertical' + ]; +} \ No newline at end of file diff --git a/src/controls/iconPicker/IconPicker.module.scss b/src/controls/iconPicker/IconPicker.module.scss new file mode 100644 index 000000000..569b1ac04 --- /dev/null +++ b/src/controls/iconPicker/IconPicker.module.scss @@ -0,0 +1,138 @@ +@import '~office-ui-fabric-react/dist/sass/References.scss'; + +.navArea { + display: flex; + width: 100%; + padding-left: 11px; +} +.headTitle { + display: inline-block; + flex-grow: 1; + flex-shrink: 2; + font-size: 28px; + font-weight: 300; + margin: auto 8px 5px 0; + white-space: nowrap; +} +.searchBox { + flex-grow: 5; + flex-shrink: 1; + margin: 5px 0; +} +.closeBtnContainer { + flex: 0 0 54px; + display: flex; + justify-content: flex-end; +} + +.iconList { + list-style-type: none; + display: flex; + flex-wrap: wrap; + padding: 0; + margin: 10px -5px; +} +.iconItem { + display: inline-block; + padding: 0; + margin: 0 2px 4px; + list-style-type: none; + position: relative; + overflow: hidden; +} +.iconRadio { + position: absolute; + left: -1000px; + opacity: 0; +} +.iconLabel { + display: flex; + flex-direction: column; + align-items: center; + justify-content: space-evenly; + width: 78px; + padding: 5px; + height: 70px; + border-radius: 3px; + background-color: "[theme:neutralLighterAlt, default:#f8f8f8]"; + + &:after { + content: ""; + display: block; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + border: 2px solid transparent; + border-color: "[theme:neutralQuarternary, default:#d0d0d0]"; + border-radius: 3px; + opacity: 0; + will-change: opacity, border-color; + transition: opacity ease-out .05s; + } + &:hover { + &:after { + opacity: 1; + } + } +} +.iconRadio:checked + .iconLabel { + &:after { + opacity: 1; + border-color: "[theme: themePrimary, default: #0078d7]"; + } + color: "[theme: themePrimary, default: #0078d7]"; +} +.iconRadio:focus + .iconLabel { + outline: 1px dashed; + outline-color: "[theme: themePrimary, default: #0078d7]"; + outline-offset: -5px; +} +.iconGlyph { + font-size: 24px; + width: 24px; + height: 24px; + margin-bottom: 5px; + color: inherit; +} +.iconName { + display: inline-block; + max-width: 100%; + text-align: left; + font-size: 12px; +} + +.footer { + display: flex; + width: 100%; +} +.selectionDisplay { + order: 2; + display: flex; + flex: 1 0 32px; + margin: 0 auto; + align-items: center; + justify-content: center; + &:global { + &.noSelection { + opacity: .3; + } + } +} +.selectionLabel { + display: inline-block; +} +.selectionIcon { + display: flex; + align-items: center; + justify-content: center; + font-size: 24px; + min-width: 32px; +} +.btnCancel { + order: 1; +} +.btnSave { + order: 3; +} \ No newline at end of file diff --git a/src/controls/iconPicker/IconPicker.tsx b/src/controls/iconPicker/IconPicker.tsx new file mode 100644 index 000000000..409ce8c13 --- /dev/null +++ b/src/controls/iconPicker/IconPicker.tsx @@ -0,0 +1,146 @@ +import * as React from 'react'; +import { IIconPickerProps } from '.'; +import { PrimaryButton, DefaultButton } from 'office-ui-fabric-react/lib/Button'; +import { Icon } from 'office-ui-fabric-react/lib/Icon'; +import { SearchBox } from 'office-ui-fabric-react/lib/SearchBox'; +import { IRenderFunction, getId } from 'office-ui-fabric-react/lib/Utilities'; +import styles from './IconPicker.module.scss'; +import * as strings from 'ControlStrings'; +import { IconNames } from './IconNames'; +import { Panel, PanelType, IPanelProps } from 'office-ui-fabric-react/lib/Panel'; +import { debounce } from 'lodash'; +import { IIconPickerState } from './IIconPickerState'; +import * as telemetry from '../../common/telemetry'; + +export class IconPicker extends React.Component { + private radioIdBase: string = getId("radio"); + + constructor(props: IIconPickerProps) { + super(props); + + telemetry.track('IconPicker'); + + this.state = { + items: IconNames.Icons, + isPanelOpen: false, + currentIcon: this.props.currentIcon || null + }; + } + + public render(): React.ReactElement { + return
+ + + {this.renderPanelContent()} + +
; + } + + private closePanel = (): void => { + this.setState({ + currentIcon: null, + isPanelOpen: false + }); + } + + private iconPickerOnClick = (): void => { + this.setState({ + isPanelOpen: true + }); + } + + private iconOnClick = (iconName: string): void => { + if (this.props.onChange) this.props.onChange(iconName); + this.setState({ + currentIcon: iconName, + }); + } + + private onAbort = (): void => { + this.setState({ items: IconNames.Icons }); + } + + private onChange = (_event?: React.ChangeEvent, newValue?: string): void => { + let items: string[]; + if (newValue.length > 2) { + items = IconNames.Icons.filter(item => { + return item.toLocaleLowerCase().indexOf(newValue.toLocaleLowerCase()) !== -1; + }); + } else { + items = IconNames.Icons; + } + this.setState({ + items: items + }); + } + + private confirmSelection = (): void => { + if (this.props.onSave) this.props.onSave(this.state.currentIcon); + this.setState({ + isPanelOpen: false, + }); + } + + private renderPanelNav: IRenderFunction = (props: IPanelProps, defaultRender: IRenderFunction) => { + return
+

{strings.SelectIcon}

+ +
{defaultRender!(props)}
+
; + } + + private renderPanelContent = () => { + return
+ {this.renderIcons()} +
; + } + + private renderPanelFooter: IRenderFunction = () => { + return
+ +
+ {strings.SelectedLabel}: + +
+ +
; + } + + private renderIcons = (): React.ReactElement => { + return (
    + {this.state.items.map(this.renderIcon)} +
); + } + + private renderIcon = (item: string): JSX.Element => { + const radioId: string = `${this.radioIdBase}-${item}`; + return
  • + this.iconOnClick(item)} /> + +
  • ; + } +} diff --git a/src/controls/iconPicker/index.ts b/src/controls/iconPicker/index.ts new file mode 100644 index 000000000..7bfd51b39 --- /dev/null +++ b/src/controls/iconPicker/index.ts @@ -0,0 +1,2 @@ +export * from './IIconPickerProps'; +export * from './IconPicker'; \ No newline at end of file diff --git a/src/controls/listItemPicker/ComboBoxListItemPicker.test.tsx b/src/controls/listItemPicker/ComboBoxListItemPicker.test.tsx new file mode 100644 index 000000000..e41c4e1c6 --- /dev/null +++ b/src/controls/listItemPicker/ComboBoxListItemPicker.test.tsx @@ -0,0 +1,177 @@ +/// + +import * as React from 'react'; +import { assert, expect } from 'chai'; +import { mount, ReactWrapper } from 'enzyme'; +import { ComboBoxListItemPicker } from './ComboBoxListItemPicker'; +import { RequestClientMock } from '../../common/mocks/RequestClientMock'; + +declare const sinon; + +let mockHttpClient: RequestClientMock = new RequestClientMock(null); +mockHttpClient.Requests.push({ + url: "/sites/test-site/_api/web/lists('TestId')/items?$select=Id,Title&$filter=Id gt 0", + method: "GET", + resultString: JSON.stringify({ "odata.metadata": "", "value": [{ "odata.type": "SP.Data.Test_x0020_listListItem", "odata.id": "9624204a-c049-49a1-8a18-a417872f8883", "odata.etag": "\"2\"", "odata.editLink": "Web/Lists(guid'490fae3c-f8cb-4b50-9737-f2c94f6b6727')/Items(1)", "Id": 1, "ID": 1, "Title": "Test 1" }, { "odata.type": "SP.Data.Test_x0020_listListItem", "odata.id": "8b0e4ce8-f1e4-4b17-8f95-1ea7d63fefd6", "odata.etag": "\"1\"", "odata.editLink": "Web/Lists(guid'490fae3c-f8cb-4b50-9737-f2c94f6b6727')/Items(2)", "Id": 2, "ID": 2, "Title": "Test 2" }, { "odata.type": "SP.Data.Test_x0020_listListItem", "odata.id": "62aea125-e442-44cf-ab08-c555ffdd2798", "odata.etag": "\"1\"", "odata.editLink": "Web/Lists(guid'490fae3c-f8cb-4b50-9737-f2c94f6b6727')/Items(3)", "Id": 3, "ID": 3, "Title": "Test 3" }, { "odata.type": "SP.Data.Test_x0020_listListItem", "odata.id": "a25c55b2-9a4f-4976-8a12-f77393abe437", "odata.etag": "\"1\"", "odata.editLink": "Web/Lists(guid'490fae3c-f8cb-4b50-9737-f2c94f6b6727')/Items(4)", "Id": 4, "ID": 4, "Title": "Test 4" }, { "odata.type": "SP.Data.Test_x0020_listListItem", "odata.id": "8c57be67-a9a8-46c8-8954-6e51d3464be2", "odata.etag": "\"1\"", "odata.editLink": "Web/Lists(guid'490fae3c-f8cb-4b50-9737-f2c94f6b6727')/Items(5)", "Id": 5, "ID": 5, "Title": "Test 5" }, { "odata.type": "SP.Data.Test_x0020_listListItem", "odata.id": "d130664b-4e28-4ae5-b567-a3189f887922", "odata.etag": "\"1\"", "odata.editLink": "Web/Lists(guid'490fae3c-f8cb-4b50-9737-f2c94f6b6727')/Items(6)", "Id": 6, "ID": 6, "Title": "Test 6" }, { "odata.type": "SP.Data.Test_x0020_listListItem", "odata.id": "6e333b93-3f19-40ee-943c-19817193a3de", "odata.etag": "\"1\"", "odata.editLink": "Web/Lists(guid'490fae3c-f8cb-4b50-9737-f2c94f6b6727')/Items(7)", "Id": 7, "ID": 7, "Title": "Test 7" }, { "odata.type": "SP.Data.Test_x0020_listListItem", "odata.id": "a0063d1f-66ab-461b-8032-7dd38d7b8749", "odata.etag": "\"1\"", "odata.editLink": "Web/Lists(guid'490fae3c-f8cb-4b50-9737-f2c94f6b6727')/Items(8)", "Id": 8, "ID": 8, "Title": "Test 8" }, { "odata.type": "SP.Data.Test_x0020_listListItem", "odata.id": "8aca4c7c-4922-45e9-9f03-7d4a4bb6f926", "odata.etag": "\"1\"", "odata.editLink": "Web/Lists(guid'490fae3c-f8cb-4b50-9737-f2c94f6b6727')/Items(9)", "Id": 9, "ID": 9, "Title": "Test 9" }, { "odata.type": "SP.Data.Test_x0020_listListItem", "odata.id": "f352a0c8-711b-47e4-9990-2a7121f961c3", "odata.etag": "\"1\"", "odata.editLink": "Web/Lists(guid'490fae3c-f8cb-4b50-9737-f2c94f6b6727')/Items(10)", "Id": 10, "ID": 10, "Title": "Test 10" }] }) +}); +describe('', () => { + it("Should render initial data", () => { + return new Promise((resolve, error) => { + let comboBox = mount( { + + expect(comboBox.state('availableOptions')).to.have.length(10); + resolve(); + }} + onSelectedItem={(item) => { }} />); + }); + }); + it("Should call onSelectedItem", () => { + return new Promise((resolve, error) => { + let comboBox = mount( { + + let ddBtn = comboBox.find('.ms-Button-flexContainer').first(); + ddBtn.simulate('click'); + //actual list is not part of the component + let checkBoxBtn = document.querySelectorAll('.ms-ComboBox-option')[3]; + (checkBoxBtn as HTMLButtonElement).click(); + + //ddBtn.simulate('click'); + }} + onSelectedItem={(item) => { + expect(item.Id).to.equal(4); + + resolve(); + }} />); + }); + }); + it("Should initialize with default selection (id)", () => { + return new Promise((resolve, error) => { + let comboBox = mount( { + let ddInput = comboBox.find('.ms-ComboBox-Input').first(); + expect((ddInput.getNode() as any).value).to.be.equal("Test 1"); + + resolve(); + }} + onSelectedItem={(item) => { + }} />); + }); + }); + it("Should initialize with default selection (object)", () => { + return new Promise((resolve, error) => { + let comboBox = mount( { + + let ddInput = comboBox.find('.ms-ComboBox-Input').first(); + expect((ddInput.getNode() as any).value).to.be.equal("Test 1"); + + resolve(); + }} + onSelectedItem={(item) => { + }} />); + }); + }); + it("Should call onSelectedItem (multi)", () => { + return new Promise((resolve, error) => { + let comboBox = mount( { + + let ddBtn = comboBox.find('.ms-Button-flexContainer').first(); + ddBtn.simulate('click'); + //actual list is not part of the component + let checkBoxBtn = document.querySelectorAll('.ms-ComboBox-option')[3]; + (checkBoxBtn as HTMLButtonElement).click(); + //ddBtn.simulate('click'); + }} + onSelectedItem={(item) => { + expect(item.Id).to.equal(4); + expect(item.selected).to.be.equal(true); + + let ddBtn = comboBox.find('.ms-Button-flexContainer').first(); + ddBtn.simulate('click'); + resolve(); + }} />); + }); + }); + it("Should initialize with default selection (multi) (object)", () => { + return new Promise((resolve, error) => { + let comboBox = mount( { + + let ddBtn = comboBox.find('.ms-Button-flexContainer').first(); + ddBtn.simulate('click'); + let checkBoxBtn = document.querySelectorAll('.ms-ComboBox-option')[0]; + expect(checkBoxBtn.classList.contains("is-checked")).to.be.equal(true); + let ddInput = comboBox.find('.ms-ComboBox-Input').first(); + expect((ddInput.getNode() as any).value).to.be.equal("Test 1, Test 2"); + ddBtn.simulate('click'); + resolve(); + }} + onSelectedItem={(item) => { + }} />); + }); + }); + it("Should initialize with default selection (multi) (id)", () => { + return new Promise((resolve, error) => { + let comboBox = mount( { + + let ddBtn = comboBox.find('.ms-Button-flexContainer').first(); + ddBtn.simulate('click'); + let checkBoxBtn = document.querySelectorAll('.ms-ComboBox-option')[0]; + expect(checkBoxBtn.classList.contains("is-checked")).to.be.equal(true); + + let ddInput = comboBox.find('.ms-ComboBox-Input').first(); + expect((ddInput.getNode() as any).value).to.be.equal("Test 1, Test 2"); + ddBtn.simulate('click'); + resolve(); + }} + onSelectedItem={(item) => { + }} />); + }); + }); +}); diff --git a/src/controls/listItemPicker/ComboBoxListItemPicker.tsx b/src/controls/listItemPicker/ComboBoxListItemPicker.tsx new file mode 100644 index 000000000..8b16a448c --- /dev/null +++ b/src/controls/listItemPicker/ComboBoxListItemPicker.tsx @@ -0,0 +1,122 @@ +import * as strings from 'ControlStrings'; +import * as React from "react"; +import { Label } from "office-ui-fabric-react/lib/Label"; +import { IComboBoxListItemPickerProps, IComboBoxListItemPickerState } from "."; +import * as telemetry from '../../common/telemetry'; +import { ComboBox, IComboBoxOption } from "office-ui-fabric-react/lib/ComboBox"; +import { ListItemRepository } from '../../common/dal/ListItemRepository'; + + +export class ComboBoxListItemPicker extends React.Component { + private _listItemRepo: ListItemRepository; + public selectedItems: any[]; + + constructor(props: IComboBoxListItemPickerProps) { + super(props); + + telemetry.track('ComboBoxListItemPicker', {}); + + // States + this.state = { + noresultsFoundText: !this.props.noResultsFoundText ? strings.genericNoResultsFoundText : this.props.noResultsFoundText, + showError: false, + errorMessage: "", + suggestionsHeaderText: !this.props.suggestionsHeaderText ? strings.ListItemPickerSelectValue : this.props.suggestionsHeaderText + }; + + // Get SPService Factory + this._listItemRepo = new ListItemRepository(this.props.webUrl, this.props.spHttpClient); + + this.selectedItems = []; + } + + public componentDidMount(): void { + this.loadOptions(); + } + + protected async loadOptions(): Promise { + let query = ""; + query += this.props.filter || "Id gt 0"; + let keyColumnName = this.props.keyColumnInternalName || "Id"; + let listItems = await this._listItemRepo.getListItemsByFilterClause(query, + this.props.listId, + this.props.columnInternalName, + this.props.keyColumnInternalName, + this.props.webUrl, + /*this.props.itemLimit ||*/ 100); + + let options = listItems.map(option => { + return { + key: option[keyColumnName], + text: option[this.props.columnInternalName || "Id"] + }; + }); + if (this.props.defaultSelectedItems) { + //if passed only ids + if (!isNaN(this.props.defaultSelectedItems[0])) { + this.selectedItems = options.filter(opt => this.props.defaultSelectedItems.indexOf(opt.key) >= 0); + } + else { + this.selectedItems = options.filter(opt => this.props.defaultSelectedItems.map(selected => selected[keyColumnName]).indexOf(opt.key) >= 0); + } + } + this.setState({ + availableOptions: options + }); + if(this.props.onInitialized){ + this.props.onInitialized(); + } + } + + public componentDidUpdate(prevProps: IComboBoxListItemPickerProps, prevState: IComboBoxListItemPickerState): void { + if (this.props.listId !== prevProps.listId) { + this.selectedItems = []; + } + } + + /** + * Render the field + */ + public render(): React.ReactElement { + const { className, disabled } = this.props; + + return (this.state.availableOptions ? ( +
    + item.key) || []} + className={className} + disabled={disabled} /> + + +
    ) : Loading... + ); + } + + /** + * On Selected Item + */ + private onChanged = (option?: IComboBoxOption, index?: number, value?: string, submitPendingValueEvent?: any): void => { + if (option && option.selected) { + this.selectedItems.push({ + [this.props.keyColumnInternalName || "Id"]: option.key, + [this.props.columnInternalName]: option.text, + selected: option.selected + }); + } else { + this.selectedItems = this.selectedItems.filter(o => o[this.props.keyColumnInternalName || "Id"] !== option.key); + } + this.props.onSelectedItem(this.selectedItems.map(item => ({ + [this.props.keyColumnInternalName || "Id"]: item.key, + [this.props.columnInternalName]: item.text + }))); + } +} diff --git a/src/controls/listItemPicker/IComboBoxListItemPickerProps.ts b/src/controls/listItemPicker/IComboBoxListItemPickerProps.ts new file mode 100644 index 000000000..41a90dead --- /dev/null +++ b/src/controls/listItemPicker/IComboBoxListItemPickerProps.ts @@ -0,0 +1,32 @@ +import { IComboBoxOptionStyles } from "office-ui-fabric-react/lib/components/ComboBox"; +import { IAutofillProps } from "office-ui-fabric-react/lib/components/Autofill"; +import { IKeytipProps } from "office-ui-fabric-react/lib/components/Keytip"; +import { SPHttpClient } from '@microsoft/sp-http'; + +export interface IComboBoxListItemPickerProps { + ///onItemClick?:(event: React.FormEvent, option?: IComboBoxOption, index?: number) => void + autoComplete?: "on" | "off"; + autofill?: IAutofillProps; + comboBoxOptionStyles?: Partial; + allowFreeform?: boolean; + keytipProps?: IKeytipProps; + multiSelect?: boolean; + onMenuDismiss?: () => void; + onMenuOpen?: () => void; + text?: string; + columnInternalName: string; + keyColumnInternalName?: string; + webUrl: string; + spHttpClient: SPHttpClient; + listId: string; + // itemLimit: number; + filter?: string; + className?: string; + defaultSelectedItems?: any[]; + disabled?: boolean; + suggestionsHeaderText?: string; + noResultsFoundText?: string; + onInitialized?: () => void; + + onSelectedItem: (item: any) => void; +} diff --git a/src/controls/listItemPicker/IComboBoxListItemPickerState.ts b/src/controls/listItemPicker/IComboBoxListItemPickerState.ts new file mode 100644 index 000000000..e676e0f33 --- /dev/null +++ b/src/controls/listItemPicker/IComboBoxListItemPickerState.ts @@ -0,0 +1,6 @@ +import { IListItemPickerState } from "./IListItemPickerState"; +import { IComboBoxOption } from "office-ui-fabric-react/lib/ComboBox"; + +export interface IComboBoxListItemPickerState extends IListItemPickerState{ + availableOptions?: IComboBoxOption[]; +} \ No newline at end of file diff --git a/src/controls/listItemPicker/IListItemPickerProps.ts b/src/controls/listItemPicker/IListItemPickerProps.ts index 23b0ac188..5ebdcdda2 100644 --- a/src/controls/listItemPicker/IListItemPickerProps.ts +++ b/src/controls/listItemPicker/IListItemPickerProps.ts @@ -14,6 +14,10 @@ export interface IListItemPickerProps { disabled?: boolean; suggestionsHeaderText?:string; noResultsFoundText?:string; + /** + * Placeholder to be displayed in an empty term picker + */ + placeholder?: string; onSelectedItem: (item:any) => void; } diff --git a/src/controls/listItemPicker/ListItemPicker.tsx b/src/controls/listItemPicker/ListItemPicker.tsx index 18fdfef32..5f80159cf 100644 --- a/src/controls/listItemPicker/ListItemPicker.tsx +++ b/src/controls/listItemPicker/ListItemPicker.tsx @@ -41,7 +41,7 @@ export class ListItemPicker extends React.Component { - const { className, disabled, itemLimit } = this.props; + const { className, disabled, itemLimit, placeholder } = this.props; return (
    @@ -56,7 +56,10 @@ export class ListItemPicker extends React.Component + disabled={disabled} + inputProps={{ + placeholder: placeholder + }} />
    diff --git a/src/controls/listItemPicker/index.ts b/src/controls/listItemPicker/index.ts index 1f118bfde..ea99fc95c 100644 --- a/src/controls/listItemPicker/index.ts +++ b/src/controls/listItemPicker/index.ts @@ -1,4 +1,7 @@ // A file is required to be in the root of the /src directory by the TypeScript compiler export * from './IListItemPickerProps'; +export * from './IComboBoxListItemPickerProps'; export * from './IListItemPickerState'; +export * from './IComboBoxListItemPickerState'; export * from './ListItemPicker'; +export * from './ComboBoxListItemPicker'; diff --git a/src/controls/listPicker/IListPicker.ts b/src/controls/listPicker/IListPicker.ts index 93120eb0d..5b8ada24a 100644 --- a/src/controls/listPicker/IListPicker.ts +++ b/src/controls/listPicker/IListPicker.ts @@ -49,6 +49,10 @@ export interface IListPickerProps { * Input placeholder text. Displayed until option is selected. */ placeHolder?: string; + /** + * Input placeholder text. Displayed until option is selected. + */ + placeholder?: string; /** * Callback issues when the selected option changes */ diff --git a/src/controls/listPicker/ListPicker.tsx b/src/controls/listPicker/ListPicker.tsx index dabfb7eab..3097c522b 100644 --- a/src/controls/listPicker/ListPicker.tsx +++ b/src/controls/listPicker/ListPicker.tsx @@ -122,7 +122,7 @@ export class ListPicker extends React.Component => { + private onSearchFieldChanged = async (searchText: string, currentSelected: IPersonaProps[]): Promise => { if (searchText.length > 2) { const results = await this.peopleSearchService.searchPeople(searchText, this.suggestionsLimit, this.props.principalTypes, this.props.webAbsoluteUrl, this.groupId, this.props.ensureUser); // Remove duplicates @@ -176,64 +176,89 @@ export class PeoplePicker extends React.Component { + + const { + peoplePickerCntrlclassName, + peoplePickerWPclassName, + isRequired, + titleText, + suggestionsLimit, + placeholder, + personSelectionLimit, + disabled, + showtooltip, + tooltipMessage, + tooltipDirectional, + errorMessageClassName, + errorMessage + } = this.props; + + const { + selectedPersons, + resolveDelay, + errorMessage: stateErrorMessage, + showRequiredError + } = this.state; + const suggestionProps: IBasePickerSuggestionsProps = { suggestionsHeaderText: strings.peoplePickerSuggestionsHeaderText, noResultsFoundText: strings.genericNoResultsFoundText, loadingText: strings.peoplePickerLoadingText, - resultsMaximumNumber: this.props.suggestionsLimit ? this.props.suggestionsLimit : 5, + resultsMaximumNumber: suggestionsLimit ? suggestionsLimit : 5, searchingText: strings.PeoplePickerSearchText }; const peoplepicker = ( -
    - {this.props.titleText && } +
    + {titleText && } peoplePersonaMenu.text} - className={`ms-PeoplePicker ${this.props.peoplePickerCntrlclassName ? this.props.peoplePickerCntrlclassName : ''}`} - key={'normal'} - removeButtonAriaLabel={'Remove'} - inputProps={{ - 'aria-label': 'People Picker' - }} - selectedItems={this.state.selectedPersons} - itemLimit={this.props.personSelectionLimit || 1} - disabled={this.props.disabled || !!this.state.errorMessage} - onChange={this.onChange} - resolveDelay={this.state.resolveDelay} /> + onResolveSuggestions={this.onSearchFieldChanged} + onEmptyInputFocus={this.returnMostRecentlyUsedPerson} + getTextFromItem={(peoplePersonaMenu: IPersonaProps) => peoplePersonaMenu.text} + className={`ms-PeoplePicker ${peoplePickerCntrlclassName ? peoplePickerCntrlclassName : ''}`} + key={'normal'} + removeButtonAriaLabel={'Remove'} + inputProps={{ + 'aria-label': 'People Picker', + placeholder: placeholder + }} + selectedItems={selectedPersons} + itemLimit={personSelectionLimit || 1} + disabled={disabled || !!stateErrorMessage} + onChange={this.onChange} + resolveDelay={resolveDelay} />
    ); return (
    { - this.props.showtooltip ? ( - + showtooltip ? ( + {peoplepicker} ) : ( -
    - {peoplepicker} -
    - ) +
    + {peoplepicker} +
    + ) } { - ((this.props.isRequired && this.state.showRequiredError) || (this.state.errorMessage)) && ( -

    + ((isRequired && showRequiredError) || (stateErrorMessage)) && ( +

    { - this.state.errorMessage && {this.state.errorMessage} + stateErrorMessage && {stateErrorMessage} } { - (this.props.isRequired && this.state.showRequiredError) && {this.props.errorMessage ? this.props.errorMessage : strings.peoplePickerComponentErrorMessage} + (isRequired && showRequiredError) && {errorMessage ? errorMessage : strings.peoplePickerComponentErrorMessage} }

    ) diff --git a/src/controls/placeholder/PlaceholderComponent.tsx b/src/controls/placeholder/PlaceholderComponent.tsx index 92d01c11f..c51251090 100644 --- a/src/controls/placeholder/PlaceholderComponent.tsx +++ b/src/controls/placeholder/PlaceholderComponent.tsx @@ -54,6 +54,17 @@ export class Placeholder extends React.Component { */ public shouldComponentUpdate(nextProps: IRichTextProps, nextState: IRichTextState): boolean { // Checks if the value coming in is the same - if (isEqual(nextState, this.state)) { + if (isEqual(nextState, this.state) && isEqual(nextProps, this.props)) { return false; } @@ -403,7 +403,7 @@ export class RichText extends React.Component { // If we're not in edit mode, display read-only version of the html if (!isEditMode) { return ( -
    ); @@ -578,7 +578,7 @@ id="DropDownStyles" editor={this.getEditor()} isOpen={this.state.morePaneVisible} onClose={this.handleClosePanel} - onLink={this.showInsertLinkDialog} + onLink={this.showInsertLinkDialog} customColors={this.props.customColors}/> { @@ -689,7 +689,7 @@ id="DropDownStyles" quill.deleteText(range.index, range.length); } - if (cursorPosition) { + if (cursorPosition > -1) { const textToInsert: string = this.state.insertUrlText !== undefined ? this.state.insertUrlText : this.state.insertUrl; const urlToInsert: string = this.state.insertUrl; quill.insertText(cursorPosition, textToInsert); diff --git a/src/controls/richText/RichTextPropertyPane.tsx b/src/controls/richText/RichTextPropertyPane.tsx index 02afc1128..6c6ed878f 100644 --- a/src/controls/richText/RichTextPropertyPane.tsx +++ b/src/controls/richText/RichTextPropertyPane.tsx @@ -44,16 +44,16 @@ export default class RichTextPropertyPane extends React.Component { return ( + isBlocking={false} + isOpen={this.props.isOpen} + type={PanelType.smallFixedFar} + onDismiss={this.props.onClose} + closeButtonAriaLabel={strings.CloseButton} + onRenderNavigation={this.handleRenderNavigation} + focusTrapZoneProps={{ + forceFocusInsideTrap: false, + isClickableOutsideFocusTrap: true + }}>
    @@ -106,45 +106,45 @@ export default class RichTextPropertyPane extends React.Component
    + id="undo-propertyPaneButton" + calloutProps={{ gapSpace: 0 }}> + className={styles.propertyPaneButton} + aria-describedby="undo-propertyPaneButton" + iconProps={{ + iconName: 'Undo', + style: { + fontSize: '20px' + } + }} /> + id="redo-propertyPaneButton" + calloutProps={{ gapSpace: 0 }}> + className={styles.propertyPaneButton} + aria-describedby="redo-propertyPaneButton" + iconProps={{ + iconName: 'Redo', + style: { + fontSize: '20px' + } + }} /> + id="clearFormatting-button-propertyPaneButton" + calloutProps={{ gapSpace: 0 }}> + className={styles.propertyPaneButton} + aria-describedby="clearFormatting-button-propertyPaneButton" + iconProps={{ + iconName: 'ClearFormatting', + style: { + fontSize: '20px' + } + }} />
    @@ -161,17 +161,17 @@ export default class RichTextPropertyPane extends React.Component
    ); @@ -187,22 +187,22 @@ export default class RichTextPropertyPane extends React.Component
    ); @@ -217,93 +217,93 @@ export default class RichTextPropertyPane extends React.Component
    + id="bold-propertyPaneButton" + calloutProps={{ gapSpace: 0 }}> this.applyFormat('bold', !this.state.formats!.bold)} - className={styles.propertyPaneButton} - aria-describedby="bold-propertyPaneButton" - iconProps={{ - iconName: 'Bold', - style: { - fontSize: '20px' - } - }} /> + onClick={() => this.applyFormat('bold', !this.state.formats!.bold)} + className={styles.propertyPaneButton} + aria-describedby="bold-propertyPaneButton" + iconProps={{ + iconName: 'Bold', + style: { + fontSize: '20px' + } + }} /> + id="italic-propertyPaneButton" + calloutProps={{ gapSpace: 0 }}> this.applyFormat('italic', !this.state.formats!.italic)} - className={styles.propertyPaneButton} - aria-describedby="italic-propertyPaneButton" - iconProps={{ - iconName: 'Italic', - style: { - fontSize: '20px' - } - }} /> + onClick={() => this.applyFormat('italic', !this.state.formats!.italic)} + className={styles.propertyPaneButton} + aria-describedby="italic-propertyPaneButton" + iconProps={{ + iconName: 'Italic', + style: { + fontSize: '20px' + } + }} /> + id="underline-propertyPaneButton" + calloutProps={{ gapSpace: 0 }}> this.applyFormat('underline', !this.state.formats!.underline)} - className={styles.propertyPaneButton} - aria-describedby="underline-propertyPaneButton" - iconProps={{ - iconName: 'Underline', - style: { - fontSize: '20px' - } - }} /> + onClick={() => this.applyFormat('underline', !this.state.formats!.underline)} + className={styles.propertyPaneButton} + aria-describedby="underline-propertyPaneButton" + iconProps={{ + iconName: 'Underline', + style: { + fontSize: '20px' + } + }} /> + id="strikethrough-propertyPaneButton" + calloutProps={{ gapSpace: 0 }}> this.applyFormat('strike', !this.state.formats!.strike)} - className={styles.propertyPaneButton} - aria-describedby="strikethrough-propertyPaneButton" - iconProps={{ - iconName: 'Strikethrough', - style: { - fontSize: '20px' - } - }} /> + onClick={() => this.applyFormat('strike', !this.state.formats!.strike)} + className={styles.propertyPaneButton} + aria-describedby="strikethrough-propertyPaneButton" + iconProps={{ + iconName: 'Strikethrough', + style: { + fontSize: '20px' + } + }} /> + id="superscript-propertyPaneButton" + calloutProps={{ gapSpace: 0 }}> this.applyFormat('script', this.state.formats!.script === 'super' ? '' : 'super')} - className={styles.propertyPaneButton} - aria-describedby="superscript-propertyPaneButton" - iconProps={{ - iconName: 'Superscript', - style: { - fontSize: '20px' - } - }} /> + onClick={() => this.applyFormat('script', this.state.formats!.script === 'super' ? '' : 'super')} + className={styles.propertyPaneButton} + aria-describedby="superscript-propertyPaneButton" + iconProps={{ + iconName: 'Superscript', + style: { + fontSize: '20px' + } + }} /> + id="subscript-propertyPaneButton" + calloutProps={{ gapSpace: 0 }}> this.applyFormat('script', this.state.formats!.script === 'sub' ? '' : 'sub')} - className={styles.propertyPaneButton} - aria-describedby="subscript-propertyPaneButton" - iconProps={{ - iconName: 'Subscript', - style: { - fontSize: '20px' - } - }} /> + onClick={() => this.applyFormat('script', this.state.formats!.script === 'sub' ? '' : 'sub')} + className={styles.propertyPaneButton} + aria-describedby="subscript-propertyPaneButton" + iconProps={{ + iconName: 'Subscript', + style: { + fontSize: '20px' + } + }} />
    @@ -329,27 +329,27 @@ export default class RichTextPropertyPane extends React.Component
    this.handleFillColorChanged(undefined)} /> + customColors={this.props.customColors} + buttonLabel={strings.FontColorLabel} + id="fontColor-propertyPaneButton" + defaultButtonLabel={strings.AutomaticFontColor} + fillThemeColor={true} + previewColor={color} + selectedColor={color} + onColorChanged={this.handleFillColorChanged} + switchToDefaultColor={() => this.handleFillColorChanged(undefined)} /> this.handleHighlightColorChanged(undefined)} - previewColor={backgroundColor} - defaultButtonLabel={strings.NoColorHighlightColor} - selectedColor={backgroundColor} - id="highlightColor-propertyPaneButton" + colorPickerGroups={[ + "highlightColors" + ]} + fillThemeColor={false} + onColorChanged={this.handleHighlightColorChanged} + switchToDefaultColor={() => this.handleHighlightColorChanged(undefined)} + previewColor={backgroundColor} + defaultButtonLabel={strings.NoColorHighlightColor} + selectedColor={backgroundColor} + id="highlightColor-propertyPaneButton" />
    @@ -366,93 +366,93 @@ export default class RichTextPropertyPane extends React.Component
    + id="left-propertyPaneButton" + calloutProps={{ gapSpace: 0 }}> this.applyFormat('align', undefined)} - className={styles.propertyPaneButton} - aria-describedby="left-propertyPaneButton" - iconProps={{ - iconName: 'AlignLeft', - style: { - fontSize: '20px' - } - }} /> + onClick={() => this.applyFormat('align', undefined)} + className={styles.propertyPaneButton} + aria-describedby="left-propertyPaneButton" + iconProps={{ + iconName: 'AlignLeft', + style: { + fontSize: '20px' + } + }} /> + id="center-propertyPaneButton" + calloutProps={{ gapSpace: 0 }}> this.applyFormat('align', 'center')} - className={styles.propertyPaneButton} - aria-describedby="center-propertyPaneButton" - iconProps={{ - iconName: 'AlignCenter', - style: { - fontSize: '20px' - } - }} /> + onClick={() => this.applyFormat('align', 'center')} + className={styles.propertyPaneButton} + aria-describedby="center-propertyPaneButton" + iconProps={{ + iconName: 'AlignCenter', + style: { + fontSize: '20px' + } + }} /> + id="right-propertyPaneButton" + calloutProps={{ gapSpace: 0 }}> this.applyFormat('align', 'right')} - className={styles.propertyPaneButton} - aria-describedby="right-propertyPaneButton" - iconProps={{ - iconName: 'AlignRight', - style: { - fontSize: '20px' - } - }} /> + onClick={() => this.applyFormat('align', 'right')} + className={styles.propertyPaneButton} + aria-describedby="right-propertyPaneButton" + iconProps={{ + iconName: 'AlignRight', + style: { + fontSize: '20px' + } + }} /> + id="justify-propertyPaneButton" + calloutProps={{ gapSpace: 0 }}> this.applyFormat('align', 'justify')} - className={styles.propertyPaneButton} - aria-describedby="justify-propertyPaneButton" - iconProps={{ - iconName: 'AlignJustify', - style: { - fontSize: '20px' - } - }} /> + onClick={() => this.applyFormat('align', 'justify')} + className={styles.propertyPaneButton} + aria-describedby="justify-propertyPaneButton" + iconProps={{ + iconName: 'AlignJustify', + style: { + fontSize: '20px' + } + }} /> - this.applyFormat('script', this.state.formats!.script === 'super' ? '' : 'super')} - className={styles.propertyPaneButton} - aria-describedby="increaseindent-propertyPaneButton" - iconProps={{ - iconName: 'IncreaseIndentLegacy', - style: { - fontSize: '20px' - } - }} /> + id="increaseindent-propertyPaneButton" + calloutProps={{ gapSpace: 0 }}> + this.onChangeIndent(1)} + className={styles.propertyPaneButton} + aria-describedby="increaseindent-propertyPaneButton" + iconProps={{ + iconName: 'IncreaseIndentLegacy', + style: { + fontSize: '20px' + } + }} /> - this.applyFormat('script', this.state.formats!.script === 'sub' ? '' : 'sub')} - className={styles.propertyPaneButton} - aria-describedby="decreaseindent-propertyPaneButton" - iconProps={{ - iconName: 'DecreaseIndentLegacy', - style: { - fontSize: '20px' - } - }} /> + id="decreaseindent-propertyPaneButton" + calloutProps={{ gapSpace: 0 }}> + this.onChangeIndent(-1)} + className={styles.propertyPaneButton} + aria-describedby="decreaseindent-propertyPaneButton" + iconProps={{ + iconName: 'DecreaseIndentLegacy', + style: { + fontSize: '20px' + } + }} />
    @@ -468,33 +468,33 @@ export default class RichTextPropertyPane extends React.Component
    + id="bullet-propertyPaneButton" + calloutProps={{ gapSpace: 0 }}> this.applyFormat('list', 'bullet')} - className={styles.propertyPaneButton} - aria-describedby="bullet-propertyPaneButton" - iconProps={{ - iconName: 'BulletedList', - style: { - fontSize: '20px' - } - }} /> + onClick={() => this.applyFormat('list', 'bullet')} + className={styles.propertyPaneButton} + aria-describedby="bullet-propertyPaneButton" + iconProps={{ + iconName: 'BulletedList', + style: { + fontSize: '20px' + } + }} /> + id="ordered-propertyPaneButton" + calloutProps={{ gapSpace: 0 }}> this.applyFormat('list', 'ordered')} - className={styles.propertyPaneButton} - aria-describedby="ordered-propertyPaneButton" - iconProps={{ - iconName: 'NumberedList', - style: { - fontSize: '20px' - } - }} /> + onClick={() => this.applyFormat('list', 'ordered')} + className={styles.propertyPaneButton} + aria-describedby="ordered-propertyPaneButton" + iconProps={{ + iconName: 'NumberedList', + style: { + fontSize: '20px' + } + }} />
    @@ -510,33 +510,33 @@ export default class RichTextPropertyPane extends React.Component
    + id="link-propertyPaneButton" + calloutProps={{ gapSpace: 0 }}> this.props.onLink()} - className={styles.propertyPaneButton} - aria-describedby="link-propertyPaneButton" - iconProps={{ - iconName: 'Link', - style: { - fontSize: '20px' - } - }} /> + onClick={() => this.props.onLink()} + className={styles.propertyPaneButton} + aria-describedby="link-propertyPaneButton" + iconProps={{ + iconName: 'Link', + style: { + fontSize: '20px' + } + }} /> + id="unlink-propertyPaneButton" + calloutProps={{ gapSpace: 0 }}> this.applyFormat('link', false)} - className={styles.propertyPaneButton} - aria-describedby="unlink-propertyPaneButton" - iconProps={{ - iconName: 'RemoveLink', - style: { - fontSize: '20px' - } - }} /> + onClick={() => this.applyFormat('link', false)} + className={styles.propertyPaneButton} + aria-describedby="unlink-propertyPaneButton" + iconProps={{ + iconName: 'RemoveLink', + style: { + fontSize: '20px' + } + }} />
    @@ -566,6 +566,15 @@ export default class RichTextPropertyPane extends React.Component { + const quill = this.props.editor; + const current = +(quill.getFormat(quill.getSelection()).indent || 0); + this.applyFormat("indent", current + direction); + } + /** * On size change */ @@ -633,12 +642,12 @@ export default class RichTextPropertyPane extends React.Component