From 6f2bd614482303136e350bd7d1f31d5061684b89 Mon Sep 17 00:00:00 2001 From: David Claux Date: Mon, 1 Jun 2020 09:03:37 -0700 Subject: [PATCH 1/8] Work in progress --- .../dist/containers/bf-image-container.css | 10 +- .../dist/containers/cortana-container.css | 10 +- .../dist/containers/outlook-container.css | 10 +- .../dist/containers/skype-container.css | 10 +- .../dist/containers/teams-container-dark.css | 10 +- .../dist/containers/teams-container-light.css | 10 +- .../dist/containers/toast-container.css | 10 +- .../dist/containers/webchat-container.css | 10 +- .../bf-image/bf-image-container.css | 10 +- .../cortana-classic/cortana-container.css | 10 +- .../cortana/cortana-container-dark.css | 10 +- .../cortana/cortana-container-light.css | 10 +- .../default/adaptivecards-defaulthost.css | 10 +- .../notifications/toast-container.css | 10 +- .../containers/outlook/outlook-container.css | 10 +- .../src/containers/skype/skype-container.css | 10 +- .../containers/teams/teams-container-dark.css | 10 +- .../teams/teams-container-light.css | 10 +- .../containers/webchat/webchat-container.css | 10 +- .../src/designer-peers.ts | 32 +++++-- .../adaptivecards-designer/src/shared.ts | 1 + .../adaptivecards-visualizer/css/bf.css | 22 +---- .../adaptivecards-visualizer/css/cortana.css | 22 +---- .../adaptivecards-visualizer/css/liveTile.css | 22 +---- .../adaptivecards-visualizer/css/outlook.css | 22 +---- .../adaptivecards-visualizer/css/skype.css | 22 +---- .../adaptivecards-visualizer/css/teams.css | 22 +---- .../adaptivecards-visualizer/css/toast.css | 22 +---- .../adaptivecards-visualizer/css/webchat.css | 10 +- .../nodejs/adaptivecards/src/card-elements.ts | 93 +++++++++++++++---- source/nodejs/adaptivecards/src/enums.ts | 2 + .../nodejs/adaptivecards/src/serialization.ts | 3 +- source/nodejs/adaptivecards/src/shared.ts | 2 +- 33 files changed, 239 insertions(+), 248 deletions(-) diff --git a/source/nodejs/adaptivecards-designer-app/dist/containers/bf-image-container.css b/source/nodejs/adaptivecards-designer-app/dist/containers/bf-image-container.css index 2ab42fb6c9..f9bcd2bc84 100644 --- a/source/nodejs/adaptivecards-designer-app/dist/containers/bf-image-container.css +++ b/source/nodejs/adaptivecards-designer-app/dist/containers/bf-image-container.css @@ -86,13 +86,13 @@ } .ac-input.ac-input-required { - background-image: linear-gradient(45deg, transparent, transparent 50%, red 50%, red 100%); - background-position: top right; - background-size: .5em .5em; - background-repeat: no-repeat; } -.ac-input.ac-input-validation-failed { +.ac-input.ac-textInput.ac-input-validation-failed, +.ac-input.ac-numberInput.ac-input-validation-failed, +.ac-input.ac-dateInput.ac-input-validation-failed, +.ac-input.ac-timeInput.ac-input-validation-failed, +.ac-input.ac-multichoiceInput.ac-choiceSetInput-compact.ac-input-validation-failed { border: 1px solid red !important; } diff --git a/source/nodejs/adaptivecards-designer-app/dist/containers/cortana-container.css b/source/nodejs/adaptivecards-designer-app/dist/containers/cortana-container.css index 12f23af28c..58d516b6bb 100644 --- a/source/nodejs/adaptivecards-designer-app/dist/containers/cortana-container.css +++ b/source/nodejs/adaptivecards-designer-app/dist/containers/cortana-container.css @@ -195,13 +195,13 @@ a.ac-anchor:visited:active { } .ac-input.ac-input-required { - background-image: linear-gradient(45deg, transparent, transparent 50%, red 50%, red 100%); - background-position: top right; - background-size: .5em .5em; - background-repeat: no-repeat; } -.ac-input.ac-input-validation-failed { +.ac-input.ac-textInput.ac-input-validation-failed, +.ac-input.ac-numberInput.ac-input-validation-failed, +.ac-input.ac-dateInput.ac-input-validation-failed, +.ac-input.ac-timeInput.ac-input-validation-failed, +.ac-input.ac-multichoiceInput.ac-choiceSetInput-compact.ac-input-validation-failed { border: 1px solid red !important; } diff --git a/source/nodejs/adaptivecards-designer-app/dist/containers/outlook-container.css b/source/nodejs/adaptivecards-designer-app/dist/containers/outlook-container.css index bd2e0e331f..ccecf9c7e4 100644 --- a/source/nodejs/adaptivecards-designer-app/dist/containers/outlook-container.css +++ b/source/nodejs/adaptivecards-designer-app/dist/containers/outlook-container.css @@ -159,13 +159,13 @@ a.ac-anchor:visited:active { } .ac-input.ac-input-required { - background-image: linear-gradient(45deg, transparent, transparent 50%, red 50%, red 100%); - background-position: top right; - background-size: .5em .5em; - background-repeat: no-repeat; } -.ac-input.ac-input-validation-failed { +.ac-input.ac-textInput.ac-input-validation-failed, +.ac-input.ac-numberInput.ac-input-validation-failed, +.ac-input.ac-dateInput.ac-input-validation-failed, +.ac-input.ac-timeInput.ac-input-validation-failed, +.ac-input.ac-multichoiceInput.ac-choiceSetInput-compact.ac-input-validation-failed { border: 1px solid red !important; } diff --git a/source/nodejs/adaptivecards-designer-app/dist/containers/skype-container.css b/source/nodejs/adaptivecards-designer-app/dist/containers/skype-container.css index 992c74ecdd..75b05cea09 100644 --- a/source/nodejs/adaptivecards-designer-app/dist/containers/skype-container.css +++ b/source/nodejs/adaptivecards-designer-app/dist/containers/skype-container.css @@ -140,13 +140,13 @@ a.ac-anchor:visited:active { } .ac-input.ac-input-required { - background-image: linear-gradient(45deg, transparent, transparent 50%, red 50%, red 100%); - background-position: top right; - background-size: .5em .5em; - background-repeat: no-repeat; } -.ac-input.ac-input-validation-failed { +.ac-input.ac-textInput.ac-input-validation-failed, +.ac-input.ac-numberInput.ac-input-validation-failed, +.ac-input.ac-dateInput.ac-input-validation-failed, +.ac-input.ac-timeInput.ac-input-validation-failed, +.ac-input.ac-multichoiceInput.ac-choiceSetInput-compact.ac-input-validation-failed { border: 1px solid red !important; } diff --git a/source/nodejs/adaptivecards-designer-app/dist/containers/teams-container-dark.css b/source/nodejs/adaptivecards-designer-app/dist/containers/teams-container-dark.css index 1a65d47df8..4ee3b42b44 100644 --- a/source/nodejs/adaptivecards-designer-app/dist/containers/teams-container-dark.css +++ b/source/nodejs/adaptivecards-designer-app/dist/containers/teams-container-dark.css @@ -168,13 +168,13 @@ a.ac-anchor:visited:active { } .ac-input.ac-input-required { - background-image: linear-gradient(45deg, transparent, transparent 50%, red 50%, red 100%); - background-position: top right; - background-size: .5em .5em; - background-repeat: no-repeat; } -.ac-input.ac-input-validation-failed { +.ac-input.ac-textInput.ac-input-validation-failed, +.ac-input.ac-numberInput.ac-input-validation-failed, +.ac-input.ac-dateInput.ac-input-validation-failed, +.ac-input.ac-timeInput.ac-input-validation-failed, +.ac-input.ac-multichoiceInput.ac-choiceSetInput-compact.ac-input-validation-failed { border: 1px solid red !important; } diff --git a/source/nodejs/adaptivecards-designer-app/dist/containers/teams-container-light.css b/source/nodejs/adaptivecards-designer-app/dist/containers/teams-container-light.css index 287fb23a08..ea5baa844b 100644 --- a/source/nodejs/adaptivecards-designer-app/dist/containers/teams-container-light.css +++ b/source/nodejs/adaptivecards-designer-app/dist/containers/teams-container-light.css @@ -168,13 +168,13 @@ a.ac-anchor:visited:active { } .ac-input.ac-input-required { - background-image: linear-gradient(45deg, transparent, transparent 50%, red 50%, red 100%); - background-position: top right; - background-size: .5em .5em; - background-repeat: no-repeat; } -.ac-input.ac-input-validation-failed { +.ac-input.ac-textInput.ac-input-validation-failed, +.ac-input.ac-numberInput.ac-input-validation-failed, +.ac-input.ac-dateInput.ac-input-validation-failed, +.ac-input.ac-timeInput.ac-input-validation-failed, +.ac-input.ac-multichoiceInput.ac-choiceSetInput-compact.ac-input-validation-failed { border: 1px solid red !important; } diff --git a/source/nodejs/adaptivecards-designer-app/dist/containers/toast-container.css b/source/nodejs/adaptivecards-designer-app/dist/containers/toast-container.css index 34182db4cc..0fc48f0160 100644 --- a/source/nodejs/adaptivecards-designer-app/dist/containers/toast-container.css +++ b/source/nodejs/adaptivecards-designer-app/dist/containers/toast-container.css @@ -108,13 +108,13 @@ a.ac-anchor:visited:active { } .ac-input.ac-input-required { - background-image: linear-gradient(45deg, transparent, transparent 50%, red 50%, red 100%); - background-position: top right; - background-size: .5em .5em; - background-repeat: no-repeat; } -.ac-input.ac-input-validation-failed { +.ac-input.ac-textInput.ac-input-validation-failed, +.ac-input.ac-numberInput.ac-input-validation-failed, +.ac-input.ac-dateInput.ac-input-validation-failed, +.ac-input.ac-timeInput.ac-input-validation-failed, +.ac-input.ac-multichoiceInput.ac-choiceSetInput-compact.ac-input-validation-failed { border: 1px solid red !important; } diff --git a/source/nodejs/adaptivecards-designer-app/dist/containers/webchat-container.css b/source/nodejs/adaptivecards-designer-app/dist/containers/webchat-container.css index 4ce3c42a6a..fc6be2a2f2 100644 --- a/source/nodejs/adaptivecards-designer-app/dist/containers/webchat-container.css +++ b/source/nodejs/adaptivecards-designer-app/dist/containers/webchat-container.css @@ -131,13 +131,13 @@ a.ac-anchor:visited:active { } .ac-input.ac-input-required { - background-image: linear-gradient(45deg, transparent, transparent 50%, red 50%, red 100%); - background-position: top right; - background-size: .5em .5em; - background-repeat: no-repeat; } -.ac-input.ac-input-validation-failed { +.ac-input.ac-textInput.ac-input-validation-failed, +.ac-input.ac-numberInput.ac-input-validation-failed, +.ac-input.ac-dateInput.ac-input-validation-failed, +.ac-input.ac-timeInput.ac-input-validation-failed, +.ac-input.ac-multichoiceInput.ac-choiceSetInput-compact.ac-input-validation-failed { border: 1px solid red !important; } diff --git a/source/nodejs/adaptivecards-designer/src/containers/bf-image/bf-image-container.css b/source/nodejs/adaptivecards-designer/src/containers/bf-image/bf-image-container.css index 2ab42fb6c9..f9bcd2bc84 100644 --- a/source/nodejs/adaptivecards-designer/src/containers/bf-image/bf-image-container.css +++ b/source/nodejs/adaptivecards-designer/src/containers/bf-image/bf-image-container.css @@ -86,13 +86,13 @@ } .ac-input.ac-input-required { - background-image: linear-gradient(45deg, transparent, transparent 50%, red 50%, red 100%); - background-position: top right; - background-size: .5em .5em; - background-repeat: no-repeat; } -.ac-input.ac-input-validation-failed { +.ac-input.ac-textInput.ac-input-validation-failed, +.ac-input.ac-numberInput.ac-input-validation-failed, +.ac-input.ac-dateInput.ac-input-validation-failed, +.ac-input.ac-timeInput.ac-input-validation-failed, +.ac-input.ac-multichoiceInput.ac-choiceSetInput-compact.ac-input-validation-failed { border: 1px solid red !important; } diff --git a/source/nodejs/adaptivecards-designer/src/containers/cortana-classic/cortana-container.css b/source/nodejs/adaptivecards-designer/src/containers/cortana-classic/cortana-container.css index 12f23af28c..58d516b6bb 100644 --- a/source/nodejs/adaptivecards-designer/src/containers/cortana-classic/cortana-container.css +++ b/source/nodejs/adaptivecards-designer/src/containers/cortana-classic/cortana-container.css @@ -195,13 +195,13 @@ a.ac-anchor:visited:active { } .ac-input.ac-input-required { - background-image: linear-gradient(45deg, transparent, transparent 50%, red 50%, red 100%); - background-position: top right; - background-size: .5em .5em; - background-repeat: no-repeat; } -.ac-input.ac-input-validation-failed { +.ac-input.ac-textInput.ac-input-validation-failed, +.ac-input.ac-numberInput.ac-input-validation-failed, +.ac-input.ac-dateInput.ac-input-validation-failed, +.ac-input.ac-timeInput.ac-input-validation-failed, +.ac-input.ac-multichoiceInput.ac-choiceSetInput-compact.ac-input-validation-failed { border: 1px solid red !important; } diff --git a/source/nodejs/adaptivecards-designer/src/containers/cortana/cortana-container-dark.css b/source/nodejs/adaptivecards-designer/src/containers/cortana/cortana-container-dark.css index 9612aa0419..958321ee15 100644 --- a/source/nodejs/adaptivecards-designer/src/containers/cortana/cortana-container-dark.css +++ b/source/nodejs/adaptivecards-designer/src/containers/cortana/cortana-container-dark.css @@ -119,13 +119,13 @@ a.ac-anchor:visited:active { } .ac-input.ac-input-required { - background-image: linear-gradient(45deg, transparent, transparent 50%, red 50%, red 100%); - background-position: top right; - background-size: .5em .5em; - background-repeat: no-repeat; } -.ac-input.ac-input-validation-failed { +.ac-input.ac-textInput.ac-input-validation-failed, +.ac-input.ac-numberInput.ac-input-validation-failed, +.ac-input.ac-dateInput.ac-input-validation-failed, +.ac-input.ac-timeInput.ac-input-validation-failed, +.ac-input.ac-multichoiceInput.ac-choiceSetInput-compact.ac-input-validation-failed { border: 1px solid red !important; } diff --git a/source/nodejs/adaptivecards-designer/src/containers/cortana/cortana-container-light.css b/source/nodejs/adaptivecards-designer/src/containers/cortana/cortana-container-light.css index 2d7c6ab1bf..ab6e51b985 100644 --- a/source/nodejs/adaptivecards-designer/src/containers/cortana/cortana-container-light.css +++ b/source/nodejs/adaptivecards-designer/src/containers/cortana/cortana-container-light.css @@ -119,13 +119,13 @@ a.ac-anchor:visited:active { } .ac-input.ac-input-required { - background-image: linear-gradient(45deg, transparent, transparent 50%, red 50%, red 100%); - background-position: top right; - background-size: .5em .5em; - background-repeat: no-repeat; } -.ac-input.ac-input-validation-failed { +.ac-input.ac-textInput.ac-input-validation-failed, +.ac-input.ac-numberInput.ac-input-validation-failed, +.ac-input.ac-dateInput.ac-input-validation-failed, +.ac-input.ac-timeInput.ac-input-validation-failed, +.ac-input.ac-multichoiceInput.ac-choiceSetInput-compact.ac-input-validation-failed { border: 1px solid red !important; } diff --git a/source/nodejs/adaptivecards-designer/src/containers/default/adaptivecards-defaulthost.css b/source/nodejs/adaptivecards-designer/src/containers/default/adaptivecards-defaulthost.css index af513bb32c..0f03aa7b3e 100644 --- a/source/nodejs/adaptivecards-designer/src/containers/default/adaptivecards-defaulthost.css +++ b/source/nodejs/adaptivecards-designer/src/containers/default/adaptivecards-defaulthost.css @@ -137,13 +137,13 @@ a.ac-anchor:visited:active { } .ac-input.ac-input-required { - background-image: linear-gradient(45deg, transparent, transparent 50%, red 50%, red 100%); - background-position: top right; - background-size: .5em .5em; - background-repeat: no-repeat; } -.ac-input.ac-input-validation-failed { +.ac-input.ac-textInput.ac-input-validation-failed, +.ac-input.ac-numberInput.ac-input-validation-failed, +.ac-input.ac-dateInput.ac-input-validation-failed, +.ac-input.ac-timeInput.ac-input-validation-failed, +.ac-input.ac-multichoiceInput.ac-choiceSetInput-compact.ac-input-validation-failed { border: 1px solid red !important; } diff --git a/source/nodejs/adaptivecards-designer/src/containers/notifications/toast-container.css b/source/nodejs/adaptivecards-designer/src/containers/notifications/toast-container.css index 34182db4cc..0fc48f0160 100644 --- a/source/nodejs/adaptivecards-designer/src/containers/notifications/toast-container.css +++ b/source/nodejs/adaptivecards-designer/src/containers/notifications/toast-container.css @@ -108,13 +108,13 @@ a.ac-anchor:visited:active { } .ac-input.ac-input-required { - background-image: linear-gradient(45deg, transparent, transparent 50%, red 50%, red 100%); - background-position: top right; - background-size: .5em .5em; - background-repeat: no-repeat; } -.ac-input.ac-input-validation-failed { +.ac-input.ac-textInput.ac-input-validation-failed, +.ac-input.ac-numberInput.ac-input-validation-failed, +.ac-input.ac-dateInput.ac-input-validation-failed, +.ac-input.ac-timeInput.ac-input-validation-failed, +.ac-input.ac-multichoiceInput.ac-choiceSetInput-compact.ac-input-validation-failed { border: 1px solid red !important; } diff --git a/source/nodejs/adaptivecards-designer/src/containers/outlook/outlook-container.css b/source/nodejs/adaptivecards-designer/src/containers/outlook/outlook-container.css index bd2e0e331f..ccecf9c7e4 100644 --- a/source/nodejs/adaptivecards-designer/src/containers/outlook/outlook-container.css +++ b/source/nodejs/adaptivecards-designer/src/containers/outlook/outlook-container.css @@ -159,13 +159,13 @@ a.ac-anchor:visited:active { } .ac-input.ac-input-required { - background-image: linear-gradient(45deg, transparent, transparent 50%, red 50%, red 100%); - background-position: top right; - background-size: .5em .5em; - background-repeat: no-repeat; } -.ac-input.ac-input-validation-failed { +.ac-input.ac-textInput.ac-input-validation-failed, +.ac-input.ac-numberInput.ac-input-validation-failed, +.ac-input.ac-dateInput.ac-input-validation-failed, +.ac-input.ac-timeInput.ac-input-validation-failed, +.ac-input.ac-multichoiceInput.ac-choiceSetInput-compact.ac-input-validation-failed { border: 1px solid red !important; } diff --git a/source/nodejs/adaptivecards-designer/src/containers/skype/skype-container.css b/source/nodejs/adaptivecards-designer/src/containers/skype/skype-container.css index 992c74ecdd..75b05cea09 100644 --- a/source/nodejs/adaptivecards-designer/src/containers/skype/skype-container.css +++ b/source/nodejs/adaptivecards-designer/src/containers/skype/skype-container.css @@ -140,13 +140,13 @@ a.ac-anchor:visited:active { } .ac-input.ac-input-required { - background-image: linear-gradient(45deg, transparent, transparent 50%, red 50%, red 100%); - background-position: top right; - background-size: .5em .5em; - background-repeat: no-repeat; } -.ac-input.ac-input-validation-failed { +.ac-input.ac-textInput.ac-input-validation-failed, +.ac-input.ac-numberInput.ac-input-validation-failed, +.ac-input.ac-dateInput.ac-input-validation-failed, +.ac-input.ac-timeInput.ac-input-validation-failed, +.ac-input.ac-multichoiceInput.ac-choiceSetInput-compact.ac-input-validation-failed { border: 1px solid red !important; } diff --git a/source/nodejs/adaptivecards-designer/src/containers/teams/teams-container-dark.css b/source/nodejs/adaptivecards-designer/src/containers/teams/teams-container-dark.css index 1a65d47df8..4ee3b42b44 100644 --- a/source/nodejs/adaptivecards-designer/src/containers/teams/teams-container-dark.css +++ b/source/nodejs/adaptivecards-designer/src/containers/teams/teams-container-dark.css @@ -168,13 +168,13 @@ a.ac-anchor:visited:active { } .ac-input.ac-input-required { - background-image: linear-gradient(45deg, transparent, transparent 50%, red 50%, red 100%); - background-position: top right; - background-size: .5em .5em; - background-repeat: no-repeat; } -.ac-input.ac-input-validation-failed { +.ac-input.ac-textInput.ac-input-validation-failed, +.ac-input.ac-numberInput.ac-input-validation-failed, +.ac-input.ac-dateInput.ac-input-validation-failed, +.ac-input.ac-timeInput.ac-input-validation-failed, +.ac-input.ac-multichoiceInput.ac-choiceSetInput-compact.ac-input-validation-failed { border: 1px solid red !important; } diff --git a/source/nodejs/adaptivecards-designer/src/containers/teams/teams-container-light.css b/source/nodejs/adaptivecards-designer/src/containers/teams/teams-container-light.css index 287fb23a08..ea5baa844b 100644 --- a/source/nodejs/adaptivecards-designer/src/containers/teams/teams-container-light.css +++ b/source/nodejs/adaptivecards-designer/src/containers/teams/teams-container-light.css @@ -168,13 +168,13 @@ a.ac-anchor:visited:active { } .ac-input.ac-input-required { - background-image: linear-gradient(45deg, transparent, transparent 50%, red 50%, red 100%); - background-position: top right; - background-size: .5em .5em; - background-repeat: no-repeat; } -.ac-input.ac-input-validation-failed { +.ac-input.ac-textInput.ac-input-validation-failed, +.ac-input.ac-numberInput.ac-input-validation-failed, +.ac-input.ac-dateInput.ac-input-validation-failed, +.ac-input.ac-timeInput.ac-input-validation-failed, +.ac-input.ac-multichoiceInput.ac-choiceSetInput-compact.ac-input-validation-failed { border: 1px solid red !important; } diff --git a/source/nodejs/adaptivecards-designer/src/containers/webchat/webchat-container.css b/source/nodejs/adaptivecards-designer/src/containers/webchat/webchat-container.css index 4ce3c42a6a..fc6be2a2f2 100644 --- a/source/nodejs/adaptivecards-designer/src/containers/webchat/webchat-container.css +++ b/source/nodejs/adaptivecards-designer/src/containers/webchat/webchat-container.css @@ -131,13 +131,13 @@ a.ac-anchor:visited:active { } .ac-input.ac-input-required { - background-image: linear-gradient(45deg, transparent, transparent 50%, red 50%, red 100%); - background-position: top right; - background-size: .5em .5em; - background-repeat: no-repeat; } -.ac-input.ac-input-validation-failed { +.ac-input.ac-textInput.ac-input-validation-failed, +.ac-input.ac-numberInput.ac-input-validation-failed, +.ac-input.ac-dateInput.ac-input-validation-failed, +.ac-input.ac-timeInput.ac-input-validation-failed, +.ac-input.ac-multichoiceInput.ac-choiceSetInput-compact.ac-input-validation-failed { border: 1px solid red !important; } diff --git a/source/nodejs/adaptivecards-designer/src/designer-peers.ts b/source/nodejs/adaptivecards-designer/src/designer-peers.ts index ab81345391..95fe08fd5b 100644 --- a/source/nodejs/adaptivecards-designer/src/designer-peers.ts +++ b/source/nodejs/adaptivecards-designer/src/designer-peers.ts @@ -57,6 +57,7 @@ export class PropertySheetCategory { static readonly StyleCategory = "Style"; static readonly SelectionAction = "Selection action"; static readonly InlineAction = "Inline action"; + static readonly Validation = "Validation"; private _entries: PropertySheetEntry[] = []; @@ -1285,11 +1286,9 @@ export class HttpActionPeer extends TypedActionPeer { populatePropertySheet(propertySheet: PropertySheet, defaultCategory: string = PropertySheetCategory.DefaultCategory) { super.populatePropertySheet(propertySheet, defaultCategory); - if (Adaptive.GlobalSettings.useBuiltInInputValidation) { - propertySheet.add( - PropertySheetCategory.DefaultCategory, - HttpActionPeer.ignoreInputValidationProperty); - } + propertySheet.add( + PropertySheetCategory.DefaultCategory, + HttpActionPeer.ignoreInputValidationProperty); propertySheet.add( defaultCategory, @@ -2189,6 +2188,7 @@ export class FactSetPeer extends TypedCardElementPeer { } export abstract class InputPeer extends TypedCardElementPeer { + /* static readonly validationProperty = new CompoundPropertyEditor( Adaptive.Versions.vNext, "validation", @@ -2197,13 +2197,25 @@ export abstract class InputPeer extends TypedCard new StringPropertyEditor(Adaptive.Versions.vNext, "errorMessage", "Error message") ] ); + */ + + static readonly isRequiredProperty = new BooleanPropertyEditor( + Adaptive.Versions.v1_3, + "isRequired", + "Required"); + + static readonly errorMessageProperty = new StringPropertyEditor( + Adaptive.Versions.v1_3, + "errorMessage", + "Error message"); populatePropertySheet(propertySheet: PropertySheet, defaultCategory: string = PropertySheetCategory.DefaultCategory) { super.populatePropertySheet(propertySheet, defaultCategory); propertySheet.add( - "Validation", - InputPeer.validationProperty); + PropertySheetCategory.Validation, + InputPeer.isRequiredProperty, + InputPeer.errorMessageProperty); propertySheet.remove( CardElementPeer.horizontalAlignmentProperty, @@ -2218,6 +2230,8 @@ export class TextInputPeer extends InputPeer { static readonly styleProperty = new EnumPropertyEditor(Adaptive.Versions.v1_0, "style", "Style", Adaptive.InputTextStyle); static readonly maxLengthProperty = new NumberPropertyEditor(Adaptive.Versions.v1_0, "maxLength", "Maximum length"); static readonly inlineActionProperty = new ActionPropertyEditor(Adaptive.Versions.v1_2, "inlineAction", "Action type", [ Adaptive.ShowCardAction.JsonTypeName ], true); + static readonly regexProperty = new StringPropertyEditor(Adaptive.Versions.v1_3, "regex", "Pattern"); + populatePropertySheet(propertySheet: PropertySheet, defaultCategory: string = PropertySheetCategory.DefaultCategory) { super.populatePropertySheet(propertySheet, defaultCategory); @@ -2255,6 +2269,10 @@ export class TextInputPeer extends InputPeer { defaultCategory, TextInputPeer.maxLengthProperty, TextInputPeer.defaultValueProperty); + + propertySheet.add( + PropertySheetCategory.Validation, + TextInputPeer.regexProperty); } initializeCardElement() { diff --git a/source/nodejs/adaptivecards-designer/src/shared.ts b/source/nodejs/adaptivecards-designer/src/shared.ts index c2bb4354ff..8fdc780064 100644 --- a/source/nodejs/adaptivecards-designer/src/shared.ts +++ b/source/nodejs/adaptivecards-designer/src/shared.ts @@ -13,5 +13,6 @@ export var SupportedTargetVersions: Adaptive.Version[] = [ Adaptive.Versions.v1_0, Adaptive.Versions.v1_1, Adaptive.Versions.v1_2, + Adaptive.Versions.v1_3, Adaptive.Versions.vNext ]; diff --git a/source/nodejs/adaptivecards-visualizer/css/bf.css b/source/nodejs/adaptivecards-visualizer/css/bf.css index 1b7796dbbe..6074ca3a91 100644 --- a/source/nodejs/adaptivecards-visualizer/css/bf.css +++ b/source/nodejs/adaptivecards-visualizer/css/bf.css @@ -97,18 +97,6 @@ align-items: center; } -.ac-input-container.ac-input-required::after { - content: "*"; - color: red; - left: 100%; - top: 0; - padding-left: 4px; -} - -.ac-input.ac-input-validation-failed { - border: 1px solid red !important; -} - .ac-input-validation-error-message { font-size: 12px; color: red; @@ -134,13 +122,13 @@ } .ac-input.ac-input-required { - background-image: linear-gradient(45deg, transparent, transparent 50%, red 50%, red 100%); - background-position: top right; - background-size: .5em .5em; - background-repeat: no-repeat; } -.ac-input.ac-input-validation-failed { +.ac-input.ac-textInput.ac-input-validation-failed, +.ac-input.ac-numberInput.ac-input-validation-failed, +.ac-input.ac-dateInput.ac-input-validation-failed, +.ac-input.ac-timeInput.ac-input-validation-failed, +.ac-input.ac-multichoiceInput.ac-choiceSetInput-compact.ac-input-validation-failed { border: 1px solid red !important; } diff --git a/source/nodejs/adaptivecards-visualizer/css/cortana.css b/source/nodejs/adaptivecards-visualizer/css/cortana.css index 75f00ba782..d0ad3b76d3 100644 --- a/source/nodejs/adaptivecards-visualizer/css/cortana.css +++ b/source/nodejs/adaptivecards-visualizer/css/cortana.css @@ -17,18 +17,6 @@ align-items: center; } -.ac-input-container.ac-input-required::after { - content: "*"; - color: red; - left: 100%; - top: 0; - padding-left: 4px; -} - -.ac-input.ac-input-validation-failed { - border: 1px solid red !important; -} - .ac-input-validation-error-message { font-size: 12px; color: red; @@ -134,13 +122,13 @@ a.ac-anchor:visited:active { } .ac-input.ac-input-required { - background-image: linear-gradient(45deg, transparent, transparent 50%, red 50%, red 100%); - background-position: top right; - background-size: .5em .5em; - background-repeat: no-repeat; } -.ac-input.ac-input-validation-failed { +.ac-input.ac-textInput.ac-input-validation-failed, +.ac-input.ac-numberInput.ac-input-validation-failed, +.ac-input.ac-dateInput.ac-input-validation-failed, +.ac-input.ac-timeInput.ac-input-validation-failed, +.ac-input.ac-multichoiceInput.ac-choiceSetInput-compact.ac-input-validation-failed { border: 1px solid red !important; } diff --git a/source/nodejs/adaptivecards-visualizer/css/liveTile.css b/source/nodejs/adaptivecards-visualizer/css/liveTile.css index d28f3a2a93..d451610f98 100644 --- a/source/nodejs/adaptivecards-visualizer/css/liveTile.css +++ b/source/nodejs/adaptivecards-visualizer/css/liveTile.css @@ -98,18 +98,6 @@ a.ac-anchor:visited:active { align-items: center; } -.ac-input-container.ac-input-required::after { - content: "*"; - color: red; - left: 100%; - top: 0; - padding-left: 4px; -} - -.ac-input.ac-input-validation-failed { - border: 1px solid red !important; -} - .ac-input-validation-error-message { font-size: 12px; color: red; @@ -140,13 +128,13 @@ a.ac-anchor:visited:active { } .ac-input.ac-input-required { - background-image: linear-gradient(45deg, transparent, transparent 50%, red 50%, red 100%); - background-position: top right; - background-size: .5em .5em; - background-repeat: no-repeat; } -.ac-input.ac-input-validation-failed { +.ac-input.ac-textInput.ac-input-validation-failed, +.ac-input.ac-numberInput.ac-input-validation-failed, +.ac-input.ac-dateInput.ac-input-validation-failed, +.ac-input.ac-timeInput.ac-input-validation-failed, +.ac-input.ac-multichoiceInput.ac-choiceSetInput-compact.ac-input-validation-failed { border: 1px solid red !important; } diff --git a/source/nodejs/adaptivecards-visualizer/css/outlook.css b/source/nodejs/adaptivecards-visualizer/css/outlook.css index 9087760c44..78796913ca 100644 --- a/source/nodejs/adaptivecards-visualizer/css/outlook.css +++ b/source/nodejs/adaptivecards-visualizer/css/outlook.css @@ -172,18 +172,6 @@ a.ac-anchor:visited:active { align-items: center; } -.ac-input-container.ac-input-required::after { - content: "*"; - color: red; - left: 100%; - top: 0; - padding-left: 4px; -} - -.ac-input.ac-input-validation-failed { - border: 1px solid red !important; -} - .ac-input-validation-error-message { font-size: 12px; color: red; @@ -208,13 +196,13 @@ a.ac-anchor:visited:active { } .ac-input.ac-input-required { - background-image: linear-gradient(45deg, transparent, transparent 50%, red 50%, red 100%); - background-position: top right; - background-size: .5em .5em; - background-repeat: no-repeat; } -.ac-input.ac-input-validation-failed { +.ac-input.ac-textInput.ac-input-validation-failed, +.ac-input.ac-numberInput.ac-input-validation-failed, +.ac-input.ac-dateInput.ac-input-validation-failed, +.ac-input.ac-timeInput.ac-input-validation-failed, +.ac-input.ac-multichoiceInput.ac-choiceSetInput-compact.ac-input-validation-failed { border: 1px solid red !important; } diff --git a/source/nodejs/adaptivecards-visualizer/css/skype.css b/source/nodejs/adaptivecards-visualizer/css/skype.css index 1602df2190..619d2855cd 100644 --- a/source/nodejs/adaptivecards-visualizer/css/skype.css +++ b/source/nodejs/adaptivecards-visualizer/css/skype.css @@ -110,18 +110,6 @@ a.ac-anchor:visited:active { align-items: center; } -.ac-input-container.ac-input-required::after { - content: "*"; - color: red; - left: 100%; - top: 0; - padding-left: 4px; -} - -.ac-input.ac-input-validation-failed { - border: 1px solid red !important; -} - .ac-input-validation-error-message { font-size: 12px; color: red; @@ -152,13 +140,13 @@ a.ac-anchor:visited:active { } .ac-input.ac-input-required { - background-image: linear-gradient(45deg, transparent, transparent 50%, red 50%, red 100%); - background-position: top right; - background-size: .5em .5em; - background-repeat: no-repeat; } -.ac-input.ac-input-validation-failed { +.ac-input.ac-textInput.ac-input-validation-failed, +.ac-input.ac-numberInput.ac-input-validation-failed, +.ac-input.ac-dateInput.ac-input-validation-failed, +.ac-input.ac-timeInput.ac-input-validation-failed, +.ac-input.ac-multichoiceInput.ac-choiceSetInput-compact.ac-input-validation-failed { border: 1px solid red !important; } diff --git a/source/nodejs/adaptivecards-visualizer/css/teams.css b/source/nodejs/adaptivecards-visualizer/css/teams.css index 7fb0cf0055..d6926687a8 100644 --- a/source/nodejs/adaptivecards-visualizer/css/teams.css +++ b/source/nodejs/adaptivecards-visualizer/css/teams.css @@ -105,18 +105,6 @@ a.ac-anchor:visited:active { align-items: center; } -.ac-input-container.ac-input-required::after { - content: "*"; - color: red; - left: 100%; - top: 0; - padding-left: 4px; -} - -.ac-input.ac-input-validation-failed { - border: 1px solid red !important; -} - .ac-input-validation-error-message { font-size: 12px; color: red; @@ -147,13 +135,13 @@ a.ac-anchor:visited:active { } .ac-input.ac-input-required { - background-image: linear-gradient(45deg, transparent, transparent 50%, red 50%, red 100%); - background-position: top right; - background-size: .5em .5em; - background-repeat: no-repeat; } -.ac-input.ac-input-validation-failed { +.ac-input.ac-textInput.ac-input-validation-failed, +.ac-input.ac-numberInput.ac-input-validation-failed, +.ac-input.ac-dateInput.ac-input-validation-failed, +.ac-input.ac-timeInput.ac-input-validation-failed, +.ac-input.ac-multichoiceInput.ac-choiceSetInput-compact.ac-input-validation-failed { border: 1px solid red !important; } diff --git a/source/nodejs/adaptivecards-visualizer/css/toast.css b/source/nodejs/adaptivecards-visualizer/css/toast.css index e1074b1def..de9099cc1a 100644 --- a/source/nodejs/adaptivecards-visualizer/css/toast.css +++ b/source/nodejs/adaptivecards-visualizer/css/toast.css @@ -98,18 +98,6 @@ a.ac-anchor:visited:active { align-items: center; } -.ac-input-container.ac-input-required::after { - content: "*"; - color: red; - left: 100%; - top: 0; - padding-left: 4px; -} - -.ac-input.ac-input-validation-failed { - border: 1px solid red !important; -} - .ac-input-validation-error-message { font-size: 12px; color: red; @@ -146,13 +134,13 @@ a.ac-anchor:visited:active { } .ac-input.ac-input-required { - background-image: linear-gradient(45deg, transparent, transparent 50%, red 50%, red 100%); - background-position: top right; - background-size: .5em .5em; - background-repeat: no-repeat; } -.ac-input.ac-input-validation-failed { +.ac-input.ac-textInput.ac-input-validation-failed, +.ac-input.ac-numberInput.ac-input-validation-failed, +.ac-input.ac-dateInput.ac-input-validation-failed, +.ac-input.ac-timeInput.ac-input-validation-failed, +.ac-input.ac-multichoiceInput.ac-choiceSetInput-compact.ac-input-validation-failed { border: 1px solid red !important; } diff --git a/source/nodejs/adaptivecards-visualizer/css/webchat.css b/source/nodejs/adaptivecards-visualizer/css/webchat.css index f01510e3c5..8c58876c37 100644 --- a/source/nodejs/adaptivecards-visualizer/css/webchat.css +++ b/source/nodejs/adaptivecards-visualizer/css/webchat.css @@ -146,13 +146,13 @@ a.ac-anchor:visited:active { } .ac-input.ac-input-required { - background-image: linear-gradient(45deg, transparent, transparent 50%, red 50%, red 100%); - background-position: top right; - background-size: .5em .5em; - background-repeat: no-repeat; } -.ac-input.ac-input-validation-failed { +.ac-input.ac-textInput.ac-input-validation-failed, +.ac-input.ac-numberInput.ac-input-validation-failed, +.ac-input.ac-dateInput.ac-input-validation-failed, +.ac-input.ac-timeInput.ac-input-validation-failed, +.ac-input.ac-multichoiceInput.ac-choiceSetInput-compact.ac-input-validation-failed { border: 1px solid red !important; } diff --git a/source/nodejs/adaptivecards/src/card-elements.ts b/source/nodejs/adaptivecards/src/card-elements.ts index eb99beda82..b5b0672d4c 100644 --- a/source/nodejs/adaptivecards/src/card-elements.ts +++ b/source/nodejs/adaptivecards/src/card-elements.ts @@ -2284,6 +2284,7 @@ export class Media extends CardElement { } } +/* export class InputValidationOptions extends SerializableObject { //#region Schema @@ -2306,15 +2307,29 @@ export class InputValidationOptions extends SerializableObject { return this.hasAllDefaultValues() ? undefined : super.internalToJSON(target, context); } } +*/ export abstract class Input extends CardElement implements IInput { //#region Schema + /* static readonly validationProperty = new SerializableObjectProperty( Versions.vNext, "validation", InputValidationOptions); + */ + + static readonly isRequiredProperty = new BoolProperty( + Versions.v1_3, + "isRequired", + false); + static readonly errorMessageProperty = new StringProperty( + Versions.v1_3, + "errorMessage", + true); + + /* protected populateSchema(schema: SerializableObjectSchema) { super.populateSchema(schema); @@ -2327,6 +2342,13 @@ export abstract class Input extends CardElement implements IInput { get validation(): InputValidationOptions { return this.getValue(Input.validationProperty); } + */ + + @property(Input.isRequiredProperty) + isRequired: boolean; + + @property(Input.errorMessageProperty) + errorMessage?: string; //#endregion @@ -2364,7 +2386,7 @@ export abstract class Input extends CardElement implements IInput { this._renderedInputControlElement = renderedInputControlElement; this._renderedInputControlElement.style.minWidth = "0px"; - if (GlobalSettings.useBuiltInInputValidation && this.isNullable && this.validation.necessity == Enums.InputValidationNecessity.RequiredWithVisualCue) { + if (this.isNullable && this.isRequired) { this._renderedInputControlElement.classList.add(hostConfig.makeCssClassName("ac-input-required")); } @@ -2389,7 +2411,7 @@ export abstract class Input extends CardElement implements IInput { } protected resetValidationFailureCue() { - if (GlobalSettings.useBuiltInInputValidation && this.renderedElement) { + if (this.renderedElement) { this._renderedInputControlElement.classList.remove(this.hostConfig.makeCssClassName("ac-input-validation-failed")); if (this._errorMessageElement) { @@ -2401,21 +2423,34 @@ export abstract class Input extends CardElement implements IInput { } protected showValidationErrorMessage() { - if (this.renderedElement && GlobalSettings.useBuiltInInputValidation && GlobalSettings.displayInputValidationErrors && this.validation.errorMessage) { + if (this.renderedElement && this.errorMessage && GlobalSettings.displayInputValidationErrors) { + /* this._errorMessageElement = document.createElement("span"); this._errorMessageElement.className = this.hostConfig.makeCssClassName("ac-input-validation-error-message"); - this._errorMessageElement.textContent = this.validation.errorMessage; + this._errorMessageElement.textContent = this.errorMessage; + */ + + let errorMessageTextBlock = new TextBlock(); + errorMessageTextBlock.setParent(this); + errorMessageTextBlock.text = this.errorMessage; + errorMessageTextBlock.color = Enums.TextColor.Attention; - this._outerContainerElement.appendChild(this._errorMessageElement); + this._errorMessageElement = errorMessageTextBlock.render(); + + if (this._errorMessageElement) { + this._outerContainerElement.appendChild(this._errorMessageElement); + } } } - abstract get value(): any; - onValueChanged: (sender: Input) => void; abstract isSet(): boolean; + isValid(): boolean { + return true; + } + internalValidateProperties(context: ValidationResults) { super.internalValidateProperties(context); @@ -2428,28 +2463,25 @@ export abstract class Input extends CardElement implements IInput { } validateValue(): boolean { - if (GlobalSettings.useBuiltInInputValidation) { - this.resetValidationFailureCue(); + this.resetValidationFailureCue(); - let result = this.validation.necessity != Enums.InputValidationNecessity.Optional ? this.isSet() : true; + let result = this.isRequired ? this.isSet() && this.isValid() : this.isValid(); - if (!result && this.renderedElement) { - this._renderedInputControlElement.classList.add(this.hostConfig.makeCssClassName("ac-input-validation-failed")); + if (!result && this.renderedElement) { + this._renderedInputControlElement.classList.add(this.hostConfig.makeCssClassName("ac-input-validation-failed")); - this.showValidationErrorMessage(); - } - - return result; - } - else { - return true; + this.showValidationErrorMessage(); } + + return result; } getAllInputs(): Input[] { return [this]; } + abstract get value(): any; + get isInteractive(): boolean { return true; } @@ -2464,6 +2496,7 @@ export class TextInput extends Input { static readonly placeholderProperty = new StringProperty(Versions.v1_0, "placeholder"); static readonly styleProperty = new EnumProperty(Versions.v1_0, "style", Enums.InputTextStyle, Enums.InputTextStyle.Text); static readonly inlineActionProperty = new ActionProperty(Versions.v1_0, "inlineAction", [ "Action.ShowCard" ]); + static readonly regexProperty = new StringProperty(Versions.v1_3, "regex", true); @property(TextInput.valueProperty) defaultValue?: string; @@ -2483,6 +2516,9 @@ export class TextInput extends Input { @property(TextInput.inlineActionProperty) inlineAction?: Action; + @property(TextInput.regexProperty) + regex?: string; + //#endregion private setupInput(input: HTMLInputElement | HTMLTextAreaElement) { @@ -2610,6 +2646,18 @@ export class TextInput extends Input { return this.value ? true : false; } + isValid(): boolean { + if (!this.value) { + return true; + } + + if (this.regex) { + return new RegExp(this.regex, "g").test(this.value); + } + + return true; + } + get value(): string | undefined { if (this.renderedInputControlElement) { if (this.isMultiline) { @@ -2719,6 +2767,10 @@ export class ToggleInput extends Input { } isSet(): boolean { + if (this.isRequired) { + return this.value === this.valueOn; + } + return this.value ? true : false; } @@ -2958,6 +3010,7 @@ export class ChoiceSetInput extends Input { } this.internalApplyAriaCurrent(); + return this._selectElement; } } @@ -3380,7 +3433,7 @@ export abstract class Action extends CardObject { protected internalValidateInputs(referencedInputs: Dictionary | undefined): Input[] { let result: Input[] = []; - if (GlobalSettings.useBuiltInInputValidation && !this.ignoreInputValidation && referencedInputs) { + if (!this.ignoreInputValidation && referencedInputs) { for (let key of Object.keys(referencedInputs)) { let input = referencedInputs[key]; diff --git a/source/nodejs/adaptivecards/src/enums.ts b/source/nodejs/adaptivecards/src/enums.ts index 53aa1eb845..b0c873b0a0 100644 --- a/source/nodejs/adaptivecards/src/enums.ts +++ b/source/nodejs/adaptivecards/src/enums.ts @@ -115,11 +115,13 @@ export enum InputTextStyle { Email } +/* export enum InputValidationNecessity { Optional, Required, RequiredWithVisualCue } +*/ /* This should really be a string enum, e.g. diff --git a/source/nodejs/adaptivecards/src/serialization.ts b/source/nodejs/adaptivecards/src/serialization.ts index 379b14c369..d95884d850 100644 --- a/source/nodejs/adaptivecards/src/serialization.ts +++ b/source/nodejs/adaptivecards/src/serialization.ts @@ -104,7 +104,8 @@ export class Versions { static readonly v1_0 = new Version(1, 0); static readonly v1_1 = new Version(1, 1); static readonly v1_2 = new Version(1, 2); - static readonly latest = Versions.v1_2; + static readonly v1_3 = new Version(1, 3); + static readonly latest = Versions.v1_3; static readonly vNext = new Version(1000, 0, "vNext"); } diff --git a/source/nodejs/adaptivecards/src/shared.ts b/source/nodejs/adaptivecards/src/shared.ts index 2173b1f845..f077fa7719 100644 --- a/source/nodejs/adaptivecards/src/shared.ts +++ b/source/nodejs/adaptivecards/src/shared.ts @@ -9,7 +9,7 @@ export class GlobalSettings { static allowMarkForTextHighlighting: boolean = false; static alwaysBleedSeparators: boolean = false; static enableFullJsonRoundTrip: boolean = false; - static useBuiltInInputValidation: boolean = true; + // static useBuiltInInputValidation: boolean = true; static displayInputValidationErrors: boolean = true; static allowPreProcessingPropertyValues: boolean = false; static setTabIndexAtCardRoot: boolean = true; From 1cbb6bc35bd5c1da92e21143f21dbc3673c6e073 Mon Sep 17 00:00:00 2001 From: David Claux Date: Mon, 15 Jun 2020 18:44:10 -0700 Subject: [PATCH 2/8] Code complete --- .../src/designer-peers.ts | 15 +- .../nodejs/adaptivecards/src/card-elements.ts | 177 +- source/nodejs/adaptivecards/src/enums.ts | 8 - .../nodejs/adaptivecards/src/host-config.ts | 103 +- source/nodejs/adaptivecards/src/shared.ts | 1 - source/nodejs/package-lock.json | 1876 +++++++++++++---- source/nodejs/package.json | 2 +- 7 files changed, 1639 insertions(+), 543 deletions(-) diff --git a/source/nodejs/adaptivecards-designer/src/designer-peers.ts b/source/nodejs/adaptivecards-designer/src/designer-peers.ts index 95fe08fd5b..fa4d6d5550 100644 --- a/source/nodejs/adaptivecards-designer/src/designer-peers.ts +++ b/source/nodejs/adaptivecards-designer/src/designer-peers.ts @@ -2188,16 +2188,10 @@ export class FactSetPeer extends TypedCardElementPeer { } export abstract class InputPeer extends TypedCardElementPeer { - /* - static readonly validationProperty = new CompoundPropertyEditor( - Adaptive.Versions.vNext, - "validation", - [ - new EnumPropertyEditor(Adaptive.Versions.vNext, "necessity", "Necessity", Adaptive.InputValidationNecessity), - new StringPropertyEditor(Adaptive.Versions.vNext, "errorMessage", "Error message") - ] - ); - */ + static readonly labelProperty = new StringPropertyEditor( + Adaptive.Versions.v1_3, + "label", + "Label"); static readonly isRequiredProperty = new BooleanPropertyEditor( Adaptive.Versions.v1_3, @@ -2212,6 +2206,7 @@ export abstract class InputPeer extends TypedCard populatePropertySheet(propertySheet: PropertySheet, defaultCategory: string = PropertySheetCategory.DefaultCategory) { super.populatePropertySheet(propertySheet, defaultCategory); + propertySheet.add(defaultCategory, InputPeer.labelProperty); propertySheet.add( PropertySheetCategory.Validation, InputPeer.isRequiredProperty, diff --git a/source/nodejs/adaptivecards/src/card-elements.ts b/source/nodejs/adaptivecards/src/card-elements.ts index 442533bfb1..cc50bc27c1 100644 --- a/source/nodejs/adaptivecards/src/card-elements.ts +++ b/source/nodejs/adaptivecards/src/card-elements.ts @@ -4,9 +4,8 @@ import * as Enums from "./enums"; import { PaddingDefinition, GlobalSettings, SizeAndUnit,SpacingDefinition, Dictionary, StringWithSubstitutions, ContentTypes, IInput, IResourceInformation } from "./shared"; import * as Utils from "./utils"; -import { HostConfig, defaultHostConfig, FontTypeDefinition, ColorSetDefinition, TextColorDefinition, ContainerStyleDefinition } from "./host-config"; +import { HostConfig, defaultHostConfig, BaseTextDefinition, FontTypeDefinition, ColorSetDefinition, TextColorDefinition, ContainerStyleDefinition } from "./host-config"; import * as TextFormatters from "./text-formatters"; -import { HostCapabilities } from "./host-capabilities"; import { CardObject, ValidationResults } from "./card-object"; import { Versions, Version, property, BaseSerializationContext, SerializableObject, SerializableObjectSchema, StringProperty, BoolProperty, ValueSetProperty, EnumProperty, SerializableObjectCollectionProperty, SerializableObjectProperty, PixelSizeProperty, @@ -516,7 +515,7 @@ export abstract class CardElement extends CardObject { return undefined; } - getAllInputs(): Input[] { + getAllInputs(processActions: boolean = true): Input[] { return []; } @@ -725,6 +724,21 @@ export abstract class BaseTextBlock extends CardElement { this.setValue(BaseTextBlock.textProperty, value); } + constructor(text?: string) { + super(); + + if (text) { + this.text = text; + } + } + + init(textDefinition: BaseTextDefinition) { + this.size = textDefinition.size; + this.weight = textDefinition.weight; + this.color = textDefinition.color; + this.isSubtle = textDefinition.isSubtle; + } + asString(): string | undefined { return this.text; } @@ -1323,8 +1337,13 @@ export class RichTextBlock extends CardElement { } } - addInline(inline: CardElement) { - this.internalAddInline(inline); + addInline(inline: CardElement | string) { + if (typeof inline === "string") { + this.internalAddInline(new TextRun(inline)); + } + else { + this.internalAddInline(inline); + } } removeInline(inline: CardElement): boolean { @@ -1868,11 +1887,11 @@ export abstract class CardElementContainer extends CardElement { } } - getAllInputs(): Input[] { + getAllInputs(processActions: boolean = true): Input[] { let result: Input[] = []; for (let i = 0; i < this.getItemCount(); i++) { - result = result.concat(this.getItemAt(i).getAllInputs()); + result = result.concat(this.getItemAt(i).getAllInputs(processActions)); } return result; @@ -2284,65 +2303,15 @@ export class Media extends CardElement { } } -/* -export class InputValidationOptions extends SerializableObject { - //#region Schema - - static readonly necessityProperty = new EnumProperty(Versions.vNext, "necessity", Enums.InputValidationNecessity, Enums.InputValidationNecessity.Optional); - static readonly errorMessageProperty = new StringProperty(Versions.vNext, "errorMessagwe"); - - protected getSchemaKey(): string { - return "InputValidationOptions"; - } - - @property(InputValidationOptions.necessityProperty) - necessity: Enums.InputValidationNecessity = Enums.InputValidationNecessity.Optional; - - @property(InputValidationOptions.errorMessageProperty) - errorMessage?: string; - - //#endregion - - protected internalToJSON(target: PropertyBag, context: BaseSerializationContext) { - return this.hasAllDefaultValues() ? undefined : super.internalToJSON(target, context); - } -} -*/ - export abstract class Input extends CardElement implements IInput { //#region Schema - /* - static readonly validationProperty = new SerializableObjectProperty( - Versions.vNext, - "validation", - InputValidationOptions); - */ - - static readonly isRequiredProperty = new BoolProperty( - Versions.v1_3, - "isRequired", - false); - - static readonly errorMessageProperty = new StringProperty( - Versions.v1_3, - "errorMessage", - true); - - /* - protected populateSchema(schema: SerializableObjectSchema) { - super.populateSchema(schema); - - if (!GlobalSettings.useBuiltInInputValidation) { - schema.remove(Input.validationProperty); - } - } + static readonly labelProperty = new StringProperty(Versions.v1_3, "label", true); + static readonly isRequiredProperty = new BoolProperty(Versions.v1_3, "isRequired", false); + static readonly errorMessageProperty = new StringProperty(Versions.v1_3, "errorMessage", true); - @property(Input.validationProperty) - get validation(): InputValidationOptions { - return this.getValue(Input.validationProperty); - } - */ + @property(Input.labelProperty) + label?: string; @property(Input.isRequiredProperty) isRequired: boolean; @@ -2376,6 +2345,34 @@ export abstract class Input extends CardElement implements IInput { this._outerContainerElement.style.display = "flex"; this._outerContainerElement.style.flexDirection = "column"; + if (this.label) { + let labelRichTextBlock = new RichTextBlock(); + labelRichTextBlock.setParent(this); + + let labelInline = new TextRun(this.label); + labelRichTextBlock.addInline(labelInline); + + if (this.isRequired) { + labelInline.init(hostConfig.inputs.label.requiredInputs); + + let isRequiredCueInline = new TextRun(hostConfig.inputs.label.requiredInputs.suffix); + isRequiredCueInline.color = hostConfig.inputs.label.requiredInputs.suffixColor; + + labelRichTextBlock.addInline(isRequiredCueInline); + } + else { + labelInline.init(hostConfig.inputs.label.optionalInputs); + } + + let renderedLabel = labelRichTextBlock.render(); + + if (renderedLabel) { + renderedLabel.style.marginBottom = hostConfig.getEffectiveSpacing(hostConfig.inputs.label.inputSpacing) + "px"; + + this._outerContainerElement.appendChild(renderedLabel); + } + } + this._inputControlContainerElement = document.createElement("div"); this._inputControlContainerElement.className = hostConfig.makeCssClassName("ac-input-container"); this._inputControlContainerElement.style.display = "flex"; @@ -2401,7 +2398,9 @@ export abstract class Input extends CardElement implements IInput { } protected valueChanged() { - this.resetValidationFailureCue(); + if (this.isValid()) { + this.resetValidationFailureCue(); + } if (this.onValueChanged) { this.onValueChanged(this); @@ -2424,16 +2423,10 @@ export abstract class Input extends CardElement implements IInput { protected showValidationErrorMessage() { if (this.renderedElement && this.errorMessage && GlobalSettings.displayInputValidationErrors) { - /* - this._errorMessageElement = document.createElement("span"); - this._errorMessageElement.className = this.hostConfig.makeCssClassName("ac-input-validation-error-message"); - this._errorMessageElement.textContent = this.errorMessage; - */ - let errorMessageTextBlock = new TextBlock(); errorMessageTextBlock.setParent(this); errorMessageTextBlock.text = this.errorMessage; - errorMessageTextBlock.color = Enums.TextColor.Attention; + errorMessageTextBlock.init(this.hostConfig.inputs.errorMessage); this._errorMessageElement = errorMessageTextBlock.render(); @@ -2476,8 +2469,8 @@ export abstract class Input extends CardElement implements IInput { return result; } - getAllInputs(): Input[] { - return [this]; + getAllInputs(processActions: boolean = true): Input[] { + return [ this ]; } abstract get value(): any; @@ -3422,7 +3415,7 @@ export abstract class Action extends CardObject { // Do nothing in base implementation } - protected internalGetReferencedInputs(allInputs: Input[]): Dictionary { + protected internalGetReferencedInputs(): Dictionary { return {}; } @@ -3568,7 +3561,7 @@ export abstract class Action extends CardObject { return false; } - getAllInputs(): Input[] { + getAllInputs(processActions: boolean = true): Input[] { return []; } @@ -3581,7 +3574,7 @@ export abstract class Action extends CardObject { } getReferencedInputs(): Dictionary | undefined { - return this.parent ? this.internalGetReferencedInputs(this.parent.getRootElement().getAllInputs()) : undefined; + return this.internalGetReferencedInputs(); } validateInputs() { @@ -3636,10 +3629,11 @@ export class SubmitAction extends Action { private _isPrepared: boolean = false; private _processedData?: PropertyBag; - protected internalGetReferencedInputs(allInputs: Input[]): Dictionary { + protected internalGetReferencedInputs(): Dictionary { let result: Dictionary = {}; + let inputs = this.parent ? this.parent.getRootElement().getAllInputs(false) : []; - for (let input of allInputs) { + for (let input of inputs) { if (input.id) { result[input.id] = input; } @@ -3912,7 +3906,8 @@ export class HttpAction extends Action { // change introduced in TS 3.1 wrt d.ts generation. DO NOT CHANGE static readonly JsonTypeName: "Action.Http" = "Action.Http"; - protected internalGetReferencedInputs(allInputs: Input[]): Dictionary { + protected internalGetReferencedInputs(): Dictionary { + let allInputs = this.parent ? this.parent.getRootElement().getAllInputs() : []; let result: Dictionary = {}; this._url.getReferencedInputs(allInputs, result); @@ -4058,8 +4053,8 @@ export class ShowCardAction extends Action { this.card.setParent(value); } - getAllInputs(): Input[] { - return this.card.getAllInputs(); + getAllInputs(processActions: boolean = true): Input[] { + return this.card.getAllInputs(processActions); } getResourceInformation(): IResourceInformation[] { @@ -4517,11 +4512,13 @@ class ActionCollection { this._renderedActionCount = 0; } - getAllInputs(): Input[] { + getAllInputs(processActions: boolean = true): Input[] { let result: Input[] = []; - for (let action of this.items) { - result = result.concat(action.getAllInputs()); + if (processActions) { + for (let action of this.items) { + result = result.concat(action.getAllInputs()); + } } return result; @@ -4621,8 +4618,8 @@ export class ActionSet extends CardElement { this._actionCollection.addAction(action); } - getAllInputs(): Input[] { - return this._actionCollection.getAllInputs(); + getAllInputs(processActions: boolean = true): Input[] { + return processActions ? this._actionCollection.getAllInputs() : []; } getResourceInformation(): IResourceInformation[] { @@ -5935,8 +5932,14 @@ export abstract class ContainerWithActions extends Container { this._actionCollection.clear(); } - getAllInputs(): Input[] { - return super.getAllInputs().concat(this._actionCollection.getAllInputs()); + getAllInputs(processActions: boolean = true): Input[] { + let result = super.getAllInputs(processActions); + + if (processActions) { + result = result.concat(this._actionCollection.getAllInputs(processActions)); + } + + return result; } getResourceInformation(): IResourceInformation[] { diff --git a/source/nodejs/adaptivecards/src/enums.ts b/source/nodejs/adaptivecards/src/enums.ts index b0c873b0a0..c670296a41 100644 --- a/source/nodejs/adaptivecards/src/enums.ts +++ b/source/nodejs/adaptivecards/src/enums.ts @@ -115,14 +115,6 @@ export enum InputTextStyle { Email } -/* -export enum InputValidationNecessity { - Optional, - Required, - RequiredWithVisualCue -} -*/ - /* This should really be a string enum, e.g. diff --git a/source/nodejs/adaptivecards/src/host-config.ts b/source/nodejs/adaptivecards/src/host-config.ts index d5a4aab6ff..b055bf5f6b 100644 --- a/source/nodejs/adaptivecards/src/host-config.ts +++ b/source/nodejs/adaptivecards/src/host-config.ts @@ -101,20 +101,18 @@ export class MediaConfig { } } -export class FactTextDefinition { +export class BaseTextDefinition { size: Enums.TextSize = Enums.TextSize.Default; color: Enums.TextColor = Enums.TextColor.Default;; isSubtle: boolean = false; weight: Enums.TextWeight = Enums.TextWeight.Default; - wrap: boolean = true; constructor(obj?: any) { if (obj) { - this.size = parseHostConfigEnum(Enums.TextSize, obj["size"], Enums.TextSize.Default); - this.color = parseHostConfigEnum(Enums.TextColor, obj["color"], Enums.TextColor.Default); + this.size = parseHostConfigEnum(Enums.TextSize, obj["size"], this.size); + this.color = parseHostConfigEnum(Enums.TextColor, obj["color"], this.color); this.isSubtle = obj["isSubtle"] || this.isSubtle; this.weight = parseHostConfigEnum(Enums.TextWeight, obj["weight"], this.getDefaultWeight()); - this.wrap = obj["wrap"] != null ? obj["wrap"] : this.wrap; } } @@ -127,12 +125,78 @@ export class FactTextDefinition { size: Enums.TextSize[this.size], color: Enums.TextColor[this.color], isSubtle: this.isSubtle, - weight: Enums.TextWeight[this.weight], - wrap: this.wrap + weight: Enums.TextWeight[this.weight] + } + } +} + +export class RequiredInputLabelTextDefinition extends BaseTextDefinition { + suffix?: string = " *"; + suffixColor: Enums.TextColor = Enums.TextColor.Attention; + + constructor(obj?: any) { + super(obj); + + if (obj) { + this.suffix = obj["suffix"] || this.suffix; + this.suffixColor = parseHostConfigEnum(Enums.TextColor, obj["suffixColor"], this.suffixColor); + } + } + + toJSON(): any { + let result = super.toJSON(); + result["suffix"] = this.suffix; + result["suffixColor"] = Enums.TextColor[this.suffixColor]; + + return result; + } +} + +export class InputLabelConfig { + inputSpacing: Enums.Spacing = Enums.Spacing.Small; + readonly requiredInputs: RequiredInputLabelTextDefinition = new RequiredInputLabelTextDefinition(); + readonly optionalInputs: BaseTextDefinition = new BaseTextDefinition(); + + constructor(obj?: any) { + if (obj) { + this.inputSpacing = parseHostConfigEnum(Enums.Spacing, obj["inputSpacing"], this.inputSpacing); + this.requiredInputs = new RequiredInputLabelTextDefinition(obj["requiredInputs"]); + this.optionalInputs = new BaseTextDefinition(obj["optionalInputs"]); } } } +export class InputConfig { + readonly label: InputLabelConfig = new InputLabelConfig(); + readonly errorMessage: BaseTextDefinition = new BaseTextDefinition({ color: Enums.TextColor.Attention }); + + constructor(obj?: any) { + if (obj) { + this.label = new InputLabelConfig(obj["label"]); + this.errorMessage = new BaseTextDefinition(obj["errorMessage"]); + } + } +} + +export class FactTextDefinition extends BaseTextDefinition { + wrap: boolean = true; + + constructor(obj?: any) { + super(obj); + + if (obj) { + this.wrap = obj["wrap"] != null ? obj["wrap"] : this.wrap; + } + } + + toJSON(): any { + let result = super.toJSON(); + result["wrap"] = this.wrap; + + return result; + } +} + export class FactTitleDefinition extends FactTextDefinition { maxWidth?: number = 150; weight: Enums.TextWeight = Enums.TextWeight.Bolder; @@ -516,6 +580,7 @@ export class HostConfig { }; readonly containerStyles: ContainerStyleSet = new ContainerStyleSet(); + readonly inputs: InputConfig = new InputConfig(); readonly actions: ActionsConfig = new ActionsConfig(); readonly adaptiveCard: AdaptiveCardConfig = new AdaptiveCardConfig(); readonly imageSet: ImageSetConfig = new ImageSetConfig(); @@ -572,6 +637,7 @@ export class HostConfig { lineColor: obj.separator && obj.separator["lineColor"] || this.separator.lineColor } + this.inputs = new InputConfig(obj.inputs || this.inputs); this.actions = new ActionsConfig(obj.actions || this.actions); this.adaptiveCard = new AdaptiveCardConfig(obj.adaptiveCard || this.adaptiveCard); this.imageSet = new ImageSetConfig(obj["imageSet"]); @@ -900,6 +966,29 @@ export const defaultHostConfig: HostConfig = new HostConfig( } } }, + inputs: { + label: { + requiredInputs: { + color: Enums.TextColor.Accent, + size: Enums.TextSize.ExtraLarge, + weight: Enums.TextWeight.Bolder, + isSubtle: true, + suffix: " (required)", + suffixColor: Enums.TextColor.Good + }, + optionalInputs: { + color: Enums.TextColor.Warning, + size: Enums.TextSize.Medium, + weight: Enums.TextWeight.Lighter, + isSubtle: false + } + }, + errorMessage: { + color: Enums.TextColor.Accent, + size: Enums.TextSize.Small, + weight: Enums.TextWeight.Bolder + } + }, actions: { maxActions: 5, spacing: Enums.Spacing.Default, diff --git a/source/nodejs/adaptivecards/src/shared.ts b/source/nodejs/adaptivecards/src/shared.ts index f077fa7719..5c5e046a41 100644 --- a/source/nodejs/adaptivecards/src/shared.ts +++ b/source/nodejs/adaptivecards/src/shared.ts @@ -9,7 +9,6 @@ export class GlobalSettings { static allowMarkForTextHighlighting: boolean = false; static alwaysBleedSeparators: boolean = false; static enableFullJsonRoundTrip: boolean = false; - // static useBuiltInInputValidation: boolean = true; static displayInputValidationErrors: boolean = true; static allowPreProcessingPropertyValues: boolean = false; static setTabIndexAtCardRoot: boolean = true; diff --git a/source/nodejs/package-lock.json b/source/nodejs/package-lock.json index e952eb7c7a..374f9f9b13 100644 --- a/source/nodejs/package-lock.json +++ b/source/nodejs/package-lock.json @@ -2123,12 +2123,24 @@ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", "dev": true }, + "@types/minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY=", + "dev": true + }, "@types/node": { "version": "10.14.13", "resolved": "https://registry.npmjs.org/@types/node/-/node-10.14.13.tgz", "integrity": "sha512-yN/FNNW1UYsRR1wwAoyOwqvDuLDtVXnaJTZ898XIw/Q5cCaeVAlVwvsmXLX5PuiScBYwZsZU4JYSHB3TvfdwvQ==", "dev": true }, + "@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", + "dev": true + }, "@types/prop-types": { "version": "15.7.1", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.1.tgz", @@ -2644,18 +2656,18 @@ }, "dependencies": { "mime-db": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", "dev": true }, "mime-types": { - "version": "2.1.24", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", - "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", "dev": true, "requires": { - "mime-db": "1.40.0" + "mime-db": "1.44.0" } } } @@ -2942,7 +2954,7 @@ }, "util": { "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "resolved": "http://registry.npmjs.org/util/-/util-0.10.3.tgz", "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", "dev": true, "requires": { @@ -2970,10 +2982,13 @@ "dev": true }, "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } }, "async-each": { "version": "1.0.3", @@ -3539,7 +3554,7 @@ }, "callsites": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "resolved": "http://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", "dev": true }, @@ -3602,37 +3617,6 @@ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, - "chokidar": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz", - "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - }, - "dependencies": { - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - } - } - }, "chownr": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", @@ -3729,20 +3713,20 @@ "dev": true }, "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "dev": true, "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" }, "dependencies": { "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, "is-fullwidth-code-point": { @@ -3752,22 +3736,23 @@ "dev": true }, "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { + "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "strip-ansi": "^5.1.0" } }, "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "^4.1.0" } } } @@ -3891,18 +3876,18 @@ "dev": true }, "compressible": { - "version": "2.0.17", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.17.tgz", - "integrity": "sha512-BGHeLCK1GV7j1bSmQQAi26X+GgWcTjLr/0tzSvMCl3LH1w1IJ4PFSPoV5316b30cneTziC+B1a+3OjoSUcQYmw==", + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", "dev": true, "requires": { - "mime-db": ">= 1.40.0 < 2" + "mime-db": ">= 1.43.0 < 2" }, "dependencies": { "mime-db": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", "dev": true } } @@ -4041,44 +4026,265 @@ "dev": true }, "conventional-changelog-writer": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-4.0.11.tgz", - "integrity": "sha512-g81GQOR392I+57Cw3IyP1f+f42ME6aEkbR+L7v1FBBWolB0xkjKTeCWVguzRrp6UiT1O6gBpJbEy2eq7AnV1rw==", + "version": "4.0.16", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-4.0.16.tgz", + "integrity": "sha512-jmU1sDJDZpm/dkuFxBeRXvyNcJQeKhGtVcFFkwTphUAzyYWcwz2j36Wcv+Mv2hU3tpvLMkysOPXJTLO55AUrYQ==", "dev": true, "requires": { "compare-func": "^1.3.1", - "conventional-commits-filter": "^2.0.2", + "conventional-commits-filter": "^2.0.6", "dateformat": "^3.0.0", - "handlebars": "^4.4.0", + "handlebars": "^4.7.6", "json-stringify-safe": "^5.0.1", "lodash": "^4.17.15", - "meow": "^5.0.0", + "meow": "^7.0.0", "semver": "^6.0.0", "split": "^1.0.0", "through2": "^3.0.0" }, "dependencies": { + "arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "dev": true + }, + "camelcase": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.0.0.tgz", + "integrity": "sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w==", + "dev": true + }, + "camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + } + } + }, + "conventional-commits-filter": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.6.tgz", + "integrity": "sha512-4g+sw8+KA50/Qwzfr0hL5k5NWxqtrOVw4DDk3/h6L85a9Gz0/Eqp3oP+CWCNfesBvZZZEFHF7OTEbRe+yYSyKw==", + "dev": true, + "requires": { + "lodash.ismatch": "^4.4.0", + "modify-values": "^1.0.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, "lodash": { "version": "4.17.15", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true }, + "map-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.1.0.tgz", + "integrity": "sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g==", + "dev": true + }, "meow": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-7.0.1.tgz", + "integrity": "sha512-tBKIQqVrAHqwit0vfuFPY3LlzJYkEOFyKa3bPgxzNl6q/RtN8KQ+ALYEASYuFayzSAsjlhXj/JZ10rH85Q6TUw==", + "dev": true, + "requires": { + "@types/minimist": "^1.2.0", + "arrify": "^2.0.1", + "camelcase": "^6.0.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "^4.0.2", + "normalize-package-data": "^2.5.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.13.1", + "yargs-parser": "^18.1.3" + } + }, + "minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "dependencies": { + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + } + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "parse-json": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-5.0.0.tgz", - "integrity": "sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig==", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", + "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", "dev": true, "requires": { - "camelcase-keys": "^4.0.0", - "decamelize-keys": "^1.0.0", - "loud-rejection": "^1.0.0", - "minimist-options": "^3.0.1", - "normalize-package-data": "^2.3.4", - "read-pkg-up": "^3.0.0", - "redent": "^2.0.0", - "trim-newlines": "^2.0.0", - "yargs-parser": "^10.0.0" + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } + } + }, + "redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "requires": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + } + }, + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" } }, "semver": { @@ -4087,6 +4293,15 @@ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, + "strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "requires": { + "min-indent": "^1.0.0" + } + }, "through2": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", @@ -4095,6 +4310,36 @@ "requires": { "readable-stream": "2 || 3" } + }, + "trim-newlines": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz", + "integrity": "sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==", + "dev": true + }, + "type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "dev": true + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + } + } } } }, @@ -4109,67 +4354,309 @@ } }, "conventional-commits-parser": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.0.8.tgz", - "integrity": "sha512-YcBSGkZbYp7d+Cr3NWUeXbPDFUN6g3SaSIzOybi8bjHL5IJ5225OSCxJJ4LgziyEJ7AaJtE9L2/EU6H7Nt/DDQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.1.0.tgz", + "integrity": "sha512-RSo5S0WIwXZiRxUGTPuYFbqvrR4vpJ1BDdTlthFgvHt5kEdnd1+pdvwWphWn57/oIl4V72NMmOocFqqJ8mFFhA==", "dev": true, "requires": { "JSONStream": "^1.0.4", "is-text-path": "^1.0.1", "lodash": "^4.17.15", - "meow": "^5.0.0", + "meow": "^7.0.0", "split2": "^2.0.0", "through2": "^3.0.0", "trim-off-newlines": "^1.0.0" }, "dependencies": { - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", "dev": true }, - "meow": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-5.0.0.tgz", - "integrity": "sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig==", + "camelcase": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.0.0.tgz", + "integrity": "sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w==", + "dev": true + }, + "camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", "dev": true, "requires": { - "camelcase-keys": "^4.0.0", - "decamelize-keys": "^1.0.0", - "loud-rejection": "^1.0.0", - "minimist-options": "^3.0.1", - "normalize-package-data": "^2.3.4", - "read-pkg-up": "^3.0.0", - "redent": "^2.0.0", - "trim-newlines": "^2.0.0", - "yargs-parser": "^10.0.0" + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + } } }, - "through2": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", - "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "requires": { - "readable-stream": "2 || 3" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" } - } - } - }, - "conventional-recommended-bump": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-5.0.1.tgz", - "integrity": "sha512-RVdt0elRcCxL90IrNP0fYCpq1uGt2MALko0eyeQ+zQuDVWtMGAy9ng6yYn3kax42lCj9+XBxQ8ZN6S9bdKxDhQ==", - "dev": true, - "requires": { - "concat-stream": "^2.0.0", - "conventional-changelog-preset-loader": "^2.1.1", - "conventional-commits-filter": "^2.0.2", - "conventional-commits-parser": "^3.0.3", - "git-raw-commits": "2.0.0", - "git-semver-tags": "^2.0.3", - "meow": "^4.0.0", + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "map-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.1.0.tgz", + "integrity": "sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g==", + "dev": true + }, + "meow": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-7.0.1.tgz", + "integrity": "sha512-tBKIQqVrAHqwit0vfuFPY3LlzJYkEOFyKa3bPgxzNl6q/RtN8KQ+ALYEASYuFayzSAsjlhXj/JZ10rH85Q6TUw==", + "dev": true, + "requires": { + "@types/minimist": "^1.2.0", + "arrify": "^2.0.1", + "camelcase": "^6.0.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "^4.0.2", + "normalize-package-data": "^2.5.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.13.1", + "yargs-parser": "^18.1.3" + } + }, + "minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "dependencies": { + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + } + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "parse-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", + "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } + } + }, + "redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "requires": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + } + }, + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "requires": { + "min-indent": "^1.0.0" + } + }, + "through2": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", + "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", + "dev": true, + "requires": { + "readable-stream": "2 || 3" + } + }, + "trim-newlines": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz", + "integrity": "sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==", + "dev": true + }, + "type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "dev": true + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + } + } + } + } + }, + "conventional-recommended-bump": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-5.0.1.tgz", + "integrity": "sha512-RVdt0elRcCxL90IrNP0fYCpq1uGt2MALko0eyeQ+zQuDVWtMGAy9ng6yYn3kax42lCj9+XBxQ8ZN6S9bdKxDhQ==", + "dev": true, + "requires": { + "concat-stream": "^2.0.0", + "conventional-changelog-preset-loader": "^2.1.1", + "conventional-commits-filter": "^2.0.2", + "conventional-commits-parser": "^3.0.3", + "git-raw-commits": "2.0.0", + "git-semver-tags": "^2.0.3", + "meow": "^4.0.0", "q": "^1.5.1" }, "dependencies": { @@ -4268,7 +4755,7 @@ "dependencies": { "cacache": { "version": "10.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", + "resolved": "http://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", "dev": true, "requires": { @@ -4661,10 +5148,26 @@ "dev": true }, "deep-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", - "dev": true + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dev": true, + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + }, + "dependencies": { + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + } + } }, "deep-is": { "version": "0.1.3", @@ -4777,12 +5280,6 @@ } } }, - "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true - }, "pify": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", @@ -4941,7 +5438,7 @@ "dependencies": { "domelementtype": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", + "resolved": "http://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", "dev": true } @@ -5009,7 +5506,7 @@ "dependencies": { "bluebird": { "version": "3.3.3", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.3.3.tgz", + "resolved": "http://registry.npmjs.org/bluebird/-/bluebird-3.3.3.tgz", "integrity": "sha1-z5akXXe5qXpDxGo2XEYZ9iv5dtA=", "dev": true }, @@ -6237,12 +6734,12 @@ } }, "follow-redirects": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.7.0.tgz", - "integrity": "sha512-m/pZQy4Gj287eNy94nivy5wchN3Kp+Q5WgUPNy5lJSZ3sgkVKSYV/ZChMAQVIgx1SqfZ2zBZtPA2YlXIWxxJOQ==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.11.0.tgz", + "integrity": "sha512-KZm0V+ll8PfBrKwMzdo5D13b1bur9Iq9Zd/RMmAoQQcl2PxxFml8cxXPaaPYVbV0RjNjq1CU7zIzAOqtUPudmA==", "dev": true, "requires": { - "debug": "^3.2.6" + "debug": "^3.0.0" }, "dependencies": { "debug": { @@ -6945,9 +7442,9 @@ "dev": true }, "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==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, "get-pkg-repo": { @@ -6971,7 +7468,7 @@ }, "camelcase-keys": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "resolved": "http://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", "dev": true, "requires": { @@ -7019,7 +7516,7 @@ }, "meow": { "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "resolved": "http://registry.npmjs.org/meow/-/meow-3.7.0.tgz", "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", "dev": true, "requires": { @@ -7339,9 +7836,9 @@ "dev": true }, "handle-thing": { - "version": "2.0.0", - "resolved": "http://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz", - "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", "dev": true }, "handlebars": { @@ -7381,6 +7878,12 @@ "har-schema": "^2.0.0" } }, + "hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true + }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -7514,9 +8017,9 @@ } }, "html-entities": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", - "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.3.1.tgz", + "integrity": "sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA==", "dev": true }, "html-minifier": { @@ -7592,7 +8095,7 @@ }, "readable-stream": { "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "dev": true, "requires": { @@ -7604,7 +8107,7 @@ }, "string_decoder": { "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", "dev": true } @@ -7635,21 +8138,23 @@ "toidentifier": "1.0.0" } }, - "http-parser-js": { - "version": "0.4.10", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz", - "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=", - "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==", + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "dev": true, "requires": { - "eventemitter3": "^3.0.0", + "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", "requires-port": "^1.0.0" + }, + "dependencies": { + "eventemitter3": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", + "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==", + "dev": true + } } }, "http-proxy-agent": { @@ -7675,7 +8180,7 @@ }, "http-proxy-middleware": { "version": "0.19.1", - "resolved": "http://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", "dev": true, "requires": { @@ -8055,7 +8560,7 @@ }, "external-editor": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "resolved": "http://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", "dev": true, "requires": { @@ -8165,9 +8670,15 @@ "dev": true }, "ipaddr.js": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", - "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true + }, + "is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", "dev": true }, "is-accessor-descriptor": { @@ -8190,6 +8701,12 @@ } } }, + "is-arguments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", + "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", + "dev": true + }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -10606,7 +11123,7 @@ }, "json5": { "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "resolved": "http://registry.npmjs.org/json5/-/json5-0.5.1.tgz", "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", "dev": true }, @@ -10727,7 +11244,7 @@ }, "external-editor": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "resolved": "http://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", "dev": true, "requires": { @@ -10795,6 +11312,12 @@ "type-check": "~0.3.2" } }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, "load-json-file": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", @@ -10911,9 +11434,9 @@ } }, "loglevel": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.3.tgz", - "integrity": "sha512-LoEDv5pgpvWgPF4kNYuIp0qqSJVWak/dML0RY74xlzMZiT9w77teNAwKYKWBTYjlokMirg+o3jBwp+vlLrcfAA==", + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.8.tgz", + "integrity": "sha512-bsU7+gc9AJ2SqpzxwU3+1fedl8zAntbtC5XYlt3s2j1hJcn2PsXSmgN8TaLG/J1/2mod4+cE/3vNL70/c1RNCA==", "dev": true }, "loglevelnext": { @@ -11120,7 +11643,7 @@ }, "media-typer": { "version": "0.3.0", - "resolved": "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", "dev": true }, @@ -11259,6 +11782,12 @@ "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "dev": true }, + "min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true + }, "mini-css-extract-plugin": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.5.0.tgz", @@ -11573,9 +12102,9 @@ } }, "node-forge": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.5.tgz", - "integrity": "sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ==", + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz", + "integrity": "sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==", "dev": true }, "node-gyp": { @@ -11855,6 +12384,81 @@ } } }, + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", + "dev": true + }, + "object-is": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.2.tgz", + "integrity": "sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "is-callable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", + "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", + "dev": true + }, + "is-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz", + "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + } + } + }, "object-keys": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", @@ -12015,40 +12619,6 @@ "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true }, - "os-locale": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.0.1.tgz", - "integrity": "sha512-7g5e7dmXPtzcP4bgsZ8ixDVqA7oWYuEz4lOSujeWyliPai4gfVDiFIcwBg3aGCPnmSGfzOKTK3ccPn0CKv3DBw==", - "dev": true, - "requires": { - "execa": "^0.10.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - }, - "dependencies": { - "execa": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", - "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - } - } - }, "os-name": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/os-name/-/os-name-3.1.0.tgz", @@ -12383,6 +12953,13 @@ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "dev": true }, + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true, + "optional": true + }, "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", @@ -12429,24 +13006,30 @@ "dev": true }, "portfinder": { - "version": "1.0.21", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.21.tgz", - "integrity": "sha512-ESabpDCzmBS3ekHbmpAIiESq3udRsCBGiBZLsC+HgBKv2ezb0R4oG+7RnYEVZ/ZCfhel5Tx3UzdNWA0Lox2QCA==", + "version": "1.0.26", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.26.tgz", + "integrity": "sha512-Xi7mKxJHHMI3rIUrnm/jjUgwhbYMkp/XKEcZX3aG4BrumLpq3nmoQMX+ClYnDZnZ/New7IatC1no5RX0zo1vXQ==", "dev": true, "requires": { - "async": "^1.5.2", - "debug": "^2.2.0", - "mkdirp": "0.5.x" + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.1" }, "dependencies": { - "mkdirp": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", - "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { - "minimist": "^1.2.5" + "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 } } }, @@ -12671,13 +13254,13 @@ } }, "proxy-addr": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", - "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", "dev": true, "requires": { "forwarded": "~0.1.2", - "ipaddr.js": "1.9.0" + "ipaddr.js": "1.9.1" } }, "prr": { @@ -12927,7 +13510,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -12992,6 +13575,75 @@ "safe-regex": "^1.1.0" } }, + "regexp.prototype.flags": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", + "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "is-callable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", + "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", + "dev": true + }, + "is-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz", + "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + } + } + }, "regexpp": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.0.0.tgz", @@ -13111,9 +13763,9 @@ "dev": true }, "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, "requires-port": { @@ -13124,7 +13776,7 @@ }, "resolve": { "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "resolved": "http://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", "dev": true }, @@ -13367,12 +14019,12 @@ "dev": true }, "selfsigned": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.4.tgz", - "integrity": "sha512-9AukTiDmHXGXWtWjembZ5NDmVvP2695EtpgbCsxCa68w3c88B+alqbmZ4O3hZ4VWGXeGWzEVdvqgAJD8DQPCDw==", + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.7.tgz", + "integrity": "sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA==", "dev": true, "requires": { - "node-forge": "0.7.5" + "node-forge": "0.9.0" } }, "semver": { @@ -13707,19 +14359,28 @@ } }, "sockjs": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", - "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.20.tgz", + "integrity": "sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA==", "dev": true, "requires": { "faye-websocket": "^0.10.0", - "uuid": "^3.0.1" + "uuid": "^3.4.0", + "websocket-driver": "0.6.5" + }, + "dependencies": { + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + } } }, "sockjs-client": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.3.0.tgz", - "integrity": "sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz", + "integrity": "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==", "dev": true, "requires": { "debug": "^3.2.5", @@ -13878,9 +14539,9 @@ "dev": true }, "spdy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.0.tgz", - "integrity": "sha512-ot0oEGT/PGUpzf/6uk4AWLqkq+irlqHXkrdbk51oWONh3bxQmBuljxPNl66zlRRcIJStWq0QkLUCPOPjgjvU0Q==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", "dev": true, "requires": { "debug": "^4.1.0", @@ -13937,9 +14598,9 @@ "dev": true }, "readable-stream": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dev": true, "requires": { "inherits": "^2.0.3", @@ -14124,6 +14785,144 @@ "strip-ansi": "^3.0.0" } }, + "string.prototype.trimend": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", + "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "is-callable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", + "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", + "dev": true + }, + "is-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz", + "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + } + } + }, + "string.prototype.trimstart": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", + "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "is-callable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", + "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", + "dev": true + }, + "is-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz", + "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + } + } + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -14135,7 +14934,7 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { @@ -14664,9 +15463,9 @@ } }, "thunky": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.3.tgz", - "integrity": "sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "dev": true }, "timers-browserify": { @@ -14921,18 +15720,18 @@ }, "dependencies": { "mime-db": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", "dev": true }, "mime-types": { - "version": "2.1.24", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", - "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", "dev": true, "requires": { - "mime-db": "1.40.0" + "mime-db": "1.44.0" } } } @@ -14962,7 +15761,7 @@ "dependencies": { "graceful-fs": { "version": "4.1.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.4.tgz", + "resolved": "http://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.4.tgz", "integrity": "sha1-7widKIDwM7ARgjzlyPrnmNp3Xb0=", "dev": true }, @@ -15295,14 +16094,179 @@ } }, "watchpack": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", - "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.2.tgz", + "integrity": "sha512-ymVbbQP40MFTp+cNMvpyBpBtygHnPzPkHqoIwRRj/0B8KhqQwV8LaKjtbaxF2lK4vl8zN9wCxS46IFCU5K4W0g==", "dev": true, "requires": { - "chokidar": "^2.0.2", + "chokidar": "^3.4.0", "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0" + "neo-async": "^2.5.0", + "watchpack-chokidar2": "^2.0.0" + }, + "dependencies": { + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "optional": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "binary-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", + "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", + "dev": true, + "optional": true + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "optional": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "chokidar": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.0.tgz", + "integrity": "sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ==", + "dev": true, + "optional": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.4.0" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "optional": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "optional": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "optional": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "optional": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "optional": true + }, + "readdirp": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", + "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "dev": true, + "optional": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "optional": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "watchpack-chokidar2": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz", + "integrity": "sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==", + "dev": true, + "optional": true, + "requires": { + "chokidar": "^2.1.8" + }, + "dependencies": { + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "optional": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "optional": true, + "requires": { + "is-extglob": "^2.1.1" + } + } } }, "wbuf": { @@ -15630,75 +16594,86 @@ } }, "webpack-dev-middleware": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.0.tgz", - "integrity": "sha512-qvDesR1QZRIAZHOE3iQ4CXLZZSQ1lAUsSpnQmlB1PBfoN/xdRjmge3Dok0W4IdaVLJOGJy3sGI4sZHwjRU0PCA==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz", + "integrity": "sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==", "dev": true, "requires": { "memory-fs": "^0.4.1", - "mime": "^2.4.2", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", "range-parser": "^1.2.1", "webpack-log": "^2.0.0" }, "dependencies": { "mime": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", - "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", + "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", "dev": true } } }, "webpack-dev-server": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.7.2.tgz", - "integrity": "sha512-mjWtrKJW2T9SsjJ4/dxDC2fkFVUw8jlpemDERqV0ZJIkjjjamR2AbQlr3oz+j4JLhYCHImHnXZK5H06P2wvUew==", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz", + "integrity": "sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg==", "dev": true, "requires": { "ansi-html": "0.0.7", "bonjour": "^3.5.0", - "chokidar": "^2.1.6", + "chokidar": "^2.1.8", "compression": "^1.7.4", "connect-history-api-fallback": "^1.6.0", "debug": "^4.1.1", "del": "^4.1.1", "express": "^4.17.1", - "html-entities": "^1.2.1", - "http-proxy-middleware": "^0.19.1", + "html-entities": "^1.3.1", + "http-proxy-middleware": "0.19.1", "import-local": "^2.0.0", "internal-ip": "^4.3.0", "ip": "^1.1.5", + "is-absolute-url": "^3.0.3", "killable": "^1.0.1", - "loglevel": "^1.6.3", + "loglevel": "^1.6.8", "opn": "^5.5.0", "p-retry": "^3.0.1", - "portfinder": "^1.0.20", + "portfinder": "^1.0.26", "schema-utils": "^1.0.0", - "selfsigned": "^1.10.4", - "semver": "^6.1.1", + "selfsigned": "^1.10.7", + "semver": "^6.3.0", "serve-index": "^1.9.1", - "sockjs": "0.3.19", - "sockjs-client": "1.3.0", - "spdy": "^4.0.0", + "sockjs": "0.3.20", + "sockjs-client": "1.4.0", + "spdy": "^4.0.2", "strip-ansi": "^3.0.1", "supports-color": "^6.1.0", "url": "^0.11.0", - "webpack-dev-middleware": "^3.7.0", + "webpack-dev-middleware": "^3.7.2", "webpack-log": "^2.0.0", - "yargs": "12.0.5" + "ws": "^6.2.1", + "yargs": "^13.3.2" }, "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } }, "debug": { "version": "4.1.1", @@ -15709,39 +16684,13 @@ "ms": "^2.1.1" } }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", - "dev": true, - "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", "dev": true, "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" + "is-extglob": "^2.1.1" } }, "ms": { @@ -15750,66 +16699,12 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, "semver": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.2.0.tgz", - "integrity": "sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, "supports-color": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", @@ -15819,34 +16714,13 @@ "has-flag": "^3.0.0" } }, - "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", "dev": true, "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", - "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" - } - }, - "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "async-limiter": "~1.0.0" } } } @@ -15880,20 +16754,18 @@ } }, "websocket-driver": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz", - "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==", + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz", + "integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=", "dev": true, "requires": { - "http-parser-js": ">=0.4.0 <0.4.11", - "safe-buffer": ">=5.1.0", "websocket-extensions": ">=0.1.1" } }, "websocket-extensions": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", - "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", "dev": true }, "whatwg-encoding": { @@ -15977,13 +16849,48 @@ } }, "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "dev": true, "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } } }, "wrappy": { @@ -16120,6 +17027,117 @@ "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", "dev": true }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, "yargs-parser": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", diff --git a/source/nodejs/package.json b/source/nodejs/package.json index 50076903b2..5b35d4e2e2 100644 --- a/source/nodejs/package.json +++ b/source/nodejs/package.json @@ -39,7 +39,7 @@ "typings-for-css-modules-loader": "^1.7.0", "webpack": "^4.38.0", "webpack-cli": "^3.3.6", - "webpack-dev-server": "^3.7.2" + "webpack-dev-server": "^3.11.0" }, "dependencies": {} } From 00bf692754ddb0a8d824ee97c2ed53dddf20f8a7 Mon Sep 17 00:00:00 2001 From: David Claux Date: Mon, 15 Jun 2020 19:32:23 -0700 Subject: [PATCH 3/8] Now actually code complete --- .../nodejs/adaptivecards/src/card-elements.ts | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/source/nodejs/adaptivecards/src/card-elements.ts b/source/nodejs/adaptivecards/src/card-elements.ts index 1b17f5150c..406be9f1a9 100644 --- a/source/nodejs/adaptivecards/src/card-elements.ts +++ b/source/nodejs/adaptivecards/src/card-elements.ts @@ -2428,6 +2428,7 @@ export abstract class Input extends CardElement implements IInput { let errorMessageTextBlock = new TextBlock(); errorMessageTextBlock.setParent(this); errorMessageTextBlock.text = this.errorMessage; + errorMessageTextBlock.wrap = true; errorMessageTextBlock.init(this.hostConfig.inputs.errorMessage); this._errorMessageElement = errorMessageTextBlock.render(); @@ -3146,6 +3147,24 @@ export class NumberInput extends Input { return this.value !== undefined && !isNaN(this.value); } + isValid(): boolean { + if (!this.value) { + return !this.isRequired; + } + + let result = true; + + if (this.min) { + result = result && (this.value >= this.min); + } + + if (this.max) { + result = result && (this.value <= this.max); + } + + return result; + } + get value(): number | undefined { return this._numberInputElement ? this._numberInputElement.valueAsNumber : undefined; } @@ -3212,6 +3231,30 @@ export class DateInput extends Input { return this.value ? true : false; } + isValid(): boolean { + if (!this.value) { + return !this.isRequired; + } + + let valueAsDate = new Date(this.value); + + let result = true; + + if (this.min) { + let minDate = new Date(this.min); + + result = result && (valueAsDate >= minDate); + } + + if (this.max) { + let maxDate = new Date(this.max); + + result = result && (valueAsDate <= maxDate); + } + + return result; + } + get value(): string | undefined { return this._dateInputElement ? this._dateInputElement.value : undefined; } @@ -3238,6 +3281,10 @@ export class TimeProperty extends CustomProperty { } export class TimeInput extends Input { + private static convertTimeStringToDate(timeString: string): Date { + return new Date("1973-09-04T" + timeString + ":00Z"); + } + //#region Schema static readonly valueProperty = new TimeProperty(Versions.v1_0, "value"); @@ -3290,6 +3337,30 @@ export class TimeInput extends Input { return this.value ? true : false; } + isValid(): boolean { + if (!this.value) { + return !this.isRequired; + } + + let valueAsDate = TimeInput.convertTimeStringToDate(this.value); + + let result = true; + + if (this.min) { + let minDate = TimeInput.convertTimeStringToDate(this.min); + + result = result && (valueAsDate >= minDate); + } + + if (this.max) { + let maxDate = TimeInput.convertTimeStringToDate(this.max); + + result = result && (valueAsDate <= maxDate); + } + + return result; + } + get value(): string | undefined { return this._timeInputElement ? this._timeInputElement.value : undefined; } From 94a85a75f5b0e16202879dce4c46aae5ecaa6588 Mon Sep 17 00:00:00 2001 From: David Claux Date: Tue, 16 Jun 2020 10:23:52 -0700 Subject: [PATCH 4/8] Fix not all required inputs gathered from ShowCard --- source/nodejs/adaptivecards/src/card-elements.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/source/nodejs/adaptivecards/src/card-elements.ts b/source/nodejs/adaptivecards/src/card-elements.ts index 406be9f1a9..e35660f38b 100644 --- a/source/nodejs/adaptivecards/src/card-elements.ts +++ b/source/nodejs/adaptivecards/src/card-elements.ts @@ -3704,7 +3704,14 @@ export class SubmitAction extends Action { protected internalGetReferencedInputs(): Dictionary { let result: Dictionary = {}; - let inputs = this.parent ? this.parent.getRootElement().getAllInputs(false) : []; + let current: CardElement | undefined = this.parent; + let inputs: Input[] = []; + + while (current) { + inputs = inputs.concat(current.getAllInputs(false)); + + current = current.parent; + } for (let input of inputs) { if (input.id) { From 38ea15c81cfc13a8d9127e019304473231e695d1 Mon Sep 17 00:00:00 2001 From: David Claux Date: Wed, 17 Jun 2020 13:42:59 -0700 Subject: [PATCH 5/8] Accessibility support --- .../nodejs/adaptivecards/src/card-elements.ts | 88 ++++++++++++++----- 1 file changed, 65 insertions(+), 23 deletions(-) diff --git a/source/nodejs/adaptivecards/src/card-elements.ts b/source/nodejs/adaptivecards/src/card-elements.ts index e35660f38b..a115d6b3c1 100644 --- a/source/nodejs/adaptivecards/src/card-elements.ts +++ b/source/nodejs/adaptivecards/src/card-elements.ts @@ -2325,14 +2325,36 @@ export abstract class Input extends CardElement implements IInput { private _outerContainerElement: HTMLElement; private _inputControlContainerElement: HTMLElement; - private _errorMessageElement?: HTMLElement; - private _renderedInputControlElement: HTMLElement; + private _renderedErrorMessageElement?: HTMLElement; + private _renderedLabelElement?: HTMLElement; + private _renderedInputControlElement?: HTMLElement; + + private updateInputControlAriaLabelledBy() { + if (this._renderedInputControlElement) { + let labelIds: string[] = []; + + if (this._renderedLabelElement) { + labelIds.push(this._renderedLabelElement.id); + } + + if (this._renderedErrorMessageElement) { + labelIds.push(this._renderedErrorMessageElement.id); + } + + if (labelIds.length > 0) { + this._renderedInputControlElement.setAttribute("aria-labelledby", labelIds.join(" ")); + } + else { + this._renderedInputControlElement.removeAttribute("aria-labelledby"); + } + } + } protected get isNullable(): boolean { return true; } - protected get renderedInputControlElement(): HTMLElement { + protected get renderedInputControlElement(): HTMLElement | undefined { return this._renderedInputControlElement; } @@ -2366,12 +2388,13 @@ export abstract class Input extends CardElement implements IInput { labelInline.init(hostConfig.inputs.label.optionalInputs); } - let renderedLabel = labelRichTextBlock.render(); + this._renderedLabelElement = labelRichTextBlock.render(); - if (renderedLabel) { - renderedLabel.style.marginBottom = hostConfig.getEffectiveSpacing(hostConfig.inputs.label.inputSpacing) + "px"; + if (this._renderedLabelElement) { + this._renderedLabelElement.id = Utils.generateUniqueId(); + this._renderedLabelElement.style.marginBottom = hostConfig.getEffectiveSpacing(hostConfig.inputs.label.inputSpacing) + "px"; - this._outerContainerElement.appendChild(renderedLabel); + this._outerContainerElement.appendChild(this._renderedLabelElement); } } @@ -2379,10 +2402,9 @@ export abstract class Input extends CardElement implements IInput { this._inputControlContainerElement.className = hostConfig.makeCssClassName("ac-input-container"); this._inputControlContainerElement.style.display = "flex"; - let renderedInputControlElement = this.internalRender(); + this._renderedInputControlElement = this.internalRender(); - if (renderedInputControlElement) { - this._renderedInputControlElement = renderedInputControlElement; + if (this._renderedInputControlElement) { this._renderedInputControlElement.style.minWidth = "0px"; if (this.isNullable && this.isRequired) { @@ -2390,9 +2412,10 @@ export abstract class Input extends CardElement implements IInput { } this._inputControlContainerElement.appendChild(this._renderedInputControlElement); - this._outerContainerElement.appendChild(this._inputControlContainerElement); + this.updateInputControlAriaLabelledBy(); + return this._outerContainerElement; } @@ -2412,13 +2435,15 @@ export abstract class Input extends CardElement implements IInput { } protected resetValidationFailureCue() { - if (this.renderedElement) { - this._renderedInputControlElement.classList.remove(this.hostConfig.makeCssClassName("ac-input-validation-failed")); + if (this.renderedInputControlElement) { + this.renderedInputControlElement.classList.remove(this.hostConfig.makeCssClassName("ac-input-validation-failed")); + + this.updateInputControlAriaLabelledBy(); - if (this._errorMessageElement) { - this._outerContainerElement.removeChild(this._errorMessageElement); + if (this._renderedErrorMessageElement) { + this._outerContainerElement.removeChild(this._renderedErrorMessageElement); - this._errorMessageElement = undefined; + this._renderedErrorMessageElement = undefined; } } } @@ -2431,10 +2456,13 @@ export abstract class Input extends CardElement implements IInput { errorMessageTextBlock.wrap = true; errorMessageTextBlock.init(this.hostConfig.inputs.errorMessage); - this._errorMessageElement = errorMessageTextBlock.render(); + this._renderedErrorMessageElement = errorMessageTextBlock.render(); + + if (this._renderedErrorMessageElement) { + this._renderedErrorMessageElement.id = Utils.generateUniqueId(); + this._outerContainerElement.appendChild(this._renderedErrorMessageElement); - if (this._errorMessageElement) { - this._outerContainerElement.appendChild(this._errorMessageElement); + this.updateInputControlAriaLabelledBy(); } } } @@ -2443,6 +2471,12 @@ export abstract class Input extends CardElement implements IInput { abstract isSet(): boolean; + focus() { + if (this._renderedInputControlElement) { + this._renderedInputControlElement.focus(); + } + } + isValid(): boolean { return true; } @@ -2463,8 +2497,8 @@ export abstract class Input extends CardElement implements IInput { let result = this.isRequired ? this.isSet() && this.isValid() : this.isValid(); - if (!result && this.renderedElement) { - this._renderedInputControlElement.classList.add(this.hostConfig.makeCssClassName("ac-input-validation-failed")); + if (!result && this.renderedInputControlElement) { + this.renderedInputControlElement.classList.add(this.hostConfig.makeCssClassName("ac-input-validation-failed")); this.showValidationErrorMessage(); } @@ -3616,8 +3650,11 @@ export abstract class Action extends CardObject { prepareForExecution(): boolean { let referencedInputs = this.getReferencedInputs(); + let invalidInputs = this.internalValidateInputs(referencedInputs); + + if (invalidInputs.length > 0) { + invalidInputs[0].focus(); - if (this.internalValidateInputs(referencedInputs).length > 0) { return false; } @@ -3650,7 +3687,12 @@ export abstract class Action extends CardObject { return this.internalGetReferencedInputs(); } - validateInputs() { + /** + * Validates the inputs associated with this action. + * + * @returns A list of inputs that failed validation, or an empty array if no input failed validation. + */ + validateInputs(): Input[] { return this.internalValidateInputs(this.getReferencedInputs()); } From c4a8ee56ff771bd584beb110ea1ff8e8cab50290 Mon Sep 17 00:00:00 2001 From: David Claux Date: Thu, 18 Jun 2020 10:34:29 -0700 Subject: [PATCH 6/8] Add aria-required, hide suffix from accessibility --- source/nodejs/adaptivecards/src/card-elements.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/source/nodejs/adaptivecards/src/card-elements.ts b/source/nodejs/adaptivecards/src/card-elements.ts index a115d6b3c1..bdff1b71ca 100644 --- a/source/nodejs/adaptivecards/src/card-elements.ts +++ b/source/nodejs/adaptivecards/src/card-elements.ts @@ -724,6 +724,8 @@ export abstract class BaseTextBlock extends CardElement { this.setValue(BaseTextBlock.textProperty, value); } + ariaHidden: boolean = false; + constructor(text?: string) { super(); @@ -791,6 +793,10 @@ export abstract class BaseTextBlock extends CardElement { } targetElement.style.fontWeight = fontWeight.toString(); + + if (this.ariaHidden) { + targetElement.setAttribute("aria-hidden", "true"); + } } get effectiveColor(): Enums.TextColor { @@ -2381,6 +2387,7 @@ export abstract class Input extends CardElement implements IInput { let isRequiredCueInline = new TextRun(hostConfig.inputs.label.requiredInputs.suffix); isRequiredCueInline.color = hostConfig.inputs.label.requiredInputs.suffixColor; + isRequiredCueInline.ariaHidden = true; labelRichTextBlock.addInline(isRequiredCueInline); } @@ -2408,6 +2415,7 @@ export abstract class Input extends CardElement implements IInput { this._renderedInputControlElement.style.minWidth = "0px"; if (this.isNullable && this.isRequired) { + this._renderedInputControlElement.setAttribute("aria-required", "true"); this._renderedInputControlElement.classList.add(hostConfig.makeCssClassName("ac-input-required")); } From 2ad25a8999a197bb7c1d3dae50ed1214bca9c2fe Mon Sep 17 00:00:00 2001 From: David Claux Date: Thu, 18 Jun 2020 10:44:39 -0700 Subject: [PATCH 7/8] aria-required for Toggle and ChoiceSet --- source/nodejs/adaptivecards/src/card-elements.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/source/nodejs/adaptivecards/src/card-elements.ts b/source/nodejs/adaptivecards/src/card-elements.ts index bdff1b71ca..495d47f637 100644 --- a/source/nodejs/adaptivecards/src/card-elements.ts +++ b/source/nodejs/adaptivecards/src/card-elements.ts @@ -2758,6 +2758,10 @@ export class ToggleInput extends Input { this._checkboxInputElement.setAttribute("aria-label", this.title); } + if (this.isRequired) { + this._checkboxInputElement.setAttribute("aria-required", "true"); + } + this._checkboxInputElement.tabIndex = 0; if (this.defaultValue == this.valueOn) { @@ -2924,6 +2928,10 @@ export class ChoiceSetInput extends Input { input.style.flex = "0 0 auto"; input.name = this.id ? this.id : this._uniqueCategoryName; + if (this.isRequired) { + input.setAttribute("aria-required", "true"); + } + if (choice.value) { input.value = choice.value; } From bba767fa86ef891d662276e49de8caa4116f9218 Mon Sep 17 00:00:00 2001 From: David Claux Date: Thu, 18 Jun 2020 15:20:38 -0700 Subject: [PATCH 8/8] Add sample --- ...daptiveCard.InputValidation.AllInputs.json | 82 +++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 samples/v1.3/Tests/AdaptiveCard.InputValidation.AllInputs.json diff --git a/samples/v1.3/Tests/AdaptiveCard.InputValidation.AllInputs.json b/samples/v1.3/Tests/AdaptiveCard.InputValidation.AllInputs.json new file mode 100644 index 0000000000..83b94cef64 --- /dev/null +++ b/samples/v1.3/Tests/AdaptiveCard.InputValidation.AllInputs.json @@ -0,0 +1,82 @@ +{ + "type": "AdaptiveCard", + "$schema": "http://adaptivecards.io/schemas/adaptive-card.json", + "version": "1.3", + "body": [ + { + "type": "Input.Text", + "placeholder": "Placeholder text", + "label": "This is an optional input", + "id": "input1" + }, + { + "type": "Input.Text", + "placeholder": "Placeholder text", + "errorMessage": "The input value is invalid. This error message is intentionally long to show that it wraps.", + "isRequired": true, + "id": "input2", + "regex": "abc", + "label": "This is a required Text input. This label is intentionally long to show that it correctly wraps." + }, + { + "type": "Input.Date", + "label": "This is a required Date input", + "isRequired": true, + "min": "6/1/2020", + "max": "6/30/2020", + "errorMessage": "The input value is invalid. This error message is intentionally long to show that it wraps.", + "id": "input3" + }, + { + "type": "Input.Time", + "label": "This is a required Time input", + "isRequired": true, + "min": "08:00", + "max": "15:00", + "errorMessage": "The input value is invalid. This error message is intentionally long to show that it wraps.", + "id": "input4" + }, + { + "type": "Input.Number", + "placeholder": "Placeholder text", + "label": "This is a required Number input", + "isRequired": true, + "errorMessage": "The input value is invalid. This error message is intentionally long to show that it wraps.", + "min": 4, + "max": 6, + "id": "input5" + }, + { + "type": "Input.ChoiceSet", + "choices": [ + { + "title": "Choice 1", + "value": "Choice 1" + }, + { + "title": "Choice 2", + "value": "Choice 2" + } + ], + "placeholder": "Placeholder text", + "label": "This is a required ChoiceSet input", + "isRequired": true, + "errorMessage": "The input value is invalid. This error message is intentionally long to show that it wraps.", + "id": "input6" + }, + { + "type": "Input.Toggle", + "title": "New Input.Toggle", + "label": "This is a required Toggle input", + "isRequired": true, + "errorMessage": "The input value is invalid. This error message is intentionally long to show that it wraps.", + "id": "input7" + } + ], + "actions": [ + { + "type": "Action.Submit", + "title": "Action.Submit" + } + ] +} \ No newline at end of file